blob: ca8dd266ffe3cc6f49339806c6f7a843a08bee2c [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
Guido van Rossumbea18cc2002-06-14 20:41:17 +000091PyDoc_STRVAR(code_doc,
92"code(argcount, nlocals, stacksize, flags, codestring, constants, names,\n\
93 varnames, filename, name, firstlineno, lnotab[, freevars[, cellvars]])\n\
94\n\
95Create a code object. Not for the faint of heart.");
96
97static PyObject *
98code_new(PyTypeObject *type, PyObject *args, PyObject *kw)
99{
100 int argcount;
101 int nlocals;
102 int stacksize;
103 int flags;
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000104 PyObject *co;
Raymond Hettingercc1798e2003-09-16 04:27:52 +0000105 PyObject *empty = NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000106 PyObject *code;
107 PyObject *consts;
108 PyObject *names;
109 PyObject *varnames;
110 PyObject *freevars = NULL;
111 PyObject *cellvars = NULL;
112 PyObject *filename;
113 PyObject *name;
114 int firstlineno;
115 PyObject *lnotab;
116
117 if (!PyArg_ParseTuple(args, "iiiiSO!O!O!SSiS|O!O!:code",
118 &argcount, &nlocals, &stacksize, &flags,
119 &code,
120 &PyTuple_Type, &consts,
121 &PyTuple_Type, &names,
122 &PyTuple_Type, &varnames,
123 &filename, &name,
124 &firstlineno, &lnotab,
125 &PyTuple_Type, &freevars,
126 &PyTuple_Type, &cellvars))
127 return NULL;
128
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000129 if (!PyObject_CheckReadBuffer(code)) {
130 PyErr_SetString(PyExc_TypeError,
131 "bytecode object must be a single-segment read-only buffer");
132 return NULL;
133 }
134
Raymond Hettingercc1798e2003-09-16 04:27:52 +0000135 if (freevars == NULL || cellvars == NULL) {
136 empty = PyTuple_New(0);
137 if (empty == NULL)
138 return NULL;
139 if (freevars == NULL)
140 freevars = empty;
141 if (cellvars == NULL)
142 cellvars = empty;
143 }
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000144
145 co = (PyObject *) PyCode_New(argcount, nlocals, stacksize, flags,
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000146 code, consts, names, varnames,
147 freevars, cellvars, filename, name,
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000148 firstlineno, lnotab);
Raymond Hettingercc1798e2003-09-16 04:27:52 +0000149 Py_XDECREF(empty);
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000150 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000151}
152
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000153static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000154code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000155{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000156 Py_XDECREF(co->co_code);
157 Py_XDECREF(co->co_consts);
158 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000159 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000160 Py_XDECREF(co->co_freevars);
161 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000162 Py_XDECREF(co->co_filename);
163 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000164 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000165 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000166}
167
Guido van Rossum79f25d91997-04-29 20:08:16 +0000168static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000169code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000170{
171 char buf[500];
172 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000173 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000174 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000175
Guido van Rossuma396a882000-04-07 01:21:36 +0000176 if (co->co_firstlineno != 0)
177 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000178 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000179 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000180 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000181 name = PyString_AS_STRING(co->co_name);
Barry Warsaw8f6d8682001-11-28 21:10:39 +0000182 PyOS_snprintf(buf, sizeof(buf),
183 "<code object %.100s at %p, file \"%.300s\", line %d>",
184 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000185 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000186}
187
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000188static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000189code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000190{
191 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000192 cmp = PyObject_Compare(co->co_name, cp->co_name);
193 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000194 cmp = co->co_argcount - cp->co_argcount;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000195 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000196 cmp = co->co_nlocals - cp->co_nlocals;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000197 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000198 cmp = co->co_flags - cp->co_flags;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000199 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000200 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000201 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000202 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000203 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000204 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000205 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000206 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000207 if (cmp) return cmp;
208 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
209 if (cmp) return cmp;
210 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000211 return cmp;
212}
213
214static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000215code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000216{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000217 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000218 h0 = PyObject_Hash(co->co_name);
219 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000220 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000221 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000222 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000223 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000224 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000225 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000227 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000228 h5 = PyObject_Hash(co->co_freevars);
229 if (h5 == -1) return -1;
230 h6 = PyObject_Hash(co->co_cellvars);
231 if (h6 == -1) return -1;
232 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000233 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000234 if (h == -1) h = -2;
235 return h;
236}
237
Jeremy Hylton78891072001-03-01 06:09:34 +0000238/* XXX code objects need to participate in GC? */
239
Guido van Rossum79f25d91997-04-29 20:08:16 +0000240PyTypeObject PyCode_Type = {
241 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000242 0,
243 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000245 0,
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000246 (destructor)code_dealloc, /* tp_dealloc */
247 0, /* tp_print */
248 0, /* tp_getattr */
249 0, /* tp_setattr */
250 (cmpfunc)code_compare, /* tp_compare */
251 (reprfunc)code_repr, /* tp_repr */
252 0, /* tp_as_number */
253 0, /* tp_as_sequence */
254 0, /* tp_as_mapping */
255 (hashfunc)code_hash, /* tp_hash */
256 0, /* tp_call */
257 0, /* tp_str */
258 PyObject_GenericGetAttr, /* tp_getattro */
259 0, /* tp_setattro */
260 0, /* tp_as_buffer */
261 Py_TPFLAGS_DEFAULT, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000262 code_doc, /* tp_doc */
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000263 0, /* tp_traverse */
264 0, /* tp_clear */
265 0, /* tp_richcompare */
266 0, /* tp_weaklistoffset */
267 0, /* tp_iter */
268 0, /* tp_iternext */
269 0, /* tp_methods */
270 code_memberlist, /* tp_members */
271 0, /* tp_getset */
272 0, /* tp_base */
273 0, /* tp_dict */
274 0, /* tp_descr_get */
275 0, /* tp_descr_set */
276 0, /* tp_dictoffset */
277 0, /* tp_init */
278 0, /* tp_alloc */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000279 code_new, /* tp_new */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000280};
281
Guido van Rossum644a12b1997-04-09 19:24:53 +0000282#define NAME_CHARS \
283 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
284
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000285/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
286
287static int
288all_name_chars(unsigned char *s)
289{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000290 static char ok_name_char[256];
291 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000292
Guido van Rossumcd90c202001-02-09 15:06:42 +0000293 if (ok_name_char[*name_chars] == 0) {
294 unsigned char *p;
295 for (p = name_chars; *p; p++)
296 ok_name_char[*p] = 1;
297 }
298 while (*s) {
299 if (ok_name_char[*s++] == 0)
300 return 0;
301 }
302 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000303}
304
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000305static int
306intern_strings(PyObject *tuple)
307{
308 int i;
309
310 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
311 PyObject *v = PyTuple_GET_ITEM(tuple, i);
312 if (v == NULL || !PyString_Check(v)) {
313 Py_FatalError("non-string found in code slot");
314 PyErr_BadInternalCall();
315 return -1;
316 }
317 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
318 }
319 return 0;
320}
321
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000322#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
323#define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD)
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000324#define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE || op==CONTINUE_LOOP)
325#define GETJUMPTGT(arr, i) (GETARG(arr,i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+3))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000326#define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000327#define CODESIZE(op) (HAS_ARG(op) ? 3 : 1)
328#define ISBASICBLOCK(blocks, start, bytes) (blocks[start]==blocks[start+bytes-1])
329
330static unsigned int *
331markblocks(unsigned char *code, int len)
332{
333 unsigned int *blocks = PyMem_Malloc(len*sizeof(int));
334 int i,j, opcode, oldblock, newblock, blockcnt = 0;
335
336 if (blocks == NULL)
337 return NULL;
338 memset(blocks, 0, len*sizeof(int));
339 for (i=0 ; i<len ; i+=CODESIZE(opcode)) {
340 opcode = code[i];
341 switch (opcode) {
342 case FOR_ITER:
343 case JUMP_FORWARD:
344 case JUMP_IF_FALSE:
345 case JUMP_IF_TRUE:
346 case JUMP_ABSOLUTE:
347 case CONTINUE_LOOP:
348 case SETUP_LOOP:
349 case SETUP_EXCEPT:
350 case SETUP_FINALLY:
351 j = GETJUMPTGT(code, i);
352 oldblock = blocks[j];
353 newblock = ++blockcnt;
354 for (; j<len ; j++) {
355 if (blocks[j] != (unsigned)oldblock)
356 break;
357 blocks[j] = newblock;
358 }
359 break;
360 }
361 }
362 return blocks;
363}
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000364
365static PyObject *
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000366optimize_code(PyObject *code, PyObject* consts, PyObject *names)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000367{
368 int i, j, codelen;
369 int tgt, tgttgt, opcode;
370 unsigned char *codestr;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000371 unsigned int *blocks;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000372 char *name;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000373
374 /* Make a modifiable copy of the code string */
375 if (!PyString_Check(code))
376 goto exitUnchanged;
377 codelen = PyString_Size(code);
378 codestr = PyMem_Malloc(codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000379 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000380 goto exitUnchanged;
381 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000382 blocks = markblocks(codestr, codelen);
383 if (blocks == NULL) {
384 PyMem_Free(codestr);
385 goto exitUnchanged;
386 }
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000387 assert(PyTuple_Check(consts));
388
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000389 for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000390 opcode = codestr[i];
391 switch (opcode) {
392
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000393 /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with
394 with JUMP_IF_TRUE POP_TOP NOP */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000395 case UNARY_NOT:
396 if (codestr[i+1] != JUMP_IF_FALSE ||
397 codestr[i+4] != POP_TOP ||
398 !ISBASICBLOCK(blocks,i,5))
399 continue;
400 tgt = GETJUMPTGT(codestr, (i+1));
401 if (codestr[tgt] != POP_TOP)
402 continue;
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000403 j = GETARG(codestr, i+1) + 1;
404 codestr[i] = JUMP_IF_TRUE;
405 SETARG(codestr, i, j);
406 codestr[i+3] = POP_TOP;
407 codestr[i+4] = NOP;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000408 break;
409
410 /* not a is b --> a is not b
411 not a in b --> a not in b
412 not a is not b --> a is b
413 not a not in b --> a in b */
414 case COMPARE_OP:
415 j = GETARG(codestr, i);
416 if (j < 6 || j > 9 ||
417 codestr[i+3] != UNARY_NOT ||
418 !ISBASICBLOCK(blocks,i,4))
419 continue;
420 SETARG(codestr, i, (j^1));
421 codestr[i+3] = NOP;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000422
423 /* Replace LOAD_GLOBAL/LOAD_NAME None with LOAD_CONST None */
424 case LOAD_NAME:
425 case LOAD_GLOBAL:
426 j = GETARG(codestr, i);
427 name = PyString_AsString(PyTuple_GET_ITEM(names, j));
428 if (name == NULL || strcmp(name, "None") != 0)
429 continue;
430 for (j=0 ; j < PyTuple_GET_SIZE(consts) ; j++) {
431 if (PyTuple_GET_ITEM(consts, j) == Py_None) {
432 codestr[i] = LOAD_CONST;
433 SETARG(codestr, i, j);
434 break;
435 }
436 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000437 break;
438
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000439 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP.
440 Note, only the first opcode is changed, the others still
441 perform normally if they happen to be jump targets. */
442 case LOAD_CONST:
443 j = GETARG(codestr, i);
444 if (codestr[i+3] != JUMP_IF_FALSE ||
445 codestr[i+6] != POP_TOP ||
446 !PyObject_IsTrue(PyTuple_GET_ITEM(consts, j)))
447 continue;
448 codestr[i] = JUMP_FORWARD;
449 SETARG(codestr, i, 4);
450 break;
451
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000452 /* Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2 JMP+2 NOP NOP.
453 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2 JMP+1 NOP. */
454 case BUILD_TUPLE:
455 case BUILD_LIST:
456 if (codestr[i+3] != UNPACK_SEQUENCE)
457 continue;
458 if (!ISBASICBLOCK(blocks,i,6))
459 continue;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000460 if (GETARG(codestr, i) == 2 &&
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000461 GETARG(codestr, i+3) == 2) {
462 codestr[i] = ROT_TWO;
463 codestr[i+1] = JUMP_FORWARD;
464 SETARG(codestr, i+1, 2);
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000465 codestr[i+4] = NOP;
466 codestr[i+5] = NOP;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000467 continue;
468 }
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000469 if (GETARG(codestr, i) == 3 &&
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000470 GETARG(codestr, i+3) == 3) {
471 codestr[i] = ROT_THREE;
472 codestr[i+1] = ROT_TWO;
473 codestr[i+2] = JUMP_FORWARD;
474 SETARG(codestr, i+2, 1);
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000475 codestr[i+5] = NOP;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000476 }
477 break;
478
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000479 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000480 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000481 case JUMP_FORWARD:
482 case JUMP_IF_FALSE:
483 case JUMP_IF_TRUE:
484 case JUMP_ABSOLUTE:
485 case CONTINUE_LOOP:
486 case SETUP_LOOP:
487 case SETUP_EXCEPT:
488 case SETUP_FINALLY:
489 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000490 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000491 continue;
492 tgttgt = GETJUMPTGT(codestr, tgt);
493 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
494 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000495 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000496 tgttgt -= i + 3; /* Calc relative jump addr */
497 if (tgttgt < 0) /* No backward relative jumps */
498 continue;
499 codestr[i] = opcode;
500 SETARG(codestr, i, tgttgt);
501 break;
502
503 case EXTENDED_ARG:
504 PyMem_Free(codestr);
505 goto exitUnchanged;
506 }
507 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000508 code = PyString_FromStringAndSize((char *)codestr, codelen);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000509 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000510 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000511 return code;
512
513exitUnchanged:
514 Py_INCREF(code);
515 return code;
516}
517
Guido van Rossum79f25d91997-04-29 20:08:16 +0000518PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000519PyCode_New(int argcount, int nlocals, int stacksize, int flags,
520 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000521 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
522 PyObject *filename, PyObject *name, int firstlineno,
523 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000524{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000525 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000526 int i;
527 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000528 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000529 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000530 consts == NULL || !PyTuple_Check(consts) ||
531 names == NULL || !PyTuple_Check(names) ||
532 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000533 freevars == NULL || !PyTuple_Check(freevars) ||
534 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000535 name == NULL || !PyString_Check(name) ||
536 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000537 lnotab == NULL || !PyString_Check(lnotab) ||
538 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000539 PyErr_BadInternalCall();
540 return NULL;
541 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000542 intern_strings(names);
543 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000544 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000545 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000546 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000547 for (i = PyTuple_Size(consts); --i >= 0; ) {
548 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000549 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000550 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000551 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000552 continue;
553 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000554 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000555 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000556 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000557 co->co_argcount = argcount;
558 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000559 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000560 co->co_flags = flags;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000561 co->co_code = optimize_code(code, consts, names);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000562 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000563 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000564 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000565 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000566 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000567 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000568 Py_INCREF(freevars);
569 co->co_freevars = freevars;
570 Py_INCREF(cellvars);
571 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000572 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000573 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000574 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000575 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000576 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000577 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000578 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000579 if (PyTuple_GET_SIZE(freevars) == 0 &&
580 PyTuple_GET_SIZE(cellvars) == 0)
581 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000582 }
583 return co;
584}
585
586
587/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000588
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000589/* The compiler uses two passes to generate bytecodes. The first pass
590 builds the symbol table. The second pass generates the bytecode.
591
592 The first pass uses a single symtable struct. The second pass uses
593 a compiling struct for each code block. The compiling structs
594 share a reference to the symtable.
595
596 The two passes communicate via symtable_load_symbols() and via
597 is_local() and is_global(). The former initializes several slots
598 in the compiling struct: c_varnames, c_locals, c_nlocals,
599 c_argcount, c_globals, and c_flags.
600*/
601
Tim Peters2a7f3842001-06-09 09:26:21 +0000602/* All about c_lnotab.
603
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000604c_lnotab is an array of unsigned bytes disguised as a Python string. Since
605version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
606mapped to source code line #s via c_lnotab instead.
607
Tim Peters2a7f3842001-06-09 09:26:21 +0000608The array is conceptually a list of
609 (bytecode offset increment, line number increment)
610pairs. The details are important and delicate, best illustrated by example:
611
612 byte code offset source code line number
613 0 1
614 6 2
615 50 7
616 350 307
617 361 308
618
619The first trick is that these numbers aren't stored, only the increments
620from one row to the next (this doesn't really work, but it's a start):
621
622 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
623
624The second trick is that an unsigned byte can't hold negative values, or
625values larger than 255, so (a) there's a deep assumption that byte code
626offsets and their corresponding line #s both increase monotonically, and (b)
627if at least one column jumps by more than 255 from one row to the next, more
628than one pair is written to the table. In case #b, there's no way to know
629from looking at the table later how many were written. That's the delicate
630part. A user of c_lnotab desiring to find the source line number
631corresponding to a bytecode address A should do something like this
632
633 lineno = addr = 0
634 for addr_incr, line_incr in c_lnotab:
635 addr += addr_incr
636 if addr > A:
637 return lineno
638 lineno += line_incr
639
640In order for this to work, when the addr field increments by more than 255,
641the line # increment in each pair generated must be 0 until the remaining addr
642increment is < 256. So, in the example above, com_set_lineno should not (as
643was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
644255, 0, 45, 255, 0, 45.
645*/
646
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000647struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000648 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000649 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000650 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000651 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000652 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +0000653 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000654 PyObject *c_locals; /* dictionary (value=localID) */
655 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000656 PyObject *c_freevars; /* dictionary (value=None) */
657 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000658 int c_nlocals; /* index of next local */
659 int c_argcount; /* number of top-level arguments */
660 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000661 int c_nexti; /* index into c_code */
662 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000663 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000664 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000665 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000666 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000667 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000668 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +0000669 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000670 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000671 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000672 int c_stacklevel; /* Current stack level */
673 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000674 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000675 PyObject *c_lnotab; /* Table mapping address to line number */
Armin Rigo80d937e2004-03-22 17:52:53 +0000676 int c_last_addr; /* last op addr seen and recorded in lnotab */
677 int c_last_line; /* last line seen and recorded in lnotab */
678 int c_lnotab_next; /* current length of lnotab */
679 int c_lnotab_last; /* start of last lnotab record added */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000680 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000681 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000682 int c_nested; /* Is block nested funcdef or lamdef? */
683 int c_closure; /* Is nested w/freevars? */
684 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000685 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000686 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000687};
688
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000689static int
690is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000691{
692 if ((v & (USE | DEF_FREE))
693 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
694 return 1;
695 if (v & DEF_FREE_CLASS)
696 return 1;
697 return 0;
698}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000699
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000700static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000701com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000702{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000703 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
704
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000705 if (c == NULL) {
706 /* Error occurred via symtable call to
707 is_constant_false */
708 PyErr_SetString(exc, msg);
709 return;
710 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000711 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000712 if (c->c_lineno < 1 || c->c_interactive) {
713 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000714 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000715 return;
716 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000717 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000718 if (v == NULL)
719 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000720
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000721 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000722 if (line == NULL) {
723 Py_INCREF(Py_None);
724 line = Py_None;
725 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000726 if (exc == PyExc_SyntaxError) {
727 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
728 Py_None, line);
729 if (t == NULL)
730 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000731 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000732 if (w == NULL)
733 goto exit;
734 PyErr_SetObject(exc, w);
735 } else {
736 /* Make sure additional exceptions are printed with
737 file and line, also. */
738 PyErr_SetObject(exc, v);
739 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
740 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000741 exit:
742 Py_XDECREF(t);
743 Py_XDECREF(v);
744 Py_XDECREF(w);
745 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000746}
747
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000748/* Interface to the block stack */
749
750static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000751block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000752{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000753 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000754 com_error(c, PyExc_SystemError,
755 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000756 }
757 else {
758 c->c_block[c->c_nblocks++] = type;
759 }
760}
761
762static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000763block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000764{
765 if (c->c_nblocks > 0)
766 c->c_nblocks--;
767 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000768 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000769 }
770}
771
Guido van Rossum681d79a1995-07-18 14:51:37 +0000772/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000773
Martin v. Löwis95292d62002-12-11 14:04:59 +0000774static int issue_warning(const char *, const char *, int);
775static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000776static void com_free(struct compiling *);
777static void com_push(struct compiling *, int);
778static void com_pop(struct compiling *, int);
779static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000780static void com_node(struct compiling *, node *);
781static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000782static void com_addbyte(struct compiling *, int);
783static void com_addint(struct compiling *, int);
784static void com_addoparg(struct compiling *, int, int);
785static void com_addfwref(struct compiling *, int, int *);
786static void com_backpatch(struct compiling *, int);
787static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
788static int com_addconst(struct compiling *, PyObject *);
789static int com_addname(struct compiling *, PyObject *);
790static void com_addopname(struct compiling *, int, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000791static void com_test(struct compiling *c, node *n);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000792static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000793static void com_list_iter(struct compiling *, node *, node *, char *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000794static void com_gen_iter(struct compiling *, node *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000795static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000796static void com_assign(struct compiling *, node *, int, node *);
797static void com_assign_name(struct compiling *, node *, int);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000798static int com_make_closure(struct compiling *c, PyCodeObject *co);
799
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000800static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +0000801static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000802 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000803static PyObject *parsestrplus(struct compiling*, node *);
804static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000805static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000806
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000807static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000808
809/* symtable operations */
Raymond Hettinger354433a2004-05-19 08:20:33 +0000810static int symtable_lookup(struct symtable *st, char *name);
Jeremy Hylton1955fcf2003-07-15 20:23:26 +0000811static struct symtable *symtable_build(node *, PyFutureFeatures *,
812 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000813static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000814static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000815static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000816static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000817static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000818static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000819
820static void symtable_node(struct symtable *, node *);
821static void symtable_funcdef(struct symtable *, node *);
822static void symtable_default_args(struct symtable *, node *);
823static void symtable_params(struct symtable *, node *);
824static void symtable_params_fplist(struct symtable *, node *n);
825static void symtable_global(struct symtable *, node *);
826static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000827static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000828static void symtable_list_comprehension(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000829static void symtable_generator_expression(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +0000830static void symtable_list_for(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000831static void symtable_gen_for(struct symtable *, node *, int);
832static void symtable_gen_iter(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000833
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000834static int symtable_update_free_vars(struct symtable *);
835static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
836static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
837
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000838/* helper */
839static void
840do_pad(int pad)
841{
842 int i;
843 for (i = 0; i < pad; ++i)
844 fprintf(stderr, " ");
845}
846
847static void
848dump(node *n, int pad, int depth)
849{
850 int i;
851 if (depth == 0)
852 return;
853 do_pad(pad);
854 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
855 if (depth > 0)
856 depth--;
857 for (i = 0; i < NCH(n); ++i)
858 dump(CHILD(n, i), pad + 1, depth);
859}
860
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000861static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000862com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000863{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000864 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000865 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
866 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000867 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000868 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000869 goto fail;
870 if ((c->c_const_dict = PyDict_New()) == NULL)
871 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000872 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000873 goto fail;
874 if ((c->c_name_dict = PyDict_New()) == NULL)
875 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000876 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000877 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000878 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
879 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000880 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000881 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000882 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000883 c->c_freevars = NULL;
884 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000885 c->c_nlocals = 0;
886 c->c_argcount = 0;
887 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000888 c->c_nexti = 0;
889 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000890 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000891 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000892 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000893 c->c_begin = 0;
894 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000895 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000896 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000897 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000898 c->c_stacklevel = 0;
899 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000900 c->c_firstlineno = 0;
901 c->c_last_addr = 0;
902 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000903 c->c_lnotab_next = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +0000904 c->c_lnotab_last = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000905 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000906 c->c_nested = 0;
907 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000908 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000909 return 1;
910
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000911 fail:
912 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000913 return 0;
914}
915
916static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000917com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000918{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000919 Py_XDECREF(c->c_code);
920 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000921 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000922 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000923 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000924 Py_XDECREF(c->c_globals);
925 Py_XDECREF(c->c_locals);
926 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000927 Py_XDECREF(c->c_freevars);
928 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000929 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000930 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +0000931 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000932}
933
934static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000935com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000936{
937 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000938 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +0000939 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000940 /*
941 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
942 c->c_filename, c->c_name, c->c_lineno,
943 c->c_nexti, c->c_stacklevel, n);
944 */
945 }
Guido van Rossum8b993a91997-01-17 21:04:03 +0000946}
947
948static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000949com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000950{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000951 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000952 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000953 else
954 c->c_stacklevel -= n;
955}
956
957static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000958com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000959{
960 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000961 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000962 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000963 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000964}
965
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000966static int
967com_check_size(PyObject **s, int offset)
968{
969 int len = PyString_GET_SIZE(*s);
970 if (offset >= len)
971 return _PyString_Resize(s, len * 2);
972 return 0;
973}
974
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000975static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000976com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000977{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000978 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000979 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +0000980 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000981 if (com_check_size(&c->c_code, c->c_nexti)) {
982 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000983 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000984 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000985 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000986}
987
988static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000989com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000990{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000991 com_addbyte(c, x & 0xff);
992 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000993}
994
995static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000996com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000997{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000998 char *p;
999 if (c->c_lnotab == NULL)
1000 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001001 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
1002 c->c_errors++;
1003 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001004 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001005 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001006 *p++ = addr;
1007 *p++ = line;
1008 c->c_lnotab_next += 2;
1009}
1010
1011static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001012com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001013{
1014 c->c_lineno = lineno;
1015 if (c->c_firstlineno == 0) {
1016 c->c_firstlineno = c->c_last_line = lineno;
1017 }
1018 else {
1019 int incr_addr = c->c_nexti - c->c_last_addr;
1020 int incr_line = lineno - c->c_last_line;
Armin Rigo80d937e2004-03-22 17:52:53 +00001021 c->c_lnotab_last = c->c_lnotab_next;
Tim Peters2a7f3842001-06-09 09:26:21 +00001022 while (incr_addr > 255) {
1023 com_add_lnotab(c, 255, 0);
1024 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001025 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001026 while (incr_line > 255) {
1027 com_add_lnotab(c, incr_addr, 255);
1028 incr_line -=255;
1029 incr_addr = 0;
1030 }
1031 if (incr_addr > 0 || incr_line > 0)
1032 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001033 c->c_last_addr = c->c_nexti;
1034 c->c_last_line = lineno;
1035 }
1036}
1037
1038static void
Armin Rigo80d937e2004-03-22 17:52:53 +00001039com_strip_lnotab(struct compiling *c)
1040{
1041 /* strip the last lnotab entry if no opcode were emitted.
1042 * This prevents a line number to be generated on a final
1043 * pass, like in the following example:
1044 *
1045 * if a:
1046 * print 5
1047 * else:
1048 * pass
1049 *
1050 * Without the fix, a line trace event would be generated
1051 * on the pass even if a is true (because of the implicit
1052 * return).
1053 */
1054 if (c->c_nexti == c->c_last_addr && c->c_lnotab_last > 0) {
1055 c->c_lnotab_next = c->c_lnotab_last;
1056 }
1057}
1058
1059static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001060com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001061{
Fred Drakeef8ace32000-08-24 00:32:09 +00001062 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +00001063 if (extended_arg){
1064 com_addbyte(c, EXTENDED_ARG);
1065 com_addint(c, extended_arg);
1066 arg &= 0xffff;
1067 }
Guido van Rossum8e793d91997-03-03 19:13:14 +00001068 com_addbyte(c, op);
1069 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001070}
1071
1072static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001073com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001074{
1075 /* Compile a forward reference for backpatching */
1076 int here;
1077 int anchor;
1078 com_addbyte(c, op);
1079 here = c->c_nexti;
1080 anchor = *p_anchor;
1081 *p_anchor = here;
1082 com_addint(c, anchor == 0 ? 0 : here - anchor);
1083}
1084
1085static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001086com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001087{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001088 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001089 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001090 int dist;
1091 int prev;
1092 for (;;) {
1093 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001094 prev = code[anchor] + (code[anchor+1] << 8);
1095 dist = target - (anchor+2);
1096 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001097 dist >>= 8;
1098 code[anchor+1] = dist;
1099 dist >>= 8;
1100 if (dist) {
1101 com_error(c, PyExc_SystemError,
1102 "com_backpatch: offset too large");
1103 break;
1104 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001105 if (!prev)
1106 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001107 anchor -= prev;
1108 }
1109}
1110
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001111/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001112
1113static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001114com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001115{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001116 PyObject *w, *t, *np=NULL;
1117 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001118
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001119 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001120 if (t == NULL)
1121 goto fail;
1122 w = PyDict_GetItem(dict, t);
1123 if (w != NULL) {
1124 n = PyInt_AsLong(w);
1125 } else {
1126 n = PyList_Size(list);
1127 np = PyInt_FromLong(n);
1128 if (np == NULL)
1129 goto fail;
1130 if (PyList_Append(list, v) != 0)
1131 goto fail;
1132 if (PyDict_SetItem(dict, t, np) != 0)
1133 goto fail;
1134 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001135 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001136 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001137 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001138 fail:
1139 Py_XDECREF(np);
1140 Py_XDECREF(t);
1141 c->c_errors++;
1142 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001143}
1144
1145static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001146com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001147{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001148 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001149}
1150
1151static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001152com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001153{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001154 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001155}
1156
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001157int
1158_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001159{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001160 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001161 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001162 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001163 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1164 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001165 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001166 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001167 return 0; /* Don't mangle __extremely_long_names */
1168 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1169 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001170 /* Strip leading underscores from class name */
1171 while (*p == '_')
1172 p++;
1173 if (*p == '\0')
1174 return 0; /* Don't mangle if class is just underscores */
1175 plen = strlen(p);
1176 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001177 plen = maxlen-nlen-2; /* Truncate class name if too long */
1178 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001179 buffer[0] = '_';
1180 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001181 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001182 return 1;
1183}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001184
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001185static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001186com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001187{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001188 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001189 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001190 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001191
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001192 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001193 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001194 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001195 c->c_errors++;
1196 i = 255;
1197 }
1198 else {
1199 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001200 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001201 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001202 com_addoparg(c, op, i);
1203}
1204
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001205#define NAME_LOCAL 0
1206#define NAME_GLOBAL 1
1207#define NAME_DEFAULT 2
1208#define NAME_CLOSURE 3
1209
1210static int
1211com_lookup_arg(PyObject *dict, PyObject *name)
1212{
1213 PyObject *v = PyDict_GetItem(dict, name);
1214 if (v == NULL)
1215 return -1;
1216 else
1217 return PyInt_AS_LONG(v);
1218}
1219
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001220static int
1221none_assignment_check(struct compiling *c, char *name, int assigning)
1222{
1223 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1224 char *msg;
1225 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001226 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001227 else
1228 msg = "deleting None";
1229 if (issue_warning(msg, c->c_filename, c->c_lineno) < 0) {
1230 c->c_errors++;
1231 return -1;
1232 }
1233 }
1234 return 0;
1235}
1236
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001237static void
1238com_addop_varname(struct compiling *c, int kind, char *name)
1239{
1240 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001241 int i, reftype;
1242 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001243 int op = STOP_CODE;
1244 char buffer[MANGLE_LEN];
1245
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001246 if (kind != VAR_LOAD &&
1247 none_assignment_check(c, name, kind == VAR_STORE))
1248 {
1249 c->c_errors++;
1250 i = 255;
1251 goto done;
1252 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001253 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001254 name = buffer;
1255 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1256 c->c_errors++;
1257 i = 255;
1258 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001259 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001260
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001261 reftype = get_ref_type(c, name);
1262 switch (reftype) {
1263 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001264 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001265 scope = NAME_LOCAL;
1266 break;
1267 case GLOBAL_EXPLICIT:
1268 scope = NAME_GLOBAL;
1269 break;
1270 case GLOBAL_IMPLICIT:
1271 if (c->c_flags & CO_OPTIMIZED)
1272 scope = NAME_GLOBAL;
1273 break;
1274 case FREE:
1275 case CELL:
1276 scope = NAME_CLOSURE;
1277 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001278 }
1279
1280 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001281 if (scope == NAME_LOCAL)
1282 i = com_lookup_arg(c->c_locals, v);
1283 else if (reftype == FREE)
1284 i = com_lookup_arg(c->c_freevars, v);
1285 else if (reftype == CELL)
1286 i = com_lookup_arg(c->c_cellvars, v);
1287 if (i == -1) {
1288 c->c_errors++; /* XXX no exception set */
1289 i = 255;
1290 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001291 }
1292 Py_DECREF(v);
1293
1294 switch (kind) {
1295 case VAR_LOAD:
1296 switch (scope) {
1297 case NAME_LOCAL:
1298 op = LOAD_FAST;
1299 break;
1300 case NAME_GLOBAL:
1301 op = LOAD_GLOBAL;
1302 break;
1303 case NAME_DEFAULT:
1304 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001305 break;
1306 case NAME_CLOSURE:
1307 op = LOAD_DEREF;
1308 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001309 }
1310 break;
1311 case VAR_STORE:
1312 switch (scope) {
1313 case NAME_LOCAL:
1314 op = STORE_FAST;
1315 break;
1316 case NAME_GLOBAL:
1317 op = STORE_GLOBAL;
1318 break;
1319 case NAME_DEFAULT:
1320 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001321 break;
1322 case NAME_CLOSURE:
1323 op = STORE_DEREF;
1324 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001325 }
1326 break;
1327 case VAR_DELETE:
1328 switch (scope) {
1329 case NAME_LOCAL:
1330 op = DELETE_FAST;
1331 break;
1332 case NAME_GLOBAL:
1333 op = DELETE_GLOBAL;
1334 break;
1335 case NAME_DEFAULT:
1336 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001337 break;
1338 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001339 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001340 PyOS_snprintf(buf, sizeof(buf),
1341 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001342 com_error(c, PyExc_SyntaxError, buf);
1343 i = 255;
1344 break;
1345 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001346 }
1347 break;
1348 }
1349done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001350 com_addoparg(c, op, i);
1351}
1352
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001353static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001354com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001355{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001356 char *name;
1357 char buffer[1000];
1358 /* XXX it is possible to write this code without the 1000
1359 chars on the total length of dotted names, I just can't be
1360 bothered right now */
1361 if (TYPE(n) == STAR)
1362 name = "*";
1363 else if (TYPE(n) == dotted_name) {
1364 char *p = buffer;
1365 int i;
1366 name = buffer;
1367 for (i = 0; i < NCH(n); i += 2) {
1368 char *s = STR(CHILD(n, i));
1369 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001370 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001371 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001372 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001373 break;
1374 }
1375 if (p != buffer)
1376 *p++ = '.';
1377 strcpy(p, s);
1378 p = strchr(p, '\0');
1379 }
1380 }
1381 else {
1382 REQ(n, NAME);
1383 name = STR(n);
1384 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001385 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001386}
1387
Guido van Rossum79f25d91997-04-29 20:08:16 +00001388static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001389parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001390{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001391 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001392 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001393 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001394#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001395 int imflag;
1396#endif
1397
Guido van Rossum282914b1991-04-04 10:42:56 +00001398 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001399 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001400#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001401 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001402#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001403 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001404 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001405 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001406 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001407 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001408 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001409 }
1410 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001411 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001412 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001413 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001414 if (errno != 0)
1415 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001416 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001417 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001418 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001419#ifndef WITHOUT_COMPLEX
1420 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001421 Py_complex z;
1422 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001423 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001424 z.imag = PyOS_ascii_atof(s);
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001425 PyFPE_END_PROTECT(z)
1426 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001427 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001428 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001429#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001430 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001431 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001432 dx = PyOS_ascii_atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001433 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001434 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001435 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001436}
1437
Guido van Rossum79f25d91997-04-29 20:08:16 +00001438static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001439decode_utf8(char **sPtr, char *end, char* encoding)
1440{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001441#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001442 Py_FatalError("decode_utf8 should not be called in this build.");
1443 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001444#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001445 PyObject *u, *v;
1446 char *s, *t;
1447 t = s = *sPtr;
1448 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1449 while (s < end && (*s & 0x80)) s++;
1450 *sPtr = s;
1451 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1452 if (u == NULL)
1453 return NULL;
1454 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1455 Py_DECREF(u);
1456 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001457#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001458}
1459
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001460/* compiler.transformer.Transformer.decode_literal depends on what
1461 might seem like minor details of this function -- changes here
1462 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001463static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001464parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001465{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001466 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001467 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001468 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001469 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001470 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001471 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001472 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001473
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001474 if (isalpha(quote) || quote == '_') {
1475 if (quote == 'u' || quote == 'U') {
1476 quote = *++s;
1477 unicode = 1;
1478 }
1479 if (quote == 'r' || quote == 'R') {
1480 quote = *++s;
1481 rawmode = 1;
1482 }
1483 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001484 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001485 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001486 return NULL;
1487 }
1488 s++;
1489 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001490 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001491 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001492 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001493 return NULL;
1494 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001495 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001496 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001497 return NULL;
1498 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001499 if (len >= 4 && s[0] == quote && s[1] == quote) {
1500 s += 2;
1501 len -= 2;
1502 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001503 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001504 return NULL;
1505 }
1506 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001507#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001508 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001509 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001510 char *buf;
1511 char *p;
1512 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001513 if (encoding == NULL) {
1514 buf = s;
1515 u = NULL;
1516 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1517 buf = s;
1518 u = NULL;
1519 } else {
1520 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1521 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1522 if (u == NULL)
1523 return NULL;
1524 p = buf = PyString_AsString(u);
1525 end = s + len;
1526 while (s < end) {
1527 if (*s == '\\') {
1528 *p++ = *s++;
1529 if (*s & 0x80) {
1530 strcpy(p, "u005c");
1531 p += 5;
1532 }
1533 }
1534 if (*s & 0x80) { /* XXX inefficient */
1535 char *r;
1536 int rn, i;
1537 w = decode_utf8(&s, end, "utf-16-be");
1538 if (w == NULL) {
1539 Py_DECREF(u);
1540 return NULL;
1541 }
1542 r = PyString_AsString(w);
1543 rn = PyString_Size(w);
1544 assert(rn % 2 == 0);
1545 for (i = 0; i < rn; i += 2) {
1546 sprintf(p, "\\u%02x%02x",
1547 r[i + 0] & 0xFF,
1548 r[i + 1] & 0xFF);
1549 p += 6;
1550 }
1551 Py_DECREF(w);
1552 } else {
1553 *p++ = *s++;
1554 }
1555 }
1556 len = p - buf;
1557 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001558 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001559 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001560 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001561 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1562 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001563 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001564 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001565 return v;
1566
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001567 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001568#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001569 need_encoding = (encoding != NULL &&
1570 strcmp(encoding, "utf-8") != 0 &&
1571 strcmp(encoding, "iso-8859-1") != 0);
1572 if (rawmode || strchr(s, '\\') == NULL) {
1573 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001574#ifndef Py_USING_UNICODE
1575 /* This should not happen - we never see any other
1576 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001577 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001578#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001579 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1580 if (u == NULL)
1581 return NULL;
1582 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1583 Py_DECREF(u);
1584 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001585#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001586 } else {
1587 return PyString_FromStringAndSize(s, len);
1588 }
1589 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001590
1591 v = PyString_DecodeEscape(s, len, NULL, unicode,
1592 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001593 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001594 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001595 return v;
1596}
1597
Guido van Rossum79f25d91997-04-29 20:08:16 +00001598static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001599parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001600{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001601 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001602 int i;
1603 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001604 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001605 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001606 for (i = 1; i < NCH(n); i++) {
1607 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001608 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001609 if (s == NULL)
1610 goto onError;
1611 if (PyString_Check(v) && PyString_Check(s)) {
1612 PyString_ConcatAndDel(&v, s);
1613 if (v == NULL)
1614 goto onError;
1615 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001616#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001617 else {
1618 PyObject *temp;
1619 temp = PyUnicode_Concat(v, s);
1620 Py_DECREF(s);
1621 if (temp == NULL)
1622 goto onError;
1623 Py_DECREF(v);
1624 v = temp;
1625 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001626#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001627 }
1628 }
1629 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001630
1631 onError:
1632 Py_XDECREF(v);
1633 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001634}
1635
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001636static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001637com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001638{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001639 int anchor = 0;
1640 int save_begin = c->c_begin;
1641
Raymond Hettinger354433a2004-05-19 08:20:33 +00001642 /* list_for: for v in expr [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001643 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001644 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001645 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001646 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001647 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001648 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001649 c->c_loops++;
1650 com_list_iter(c, n, e, t);
1651 c->c_loops--;
1652 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1653 c->c_begin = save_begin;
1654 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001655 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001656}
1657
1658static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001659com_gen_for(struct compiling *c, node *n, node *t, int is_outmost)
1660{
1661 int break_anchor = 0;
1662 int anchor = 0;
1663 int save_begin = c->c_begin;
1664
1665 REQ(n, gen_for);
1666 /* gen_for: for v in test [gen_iter] */
1667
1668 com_addfwref(c, SETUP_LOOP, &break_anchor);
1669 block_push(c, SETUP_LOOP);
1670
1671 if (is_outmost) {
1672 com_addop_varname(c, VAR_LOAD, "[outmost-iterable]");
1673 com_push(c, 1);
1674 }
1675 else {
1676 com_node(c, CHILD(n, 3));
1677 com_addbyte(c, GET_ITER);
1678 }
1679
1680 c->c_begin = c->c_nexti;
1681 com_set_lineno(c, c->c_last_line);
1682 com_addfwref(c, FOR_ITER, &anchor);
1683 com_push(c, 1);
1684 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
1685
1686 if (NCH(n) == 5)
1687 com_gen_iter(c, CHILD(n, 4), t);
1688 else {
1689 com_test(c, t);
1690 com_addbyte(c, YIELD_VALUE);
1691 com_pop(c, 1);
1692 }
1693
1694 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1695 c->c_begin = save_begin;
1696
1697 com_backpatch(c, anchor);
1698 com_pop(c, 1); /* FOR_ITER has popped this */
1699 com_addbyte(c, POP_BLOCK);
1700 block_pop(c, SETUP_LOOP);
1701 com_backpatch(c, break_anchor);
1702}
1703
1704static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001705com_list_if(struct compiling *c, node *n, node *e, char *t)
1706{
1707 int anchor = 0;
1708 int a = 0;
1709 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001710 com_node(c, CHILD(n, 1));
1711 com_addfwref(c, JUMP_IF_FALSE, &a);
1712 com_addbyte(c, POP_TOP);
1713 com_pop(c, 1);
1714 com_list_iter(c, n, e, t);
1715 com_addfwref(c, JUMP_FORWARD, &anchor);
1716 com_backpatch(c, a);
1717 /* We jump here with an extra entry which we now pop */
1718 com_addbyte(c, POP_TOP);
1719 com_backpatch(c, anchor);
1720}
1721
1722static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001723com_gen_if(struct compiling *c, node *n, node *t)
1724{
1725 /* gen_if: 'if' test [gen_iter] */
1726 int anchor = 0;
1727 int a=0;
1728
1729 com_node(c, CHILD(n, 1));
1730 com_addfwref(c, JUMP_IF_FALSE, &a);
1731 com_addbyte(c, POP_TOP);
1732 com_pop(c, 1);
1733
1734 if (NCH(n) == 3)
1735 com_gen_iter(c, CHILD(n, 2), t);
1736 else {
1737 com_test(c, t);
1738 com_addbyte(c, YIELD_VALUE);
1739 com_pop(c, 1);
1740 }
1741 com_addfwref(c, JUMP_FORWARD, &anchor);
1742 com_backpatch(c, a);
1743 /* We jump here with an extra entry which we now pop */
1744 com_addbyte(c, POP_TOP);
1745 com_backpatch(c, anchor);
1746}
1747
1748static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001749com_list_iter(struct compiling *c,
1750 node *p, /* parent of list_iter node */
1751 node *e, /* element expression node */
1752 char *t /* name of result list temp local */)
1753{
1754 /* list_iter is the last child in a listmaker, list_for, or list_if */
1755 node *n = CHILD(p, NCH(p)-1);
1756 if (TYPE(n) == list_iter) {
1757 n = CHILD(n, 0);
1758 switch (TYPE(n)) {
1759 case list_for:
1760 com_list_for(c, n, e, t);
1761 break;
1762 case list_if:
1763 com_list_if(c, n, e, t);
1764 break;
1765 default:
1766 com_error(c, PyExc_SystemError,
1767 "invalid list_iter node type");
1768 }
1769 }
1770 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001771 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001772 com_push(c, 1);
1773 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001774 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001775 com_pop(c, 2);
1776 }
1777}
1778
1779static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001780com_gen_iter(struct compiling *c, node *n, node *t)
1781{
1782 /* gen_iter: gen_for | gen_if */
1783 node *ch;
1784 REQ(n, gen_iter);
1785
1786 ch = CHILD(n, 0);
1787
1788 switch (TYPE(ch)) {
1789 case gen_for:
1790 com_gen_for(c, ch, t, 0);
1791 break;
1792 case gen_if:
1793 com_gen_if(c, ch, t);
1794 break;
1795 default:
1796 com_error(c, PyExc_SystemError,
1797 "invalid gen_iter node type");
1798 }
1799}
1800
1801static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001802com_list_comprehension(struct compiling *c, node *n)
1803{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001804 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001805 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001806
1807 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001808 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001809 com_addoparg(c, BUILD_LIST, 0);
1810 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1811 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001812 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001813 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001814 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001815 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001816 --c->c_tmpname;
1817}
1818
1819static void
1820com_listmaker(struct compiling *c, node *n)
1821{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001822 /* listmaker: test ( list_for | (',' test)* [','] ) */
1823 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001824 com_list_comprehension(c, n);
1825 else {
1826 int len = 0;
1827 int i;
1828 for (i = 0; i < NCH(n); i += 2, len++)
1829 com_node(c, CHILD(n, i));
1830 com_addoparg(c, BUILD_LIST, len);
1831 com_pop(c, len-1);
1832 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001833}
1834
1835static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001836com_generator_expression(struct compiling *c, node *n)
1837{
1838 /* testlist_gexp: test gen_for */
1839 /* argument: test gen_for */
1840 PyCodeObject *co;
1841
1842 REQ(CHILD(n, 0), test);
1843 REQ(CHILD(n, 1), gen_for);
1844
1845 symtable_enter_scope(c->c_symtable, "<genexpr>", TYPE(n),
1846 n->n_lineno);
1847 co = icompile(n, c);
1848 symtable_exit_scope(c->c_symtable);
1849
1850 if (co == NULL)
1851 c->c_errors++;
1852 else {
1853 int closure = com_make_closure(c, co);
1854 int i = com_addconst(c, (PyObject *)co);
1855
1856 com_addoparg(c, LOAD_CONST, i);
1857 com_push(c, 1);
1858 if (closure)
1859 com_addoparg(c, MAKE_CLOSURE, 0);
1860 else
1861 com_addoparg(c, MAKE_FUNCTION, 0);
1862
1863 com_test(c, CHILD(CHILD(n, 1), 3));
1864 com_addbyte(c, GET_ITER);
1865 com_addoparg(c, CALL_FUNCTION, 1);
1866 com_pop(c, 1);
1867
1868 Py_DECREF(co);
1869 }
1870}
1871
1872static void
1873com_testlist_gexp(struct compiling *c, node *n)
1874{
1875 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
1876 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
1877 com_generator_expression(c, n);
1878 else com_list(c, n, 0);
1879}
1880
1881static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001882com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001883{
1884 int i;
1885 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1886 for (i = 0; i+2 < NCH(n); i += 4) {
1887 /* We must arrange things just right for STORE_SUBSCR.
1888 It wants the stack to look like (value) (dict) (key) */
1889 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001890 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001891 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00001892 com_node(c, CHILD(n, i+2)); /* value */
1893 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001894 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001895 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001896 }
1897}
1898
1899static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001900com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001901{
1902 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001903 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001904 int i;
1905 REQ(n, atom);
1906 ch = CHILD(n, 0);
1907 switch (TYPE(ch)) {
1908 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001909 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001910 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001911 com_push(c, 1);
1912 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001913 else
Raymond Hettinger354433a2004-05-19 08:20:33 +00001914 com_testlist_gexp(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001915 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001916 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001917 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001918 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001919 com_push(c, 1);
1920 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001921 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001922 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001923 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001924 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001925 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001926 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001927 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001928 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001929 break;
1930 case BACKQUOTE:
1931 com_node(c, CHILD(n, 1));
1932 com_addbyte(c, UNARY_CONVERT);
1933 break;
1934 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001935 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001936 i = 255;
1937 }
1938 else {
1939 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001940 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001941 }
1942 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001943 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001944 break;
1945 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001946 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001947 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001948 c->c_errors++;
1949 i = 255;
1950 }
1951 else {
1952 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001953 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001954 }
1955 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001956 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001957 break;
1958 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001959 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001960 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001961 break;
1962 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001963 com_error(c, PyExc_SystemError,
1964 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001965 }
1966}
1967
1968static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001969com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001970{
1971 if (NCH(n) == 1) {
1972 com_addbyte(c, op);
1973 }
1974 else if (NCH(n) == 2) {
1975 if (TYPE(CHILD(n, 0)) != COLON) {
1976 com_node(c, CHILD(n, 0));
1977 com_addbyte(c, op+1);
1978 }
1979 else {
1980 com_node(c, CHILD(n, 1));
1981 com_addbyte(c, op+2);
1982 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001983 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001984 }
1985 else {
1986 com_node(c, CHILD(n, 0));
1987 com_node(c, CHILD(n, 2));
1988 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001989 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001990 }
1991}
1992
Guido van Rossum635abd21997-01-06 22:56:52 +00001993static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001994com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1995{
1996 if (NCH(n) == 1) {
1997 com_addbyte(c, DUP_TOP);
1998 com_push(c, 1);
1999 com_addbyte(c, SLICE);
2000 com_node(c, augn);
2001 com_addbyte(c, opcode);
2002 com_pop(c, 1);
2003 com_addbyte(c, ROT_TWO);
2004 com_addbyte(c, STORE_SLICE);
2005 com_pop(c, 2);
2006 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
2007 com_node(c, CHILD(n, 0));
2008 com_addoparg(c, DUP_TOPX, 2);
2009 com_push(c, 2);
2010 com_addbyte(c, SLICE+1);
2011 com_pop(c, 1);
2012 com_node(c, augn);
2013 com_addbyte(c, opcode);
2014 com_pop(c, 1);
2015 com_addbyte(c, ROT_THREE);
2016 com_addbyte(c, STORE_SLICE+1);
2017 com_pop(c, 3);
2018 } else if (NCH(n) == 2) {
2019 com_node(c, CHILD(n, 1));
2020 com_addoparg(c, DUP_TOPX, 2);
2021 com_push(c, 2);
2022 com_addbyte(c, SLICE+2);
2023 com_pop(c, 1);
2024 com_node(c, augn);
2025 com_addbyte(c, opcode);
2026 com_pop(c, 1);
2027 com_addbyte(c, ROT_THREE);
2028 com_addbyte(c, STORE_SLICE+2);
2029 com_pop(c, 3);
2030 } else {
2031 com_node(c, CHILD(n, 0));
2032 com_node(c, CHILD(n, 2));
2033 com_addoparg(c, DUP_TOPX, 3);
2034 com_push(c, 3);
2035 com_addbyte(c, SLICE+3);
2036 com_pop(c, 2);
2037 com_node(c, augn);
2038 com_addbyte(c, opcode);
2039 com_pop(c, 1);
2040 com_addbyte(c, ROT_FOUR);
2041 com_addbyte(c, STORE_SLICE+3);
2042 com_pop(c, 4);
2043 }
2044}
2045
2046static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002047com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002048{
2049 node *m;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002050 REQ(n, argument); /* [test '='] test [gen_for]; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00002051 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00002052 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002053 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00002054 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002055 }
2056 else {
2057 com_node(c, CHILD(n, 0));
2058 }
Guido van Rossum635abd21997-01-06 22:56:52 +00002059 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002060 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00002061 if (NCH(n) == 2) {
2062 com_generator_expression(c, n);
2063 return;
2064 }
2065
Guido van Rossumf10570b1995-07-07 22:53:21 +00002066 m = n;
2067 do {
2068 m = CHILD(m, 0);
2069 } while (NCH(m) == 1);
2070 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00002071 /* f(lambda x: x[0] = 3) ends up getting parsed with
2072 * LHS test = lambda x: x[0], and RHS test = 3.
2073 * SF bug 132313 points out that complaining about a keyword
2074 * then is very confusing.
2075 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002076 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00002077 TYPE(m) == lambdef ?
2078 "lambda cannot contain assignment" :
2079 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002080 }
2081 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002082 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00002083 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00002084 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002085 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002086 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002087 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002088 else if (*pkeywords == NULL) {
2089 c->c_errors++;
2090 Py_DECREF(v);
2091 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002092 if (PyDict_GetItem(*pkeywords, v) != NULL)
2093 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00002094 "duplicate keyword argument");
2095 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002096 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00002097 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002098 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002099 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002100 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002101 }
2102 }
2103 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002104}
2105
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002106static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002107com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002108{
2109 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00002110 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002111 }
2112 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002113 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00002114 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00002115 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00002116 int star_flag = 0;
2117 int starstar_flag = 0;
2118 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002119 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002120 na = 0;
2121 nk = 0;
2122 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00002123 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00002124 if (TYPE(ch) == STAR ||
2125 TYPE(ch) == DOUBLESTAR)
2126 break;
Guido van Rossumca906051998-12-10 16:56:22 +00002127 if (ch->n_lineno != lineno) {
2128 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002129 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00002130 }
2131 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00002132 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002133 na++;
2134 else
2135 nk++;
2136 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002137 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00002138 while (i < NCH(n)) {
2139 node *tok = CHILD(n, i);
2140 node *ch = CHILD(n, i+1);
2141 i += 3;
2142 switch (TYPE(tok)) {
2143 case STAR: star_flag = 1; break;
2144 case DOUBLESTAR: starstar_flag = 1; break;
2145 }
2146 com_node(c, ch);
2147 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002148 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002149 com_error(c, PyExc_SyntaxError,
2150 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002151 }
Jeremy Hylton76901512000-03-28 23:49:17 +00002152 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00002153 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00002154 star_flag + (starstar_flag << 1);
2155 else
2156 opcode = CALL_FUNCTION;
2157 com_addoparg(c, opcode, na | (nk << 8));
2158 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002159 }
2160}
2161
2162static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002163com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002164{
2165 com_addopname(c, LOAD_ATTR, n);
2166}
2167
2168static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002169com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002170{
2171 int i=0;
2172 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00002173 node *ch;
2174
2175 /* first argument */
2176 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002177 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002178 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002179 i++;
2180 }
2181 else {
2182 com_node(c, CHILD(n,i));
2183 i++;
2184 REQ(CHILD(n,i),COLON);
2185 i++;
2186 }
2187 /* second argument */
2188 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
2189 com_node(c, CHILD(n,i));
2190 i++;
2191 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002192 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002193 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002194 com_push(c, 1);
2195 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002196 /* remaining arguments */
2197 for (; i < NCH(n); i++) {
2198 ns++;
2199 ch=CHILD(n,i);
2200 REQ(ch, sliceop);
2201 if (NCH(ch) == 1) {
2202 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002203 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002204 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002205 }
2206 else
2207 com_node(c, CHILD(ch,1));
2208 }
2209 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002210 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002211}
2212
2213static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002214com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002215{
2216 node *ch;
2217 REQ(n, subscript);
2218 ch = CHILD(n,0);
2219 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002220 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002221 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002222 com_push(c, 1);
2223 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002224 else {
2225 /* check for slice */
2226 if ((TYPE(ch) == COLON || NCH(n) > 1))
2227 com_sliceobj(c, n);
2228 else {
2229 REQ(ch, test);
2230 com_node(c, ch);
2231 }
2232 }
2233}
2234
2235static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002236com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002237{
2238 int i, op;
2239 REQ(n, subscriptlist);
2240 /* Check to make backward compatible slice behavior for '[i:j]' */
2241 if (NCH(n) == 1) {
2242 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002243 /* 'Basic' slice, should have exactly one colon. */
2244 if ((TYPE(CHILD(sub, 0)) == COLON
2245 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2246 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2247 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002248 switch (assigning) {
2249 case OP_DELETE:
2250 op = DELETE_SLICE;
2251 break;
2252 case OP_ASSIGN:
2253 op = STORE_SLICE;
2254 break;
2255 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002256 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002257 break;
2258 default:
2259 com_augassign_slice(c, sub, assigning, augn);
2260 return;
2261 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002262 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002263 if (op == STORE_SLICE)
2264 com_pop(c, 2);
2265 else if (op == DELETE_SLICE)
2266 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002267 return;
2268 }
2269 }
2270 /* Else normal subscriptlist. Compile each subscript. */
2271 for (i = 0; i < NCH(n); i += 2)
2272 com_subscript(c, CHILD(n, i));
2273 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002274 if (NCH(n) > 1) {
2275 i = (NCH(n)+1) / 2;
2276 com_addoparg(c, BUILD_TUPLE, i);
2277 com_pop(c, i-1);
2278 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002279 switch (assigning) {
2280 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002281 op = DELETE_SUBSCR;
2282 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002283 break;
2284 default:
2285 case OP_ASSIGN:
2286 op = STORE_SUBSCR;
2287 i = 3;
2288 break;
2289 case OP_APPLY:
2290 op = BINARY_SUBSCR;
2291 i = 1;
2292 break;
2293 }
2294 if (assigning > OP_APPLY) {
2295 com_addoparg(c, DUP_TOPX, 2);
2296 com_push(c, 2);
2297 com_addbyte(c, BINARY_SUBSCR);
2298 com_pop(c, 1);
2299 com_node(c, augn);
2300 com_addbyte(c, assigning);
2301 com_pop(c, 1);
2302 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002303 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002304 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002305 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002306}
2307
2308static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002309com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002310{
2311 REQ(n, trailer);
2312 switch (TYPE(CHILD(n, 0))) {
2313 case LPAR:
2314 com_call_function(c, CHILD(n, 1));
2315 break;
2316 case DOT:
2317 com_select_member(c, CHILD(n, 1));
2318 break;
2319 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002320 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002321 break;
2322 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002323 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002324 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002325 }
2326}
2327
2328static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002329com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002330{
2331 int i;
2332 REQ(n, power);
2333 com_atom(c, CHILD(n, 0));
2334 for (i = 1; i < NCH(n); i++) {
2335 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2336 com_factor(c, CHILD(n, i+1));
2337 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002338 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002339 break;
2340 }
2341 else
2342 com_apply_trailer(c, CHILD(n, i));
2343 }
2344}
2345
2346static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002347com_invert_constant(struct compiling *c, node *n)
2348{
2349 /* Compute the inverse of int and longs and use them directly,
2350 but be prepared to generate code for all other
2351 possibilities (invalid numbers, floats, complex).
2352 */
2353 PyObject *num, *inv = NULL;
2354 int i;
2355
2356 REQ(n, NUMBER);
2357 num = parsenumber(c, STR(n));
2358 if (num == NULL)
2359 i = 255;
2360 else {
2361 inv = PyNumber_Invert(num);
2362 if (inv == NULL) {
2363 PyErr_Clear();
2364 i = com_addconst(c, num);
2365 } else {
2366 i = com_addconst(c, inv);
2367 Py_DECREF(inv);
2368 }
2369 Py_DECREF(num);
2370 }
2371 com_addoparg(c, LOAD_CONST, i);
2372 com_push(c, 1);
2373 if (num != NULL && inv == NULL)
2374 com_addbyte(c, UNARY_INVERT);
2375}
2376
Tim Peters51e26512001-09-07 08:45:55 +00002377static int
2378is_float_zero(const char *p)
2379{
2380 int found_radix_point = 0;
2381 int ch;
2382 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2383 switch (ch) {
2384 case '0':
2385 /* no reason to believe it's not 0 -- continue */
2386 break;
2387
2388 case 'e': case 'E': case 'j': case 'J':
2389 /* If this was a hex constant, we already would have
2390 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2391 must be an exponent marker, and we haven't yet
2392 seen a non-zero digit, and it doesn't matter what
2393 the exponent is then. For 'j' or 'J' similarly,
2394 except that this is an imaginary 0 then. */
2395 return 1;
2396
2397 case '.':
2398 found_radix_point = 1;
2399 break;
2400
2401 default:
2402 return 0;
2403 }
2404 }
2405 return found_radix_point;
2406}
2407
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002408static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002409com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002410{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002411 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002412 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002413 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002414 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002415 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002416 approriate value as a constant. If the value is negative,
2417 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002418 negative in the 0th position -- unless we're doing unary minus
2419 of a floating zero! In that case the sign is significant, but
2420 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002421 */
2422 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002423 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002424 && TYPE((pfactor = CHILD(n, 1))) == factor
2425 && NCH(pfactor) == 1
2426 && TYPE((ppower = CHILD(pfactor, 0))) == power
2427 && NCH(ppower) == 1
2428 && TYPE((patom = CHILD(ppower, 0))) == atom
2429 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002430 && !(childtype == MINUS &&
2431 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002432 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002433 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002434 return;
2435 }
2436 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002437 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002438 if (s == NULL) {
2439 com_error(c, PyExc_MemoryError, "");
2440 com_addbyte(c, 255);
2441 return;
2442 }
2443 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002444 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002445 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002446 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002447 }
Tim Peters51e26512001-09-07 08:45:55 +00002448 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002449 }
2450 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002451 com_factor(c, CHILD(n, 1));
2452 com_addbyte(c, UNARY_POSITIVE);
2453 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002454 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002455 com_factor(c, CHILD(n, 1));
2456 com_addbyte(c, UNARY_NEGATIVE);
2457 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002458 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002459 com_factor(c, CHILD(n, 1));
2460 com_addbyte(c, UNARY_INVERT);
2461 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002462 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002463 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002464 }
2465}
2466
2467static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002468com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002469{
2470 int i;
2471 int op;
2472 REQ(n, term);
2473 com_factor(c, CHILD(n, 0));
2474 for (i = 2; i < NCH(n); i += 2) {
2475 com_factor(c, CHILD(n, i));
2476 switch (TYPE(CHILD(n, i-1))) {
2477 case STAR:
2478 op = BINARY_MULTIPLY;
2479 break;
2480 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002481 if (c->c_flags & CO_FUTURE_DIVISION)
2482 op = BINARY_TRUE_DIVIDE;
2483 else
2484 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002485 break;
2486 case PERCENT:
2487 op = BINARY_MODULO;
2488 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002489 case DOUBLESLASH:
2490 op = BINARY_FLOOR_DIVIDE;
2491 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002492 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002493 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002494 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002495 op = 255;
2496 }
2497 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002498 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002499 }
2500}
2501
2502static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002503com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002504{
2505 int i;
2506 int op;
2507 REQ(n, arith_expr);
2508 com_term(c, CHILD(n, 0));
2509 for (i = 2; i < NCH(n); i += 2) {
2510 com_term(c, CHILD(n, i));
2511 switch (TYPE(CHILD(n, i-1))) {
2512 case PLUS:
2513 op = BINARY_ADD;
2514 break;
2515 case MINUS:
2516 op = BINARY_SUBTRACT;
2517 break;
2518 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002519 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002520 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002521 op = 255;
2522 }
2523 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002524 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002525 }
2526}
2527
2528static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002529com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002530{
2531 int i;
2532 int op;
2533 REQ(n, shift_expr);
2534 com_arith_expr(c, CHILD(n, 0));
2535 for (i = 2; i < NCH(n); i += 2) {
2536 com_arith_expr(c, CHILD(n, i));
2537 switch (TYPE(CHILD(n, i-1))) {
2538 case LEFTSHIFT:
2539 op = BINARY_LSHIFT;
2540 break;
2541 case RIGHTSHIFT:
2542 op = BINARY_RSHIFT;
2543 break;
2544 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002545 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002546 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002547 op = 255;
2548 }
2549 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002550 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002551 }
2552}
2553
2554static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002555com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002556{
2557 int i;
2558 int op;
2559 REQ(n, and_expr);
2560 com_shift_expr(c, CHILD(n, 0));
2561 for (i = 2; i < NCH(n); i += 2) {
2562 com_shift_expr(c, CHILD(n, i));
2563 if (TYPE(CHILD(n, i-1)) == AMPER) {
2564 op = BINARY_AND;
2565 }
2566 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002567 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002568 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002569 op = 255;
2570 }
2571 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002572 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002573 }
2574}
2575
2576static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002577com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002578{
2579 int i;
2580 int op;
2581 REQ(n, xor_expr);
2582 com_and_expr(c, CHILD(n, 0));
2583 for (i = 2; i < NCH(n); i += 2) {
2584 com_and_expr(c, CHILD(n, i));
2585 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2586 op = BINARY_XOR;
2587 }
2588 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002589 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002590 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002591 op = 255;
2592 }
2593 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002594 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002595 }
2596}
2597
2598static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002599com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002600{
2601 int i;
2602 int op;
2603 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002604 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002605 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002606 com_xor_expr(c, CHILD(n, i));
2607 if (TYPE(CHILD(n, i-1)) == VBAR) {
2608 op = BINARY_OR;
2609 }
2610 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002611 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002612 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002613 op = 255;
2614 }
2615 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002616 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002617 }
2618}
2619
2620static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002621cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002622{
2623 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00002624 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002625 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2626 if (NCH(n) == 1) {
2627 n = CHILD(n, 0);
2628 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002629 case LESS: return PyCmp_LT;
2630 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00002631 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00002632 case LESSEQUAL: return PyCmp_LE;
2633 case GREATEREQUAL: return PyCmp_GE;
2634 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2635 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2636 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002637 }
2638 }
2639 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002640 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002641 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002642 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002643 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002644 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002645 }
2646 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002647 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002648}
2649
2650static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002651com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002652{
2653 int i;
2654 enum cmp_op op;
2655 int anchor;
2656 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2657 com_expr(c, CHILD(n, 0));
2658 if (NCH(n) == 1)
2659 return;
2660
2661 /****************************************************************
2662 The following code is generated for all but the last
2663 comparison in a chain:
2664
2665 label: on stack: opcode: jump to:
2666
2667 a <code to load b>
2668 a, b DUP_TOP
2669 a, b, b ROT_THREE
2670 b, a, b COMPARE_OP
2671 b, 0-or-1 JUMP_IF_FALSE L1
2672 b, 1 POP_TOP
2673 b
2674
2675 We are now ready to repeat this sequence for the next
2676 comparison in the chain.
2677
2678 For the last we generate:
2679
2680 b <code to load c>
2681 b, c COMPARE_OP
2682 0-or-1
2683
2684 If there were any jumps to L1 (i.e., there was more than one
2685 comparison), we generate:
2686
2687 0-or-1 JUMP_FORWARD L2
2688 L1: b, 0 ROT_TWO
2689 0, b POP_TOP
2690 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002691 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002692 ****************************************************************/
2693
2694 anchor = 0;
2695
2696 for (i = 2; i < NCH(n); i += 2) {
2697 com_expr(c, CHILD(n, i));
2698 if (i+2 < NCH(n)) {
2699 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002700 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002701 com_addbyte(c, ROT_THREE);
2702 }
2703 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002704 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002705 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002706 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002707 }
2708 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002709 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002710 if (i+2 < NCH(n)) {
2711 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2712 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002713 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002714 }
2715 }
2716
2717 if (anchor) {
2718 int anchor2 = 0;
2719 com_addfwref(c, JUMP_FORWARD, &anchor2);
2720 com_backpatch(c, anchor);
2721 com_addbyte(c, ROT_TWO);
2722 com_addbyte(c, POP_TOP);
2723 com_backpatch(c, anchor2);
2724 }
2725}
2726
2727static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002728com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002729{
2730 REQ(n, not_test); /* 'not' not_test | comparison */
2731 if (NCH(n) == 1) {
2732 com_comparison(c, CHILD(n, 0));
2733 }
2734 else {
2735 com_not_test(c, CHILD(n, 1));
2736 com_addbyte(c, UNARY_NOT);
2737 }
2738}
2739
2740static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002741com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002742{
2743 int i;
2744 int anchor;
2745 REQ(n, and_test); /* not_test ('and' not_test)* */
2746 anchor = 0;
2747 i = 0;
2748 for (;;) {
2749 com_not_test(c, CHILD(n, i));
2750 if ((i += 2) >= NCH(n))
2751 break;
2752 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2753 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002754 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002755 }
2756 if (anchor)
2757 com_backpatch(c, anchor);
2758}
2759
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002760static int
2761com_make_closure(struct compiling *c, PyCodeObject *co)
2762{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002763 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002764 if (free == 0)
2765 return 0;
2766 for (i = 0; i < free; ++i) {
2767 /* Bypass com_addop_varname because it will generate
2768 LOAD_DEREF but LOAD_CLOSURE is needed.
2769 */
2770 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2771 int arg, reftype;
2772
2773 /* Special case: If a class contains a method with a
2774 free variable that has the same name as a method,
2775 the name will be considered free *and* local in the
2776 class. It should be handled by the closure, as
2777 well as by the normal name loookup logic.
2778 */
2779 reftype = get_ref_type(c, PyString_AS_STRING(name));
2780 if (reftype == CELL)
2781 arg = com_lookup_arg(c->c_cellvars, name);
2782 else /* (reftype == FREE) */
2783 arg = com_lookup_arg(c->c_freevars, name);
2784 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002785 fprintf(stderr, "lookup %s in %s %d %d\n"
2786 "freevars of %s: %s\n",
2787 PyObject_REPR(name),
2788 c->c_name,
2789 reftype, arg,
2790 PyString_AS_STRING(co->co_name),
2791 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002792 Py_FatalError("com_make_closure()");
2793 }
2794 com_addoparg(c, LOAD_CLOSURE, arg);
2795
2796 }
2797 com_push(c, free);
2798 return 1;
2799}
2800
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002801static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002802com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002803{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002804 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002805 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002806 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002807 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002808 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002809 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2810 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002811 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002812 if (co == NULL) {
2813 c->c_errors++;
2814 return;
2815 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002816 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002817 i = com_addconst(c, (PyObject *)co);
2818 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002819 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002820 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002821 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002822 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002823 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002824 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002825 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002826 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002827 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002828 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002829 else {
2830 int anchor = 0;
2831 int i = 0;
2832 for (;;) {
2833 com_and_test(c, CHILD(n, i));
2834 if ((i += 2) >= NCH(n))
2835 break;
2836 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2837 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002838 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002839 }
2840 if (anchor)
2841 com_backpatch(c, anchor);
2842 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002843}
2844
2845static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002846com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002847{
2848 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002849 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002850 com_node(c, CHILD(n, 0));
2851 }
2852 else {
2853 int i;
2854 int len;
2855 len = (NCH(n) + 1) / 2;
2856 for (i = 0; i < NCH(n); i += 2)
2857 com_node(c, CHILD(n, i));
2858 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002859 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002860 }
2861}
2862
2863
2864/* Begin of assignment compilation */
2865
Thomas Wouters434d0822000-08-24 20:11:32 +00002866
2867static void
2868com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2869{
2870 com_addbyte(c, DUP_TOP);
2871 com_push(c, 1);
2872 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002873 com_node(c, augn);
2874 com_addbyte(c, opcode);
2875 com_pop(c, 1);
2876 com_addbyte(c, ROT_TWO);
2877 com_addopname(c, STORE_ATTR, n);
2878 com_pop(c, 2);
2879}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002880
2881static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002882com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002883{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00002884 if (none_assignment_check(c, STR(n), assigning))
2885 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002886 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002887 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002888}
2889
2890static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002891com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002892{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002893 REQ(n, trailer);
2894 switch (TYPE(CHILD(n, 0))) {
2895 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002896 if (assigning == OP_DELETE)
2897 com_error(c, PyExc_SyntaxError,
2898 "can't delete function call");
2899 else
2900 com_error(c, PyExc_SyntaxError,
2901 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002902 break;
2903 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002904 if (assigning > OP_APPLY)
2905 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2906 else
2907 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002908 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002909 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002910 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002911 break;
2912 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002913 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002914 }
2915}
2916
2917static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002918com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002919{
2920 int i;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002921 if (TYPE(n) != testlist && TYPE(n) != testlist_gexp &&
2922 TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002923 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002924 if (assigning) {
2925 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002926 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002927 com_push(c, i-1);
2928 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002929 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002930 com_assign(c, CHILD(n, i), assigning, NULL);
2931}
2932
2933static void
2934com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2935{
2936 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002937 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002938 com_push(c, 1);
2939 com_node(c, augn);
2940 com_addbyte(c, opcode);
2941 com_pop(c, 1);
2942 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002943}
2944
2945static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002946com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002947{
2948 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002949 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002950 if (assigning)
2951 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002952}
2953
2954static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002955com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002956{
2957 /* Loop to avoid trivial recursion */
2958 for (;;) {
2959 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002960
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002961 case exprlist:
2962 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002963 case testlist1:
Raymond Hettinger354433a2004-05-19 08:20:33 +00002964 case testlist_gexp:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002965 if (NCH(n) > 1) {
Raymond Hettinger354433a2004-05-19 08:20:33 +00002966 if (TYPE(CHILD(n, 1)) == gen_for) {
2967 com_error(c, PyExc_SystemError,
2968 "assign to generator expression not possible");
2969 return;
2970 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002971 if (assigning > OP_APPLY) {
2972 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002973 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002974 return;
2975 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002976 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002977 return;
2978 }
2979 n = CHILD(n, 0);
2980 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002981
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002982 case test:
2983 case and_test:
2984 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002985 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002986 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002987 case xor_expr:
2988 case and_expr:
2989 case shift_expr:
2990 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002991 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002992 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002993 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002994 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002995 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002996 return;
2997 }
2998 n = CHILD(n, 0);
2999 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003000
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003001 case power: /* atom trailer* ('**' power)*
3002 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00003003 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003004 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003005 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003006 return;
3007 }
Guido van Rossum50564e81996-01-12 01:13:16 +00003008 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003009 int i;
3010 com_node(c, CHILD(n, 0));
3011 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003012 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003013 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003014 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00003015 return;
3016 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003017 com_apply_trailer(c, CHILD(n, i));
3018 } /* NB i is still alive */
3019 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00003020 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003021 return;
3022 }
3023 n = CHILD(n, 0);
3024 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003025
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003026 case atom:
3027 switch (TYPE(CHILD(n, 0))) {
3028 case LPAR:
3029 n = CHILD(n, 1);
3030 if (TYPE(n) == RPAR) {
3031 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003032 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003033 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003034 return;
3035 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003036 if (assigning > OP_APPLY) {
3037 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003038 "augmented assign to tuple literal not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003039 return;
3040 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003041 break;
3042 case LSQB:
3043 n = CHILD(n, 1);
3044 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003045 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003046 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003047 return;
3048 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003049 if (assigning > OP_APPLY) {
3050 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003051 "augmented assign to list literal not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003052 return;
3053 }
3054 if (NCH(n) > 1
3055 && TYPE(CHILD(n, 1)) == list_for) {
3056 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003057 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00003058 return;
3059 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003060 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003061 return;
3062 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00003063 if (assigning > OP_APPLY)
3064 com_augassign_name(c, CHILD(n, 0),
3065 assigning, augn);
3066 else
3067 com_assign_name(c, CHILD(n, 0),
3068 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003069 return;
3070 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003071 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003072 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003073 return;
3074 }
3075 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003076
3077 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003078 com_error(c, PyExc_SyntaxError,
3079 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003080 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003081
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003082 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003083 com_error(c, PyExc_SystemError,
3084 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003085 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003086
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003087 }
3088 }
3089}
Guido van Rossum7c531111997-03-11 18:42:21 +00003090
Thomas Wouters434d0822000-08-24 20:11:32 +00003091static void
3092com_augassign(struct compiling *c, node *n)
3093{
3094 int opcode;
3095
3096 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
3097 case '+': opcode = INPLACE_ADD; break;
3098 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00003099 case '/':
3100 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
3101 opcode = INPLACE_FLOOR_DIVIDE;
3102 else if (c->c_flags & CO_FUTURE_DIVISION)
3103 opcode = INPLACE_TRUE_DIVIDE;
3104 else
3105 opcode = INPLACE_DIVIDE;
3106 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00003107 case '%': opcode = INPLACE_MODULO; break;
3108 case '<': opcode = INPLACE_LSHIFT; break;
3109 case '>': opcode = INPLACE_RSHIFT; break;
3110 case '&': opcode = INPLACE_AND; break;
3111 case '^': opcode = INPLACE_XOR; break;
3112 case '|': opcode = INPLACE_OR; break;
3113 case '*':
3114 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
3115 opcode = INPLACE_POWER;
3116 else
3117 opcode = INPLACE_MULTIPLY;
3118 break;
3119 default:
3120 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
3121 return;
3122 }
3123 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
3124}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003125
3126static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003127com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003128{
Thomas Wouters434d0822000-08-24 20:11:32 +00003129 REQ(n, expr_stmt);
3130 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003131 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00003132 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003133 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00003134 if (NCH(n) == 1) {
3135 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003136 if (c->c_interactive)
3137 com_addbyte(c, PRINT_EXPR);
3138 else
3139 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003140 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003141 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003142 else if (TYPE(CHILD(n,1)) == augassign)
3143 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003144 else {
3145 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00003146 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003147 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003148 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003149 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003150 com_push(c, 1);
3151 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003152 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003153 }
3154 }
3155}
3156
3157static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003158com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00003159{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003160 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003161 int i;
3162 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003163 if (Py_OptimizeFlag)
3164 return;
3165 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00003166
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003167 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00003168 raise AssertionError [, <message>]
3169
3170 where <message> is the second test, if present.
3171 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003172 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003173 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003174 com_addbyte(c, POP_TOP);
3175 com_pop(c, 1);
3176 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003177 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00003178 com_push(c, 1);
3179 i = NCH(n)/2; /* Either 2 or 4 */
3180 if (i > 1)
3181 com_node(c, CHILD(n, 3));
3182 com_addoparg(c, RAISE_VARARGS, i);
3183 com_pop(c, i);
3184 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003185 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003186 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003187 com_addbyte(c, POP_TOP);
3188}
3189
3190static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003191com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003192{
Barry Warsaw29c574e2000-08-21 15:38:56 +00003193 int i = 1;
3194 node* stream = NULL;
3195
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003196 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003197
3198 /* are we using the extended print form? */
3199 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
3200 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00003201 com_node(c, stream);
3202 /* stack: [...] => [... stream] */
3203 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003204 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3205 i = 4;
3206 else
3207 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003208 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003209 for (; i < NCH(n); i += 2) {
3210 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003211 com_addbyte(c, DUP_TOP);
3212 /* stack: [stream] => [stream stream] */
3213 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003214 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003215 /* stack: [stream stream] => [stream stream obj] */
3216 com_addbyte(c, ROT_TWO);
3217 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003218 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003219 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003220 com_pop(c, 2);
3221 }
3222 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003223 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003224 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003225 com_addbyte(c, PRINT_ITEM);
3226 com_pop(c, 1);
3227 }
3228 }
3229 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003230 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003231 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003232 /* must pop the extra stream object off the stack */
3233 com_addbyte(c, POP_TOP);
3234 /* stack: [... stream] => [...] */
3235 com_pop(c, 1);
3236 }
3237 }
3238 else {
3239 if (stream != NULL) {
3240 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003241 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003242 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003243 com_pop(c, 1);
3244 }
3245 else
3246 com_addbyte(c, PRINT_NEWLINE);
3247 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003248}
3249
3250static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003251com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003252{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003253 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003254 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003255 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003256 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003257 if (c->c_flags & CO_GENERATOR) {
3258 if (NCH(n) > 1) {
3259 com_error(c, PyExc_SyntaxError,
3260 "'return' with argument inside generator");
3261 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003262 }
3263 if (NCH(n) < 2) {
3264 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003265 com_push(c, 1);
3266 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003267 else
3268 com_node(c, CHILD(n, 1));
3269 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003270 com_pop(c, 1);
3271}
3272
3273static void
3274com_yield_stmt(struct compiling *c, node *n)
3275{
Tim Peters95c80f82001-06-23 02:07:08 +00003276 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003277 REQ(n, yield_stmt); /* 'yield' testlist */
3278 if (!c->c_infunction) {
3279 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3280 }
Tim Peters95c80f82001-06-23 02:07:08 +00003281
3282 for (i = 0; i < c->c_nblocks; ++i) {
3283 if (c->c_block[i] == SETUP_FINALLY) {
3284 com_error(c, PyExc_SyntaxError,
3285 "'yield' not allowed in a 'try' block "
3286 "with a 'finally' clause");
3287 return;
3288 }
3289 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003290 com_node(c, CHILD(n, 1));
3291 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003292 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003293}
3294
3295static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003296com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003297{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003298 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003299 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3300 if (NCH(n) > 1) {
3301 com_node(c, CHILD(n, 1));
3302 if (NCH(n) > 3) {
3303 com_node(c, CHILD(n, 3));
3304 if (NCH(n) > 5)
3305 com_node(c, CHILD(n, 5));
3306 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003307 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003308 i = NCH(n)/2;
3309 com_addoparg(c, RAISE_VARARGS, i);
3310 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003311}
3312
3313static void
Thomas Wouters52152252000-08-17 22:55:00 +00003314com_from_import(struct compiling *c, node *n)
3315{
3316 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3317 com_push(c, 1);
3318 if (NCH(n) > 1) {
3319 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3320 com_error(c, PyExc_SyntaxError, "invalid syntax");
3321 return;
3322 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003323 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003324 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003325 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003326 com_pop(c, 1);
3327}
3328
3329static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003330com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003331{
3332 int i;
3333 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003334 /* 'import' dotted_name (',' dotted_name)* |
3335 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003336 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00003337 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003338 /* 'from' dotted_name 'import' ... */
3339 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003340
3341 if (TYPE(CHILD(n, 3)) == STAR) {
3342 tup = Py_BuildValue("(s)", "*");
3343 } else {
3344 tup = PyTuple_New((NCH(n) - 2)/2);
3345 for (i = 3; i < NCH(n); i += 2) {
3346 PyTuple_SET_ITEM(tup, (i-3)/2,
Guido van Rossum633d90c2002-12-23 16:51:42 +00003347 PyString_FromString(STR(
3348 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003349 }
3350 }
3351 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003352 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003353 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003354 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00003355 if (TYPE(CHILD(n, 3)) == STAR)
3356 com_addbyte(c, IMPORT_STAR);
3357 else {
3358 for (i = 3; i < NCH(n); i += 2)
3359 com_from_import(c, CHILD(n, i));
3360 com_addbyte(c, POP_TOP);
3361 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003362 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003363 }
3364 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003365 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003366 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003367 node *subn = CHILD(n, i);
3368 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003369 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003370 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003371 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003372 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003373 int j;
3374 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003375 com_error(c, PyExc_SyntaxError,
3376 "invalid syntax");
3377 return;
3378 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003379 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3380 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003381 CHILD(CHILD(subn, 0),
3382 j));
3383 com_addop_varname(c, VAR_STORE,
3384 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003385 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003386 com_addop_varname(c, VAR_STORE,
3387 STR(CHILD(CHILD(subn, 0),
3388 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003389 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003390 }
3391 }
3392}
3393
3394static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003395com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003396{
3397 REQ(n, exec_stmt);
3398 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3399 com_node(c, CHILD(n, 1));
3400 if (NCH(n) >= 4)
3401 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003402 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003403 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003404 com_push(c, 1);
3405 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003406 if (NCH(n) >= 6)
3407 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003408 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003409 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003410 com_push(c, 1);
3411 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003412 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003413 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003414}
3415
Guido van Rossum7c531111997-03-11 18:42:21 +00003416static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003417is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003418{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003419 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003420 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003421 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003422
3423 /* Label to avoid tail recursion */
3424 next:
3425 switch (TYPE(n)) {
3426
3427 case suite:
3428 if (NCH(n) == 1) {
3429 n = CHILD(n, 0);
3430 goto next;
3431 }
3432 /* Fall through */
3433 case file_input:
3434 for (i = 0; i < NCH(n); i++) {
3435 node *ch = CHILD(n, i);
3436 if (TYPE(ch) == stmt) {
3437 n = ch;
3438 goto next;
3439 }
3440 }
3441 break;
3442
3443 case stmt:
3444 case simple_stmt:
3445 case small_stmt:
3446 n = CHILD(n, 0);
3447 goto next;
3448
3449 case expr_stmt:
3450 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003451 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003452 case test:
3453 case and_test:
3454 case not_test:
3455 case comparison:
3456 case expr:
3457 case xor_expr:
3458 case and_expr:
3459 case shift_expr:
3460 case arith_expr:
3461 case term:
3462 case factor:
3463 case power:
3464 case atom:
3465 if (NCH(n) == 1) {
3466 n = CHILD(n, 0);
3467 goto next;
3468 }
3469 break;
3470
3471 case NAME:
3472 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3473 return 1;
3474 break;
3475
3476 case NUMBER:
3477 v = parsenumber(c, STR(n));
3478 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003479 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003480 break;
3481 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003482 i = PyObject_IsTrue(v);
3483 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003484 return i == 0;
3485
3486 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003487 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003488 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003489 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003490 break;
3491 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003492 i = PyObject_IsTrue(v);
3493 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003494 return i == 0;
3495
3496 }
3497 return 0;
3498}
3499
Tim Peters08a898f2001-06-28 01:52:22 +00003500
3501/* Look under n for a return stmt with an expression.
3502 * This hack is used to find illegal returns under "if 0:" blocks in
3503 * functions already known to be generators (as determined by the symtable
3504 * pass).
3505 * Return the offending return node if found, else NULL.
3506 */
3507static node *
3508look_for_offending_return(node *n)
3509{
3510 int i;
3511
3512 for (i = 0; i < NCH(n); ++i) {
3513 node *kid = CHILD(n, i);
3514
3515 switch (TYPE(kid)) {
3516 case classdef:
3517 case funcdef:
3518 case lambdef:
3519 /* Stuff in nested functions & classes doesn't
3520 affect the code block we started in. */
3521 return NULL;
3522
3523 case return_stmt:
3524 if (NCH(kid) > 1)
3525 return kid;
3526 break;
3527
3528 default: {
3529 node *bad = look_for_offending_return(kid);
3530 if (bad != NULL)
3531 return bad;
3532 }
3533 }
3534 }
3535
3536 return NULL;
3537}
3538
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003539static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003540com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003541{
3542 int i;
3543 int anchor = 0;
3544 REQ(n, if_stmt);
3545 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3546 for (i = 0; i+3 < NCH(n); i+=4) {
3547 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003548 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003549 if (is_constant_false(c, ch)) {
3550 /* We're going to skip this block. However, if this
3551 is a generator, we have to check the dead code
3552 anyway to make sure there aren't any return stmts
3553 with expressions, in the same scope. */
3554 if (c->c_flags & CO_GENERATOR) {
3555 node *p = look_for_offending_return(n);
3556 if (p != NULL) {
3557 int savelineno = c->c_lineno;
3558 c->c_lineno = p->n_lineno;
3559 com_error(c, PyExc_SyntaxError,
3560 "'return' with argument "
3561 "inside generator");
3562 c->c_lineno = savelineno;
3563 }
3564 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003565 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003566 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003567 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003568 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003569 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003570 com_addfwref(c, JUMP_IF_FALSE, &a);
3571 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003572 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003573 com_node(c, CHILD(n, i+3));
3574 com_addfwref(c, JUMP_FORWARD, &anchor);
3575 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003576 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003577 com_addbyte(c, POP_TOP);
3578 }
3579 if (i+2 < NCH(n))
3580 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003581 if (anchor)
3582 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003583}
3584
3585static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003586com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003587{
3588 int break_anchor = 0;
3589 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003590 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003591 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3592 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003593 block_push(c, SETUP_LOOP);
3594 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003595 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003596 com_node(c, CHILD(n, 1));
3597 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3598 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003599 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003600 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003601 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003602 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003603 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3604 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003605 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003606 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003607 com_addbyte(c, POP_TOP);
3608 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003609 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003610 if (NCH(n) > 4)
3611 com_node(c, CHILD(n, 6));
3612 com_backpatch(c, break_anchor);
3613}
3614
3615static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003616com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003617{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003618 int break_anchor = 0;
3619 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003620 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003621 REQ(n, for_stmt);
3622 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3623 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003624 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003625 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003626 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003627 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00003628 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003629 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003630 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003631 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003632 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003633 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003634 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003635 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3636 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003637 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003638 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003639 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003640 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003641 if (NCH(n) > 8)
3642 com_node(c, CHILD(n, 8));
3643 com_backpatch(c, break_anchor);
3644}
3645
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003646/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003647
3648 SETUP_FINALLY L
3649 <code for S>
3650 POP_BLOCK
3651 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003652 L: <code for Sf>
3653 END_FINALLY
3654
3655 The special instructions use the block stack. Each block
3656 stack entry contains the instruction that created it (here
3657 SETUP_FINALLY), the level of the value stack at the time the
3658 block stack entry was created, and a label (here L).
3659
3660 SETUP_FINALLY:
3661 Pushes the current value stack level and the label
3662 onto the block stack.
3663 POP_BLOCK:
3664 Pops en entry from the block stack, and pops the value
3665 stack until its level is the same as indicated on the
3666 block stack. (The label is ignored.)
3667 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003668 Pops a variable number of entries from the *value* stack
3669 and re-raises the exception they specify. The number of
3670 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003671
3672 The block stack is unwound when an exception is raised:
3673 when a SETUP_FINALLY entry is found, the exception is pushed
3674 onto the value stack (and the exception condition is cleared),
3675 and the interpreter jumps to the label gotten from the block
3676 stack.
3677
3678 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003679 (The contents of the value stack is shown in [], with the top
3680 at the right; 'tb' is trace-back info, 'val' the exception's
3681 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003682
3683 Value stack Label Instruction Argument
3684 [] SETUP_EXCEPT L1
3685 [] <code for S>
3686 [] POP_BLOCK
3687 [] JUMP_FORWARD L0
3688
Guido van Rossum3f5da241990-12-20 15:06:42 +00003689 [tb, val, exc] L1: DUP )
3690 [tb, val, exc, exc] <evaluate E1> )
3691 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3692 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3693 [tb, val, exc, 1] POP )
3694 [tb, val, exc] POP
3695 [tb, val] <assign to V1> (or POP if no V1)
3696 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003697 [] <code for S1>
3698 JUMP_FORWARD L0
3699
Guido van Rossum3f5da241990-12-20 15:06:42 +00003700 [tb, val, exc, 0] L2: POP
3701 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003702 .............................etc.......................
3703
Guido van Rossum3f5da241990-12-20 15:06:42 +00003704 [tb, val, exc, 0] Ln+1: POP
3705 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003706
3707 [] L0: <next statement>
3708
3709 Of course, parts are not generated if Vi or Ei is not present.
3710*/
3711
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003712static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003713com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003714{
3715 int except_anchor = 0;
3716 int end_anchor = 0;
3717 int else_anchor = 0;
3718 int i;
3719 node *ch;
3720
3721 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3722 block_push(c, SETUP_EXCEPT);
3723 com_node(c, CHILD(n, 2));
3724 com_addbyte(c, POP_BLOCK);
3725 block_pop(c, SETUP_EXCEPT);
3726 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3727 com_backpatch(c, except_anchor);
3728 for (i = 3;
3729 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3730 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003731 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003732 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003733 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003734 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003735 break;
3736 }
3737 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003738 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003739 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003740 if (NCH(ch) > 1) {
3741 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003742 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003743 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003744 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003745 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003746 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3747 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003748 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003749 }
3750 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003751 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003752 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003753 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003754 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003755 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003756 com_pop(c, 1);
3757 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003758 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003759 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003760 com_node(c, CHILD(n, i+2));
3761 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3762 if (except_anchor) {
3763 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003764 /* We come in with [tb, val, exc, 0] on the
3765 stack; one pop and it's the same as
3766 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003767 com_addbyte(c, POP_TOP);
3768 }
3769 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003770 /* We actually come in here with [tb, val, exc] but the
3771 END_FINALLY will zap those and jump around.
3772 The c_stacklevel does not reflect them so we need not pop
3773 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003774 com_addbyte(c, END_FINALLY);
3775 com_backpatch(c, else_anchor);
3776 if (i < NCH(n))
3777 com_node(c, CHILD(n, i+2));
3778 com_backpatch(c, end_anchor);
3779}
3780
3781static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003782com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003783{
3784 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003785 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003786
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003787 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3788 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003789 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003790 com_addbyte(c, POP_BLOCK);
3791 block_pop(c, SETUP_FINALLY);
3792 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003793 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003794 /* While the generated code pushes only one item,
3795 the try-finally handling can enter here with
3796 up to three items. OK, here are the details:
3797 3 for an exception, 2 for RETURN, 1 for BREAK. */
3798 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003799 com_backpatch(c, finally_anchor);
3800 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003801 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003802 com_node(c, ch);
3803 com_addbyte(c, END_FINALLY);
3804 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003805 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003806}
3807
3808static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003809com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003810{
3811 REQ(n, try_stmt);
3812 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3813 | 'try' ':' suite 'finally' ':' suite */
3814 if (TYPE(CHILD(n, 3)) != except_clause)
3815 com_try_finally(c, n);
3816 else
3817 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003818}
3819
Guido van Rossum8b993a91997-01-17 21:04:03 +00003820static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003821get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003822{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003823 int i;
3824
Guido van Rossum8b993a91997-01-17 21:04:03 +00003825 /* Label to avoid tail recursion */
3826 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003827 switch (TYPE(n)) {
3828
3829 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003830 if (NCH(n) == 1) {
3831 n = CHILD(n, 0);
3832 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003833 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003834 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003835 case file_input:
3836 for (i = 0; i < NCH(n); i++) {
3837 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003838 if (TYPE(ch) == stmt) {
3839 n = ch;
3840 goto next;
3841 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003842 }
3843 break;
3844
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003845 case stmt:
3846 case simple_stmt:
3847 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003848 n = CHILD(n, 0);
3849 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003850
3851 case expr_stmt:
3852 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003853 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003854 case test:
3855 case and_test:
3856 case not_test:
3857 case comparison:
3858 case expr:
3859 case xor_expr:
3860 case and_expr:
3861 case shift_expr:
3862 case arith_expr:
3863 case term:
3864 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003865 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003866 if (NCH(n) == 1) {
3867 n = CHILD(n, 0);
3868 goto next;
3869 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003870 break;
3871
3872 case atom:
3873 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003874 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003875 break;
3876
3877 }
3878 return NULL;
3879}
3880
Guido van Rossum79f25d91997-04-29 20:08:16 +00003881static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003882get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003883{
Guido van Rossum541563e1999-01-28 15:08:09 +00003884 /* Don't generate doc-strings if run with -OO */
3885 if (Py_OptimizeFlag > 1)
3886 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003887 n = get_rawdocstring(n);
3888 if (n == NULL)
3889 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003890 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003891}
3892
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003893static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003894com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003895{
3896 REQ(n, suite);
3897 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3898 if (NCH(n) == 1) {
3899 com_node(c, CHILD(n, 0));
3900 }
3901 else {
3902 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003903 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003904 node *ch = CHILD(n, i);
3905 if (TYPE(ch) == stmt)
3906 com_node(c, ch);
3907 }
3908 }
3909}
3910
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003911/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003912static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003913com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003914{
3915 int i = c->c_nblocks;
3916 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3917 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3918 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003919 else if (i <= 0) {
3920 /* at the outer level */
3921 com_error(c, PyExc_SyntaxError,
3922 "'continue' not properly in loop");
3923 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003924 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003925 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003926 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003927 if (c->c_block[j] == SETUP_LOOP)
3928 break;
3929 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003930 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003931 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003932 for (; i > j; --i) {
3933 if (c->c_block[i] == SETUP_EXCEPT ||
3934 c->c_block[i] == SETUP_FINALLY) {
3935 com_addoparg(c, CONTINUE_LOOP,
3936 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003937 return;
3938 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003939 if (c->c_block[i] == END_FINALLY) {
3940 com_error(c, PyExc_SyntaxError,
3941 "'continue' not supported inside 'finally' clause");
3942 return;
3943 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003944 }
3945 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003946 com_error(c, PyExc_SyntaxError,
3947 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003948 }
3949 /* XXX Could allow it inside a 'finally' clause
3950 XXX if we could pop the exception still on the stack */
3951}
3952
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003953/* Return the number of default values in the argument list.
3954
3955 If a non-default argument follows a default argument, set an
3956 exception and return -1.
3957*/
3958
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003959static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003960com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003961{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003962 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003963 if (TYPE(n) == lambdef) {
3964 /* lambdef: 'lambda' [varargslist] ':' test */
3965 n = CHILD(n, 1);
3966 }
3967 else {
3968 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3969 n = CHILD(n, 2);
3970 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3971 n = CHILD(n, 1);
3972 }
3973 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003974 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003975 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003976 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003977 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3978 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003979 ndefs = 0;
3980 for (i = 0; i < nch; i++) {
3981 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003982 if (TYPE(CHILD(n, i)) == STAR ||
3983 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003984 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003985 i++;
3986 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003987 t = RPAR; /* Anything except EQUAL or COMMA */
3988 else
3989 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003990 if (t == EQUAL) {
3991 i++;
3992 ndefs++;
3993 com_node(c, CHILD(n, i));
3994 i++;
3995 if (i >= nch)
3996 break;
3997 t = TYPE(CHILD(n, i));
3998 }
3999 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004000 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004001 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004002 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00004003 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004004 return -1;
4005 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004006 }
4007 if (t != COMMA)
4008 break;
4009 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004010 return ndefs;
4011}
4012
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004013static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004014com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004015{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004016 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004017 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004018 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004019 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004020 if (ndefs < 0)
4021 return;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004022 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
4023 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004024 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004025 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004026 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004027 c->c_errors++;
4028 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004029 int closure = com_make_closure(c, (PyCodeObject *)co);
4030 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004031 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004032 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004033 if (closure)
4034 com_addoparg(c, MAKE_CLOSURE, ndefs);
4035 else
4036 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004037 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004038 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004039 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004040 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004041 }
4042}
4043
4044static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004045com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004046{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004047 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004048 REQ(n, testlist);
4049 /* testlist: test (',' test)* [','] */
4050 for (i = 0; i < NCH(n); i += 2)
4051 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004052 i = (NCH(n)+1) / 2;
4053 com_addoparg(c, BUILD_TUPLE, i);
4054 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004055}
4056
4057static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004058com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004059{
Guido van Rossum25831651993-05-19 14:50:45 +00004060 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004061 PyObject *v;
4062 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004063 char *name;
4064
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004065 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004066 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004067 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004068 c->c_errors++;
4069 return;
4070 }
4071 /* Push the class name on the stack */
4072 i = com_addconst(c, v);
4073 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004074 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004075 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004076 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004077 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004078 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004079 com_push(c, 1);
4080 }
Guido van Rossum25831651993-05-19 14:50:45 +00004081 else
4082 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004083 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004084 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004085 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004086 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004087 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004088 c->c_errors++;
4089 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004090 int closure = com_make_closure(c, co);
4091 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004092 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004093 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004094 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004095 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004096 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004097 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004098 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004099 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004100 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004101 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004102 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004103 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004104 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004105 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004106}
4107
4108static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004109com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004110{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004111 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004112 if (c->c_errors)
4113 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004114 switch (TYPE(n)) {
4115
4116 /* Definition nodes */
4117
4118 case funcdef:
4119 com_funcdef(c, n);
4120 break;
4121 case classdef:
4122 com_classdef(c, n);
4123 break;
4124
4125 /* Trivial parse tree nodes */
4126
4127 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004128 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004129 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004130 n = CHILD(n, 0);
4131 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004132
4133 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004134 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004135 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004136 {
4137 int i;
4138 for (i = 0; i < NCH(n)-1; i += 2)
4139 com_node(c, CHILD(n, i));
4140 }
4141 break;
4142
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004143 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004144 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004145 n = CHILD(n, 0);
4146 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004147
4148 /* Statement nodes */
4149
4150 case expr_stmt:
4151 com_expr_stmt(c, n);
4152 break;
4153 case print_stmt:
4154 com_print_stmt(c, n);
4155 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004156 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004157 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004158 break;
4159 case pass_stmt:
4160 break;
4161 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004162 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004163 com_error(c, PyExc_SyntaxError,
4164 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004165 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004166 com_addbyte(c, BREAK_LOOP);
4167 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004168 case continue_stmt:
4169 com_continue_stmt(c, n);
4170 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004171 case return_stmt:
4172 com_return_stmt(c, n);
4173 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004174 case yield_stmt:
4175 com_yield_stmt(c, n);
4176 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004177 case raise_stmt:
4178 com_raise_stmt(c, n);
4179 break;
4180 case import_stmt:
4181 com_import_stmt(c, n);
4182 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004183 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004184 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004185 case exec_stmt:
4186 com_exec_stmt(c, n);
4187 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004188 case assert_stmt:
4189 com_assert_stmt(c, n);
4190 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004191 case if_stmt:
4192 com_if_stmt(c, n);
4193 break;
4194 case while_stmt:
4195 com_while_stmt(c, n);
4196 break;
4197 case for_stmt:
4198 com_for_stmt(c, n);
4199 break;
4200 case try_stmt:
4201 com_try_stmt(c, n);
4202 break;
4203 case suite:
4204 com_suite(c, n);
4205 break;
4206
4207 /* Expression nodes */
4208
4209 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004210 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004211 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004212 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004213 break;
4214 case test:
4215 com_test(c, n);
4216 break;
4217 case and_test:
4218 com_and_test(c, n);
4219 break;
4220 case not_test:
4221 com_not_test(c, n);
4222 break;
4223 case comparison:
4224 com_comparison(c, n);
4225 break;
4226 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004227 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004228 break;
4229 case expr:
4230 com_expr(c, n);
4231 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004232 case xor_expr:
4233 com_xor_expr(c, n);
4234 break;
4235 case and_expr:
4236 com_and_expr(c, n);
4237 break;
4238 case shift_expr:
4239 com_shift_expr(c, n);
4240 break;
4241 case arith_expr:
4242 com_arith_expr(c, n);
4243 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004244 case term:
4245 com_term(c, n);
4246 break;
4247 case factor:
4248 com_factor(c, n);
4249 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004250 case power:
4251 com_power(c, n);
4252 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004253 case atom:
4254 com_atom(c, n);
4255 break;
4256
4257 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004258 com_error(c, PyExc_SystemError,
4259 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004260 }
4261}
4262
Tim Petersdbd9ba62000-07-09 03:09:57 +00004263static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004264
4265static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004266com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004267{
4268 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4269 if (TYPE(CHILD(n, 0)) == LPAR)
4270 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004271 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004272 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004273 com_pop(c, 1);
4274 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004275}
4276
4277static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004278com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004279{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004280 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004281 if (NCH(n) == 1) {
4282 com_fpdef(c, CHILD(n, 0));
4283 }
4284 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004285 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004286 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004287 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004288 for (i = 0; i < NCH(n); i += 2)
4289 com_fpdef(c, CHILD(n, i));
4290 }
4291}
4292
4293static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004294com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004295{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004296 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004297 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004298 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004299 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004300 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004301 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004302 nch = NCH(n);
4303 /* Enter all arguments in table of locals */
4304 for (i = 0, narg = 0; i < nch; i++) {
4305 node *ch = CHILD(n, i);
4306 node *fp;
4307 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004308 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004309 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4310 fp = CHILD(ch, 0);
4311 if (TYPE(fp) != NAME) {
4312 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4313 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004314 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004315 narg++;
4316 /* all name updates handled by symtable */
4317 if (++i >= nch)
4318 break;
4319 ch = CHILD(n, i);
4320 if (TYPE(ch) == EQUAL)
4321 i += 2;
4322 else
4323 REQ(ch, COMMA);
4324 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004325 if (complex) {
4326 /* Generate code for complex arguments only after
4327 having counted the simple arguments */
4328 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004329 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004330 node *ch = CHILD(n, i);
4331 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004332 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004333 break;
4334 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4335 fp = CHILD(ch, 0);
4336 if (TYPE(fp) != NAME) {
4337 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004338 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004339 com_fpdef(c, ch);
4340 }
4341 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004342 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004343 break;
4344 ch = CHILD(n, i);
4345 if (TYPE(ch) == EQUAL)
4346 i += 2;
4347 else
4348 REQ(ch, COMMA);
4349 }
4350 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004351}
4352
4353static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004354com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004355{
4356 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004357 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004358 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004359 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004360 if (doc != NULL) {
4361 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004362 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004363 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004364 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004365 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004366 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004367 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004368 for (i = 0; i < NCH(n); i++) {
4369 node *ch = CHILD(n, i);
4370 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4371 com_node(c, ch);
4372 }
4373}
4374
4375/* Top-level compile-node interface */
4376
4377static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004378compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004379{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004380 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004381 node *ch;
4382 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00004383 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004384 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004385 if (doc != NULL) {
4386 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004387 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004388 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004389 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004390 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004391 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
4392 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004393 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004394 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004395 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004396 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004397 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004398 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004399 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4400 com_push(c, 1);
4401 com_addbyte(c, RETURN_VALUE);
4402 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004403}
4404
4405static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004406compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004407{
Guido van Rossum590baa41993-11-30 13:40:46 +00004408 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004409 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004410 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004411
4412 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004413 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004414 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004415 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004416 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004417 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004418 else
4419 ch = CHILD(n, 2);
4420 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004421 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004422 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004423}
4424
4425static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004426compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004427{
4428 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004429 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004430 REQ(n, classdef);
4431 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4432 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004433 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004434 /* Initialize local __module__ from global __name__ */
4435 com_addop_name(c, LOAD_GLOBAL, "__name__");
4436 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004437 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004438 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004439 if (doc != NULL) {
4440 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004441 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004442 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004443 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004444 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004445 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004446 }
4447 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004448 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004449 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00004450 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004451 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004452 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004453 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004454 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004455}
4456
4457static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00004458compile_generator_expression(struct compiling *c, node *n)
4459{
4460 /* testlist_gexp: test gen_for */
4461 /* argument: test gen_for */
4462 REQ(CHILD(n, 0), test);
4463 REQ(CHILD(n, 1), gen_for);
4464
4465 c->c_name = "<generator expression>";
4466 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
4467
4468 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4469 com_push(c, 1);
4470 com_addbyte(c, RETURN_VALUE);
4471 com_pop(c, 1);
4472}
4473
4474static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004475compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004476{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004477 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004478
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004479 switch (TYPE(n)) {
4480
Guido van Rossum4c417781991-01-21 16:09:22 +00004481 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004482 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004483 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004484 n = CHILD(n, 0);
4485 if (TYPE(n) != NEWLINE)
4486 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004487 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004488 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4489 com_push(c, 1);
4490 com_addbyte(c, RETURN_VALUE);
4491 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004492 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004493 break;
4494
Guido van Rossum4c417781991-01-21 16:09:22 +00004495 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004496 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004497 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004498 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4499 com_push(c, 1);
4500 com_addbyte(c, RETURN_VALUE);
4501 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004502 break;
4503
Guido van Rossum590baa41993-11-30 13:40:46 +00004504 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004505 com_node(c, CHILD(n, 0));
4506 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004507 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004508 break;
4509
Guido van Rossum590baa41993-11-30 13:40:46 +00004510 case lambdef: /* anonymous function definition */
4511 compile_lambdef(c, n);
4512 break;
4513
Guido van Rossum4c417781991-01-21 16:09:22 +00004514 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004515 compile_funcdef(c, n);
4516 break;
4517
Guido van Rossum4c417781991-01-21 16:09:22 +00004518 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004519 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004520 break;
4521
Raymond Hettinger354433a2004-05-19 08:20:33 +00004522 case testlist_gexp: /* A generator expression */
4523 case argument: /* A generator expression */
4524 compile_generator_expression(c, n);
4525 break;
4526
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004527 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004528 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004529 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004530 }
4531}
4532
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004533static PyObject *
4534dict_keys_inorder(PyObject *dict, int offset)
4535{
4536 PyObject *tuple, *k, *v;
4537 int i, pos = 0, size = PyDict_Size(dict);
4538
4539 tuple = PyTuple_New(size);
4540 if (tuple == NULL)
4541 return NULL;
4542 while (PyDict_Next(dict, &pos, &k, &v)) {
4543 i = PyInt_AS_LONG(v);
4544 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004545 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004546 PyTuple_SET_ITEM(tuple, i - offset, k);
4547 }
4548 return tuple;
4549}
4550
Guido van Rossum79f25d91997-04-29 20:08:16 +00004551PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004552PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004553{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004554 return PyNode_CompileFlags(n, filename, NULL);
4555}
4556
4557PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004558PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004559{
4560 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004561}
4562
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004563struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004564PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004565{
4566 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004567 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004568
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004569 ff = PyNode_Future(n, filename);
4570 if (ff == NULL)
4571 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004572 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00004573 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004574 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004575 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004576 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004577 return st;
4578}
4579
Guido van Rossum79f25d91997-04-29 20:08:16 +00004580static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004581icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004582{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004583 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004584}
4585
Guido van Rossum79f25d91997-04-29 20:08:16 +00004586static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004587jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004588 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004589{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004590 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004591 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004592 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004593 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004594 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4595 sc.c_encoding = "utf-8";
4596 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004597 sc.c_encoding = STR(n);
4598 n = CHILD(n, 0);
4599 } else {
4600 sc.c_encoding = NULL;
4601 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004602 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004603 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004604 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004605 /* c_symtable still points to parent's symbols */
4606 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004607 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004608 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004609 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004610 if (base->c_encoding != NULL) {
4611 assert(sc.c_encoding == NULL);
4612 sc.c_encoding = base->c_encoding;
4613 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004614 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004615 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004616 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004617 if (sc.c_future == NULL) {
4618 com_free(&sc);
4619 return NULL;
4620 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004621 if (flags) {
4622 int merged = sc.c_future->ff_features |
4623 flags->cf_flags;
4624 sc.c_future->ff_features = merged;
4625 flags->cf_flags = merged;
4626 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004627 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
4628 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004629 com_free(&sc);
4630 return NULL;
4631 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004632 /* reset symbol table for second pass */
4633 sc.c_symtable->st_nscopes = 1;
4634 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004635 }
4636 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004637 if (symtable_load_symbols(&sc) < 0) {
4638 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004639 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004640 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004641 compile_node(&sc, n);
4642 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004643 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004644 PyObject *consts, *names, *varnames, *filename, *name,
4645 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004646 consts = PyList_AsTuple(sc.c_consts);
4647 names = PyList_AsTuple(sc.c_names);
4648 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004649 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4650 freevars = dict_keys_inorder(sc.c_freevars,
4651 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004652 filename = PyString_InternFromString(sc.c_filename);
4653 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004654 if (!PyErr_Occurred())
4655 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004656 sc.c_nlocals,
4657 sc.c_maxstacklevel,
4658 sc.c_flags,
4659 sc.c_code,
4660 consts,
4661 names,
4662 varnames,
4663 freevars,
4664 cellvars,
4665 filename,
4666 name,
4667 sc.c_firstlineno,
4668 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004669 Py_XDECREF(consts);
4670 Py_XDECREF(names);
4671 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004672 Py_XDECREF(freevars);
4673 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004674 Py_XDECREF(filename);
4675 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004676 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004677 else if (!PyErr_Occurred()) {
4678 /* This could happen if someone called PyErr_Clear() after an
4679 error was reported above. That's not supposed to happen,
4680 but I just plugged one case and I'm not sure there can't be
4681 others. In that case, raise SystemError so that at least
4682 it gets reported instead dumping core. */
4683 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4684 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004685 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004686 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004687 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004688 sc.c_symtable = NULL;
4689 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004690 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004691 return co;
4692}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004693
4694int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004695PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004696{
4697 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004698 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004699 int line = co->co_firstlineno;
4700 int addr = 0;
4701 while (--size >= 0) {
4702 addr += *p++;
4703 if (addr > addrq)
4704 break;
4705 line += *p++;
4706 }
4707 return line;
4708}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004709
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004710/* The test for LOCAL must come before the test for FREE in order to
4711 handle classes where name is both local and free. The local var is
4712 a method and the free var is a free var referenced within a method.
4713*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004714
4715static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004716get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004717{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004718 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004719 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004720
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004721 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4722 return CELL;
4723 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4724 return LOCAL;
4725 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4726 return FREE;
4727 v = PyDict_GetItemString(c->c_globals, name);
4728 if (v) {
4729 if (v == Py_None)
4730 return GLOBAL_EXPLICIT;
4731 else {
4732 return GLOBAL_IMPLICIT;
4733 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004734 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004735 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004736 "unknown scope for %.100s in %.100s(%s) "
4737 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4738 name, c->c_name,
4739 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4740 c->c_filename,
4741 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4742 PyObject_REPR(c->c_locals),
4743 PyObject_REPR(c->c_globals)
4744 );
4745
4746 Py_FatalError(buf);
4747 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004748}
4749
Guido van Rossum207fda62001-03-02 03:30:41 +00004750/* Helper functions to issue warnings */
4751
4752static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004753issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004754{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004755 if (PyErr_Occurred()) {
4756 /* This can happen because symtable_node continues
4757 processing even after raising a SyntaxError.
4758 Calling PyErr_WarnExplicit now would clobber the
4759 pending exception; instead we fail and let that
4760 exception propagate.
4761 */
4762 return -1;
4763 }
Guido van Rossum207fda62001-03-02 03:30:41 +00004764 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4765 lineno, NULL, NULL) < 0) {
4766 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4767 PyErr_SetString(PyExc_SyntaxError, msg);
4768 PyErr_SyntaxLocation(filename, lineno);
4769 }
4770 return -1;
4771 }
4772 return 0;
4773}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004774
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004775static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004776symtable_warn(struct symtable *st, char *msg)
4777{
Guido van Rossum207fda62001-03-02 03:30:41 +00004778 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004779 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004780 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004781 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004782 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004783}
4784
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004785/* Helper function for setting lineno and filename */
4786
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004787static struct symtable *
4788symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004789{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004790 struct symtable *st;
4791
4792 st = symtable_init();
4793 if (st == NULL)
4794 return NULL;
4795 st->st_future = ff;
4796 st->st_filename = filename;
4797 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
4798 if (st->st_errors > 0)
4799 goto fail;
4800 symtable_node(st, n);
4801 if (st->st_errors > 0)
4802 goto fail;
4803 return st;
4804 fail:
4805 if (!PyErr_Occurred()) {
4806 /* This could happen because after a syntax error is
4807 detected, the symbol-table-building continues for
4808 a while, and PyErr_Clear() might erroneously be
4809 called during that process. One such case has been
4810 fixed, but there might be more (now or later).
4811 */
4812 PyErr_SetString(PyExc_SystemError, "lost exception");
4813 }
4814 st->st_future = NULL;
4815 st->st_filename = NULL;
4816 PySymtable_Free(st);
4817 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004818}
4819
4820static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004821symtable_init_compiling_symbols(struct compiling *c)
4822{
4823 PyObject *varnames;
4824
4825 varnames = c->c_symtable->st_cur->ste_varnames;
4826 if (varnames == NULL) {
4827 varnames = PyList_New(0);
4828 if (varnames == NULL)
4829 return -1;
4830 c->c_symtable->st_cur->ste_varnames = varnames;
4831 Py_INCREF(varnames);
4832 } else
4833 Py_INCREF(varnames);
4834 c->c_varnames = varnames;
4835
4836 c->c_globals = PyDict_New();
4837 if (c->c_globals == NULL)
4838 return -1;
4839 c->c_freevars = PyDict_New();
4840 if (c->c_freevars == NULL)
4841 return -1;
4842 c->c_cellvars = PyDict_New();
4843 if (c->c_cellvars == NULL)
4844 return -1;
4845 return 0;
4846}
4847
4848struct symbol_info {
4849 int si_nlocals;
4850 int si_ncells;
4851 int si_nfrees;
4852 int si_nimplicit;
4853};
4854
4855static void
4856symtable_init_info(struct symbol_info *si)
4857{
4858 si->si_nlocals = 0;
4859 si->si_ncells = 0;
4860 si->si_nfrees = 0;
4861 si->si_nimplicit = 0;
4862}
4863
4864static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004865symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004866 struct symbol_info *si)
4867{
4868 PyObject *dict, *v;
4869
4870 /* Seperate logic for DEF_FREE. If it occurs in a function,
4871 it indicates a local that we must allocate storage for (a
4872 cell var). If it occurs in a class, then the class has a
4873 method and a free variable with the same name.
4874 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004875 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004876 /* If it isn't declared locally, it can't be a cell. */
4877 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4878 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004879 v = PyInt_FromLong(si->si_ncells++);
4880 dict = c->c_cellvars;
4881 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004882 /* If it is free anyway, then there is no need to do
4883 anything here.
4884 */
4885 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004886 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004887 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004888 v = PyInt_FromLong(si->si_nfrees++);
4889 dict = c->c_freevars;
4890 }
4891 if (v == NULL)
4892 return -1;
4893 if (PyDict_SetItem(dict, name, v) < 0) {
4894 Py_DECREF(v);
4895 return -1;
4896 }
4897 Py_DECREF(v);
4898 return 0;
4899}
4900
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004901/* If a variable is a cell and an argument, make sure that appears in
4902 co_cellvars before any variable to its right in varnames.
4903*/
4904
4905
4906static int
4907symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4908 PyObject *varnames, int flags)
4909{
Tim Petersb39903b2003-03-24 17:22:24 +00004910 PyObject *v = NULL;
4911 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004912 int i, pos;
4913
4914 if (flags & CO_VARARGS)
4915 argcount++;
4916 if (flags & CO_VARKEYWORDS)
4917 argcount++;
4918 for (i = argcount; --i >= 0; ) {
4919 v = PyList_GET_ITEM(varnames, i);
4920 if (PyDict_GetItem(*cellvars, v)) {
4921 if (list == NULL) {
4922 list = PyList_New(1);
4923 if (list == NULL)
4924 return -1;
4925 PyList_SET_ITEM(list, 0, v);
4926 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004927 } else {
4928 if (PyList_Insert(list, 0, v) < 0) {
4929 Py_DECREF(list);
4930 return -1;
4931 }
4932 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004933 }
4934 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00004935 if (list == NULL)
4936 return 0;
4937
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004938 /* There are cellvars that are also arguments. Create a dict
4939 to replace cellvars and put the args at the front.
4940 */
4941 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004942 if (d == NULL)
4943 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004944 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4945 v = PyInt_FromLong(i);
4946 if (v == NULL)
4947 goto fail;
4948 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4949 goto fail;
4950 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4951 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00004952 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004953 }
4954 pos = 0;
4955 i = PyList_GET_SIZE(list);
4956 Py_DECREF(list);
4957 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4958 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004959 if (w == NULL)
4960 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004961 if (PyDict_SetItem(d, v, w) < 0) {
4962 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00004963 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004964 goto fail;
4965 }
4966 Py_DECREF(w);
4967 }
4968 Py_DECREF(*cellvars);
4969 *cellvars = d;
4970 return 1;
4971 fail:
4972 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00004973 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004974 return -1;
4975}
4976
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004977static int
4978symtable_freevar_offsets(PyObject *freevars, int offset)
4979{
4980 PyObject *name, *v;
4981 int pos;
4982
4983 /* The cell vars are the first elements of the closure,
4984 followed by the free vars. Update the offsets in
4985 c_freevars to account for number of cellvars. */
4986 pos = 0;
4987 while (PyDict_Next(freevars, &pos, &name, &v)) {
4988 int i = PyInt_AS_LONG(v) + offset;
4989 PyObject *o = PyInt_FromLong(i);
4990 if (o == NULL)
4991 return -1;
4992 if (PyDict_SetItem(freevars, name, o) < 0) {
4993 Py_DECREF(o);
4994 return -1;
4995 }
4996 Py_DECREF(o);
4997 }
4998 return 0;
4999}
5000
5001static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005002symtable_check_unoptimized(struct compiling *c,
5003 PySymtableEntryObject *ste,
5004 struct symbol_info *si)
5005{
5006 char buf[300];
5007
5008 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
5009 || (ste->ste_nested && si->si_nimplicit)))
5010 return 0;
5011
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005012#define ILLEGAL_CONTAINS "contains a nested function with free variables"
5013
5014#define ILLEGAL_IS "is a nested function"
5015
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005016#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005017"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005018
5019#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005020"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005021
5022#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005023"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005024"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005025
5026 /* XXX perhaps the linenos for these opt-breaking statements
5027 should be stored so the exception can point to them. */
5028
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005029 if (ste->ste_child_free) {
5030 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005031 PyOS_snprintf(buf, sizeof(buf),
5032 ILLEGAL_IMPORT_STAR,
5033 PyString_AS_STRING(ste->ste_name),
5034 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005035 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005036 PyOS_snprintf(buf, sizeof(buf),
5037 ILLEGAL_BARE_EXEC,
5038 PyString_AS_STRING(ste->ste_name),
5039 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005040 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005041 PyOS_snprintf(buf, sizeof(buf),
5042 ILLEGAL_EXEC_AND_IMPORT_STAR,
5043 PyString_AS_STRING(ste->ste_name),
5044 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005045 }
5046 } else {
5047 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005048 PyOS_snprintf(buf, sizeof(buf),
5049 ILLEGAL_IMPORT_STAR,
5050 PyString_AS_STRING(ste->ste_name),
5051 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005052 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005053 PyOS_snprintf(buf, sizeof(buf),
5054 ILLEGAL_BARE_EXEC,
5055 PyString_AS_STRING(ste->ste_name),
5056 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005057 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005058 PyOS_snprintf(buf, sizeof(buf),
5059 ILLEGAL_EXEC_AND_IMPORT_STAR,
5060 PyString_AS_STRING(ste->ste_name),
5061 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005062 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005063 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005064
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005065 PyErr_SetString(PyExc_SyntaxError, buf);
5066 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5067 ste->ste_opt_lineno);
5068 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005069}
5070
5071static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005072symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5073 struct symbol_info *si)
5074{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005075 if (c->c_future)
5076 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005077 if (ste->ste_generator)
5078 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005079 if (ste->ste_type != TYPE_MODULE)
5080 c->c_flags |= CO_NEWLOCALS;
5081 if (ste->ste_type == TYPE_FUNCTION) {
5082 c->c_nlocals = si->si_nlocals;
5083 if (ste->ste_optimized == 0)
5084 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005085 else if (ste->ste_optimized != OPT_EXEC)
5086 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005087 }
5088 return 0;
5089}
5090
5091static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005092symtable_error(struct symtable *st, int lineno)
5093{
5094 if (lineno == 0)
5095 lineno = st->st_cur->ste_lineno;
5096 PyErr_SyntaxLocation(st->st_filename, lineno);
5097 st->st_errors++;
5098 return -1;
5099}
5100
5101static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005102symtable_load_symbols(struct compiling *c)
5103{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005104 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005105 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005106 PyObject *name, *varnames, *v;
5107 int i, flags, pos;
5108 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005109
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005110 v = NULL;
5111
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005112 if (symtable_init_compiling_symbols(c) < 0)
5113 goto fail;
5114 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005115 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005116 si.si_nlocals = PyList_GET_SIZE(varnames);
5117 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005118
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005119 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005120 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005121 if (v == NULL)
5122 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005123 if (PyDict_SetItem(c->c_locals,
5124 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005125 goto fail;
5126 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005127 }
5128
5129 /* XXX The cases below define the rules for whether a name is
5130 local or global. The logic could probably be clearer. */
5131 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005132 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5133 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005134
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005135 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005136 /* undo the original DEF_FREE */
5137 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005138
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005139 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005140 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005141 2. Free variables in methods that are also class
5142 variables or declared global.
5143 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005144 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005145 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005146
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005147 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005148 c->c_argcount--;
5149 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005150 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005151 c->c_argcount--;
5152 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005153 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005154 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005155 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005156 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005157 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005158 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005159 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005160 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005161 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005162 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5163 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005164 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005165 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005166 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005167 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005168 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005169 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005170 if (v == NULL)
5171 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005172 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005173 goto fail;
5174 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005175 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005176 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005177 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005178 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005179 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005180 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005181 if (v == NULL)
5182 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005183 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005184 goto fail;
5185 Py_DECREF(v);
5186 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005187 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005188 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005189 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005190 goto fail;
5191 if (st->st_nscopes != 1) {
5192 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005193 if (v == NULL)
5194 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005195 if (PyDict_SetItem(st->st_global,
5196 name, v))
5197 goto fail;
5198 Py_DECREF(v);
5199 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005200 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005201 }
5202 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005203 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5204
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005205 if (si.si_ncells > 1) { /* one cell is always in order */
5206 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5207 c->c_varnames, c->c_flags) < 0)
5208 return -1;
5209 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005210 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5211 return -1;
5212 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005213 fail:
5214 /* is this always the right thing to do? */
5215 Py_XDECREF(v);
5216 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005217}
5218
5219static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005220symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005221{
5222 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005223
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005224 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005225 if (st == NULL)
5226 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005227 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005228
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005229 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005230 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005231 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005232 goto fail;
5233 if ((st->st_symbols = PyDict_New()) == NULL)
5234 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005235 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005236 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005237 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005238 st->st_private = NULL;
5239 return st;
5240 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005241 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005242 return NULL;
5243}
5244
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005245void
5246PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005247{
5248 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005249 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005250 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005251 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005252}
5253
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005254/* When the compiler exits a scope, it must should update the scope's
5255 free variable information with the list of free variables in its
5256 children.
5257
5258 Variables that are free in children and defined in the current
5259 scope are cellvars.
5260
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005261 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005262 false), free variables in children that are not defined here are
5263 implicit globals.
5264
5265*/
5266
5267static int
5268symtable_update_free_vars(struct symtable *st)
5269{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005270 int i, j, def;
5271 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005272 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005273
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005274 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005275 def = DEF_FREE_CLASS;
5276 else
5277 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005278 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005279 int pos = 0;
5280
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005281 if (list && PyList_SetSlice(list, 0,
5282 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005283 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005284 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005285 PyList_GET_ITEM(ste->ste_children, i);
5286 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005287 int flags = PyInt_AS_LONG(o);
5288 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005289 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005290 if (list == NULL) {
5291 list = PyList_New(0);
5292 if (list == NULL)
5293 return -1;
5294 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005295 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005296 if (PyList_Append(list, name) < 0) {
5297 Py_DECREF(list);
5298 return -1;
5299 }
5300 }
5301 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005302 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005303 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005304 v = PyDict_GetItem(ste->ste_symbols, name);
5305 /* If a name N is declared global in scope A and
5306 referenced in scope B contained (perhaps
5307 indirectly) in A and there are no scopes
5308 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005309 is global in B. Unless A is a class scope,
5310 because class scopes are not considered for
5311 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005312 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005313 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005314 int flags = PyInt_AS_LONG(v);
5315 if (flags & DEF_GLOBAL) {
5316 symtable_undo_free(st, child->ste_id,
5317 name);
5318 continue;
5319 }
5320 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005321 if (ste->ste_nested) {
5322 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005323 name, def) < 0) {
5324 Py_DECREF(list);
5325 return -1;
5326 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005327 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005328 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005329 name) < 0) {
5330 Py_DECREF(list);
5331 return -1;
5332 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005333 }
5334 }
5335 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005336
5337 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005338 return 0;
5339}
5340
5341/* If the current scope is a non-nested class or if name is not
5342 defined in the current, non-nested scope, then it is an implicit
5343 global in all nested scopes.
5344*/
5345
5346static int
5347symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5348{
5349 PyObject *o;
5350 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005351 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005352
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005353 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005354 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005355 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005356 if (o == NULL)
5357 return symtable_undo_free(st, child, name);
5358 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005359
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005360 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005361 return symtable_undo_free(st, child, name);
5362 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005363 return symtable_add_def_o(st, ste->ste_symbols,
5364 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005365}
5366
5367static int
5368symtable_undo_free(struct symtable *st, PyObject *id,
5369 PyObject *name)
5370{
5371 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005372 PyObject *info;
5373 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005374
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005375 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5376 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005377 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005378
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005379 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005380 if (info == NULL)
5381 return 0;
5382 v = PyInt_AS_LONG(info);
5383 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005384 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005385 DEF_FREE_GLOBAL) < 0)
5386 return -1;
5387 } else
5388 /* If the name is defined here or declared global,
5389 then the recursion stops. */
5390 return 0;
5391
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005392 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5393 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005394 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005395 PyList_GET_ITEM(ste->ste_children, i);
5396 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005397 if (x < 0)
5398 return x;
5399 }
5400 return 0;
5401}
5402
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005403/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5404 This reference is released when the scope is exited, via the DECREF
5405 in symtable_exit_scope().
5406*/
5407
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005408static int
5409symtable_exit_scope(struct symtable *st)
5410{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005411 int end;
5412
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005413 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005414 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005415 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005416 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005417 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5418 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005419 if (PySequence_DelItem(st->st_stack, end) < 0)
5420 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005421 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005422}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005423
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005424static void
5425symtable_enter_scope(struct symtable *st, char *name, int type,
5426 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005427{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005428 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005429
5430 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005431 prev = st->st_cur;
5432 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005433 st->st_errors++;
5434 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005435 }
5436 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005437 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005438 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005439 if (st->st_cur == NULL) {
5440 st->st_errors++;
5441 return;
5442 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005443 if (strcmp(name, TOP) == 0)
5444 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005445 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005446 if (PyList_Append(prev->ste_children,
5447 (PyObject *)st->st_cur) < 0)
5448 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005449 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005450}
5451
5452static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005453symtable_lookup(struct symtable *st, char *name)
5454{
5455 char buffer[MANGLE_LEN];
5456 PyObject *v;
5457 int flags;
5458
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005459 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005460 name = buffer;
5461 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5462 if (v == NULL) {
5463 if (PyErr_Occurred())
5464 return -1;
5465 else
5466 return 0;
5467 }
5468
5469 flags = PyInt_AS_LONG(v);
5470 return flags;
5471}
5472
5473static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005474symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005475{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005476 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005477 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005478 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005479
Guido van Rossumb7164622002-08-16 02:48:11 +00005480 /* Warn about None, except inside a tuple (where the assignment
5481 code already issues a warning). */
5482 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5483 *name == 'N' && strcmp(name, "None") == 0)
5484 {
5485 if (symtable_warn(st, "argument named None"))
5486 return -1;
5487 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005488 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005489 name = buffer;
5490 if ((s = PyString_InternFromString(name)) == NULL)
5491 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005492 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5493 Py_DECREF(s);
5494 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005495}
5496
5497/* Must only be called with mangled names */
5498
5499static int
5500symtable_add_def_o(struct symtable *st, PyObject *dict,
5501 PyObject *name, int flag)
5502{
5503 PyObject *o;
5504 int val;
5505
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005506 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005507 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005508 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005509 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005510 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005511 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005512 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005513 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005514 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005515 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005516 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005517 if (o == NULL)
5518 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005519 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005520 Py_DECREF(o);
5521 return -1;
5522 }
5523 Py_DECREF(o);
5524
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005525 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005526 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005527 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005528 } else if (flag & DEF_GLOBAL) {
5529 /* XXX need to update DEF_GLOBAL for other flags too;
5530 perhaps only DEF_FREE_GLOBAL */
5531 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005532 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005533 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005534 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005535 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005536 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005537 if (o == NULL)
5538 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005539 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005540 Py_DECREF(o);
5541 return -1;
5542 }
5543 Py_DECREF(o);
5544 }
5545 return 0;
5546}
5547
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005548#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005549
Tim Peters08a898f2001-06-28 01:52:22 +00005550/* Look for a yield stmt under n. Return 1 if found, else 0.
5551 This hack is used to look inside "if 0:" blocks (which are normally
5552 ignored) in case those are the only places a yield occurs (so that this
5553 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005554static int
5555look_for_yield(node *n)
5556{
5557 int i;
5558
5559 for (i = 0; i < NCH(n); ++i) {
5560 node *kid = CHILD(n, i);
5561
5562 switch (TYPE(kid)) {
5563
5564 case classdef:
5565 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005566 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005567 /* Stuff in nested functions and classes can't make
5568 the parent a generator. */
5569 return 0;
5570
5571 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00005572 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005573
5574 default:
5575 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00005576 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005577 }
5578 }
5579 return 0;
5580}
5581
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005582static void
5583symtable_node(struct symtable *st, node *n)
5584{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005585 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005586
5587 loop:
5588 switch (TYPE(n)) {
5589 case funcdef: {
5590 char *func_name = STR(CHILD(n, 1));
5591 symtable_add_def(st, func_name, DEF_LOCAL);
5592 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005593 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005594 symtable_funcdef(st, n);
5595 symtable_exit_scope(st);
5596 break;
5597 }
5598 case lambdef:
5599 if (NCH(n) == 4)
5600 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005601 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005602 symtable_funcdef(st, n);
5603 symtable_exit_scope(st);
5604 break;
5605 case classdef: {
5606 char *tmp, *class_name = STR(CHILD(n, 1));
5607 symtable_add_def(st, class_name, DEF_LOCAL);
5608 if (TYPE(CHILD(n, 2)) == LPAR) {
5609 node *bases = CHILD(n, 3);
5610 int i;
5611 for (i = 0; i < NCH(bases); i += 2) {
5612 symtable_node(st, CHILD(bases, i));
5613 }
5614 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005615 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005616 tmp = st->st_private;
5617 st->st_private = class_name;
5618 symtable_node(st, CHILD(n, NCH(n) - 1));
5619 st->st_private = tmp;
5620 symtable_exit_scope(st);
5621 break;
5622 }
5623 case if_stmt:
5624 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005625 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5626 if (st->st_cur->ste_generator == 0)
5627 st->st_cur->ste_generator =
5628 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005629 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005630 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005631 symtable_node(st, CHILD(n, i + 1));
5632 symtable_node(st, CHILD(n, i + 3));
5633 }
5634 if (i + 2 < NCH(n))
5635 symtable_node(st, CHILD(n, i + 2));
5636 break;
5637 case global_stmt:
5638 symtable_global(st, n);
5639 break;
5640 case import_stmt:
5641 symtable_import(st, n);
5642 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005643 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005644 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005645 symtable_node(st, CHILD(n, 1));
5646 if (NCH(n) > 2)
5647 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005648 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005649 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005650 st->st_cur->ste_opt_lineno = n->n_lineno;
5651 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005652 if (NCH(n) > 4)
5653 symtable_node(st, CHILD(n, 5));
5654 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005655
5656 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005657 case assert_stmt:
5658 if (Py_OptimizeFlag)
5659 return;
5660 if (NCH(n) == 2) {
5661 n = CHILD(n, 1);
5662 goto loop;
5663 } else {
5664 symtable_node(st, CHILD(n, 1));
5665 n = CHILD(n, 3);
5666 goto loop;
5667 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005668 case except_clause:
5669 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005670 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005671 if (NCH(n) > 1) {
5672 n = CHILD(n, 1);
5673 goto loop;
5674 }
5675 break;
5676 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005677 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005678 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005679 case yield_stmt:
5680 st->st_cur->ste_generator = 1;
5681 n = CHILD(n, 1);
5682 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005683 case expr_stmt:
5684 if (NCH(n) == 1)
5685 n = CHILD(n, 0);
5686 else {
5687 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005688 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005689 symtable_node(st, CHILD(n, 2));
5690 break;
5691 } else {
5692 int i;
5693 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005694 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005695 n = CHILD(n, NCH(n) - 1);
5696 }
5697 }
5698 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005699 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005700 /* only occurs when there are multiple for loops
5701 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005702 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005703 if (TYPE(n) == list_for)
5704 symtable_list_for(st, n);
5705 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005706 REQ(n, list_if);
5707 symtable_node(st, CHILD(n, 1));
5708 if (NCH(n) == 3) {
5709 n = CHILD(n, 2);
5710 goto loop;
5711 }
5712 }
5713 break;
5714 case for_stmt:
5715 symtable_assign(st, CHILD(n, 1), 0);
5716 for (i = 3; i < NCH(n); ++i)
5717 if (TYPE(CHILD(n, i)) >= single_input)
5718 symtable_node(st, CHILD(n, i));
5719 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00005720 case arglist:
5721 if (NCH(n) > 1)
5722 for (i = 0; i < NCH(n); ++i) {
5723 node *ch = CHILD(n, i);
5724 if (TYPE(ch) == argument && NCH(ch) == 2 &&
5725 TYPE(CHILD(ch, 1)) == gen_for) {
5726 PyErr_SetString(PyExc_SyntaxError,
5727 "invalid syntax");
5728 symtable_error(st, n->n_lineno);
5729 return;
5730 }
5731 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005732 /* The remaining cases fall through to default except in
5733 special circumstances. This requires the individual cases
5734 to be coded with great care, even though they look like
5735 rather innocuous. Each case must double-check TYPE(n).
5736 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005737 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005738 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005739 n = CHILD(n, 2);
5740 goto loop;
5741 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00005742 else if (TYPE(n) == argument && NCH(n) == 2 &&
5743 TYPE(CHILD(n, 1)) == gen_for) {
5744 symtable_generator_expression(st, n);
5745 break;
5746 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005747 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005748 case listmaker:
5749 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005750 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005751 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005752 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005753 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00005754 case testlist_gexp:
5755 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
5756 symtable_generator_expression(st, n);
5757 break;
5758 }
5759 /* fall through */
5760
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005761 case atom:
5762 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5763 symtable_add_use(st, STR(CHILD(n, 0)));
5764 break;
5765 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005766 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005767 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005768 /* Walk over every non-token child with a special case
5769 for one child.
5770 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005771 if (NCH(n) == 1) {
5772 n = CHILD(n, 0);
5773 goto loop;
5774 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005775 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005776 if (TYPE(CHILD(n, i)) >= single_input)
5777 symtable_node(st, CHILD(n, i));
5778 }
5779}
5780
5781static void
5782symtable_funcdef(struct symtable *st, node *n)
5783{
5784 node *body;
5785
5786 if (TYPE(n) == lambdef) {
5787 if (NCH(n) == 4)
5788 symtable_params(st, CHILD(n, 1));
5789 } else
5790 symtable_params(st, CHILD(n, 2));
5791 body = CHILD(n, NCH(n) - 1);
5792 symtable_node(st, body);
5793}
5794
5795/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00005796 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005797 which are references in the defining scope. symtable_params()
5798 parses the parameter names, which are defined in the function's
5799 body.
5800
5801 varargslist:
5802 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5803 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5804*/
5805
5806static void
5807symtable_default_args(struct symtable *st, node *n)
5808{
5809 node *c;
5810 int i;
5811
5812 if (TYPE(n) == parameters) {
5813 n = CHILD(n, 1);
5814 if (TYPE(n) == RPAR)
5815 return;
5816 }
5817 REQ(n, varargslist);
5818 for (i = 0; i < NCH(n); i += 2) {
5819 c = CHILD(n, i);
5820 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5821 break;
5822 }
5823 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5824 symtable_node(st, CHILD(n, i));
5825 }
5826}
5827
5828static void
5829symtable_params(struct symtable *st, node *n)
5830{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005831 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00005832 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005833
5834 if (TYPE(n) == parameters) {
5835 n = CHILD(n, 1);
5836 if (TYPE(n) == RPAR)
5837 return;
5838 }
5839 REQ(n, varargslist);
5840 for (i = 0; i < NCH(n); i += 2) {
5841 c = CHILD(n, i);
5842 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5843 ext = 1;
5844 break;
5845 }
5846 if (TYPE(c) == test) {
5847 continue;
5848 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00005849 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005850 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00005851 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005852 char nbuf[30];
5853 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005854 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005855 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005856 }
5857 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005858 if (ext) {
5859 c = CHILD(n, i);
5860 if (TYPE(c) == STAR) {
5861 i++;
5862 symtable_add_def(st, STR(CHILD(n, i)),
5863 DEF_PARAM | DEF_STAR);
5864 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005865 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005866 c = NULL;
5867 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005868 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005869 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005870 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005871 i++;
5872 symtable_add_def(st, STR(CHILD(n, i)),
5873 DEF_PARAM | DEF_DOUBLESTAR);
5874 }
5875 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005876 if (complex >= 0) {
5877 int j;
5878 for (j = 0; j <= complex; j++) {
5879 c = CHILD(n, j);
5880 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005881 c = CHILD(n, ++j);
5882 else if (TYPE(c) == EQUAL)
5883 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005884 if (TYPE(CHILD(c, 0)) == LPAR)
5885 symtable_params_fplist(st, CHILD(c, 1));
5886 }
5887 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005888}
5889
5890static void
5891symtable_params_fplist(struct symtable *st, node *n)
5892{
5893 int i;
5894 node *c;
5895
5896 REQ(n, fplist);
5897 for (i = 0; i < NCH(n); i += 2) {
5898 c = CHILD(n, i);
5899 REQ(c, fpdef);
5900 if (NCH(c) == 1)
5901 symtable_add_def(st, STR(CHILD(c, 0)),
5902 DEF_PARAM | DEF_INTUPLE);
5903 else
5904 symtable_params_fplist(st, CHILD(c, 1));
5905 }
5906
5907}
5908
5909static void
5910symtable_global(struct symtable *st, node *n)
5911{
5912 int i;
5913
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005914 /* XXX It might be helpful to warn about module-level global
5915 statements, but it's hard to tell the difference between
5916 module-level and a string passed to exec.
5917 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005918
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005919 for (i = 1; i < NCH(n); i += 2) {
5920 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005921 int flags;
5922
5923 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005924 if (flags < 0)
5925 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005926 if (flags && flags != DEF_GLOBAL) {
5927 char buf[500];
5928 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005929 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005930 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00005931 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005932 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005933 }
5934 else {
5935 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005936 PyOS_snprintf(buf, sizeof(buf),
5937 GLOBAL_AFTER_ASSIGN,
5938 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005939 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005940 PyOS_snprintf(buf, sizeof(buf),
5941 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005942 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005943 }
5944 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005945 symtable_add_def(st, name, DEF_GLOBAL);
5946 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005947}
5948
5949static void
5950symtable_list_comprehension(struct symtable *st, node *n)
5951{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005952 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005953 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005954
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005955 REQ(n, listmaker);
5956 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
5957 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005958 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005959 symtable_list_for(st, CHILD(n, 1));
5960 symtable_node(st, CHILD(n, 0));
5961 --st->st_cur->ste_tmpname;
5962}
5963
5964static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00005965symtable_generator_expression(struct symtable *st, node *n)
5966{
5967 /* testlist_gexp: test gen_for */
5968 REQ(CHILD(n, 0), test);
5969 REQ(CHILD(n, 1), gen_for);
5970
5971 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
5972 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
5973
5974 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
5975
5976 symtable_gen_for(st, CHILD(n, 1), 1);
5977 symtable_node(st, CHILD(n, 0));
5978 symtable_exit_scope(st);
5979
5980 /* for outmost iterable precomputation */
5981 symtable_node(st, CHILD(CHILD(n, 1), 3));
5982}
5983
5984static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005985symtable_list_for(struct symtable *st, node *n)
5986{
5987 REQ(n, list_for);
5988 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005989 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005990 symtable_node(st, CHILD(n, 3));
5991 if (NCH(n) == 5)
5992 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005993}
5994
5995static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00005996symtable_gen_for(struct symtable *st, node *n, int is_outmost)
5997{
5998 REQ(n, gen_for);
5999
6000 /* gen_for: for v in test [gen_iter] */
6001 symtable_assign(st, CHILD(n, 1), 0);
6002 if (is_outmost)
6003 symtable_add_use(st, "[outmost-iterable]");
6004 else
6005 symtable_node(st, CHILD(n, 3));
6006
6007 if (NCH(n) == 5)
6008 symtable_gen_iter(st, CHILD(n, 4));
6009}
6010
6011static void
6012symtable_gen_iter(struct symtable *st, node *n)
6013{
6014 REQ(n, gen_iter);
6015
6016 n = CHILD(n, 0);
6017 if (TYPE(n) == gen_for)
6018 symtable_gen_for(st, n, 0);
6019 else {
6020 REQ(n, gen_if);
6021 symtable_node(st, CHILD(n, 1));
6022
6023 if (NCH(n) == 3)
6024 symtable_gen_iter(st, CHILD(n, 2));
6025 }
6026}
6027
6028static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006029symtable_import(struct symtable *st, node *n)
6030{
6031 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006032 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006033 | 'from' dotted_name 'import'
6034 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00006035 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006036 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006037 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006038 node *dotname = CHILD(n, 1);
6039 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6040 /* check for bogus imports */
6041 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6042 PyErr_SetString(PyExc_SyntaxError,
6043 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006044 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006045 return;
6046 }
6047 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006048 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006049 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006050 if (symtable_warn(st,
6051 "import * only allowed at module level") < 0)
6052 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006053 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006054 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006055 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006056 } else {
6057 for (i = 3; i < NCH(n); i += 2) {
6058 node *c = CHILD(n, i);
6059 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006060 symtable_assign(st, CHILD(c, 2),
6061 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006062 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006063 symtable_assign(st, CHILD(c, 0),
6064 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006065 }
6066 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006067 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006068 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006069 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006070 }
6071 }
6072}
6073
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006074/* The third argument to symatble_assign() is a flag to be passed to
6075 symtable_add_def() if it is eventually called. The flag is useful
6076 to specify the particular type of assignment that should be
6077 recorded, e.g. an assignment caused by import.
6078 */
6079
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006080static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006081symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006082{
6083 node *tmp;
6084 int i;
6085
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006086 loop:
6087 switch (TYPE(n)) {
6088 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006089 /* invalid assignment, e.g. lambda x:x=2. The next
6090 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006091 return;
6092 case power:
6093 if (NCH(n) > 2) {
6094 for (i = 2; i < NCH(n); ++i)
6095 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6096 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006097 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006098 if (NCH(n) > 1) {
6099 symtable_node(st, CHILD(n, 0));
6100 symtable_node(st, CHILD(n, 1));
6101 } else {
6102 n = CHILD(n, 0);
6103 goto loop;
6104 }
6105 return;
6106 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006107 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6108 /* XXX This is an error, but the next pass
6109 will catch it. */
6110 return;
6111 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006112 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006113 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006114 }
6115 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006116 case testlist_gexp:
6117 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6118 /* XXX This is an error, but the next pass
6119 will catch it. */
6120 return;
6121 } else {
6122 for (i = 0; i < NCH(n); i += 2)
6123 symtable_assign(st, CHILD(n, i), def_flag);
6124 }
6125 return;
6126
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006127 case exprlist:
6128 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006129 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006130 if (NCH(n) == 1) {
6131 n = CHILD(n, 0);
6132 goto loop;
6133 }
6134 else {
6135 int i;
6136 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006137 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006138 return;
6139 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006140 case atom:
6141 tmp = CHILD(n, 0);
6142 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6143 n = CHILD(n, 1);
6144 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006145 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006146 if (strcmp(STR(tmp), "__debug__") == 0) {
6147 PyErr_SetString(PyExc_SyntaxError,
6148 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006149 symtable_error(st, n->n_lineno);
6150 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006151 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006152 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006153 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006154 return;
6155 case dotted_as_name:
6156 if (NCH(n) == 3)
6157 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006158 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006159 else
6160 symtable_add_def(st,
6161 STR(CHILD(CHILD(n,
6162 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006163 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006164 return;
6165 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006166 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006167 return;
6168 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006169 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006170 return;
6171 default:
6172 if (NCH(n) == 0)
6173 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006174 if (NCH(n) == 1) {
6175 n = CHILD(n, 0);
6176 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006177 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006178 /* Should only occur for errors like x + 1 = 1,
6179 which will be caught in the next pass. */
6180 for (i = 0; i < NCH(n); ++i)
6181 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006182 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006183 }
6184}