blob: 771bc2fa8acf44ac28dfe579d085a8eb1351a49b [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;
Tim Petersdb5860b2004-07-17 05:00:52 +0000422 break;
423
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000424 /* Replace LOAD_GLOBAL/LOAD_NAME None with LOAD_CONST None */
425 case LOAD_NAME:
426 case LOAD_GLOBAL:
427 j = GETARG(codestr, i);
428 name = PyString_AsString(PyTuple_GET_ITEM(names, j));
429 if (name == NULL || strcmp(name, "None") != 0)
430 continue;
431 for (j=0 ; j < PyTuple_GET_SIZE(consts) ; j++) {
432 if (PyTuple_GET_ITEM(consts, j) == Py_None) {
433 codestr[i] = LOAD_CONST;
434 SETARG(codestr, i, j);
435 break;
436 }
437 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000438 break;
439
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000440 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP.
441 Note, only the first opcode is changed, the others still
442 perform normally if they happen to be jump targets. */
443 case LOAD_CONST:
444 j = GETARG(codestr, i);
445 if (codestr[i+3] != JUMP_IF_FALSE ||
446 codestr[i+6] != POP_TOP ||
447 !PyObject_IsTrue(PyTuple_GET_ITEM(consts, j)))
448 continue;
449 codestr[i] = JUMP_FORWARD;
450 SETARG(codestr, i, 4);
451 break;
452
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000453 /* Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2 JMP+2 NOP NOP.
454 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2 JMP+1 NOP. */
455 case BUILD_TUPLE:
456 case BUILD_LIST:
457 if (codestr[i+3] != UNPACK_SEQUENCE)
458 continue;
459 if (!ISBASICBLOCK(blocks,i,6))
460 continue;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000461 if (GETARG(codestr, i) == 2 &&
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000462 GETARG(codestr, i+3) == 2) {
463 codestr[i] = ROT_TWO;
464 codestr[i+1] = JUMP_FORWARD;
465 SETARG(codestr, i+1, 2);
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000466 codestr[i+4] = NOP;
467 codestr[i+5] = NOP;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000468 continue;
469 }
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000470 if (GETARG(codestr, i) == 3 &&
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000471 GETARG(codestr, i+3) == 3) {
472 codestr[i] = ROT_THREE;
473 codestr[i+1] = ROT_TWO;
474 codestr[i+2] = JUMP_FORWARD;
475 SETARG(codestr, i+2, 1);
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000476 codestr[i+5] = NOP;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000477 }
478 break;
479
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000480 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000481 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000482 case JUMP_FORWARD:
483 case JUMP_IF_FALSE:
484 case JUMP_IF_TRUE:
485 case JUMP_ABSOLUTE:
486 case CONTINUE_LOOP:
487 case SETUP_LOOP:
488 case SETUP_EXCEPT:
489 case SETUP_FINALLY:
490 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000491 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000492 continue;
493 tgttgt = GETJUMPTGT(codestr, tgt);
494 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
495 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000496 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000497 tgttgt -= i + 3; /* Calc relative jump addr */
498 if (tgttgt < 0) /* No backward relative jumps */
499 continue;
500 codestr[i] = opcode;
501 SETARG(codestr, i, tgttgt);
502 break;
503
504 case EXTENDED_ARG:
505 PyMem_Free(codestr);
506 goto exitUnchanged;
507 }
508 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000509 code = PyString_FromStringAndSize((char *)codestr, codelen);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000510 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000511 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000512 return code;
513
514exitUnchanged:
515 Py_INCREF(code);
516 return code;
517}
518
Guido van Rossum79f25d91997-04-29 20:08:16 +0000519PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000520PyCode_New(int argcount, int nlocals, int stacksize, int flags,
521 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000522 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
523 PyObject *filename, PyObject *name, int firstlineno,
524 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000525{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000526 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000527 int i;
528 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000529 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000530 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000531 consts == NULL || !PyTuple_Check(consts) ||
532 names == NULL || !PyTuple_Check(names) ||
533 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000534 freevars == NULL || !PyTuple_Check(freevars) ||
535 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000536 name == NULL || !PyString_Check(name) ||
537 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000538 lnotab == NULL || !PyString_Check(lnotab) ||
539 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000540 PyErr_BadInternalCall();
541 return NULL;
542 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000543 intern_strings(names);
544 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000545 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000546 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000547 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000548 for (i = PyTuple_Size(consts); --i >= 0; ) {
549 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000550 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000551 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000552 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000553 continue;
554 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000555 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000556 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000557 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000558 co->co_argcount = argcount;
559 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000560 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000561 co->co_flags = flags;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000562 co->co_code = optimize_code(code, consts, names);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000563 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000564 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000565 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000566 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000567 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000568 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000569 Py_INCREF(freevars);
570 co->co_freevars = freevars;
571 Py_INCREF(cellvars);
572 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000573 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000574 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000575 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000576 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000577 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000578 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000579 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000580 if (PyTuple_GET_SIZE(freevars) == 0 &&
581 PyTuple_GET_SIZE(cellvars) == 0)
582 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000583 }
584 return co;
585}
586
587
588/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000589
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000590/* The compiler uses two passes to generate bytecodes. The first pass
591 builds the symbol table. The second pass generates the bytecode.
592
593 The first pass uses a single symtable struct. The second pass uses
594 a compiling struct for each code block. The compiling structs
595 share a reference to the symtable.
596
597 The two passes communicate via symtable_load_symbols() and via
598 is_local() and is_global(). The former initializes several slots
599 in the compiling struct: c_varnames, c_locals, c_nlocals,
600 c_argcount, c_globals, and c_flags.
601*/
602
Tim Peters2a7f3842001-06-09 09:26:21 +0000603/* All about c_lnotab.
604
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000605c_lnotab is an array of unsigned bytes disguised as a Python string. Since
606version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
607mapped to source code line #s via c_lnotab instead.
608
Tim Peters2a7f3842001-06-09 09:26:21 +0000609The array is conceptually a list of
610 (bytecode offset increment, line number increment)
611pairs. The details are important and delicate, best illustrated by example:
612
613 byte code offset source code line number
614 0 1
615 6 2
616 50 7
617 350 307
618 361 308
619
620The first trick is that these numbers aren't stored, only the increments
621from one row to the next (this doesn't really work, but it's a start):
622
623 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
624
625The second trick is that an unsigned byte can't hold negative values, or
626values larger than 255, so (a) there's a deep assumption that byte code
627offsets and their corresponding line #s both increase monotonically, and (b)
628if at least one column jumps by more than 255 from one row to the next, more
629than one pair is written to the table. In case #b, there's no way to know
630from looking at the table later how many were written. That's the delicate
631part. A user of c_lnotab desiring to find the source line number
632corresponding to a bytecode address A should do something like this
633
634 lineno = addr = 0
635 for addr_incr, line_incr in c_lnotab:
636 addr += addr_incr
637 if addr > A:
638 return lineno
639 lineno += line_incr
640
641In order for this to work, when the addr field increments by more than 255,
642the line # increment in each pair generated must be 0 until the remaining addr
643increment is < 256. So, in the example above, com_set_lineno should not (as
644was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
645255, 0, 45, 255, 0, 45.
646*/
647
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000648struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000649 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000650 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000651 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000652 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000653 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +0000654 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000655 PyObject *c_locals; /* dictionary (value=localID) */
656 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000657 PyObject *c_freevars; /* dictionary (value=None) */
658 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000659 int c_nlocals; /* index of next local */
660 int c_argcount; /* number of top-level arguments */
661 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000662 int c_nexti; /* index into c_code */
663 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000664 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000665 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000666 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000667 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000668 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000669 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +0000670 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000671 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000672 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000673 int c_stacklevel; /* Current stack level */
674 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000675 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000676 PyObject *c_lnotab; /* Table mapping address to line number */
Armin Rigo80d937e2004-03-22 17:52:53 +0000677 int c_last_addr; /* last op addr seen and recorded in lnotab */
678 int c_last_line; /* last line seen and recorded in lnotab */
679 int c_lnotab_next; /* current length of lnotab */
680 int c_lnotab_last; /* start of last lnotab record added */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000681 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000682 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000683 int c_nested; /* Is block nested funcdef or lamdef? */
684 int c_closure; /* Is nested w/freevars? */
685 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000686 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000687 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000688};
689
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000690static int
691is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000692{
693 if ((v & (USE | DEF_FREE))
694 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
695 return 1;
696 if (v & DEF_FREE_CLASS)
697 return 1;
698 return 0;
699}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000700
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000701static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000702com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000703{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000704 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
705
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000706 if (c == NULL) {
707 /* Error occurred via symtable call to
708 is_constant_false */
709 PyErr_SetString(exc, msg);
710 return;
711 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000712 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000713 if (c->c_lineno < 1 || c->c_interactive) {
714 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000715 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000716 return;
717 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000718 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000719 if (v == NULL)
720 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000721
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000722 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000723 if (line == NULL) {
724 Py_INCREF(Py_None);
725 line = Py_None;
726 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000727 if (exc == PyExc_SyntaxError) {
728 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
729 Py_None, line);
730 if (t == NULL)
731 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000732 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000733 if (w == NULL)
734 goto exit;
735 PyErr_SetObject(exc, w);
736 } else {
737 /* Make sure additional exceptions are printed with
738 file and line, also. */
739 PyErr_SetObject(exc, v);
740 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
741 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000742 exit:
743 Py_XDECREF(t);
744 Py_XDECREF(v);
745 Py_XDECREF(w);
746 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000747}
748
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000749/* Interface to the block stack */
750
751static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000752block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000753{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000754 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000755 com_error(c, PyExc_SystemError,
756 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000757 }
758 else {
759 c->c_block[c->c_nblocks++] = type;
760 }
761}
762
763static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000764block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000765{
766 if (c->c_nblocks > 0)
767 c->c_nblocks--;
768 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000769 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000770 }
771}
772
Guido van Rossum681d79a1995-07-18 14:51:37 +0000773/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000774
Martin v. Löwis95292d62002-12-11 14:04:59 +0000775static int issue_warning(const char *, const char *, int);
776static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000777static void com_free(struct compiling *);
778static void com_push(struct compiling *, int);
779static void com_pop(struct compiling *, int);
780static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000781static void com_node(struct compiling *, node *);
782static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000783static void com_addbyte(struct compiling *, int);
784static void com_addint(struct compiling *, int);
785static void com_addoparg(struct compiling *, int, int);
786static void com_addfwref(struct compiling *, int, int *);
787static void com_backpatch(struct compiling *, int);
788static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
789static int com_addconst(struct compiling *, PyObject *);
790static int com_addname(struct compiling *, PyObject *);
791static void com_addopname(struct compiling *, int, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000792static void com_test(struct compiling *c, node *n);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000793static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000794static void com_list_iter(struct compiling *, node *, node *, char *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000795static void com_gen_iter(struct compiling *, node *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000796static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000797static void com_assign(struct compiling *, node *, int, node *);
798static void com_assign_name(struct compiling *, node *, int);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000799static int com_make_closure(struct compiling *c, PyCodeObject *co);
800
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000801static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +0000802static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000803 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000804static PyObject *parsestrplus(struct compiling*, node *);
805static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000806static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000807
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000808static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000809
810/* symtable operations */
Raymond Hettinger354433a2004-05-19 08:20:33 +0000811static int symtable_lookup(struct symtable *st, char *name);
Jeremy Hylton1955fcf2003-07-15 20:23:26 +0000812static struct symtable *symtable_build(node *, PyFutureFeatures *,
813 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000814static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000815static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000816static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000817static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000818static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000819static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000820
821static void symtable_node(struct symtable *, node *);
822static void symtable_funcdef(struct symtable *, node *);
823static void symtable_default_args(struct symtable *, node *);
824static void symtable_params(struct symtable *, node *);
825static void symtable_params_fplist(struct symtable *, node *n);
826static void symtable_global(struct symtable *, node *);
827static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000828static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000829static void symtable_list_comprehension(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000830static void symtable_generator_expression(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +0000831static void symtable_list_for(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000832static void symtable_gen_for(struct symtable *, node *, int);
833static void symtable_gen_iter(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000834
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000835static int symtable_update_free_vars(struct symtable *);
836static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
837static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
838
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000839/* helper */
840static void
841do_pad(int pad)
842{
843 int i;
844 for (i = 0; i < pad; ++i)
845 fprintf(stderr, " ");
846}
847
848static void
849dump(node *n, int pad, int depth)
850{
851 int i;
852 if (depth == 0)
853 return;
854 do_pad(pad);
855 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
856 if (depth > 0)
857 depth--;
858 for (i = 0; i < NCH(n); ++i)
859 dump(CHILD(n, i), pad + 1, depth);
860}
861
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000862static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000863com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000864{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000865 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000866 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
867 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000868 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000869 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000870 goto fail;
871 if ((c->c_const_dict = PyDict_New()) == NULL)
872 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000873 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000874 goto fail;
875 if ((c->c_name_dict = PyDict_New()) == NULL)
876 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000877 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000878 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000879 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
880 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000881 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000882 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000883 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000884 c->c_freevars = NULL;
885 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000886 c->c_nlocals = 0;
887 c->c_argcount = 0;
888 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000889 c->c_nexti = 0;
890 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000891 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000892 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000893 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000894 c->c_begin = 0;
895 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000896 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000897 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000898 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000899 c->c_stacklevel = 0;
900 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000901 c->c_firstlineno = 0;
902 c->c_last_addr = 0;
903 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000904 c->c_lnotab_next = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +0000905 c->c_lnotab_last = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000906 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000907 c->c_nested = 0;
908 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000909 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000910 return 1;
911
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000912 fail:
913 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000914 return 0;
915}
916
917static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000918com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000919{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000920 Py_XDECREF(c->c_code);
921 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000922 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000923 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000924 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000925 Py_XDECREF(c->c_globals);
926 Py_XDECREF(c->c_locals);
927 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000928 Py_XDECREF(c->c_freevars);
929 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000930 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000931 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +0000932 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000933}
934
935static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000936com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000937{
938 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000939 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +0000940 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000941 /*
942 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
943 c->c_filename, c->c_name, c->c_lineno,
944 c->c_nexti, c->c_stacklevel, n);
945 */
946 }
Guido van Rossum8b993a91997-01-17 21:04:03 +0000947}
948
949static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000950com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000951{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000952 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000953 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000954 else
955 c->c_stacklevel -= n;
956}
957
958static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000959com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000960{
961 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000962 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000963 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000964 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000965}
966
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000967static int
968com_check_size(PyObject **s, int offset)
969{
970 int len = PyString_GET_SIZE(*s);
971 if (offset >= len)
972 return _PyString_Resize(s, len * 2);
973 return 0;
974}
975
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000976static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000977com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000978{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000979 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000980 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +0000981 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000982 if (com_check_size(&c->c_code, c->c_nexti)) {
983 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000984 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000985 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000986 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000987}
988
989static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000990com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000991{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000992 com_addbyte(c, x & 0xff);
993 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000994}
995
996static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000997com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000998{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000999 char *p;
1000 if (c->c_lnotab == NULL)
1001 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001002 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
1003 c->c_errors++;
1004 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001005 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001006 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001007 *p++ = addr;
1008 *p++ = line;
1009 c->c_lnotab_next += 2;
1010}
1011
1012static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001013com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001014{
1015 c->c_lineno = lineno;
1016 if (c->c_firstlineno == 0) {
1017 c->c_firstlineno = c->c_last_line = lineno;
1018 }
1019 else {
1020 int incr_addr = c->c_nexti - c->c_last_addr;
1021 int incr_line = lineno - c->c_last_line;
Armin Rigo80d937e2004-03-22 17:52:53 +00001022 c->c_lnotab_last = c->c_lnotab_next;
Tim Peters2a7f3842001-06-09 09:26:21 +00001023 while (incr_addr > 255) {
1024 com_add_lnotab(c, 255, 0);
1025 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001026 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001027 while (incr_line > 255) {
1028 com_add_lnotab(c, incr_addr, 255);
1029 incr_line -=255;
1030 incr_addr = 0;
1031 }
1032 if (incr_addr > 0 || incr_line > 0)
1033 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001034 c->c_last_addr = c->c_nexti;
1035 c->c_last_line = lineno;
1036 }
1037}
1038
1039static void
Armin Rigo80d937e2004-03-22 17:52:53 +00001040com_strip_lnotab(struct compiling *c)
1041{
1042 /* strip the last lnotab entry if no opcode were emitted.
1043 * This prevents a line number to be generated on a final
1044 * pass, like in the following example:
1045 *
1046 * if a:
1047 * print 5
1048 * else:
1049 * pass
1050 *
1051 * Without the fix, a line trace event would be generated
1052 * on the pass even if a is true (because of the implicit
1053 * return).
1054 */
1055 if (c->c_nexti == c->c_last_addr && c->c_lnotab_last > 0) {
1056 c->c_lnotab_next = c->c_lnotab_last;
1057 }
1058}
1059
1060static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001061com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001062{
Fred Drakeef8ace32000-08-24 00:32:09 +00001063 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +00001064 if (extended_arg){
1065 com_addbyte(c, EXTENDED_ARG);
1066 com_addint(c, extended_arg);
1067 arg &= 0xffff;
1068 }
Guido van Rossum8e793d91997-03-03 19:13:14 +00001069 com_addbyte(c, op);
1070 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001071}
1072
1073static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001074com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001075{
1076 /* Compile a forward reference for backpatching */
1077 int here;
1078 int anchor;
1079 com_addbyte(c, op);
1080 here = c->c_nexti;
1081 anchor = *p_anchor;
1082 *p_anchor = here;
1083 com_addint(c, anchor == 0 ? 0 : here - anchor);
1084}
1085
1086static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001087com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001088{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001089 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001090 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001091 int dist;
1092 int prev;
1093 for (;;) {
1094 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001095 prev = code[anchor] + (code[anchor+1] << 8);
1096 dist = target - (anchor+2);
1097 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001098 dist >>= 8;
1099 code[anchor+1] = dist;
1100 dist >>= 8;
1101 if (dist) {
1102 com_error(c, PyExc_SystemError,
1103 "com_backpatch: offset too large");
1104 break;
1105 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001106 if (!prev)
1107 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001108 anchor -= prev;
1109 }
1110}
1111
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001112/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001113
1114static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001115com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001116{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001117 PyObject *w, *t, *np=NULL;
1118 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001119
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001120 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001121 if (t == NULL)
1122 goto fail;
1123 w = PyDict_GetItem(dict, t);
1124 if (w != NULL) {
1125 n = PyInt_AsLong(w);
1126 } else {
1127 n = PyList_Size(list);
1128 np = PyInt_FromLong(n);
1129 if (np == NULL)
1130 goto fail;
1131 if (PyList_Append(list, v) != 0)
1132 goto fail;
1133 if (PyDict_SetItem(dict, t, np) != 0)
1134 goto fail;
1135 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001136 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001137 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001138 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001139 fail:
1140 Py_XDECREF(np);
1141 Py_XDECREF(t);
1142 c->c_errors++;
1143 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001144}
1145
1146static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001147com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001148{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001149 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001150}
1151
1152static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001153com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001154{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001155 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001156}
1157
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001158int
1159_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001160{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001161 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001162 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001163 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001164 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1165 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001166 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001167 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001168 return 0; /* Don't mangle __extremely_long_names */
1169 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1170 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001171 /* Strip leading underscores from class name */
1172 while (*p == '_')
1173 p++;
1174 if (*p == '\0')
1175 return 0; /* Don't mangle if class is just underscores */
1176 plen = strlen(p);
1177 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001178 plen = maxlen-nlen-2; /* Truncate class name if too long */
1179 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001180 buffer[0] = '_';
1181 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001182 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001183 return 1;
1184}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001185
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001186static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001187com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001188{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001189 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001190 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001191 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001192
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001193 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001194 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001195 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001196 c->c_errors++;
1197 i = 255;
1198 }
1199 else {
1200 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001201 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001202 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001203 com_addoparg(c, op, i);
1204}
1205
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001206#define NAME_LOCAL 0
1207#define NAME_GLOBAL 1
1208#define NAME_DEFAULT 2
1209#define NAME_CLOSURE 3
1210
1211static int
1212com_lookup_arg(PyObject *dict, PyObject *name)
1213{
1214 PyObject *v = PyDict_GetItem(dict, name);
1215 if (v == NULL)
1216 return -1;
1217 else
1218 return PyInt_AS_LONG(v);
1219}
1220
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001221static int
1222none_assignment_check(struct compiling *c, char *name, int assigning)
1223{
1224 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1225 char *msg;
1226 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001227 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001228 else
1229 msg = "deleting None";
Raymond Hettinger11a70c72004-07-17 21:46:25 +00001230 com_error(c, PyExc_SyntaxError, msg);
1231 return -1;
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001232 }
1233 return 0;
1234}
1235
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001236static void
1237com_addop_varname(struct compiling *c, int kind, char *name)
1238{
1239 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001240 int i, reftype;
1241 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001242 int op = STOP_CODE;
1243 char buffer[MANGLE_LEN];
1244
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001245 if (kind != VAR_LOAD &&
1246 none_assignment_check(c, name, kind == VAR_STORE))
1247 {
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001248 i = 255;
1249 goto done;
1250 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001251 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001252 name = buffer;
1253 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1254 c->c_errors++;
1255 i = 255;
1256 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001257 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001258
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001259 reftype = get_ref_type(c, name);
1260 switch (reftype) {
1261 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001262 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001263 scope = NAME_LOCAL;
1264 break;
1265 case GLOBAL_EXPLICIT:
1266 scope = NAME_GLOBAL;
1267 break;
1268 case GLOBAL_IMPLICIT:
1269 if (c->c_flags & CO_OPTIMIZED)
1270 scope = NAME_GLOBAL;
1271 break;
1272 case FREE:
1273 case CELL:
1274 scope = NAME_CLOSURE;
1275 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001276 }
1277
1278 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001279 if (scope == NAME_LOCAL)
1280 i = com_lookup_arg(c->c_locals, v);
1281 else if (reftype == FREE)
1282 i = com_lookup_arg(c->c_freevars, v);
1283 else if (reftype == CELL)
1284 i = com_lookup_arg(c->c_cellvars, v);
1285 if (i == -1) {
1286 c->c_errors++; /* XXX no exception set */
1287 i = 255;
1288 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001289 }
1290 Py_DECREF(v);
1291
1292 switch (kind) {
1293 case VAR_LOAD:
1294 switch (scope) {
1295 case NAME_LOCAL:
1296 op = LOAD_FAST;
1297 break;
1298 case NAME_GLOBAL:
1299 op = LOAD_GLOBAL;
1300 break;
1301 case NAME_DEFAULT:
1302 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001303 break;
1304 case NAME_CLOSURE:
1305 op = LOAD_DEREF;
1306 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001307 }
1308 break;
1309 case VAR_STORE:
1310 switch (scope) {
1311 case NAME_LOCAL:
1312 op = STORE_FAST;
1313 break;
1314 case NAME_GLOBAL:
1315 op = STORE_GLOBAL;
1316 break;
1317 case NAME_DEFAULT:
1318 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001319 break;
1320 case NAME_CLOSURE:
1321 op = STORE_DEREF;
1322 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001323 }
1324 break;
1325 case VAR_DELETE:
1326 switch (scope) {
1327 case NAME_LOCAL:
1328 op = DELETE_FAST;
1329 break;
1330 case NAME_GLOBAL:
1331 op = DELETE_GLOBAL;
1332 break;
1333 case NAME_DEFAULT:
1334 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001335 break;
1336 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001337 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001338 PyOS_snprintf(buf, sizeof(buf),
1339 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001340 com_error(c, PyExc_SyntaxError, buf);
1341 i = 255;
1342 break;
1343 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001344 }
1345 break;
1346 }
1347done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001348 com_addoparg(c, op, i);
1349}
1350
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001351static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001352com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001353{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001354 char *name;
1355 char buffer[1000];
1356 /* XXX it is possible to write this code without the 1000
1357 chars on the total length of dotted names, I just can't be
1358 bothered right now */
1359 if (TYPE(n) == STAR)
1360 name = "*";
1361 else if (TYPE(n) == dotted_name) {
1362 char *p = buffer;
1363 int i;
1364 name = buffer;
1365 for (i = 0; i < NCH(n); i += 2) {
1366 char *s = STR(CHILD(n, i));
1367 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001368 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001369 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001370 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001371 break;
1372 }
1373 if (p != buffer)
1374 *p++ = '.';
1375 strcpy(p, s);
1376 p = strchr(p, '\0');
1377 }
1378 }
1379 else {
1380 REQ(n, NAME);
1381 name = STR(n);
1382 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001383 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001384}
1385
Guido van Rossum79f25d91997-04-29 20:08:16 +00001386static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001387parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001388{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001389 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001390 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001391 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001392#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001393 int imflag;
1394#endif
1395
Guido van Rossum282914b1991-04-04 10:42:56 +00001396 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001397 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001398#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001399 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001400#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001401 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001402 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001403 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001404 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001405 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001406 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001407 }
1408 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001409 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001410 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001411 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001412 if (errno != 0)
1413 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001414 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001415 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001416 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001417#ifndef WITHOUT_COMPLEX
1418 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001419 Py_complex z;
1420 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001421 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001422 z.imag = PyOS_ascii_atof(s);
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001423 PyFPE_END_PROTECT(z)
1424 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001425 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001426 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001427#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001428 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001429 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001430 dx = PyOS_ascii_atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001431 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001432 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001433 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001434}
1435
Guido van Rossum79f25d91997-04-29 20:08:16 +00001436static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001437decode_utf8(char **sPtr, char *end, char* encoding)
1438{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001439#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001440 Py_FatalError("decode_utf8 should not be called in this build.");
1441 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001442#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001443 PyObject *u, *v;
1444 char *s, *t;
1445 t = s = *sPtr;
1446 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1447 while (s < end && (*s & 0x80)) s++;
1448 *sPtr = s;
1449 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1450 if (u == NULL)
1451 return NULL;
1452 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1453 Py_DECREF(u);
1454 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001455#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001456}
1457
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001458/* compiler.transformer.Transformer.decode_literal depends on what
1459 might seem like minor details of this function -- changes here
1460 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001461static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001462parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001463{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001464 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001465 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001466 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001467 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001468 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001469 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001470 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001471
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001472 if (isalpha(quote) || quote == '_') {
1473 if (quote == 'u' || quote == 'U') {
1474 quote = *++s;
1475 unicode = 1;
1476 }
1477 if (quote == 'r' || quote == 'R') {
1478 quote = *++s;
1479 rawmode = 1;
1480 }
1481 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001482 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001483 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001484 return NULL;
1485 }
1486 s++;
1487 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001488 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001489 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001490 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001491 return NULL;
1492 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001493 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001494 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001495 return NULL;
1496 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001497 if (len >= 4 && s[0] == quote && s[1] == quote) {
1498 s += 2;
1499 len -= 2;
1500 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001501 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001502 return NULL;
1503 }
1504 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001505#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001506 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001507 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001508 char *buf;
1509 char *p;
1510 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001511 if (encoding == NULL) {
1512 buf = s;
1513 u = NULL;
1514 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1515 buf = s;
1516 u = NULL;
1517 } else {
1518 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1519 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1520 if (u == NULL)
1521 return NULL;
1522 p = buf = PyString_AsString(u);
1523 end = s + len;
1524 while (s < end) {
1525 if (*s == '\\') {
1526 *p++ = *s++;
1527 if (*s & 0x80) {
1528 strcpy(p, "u005c");
1529 p += 5;
1530 }
1531 }
1532 if (*s & 0x80) { /* XXX inefficient */
1533 char *r;
1534 int rn, i;
1535 w = decode_utf8(&s, end, "utf-16-be");
1536 if (w == NULL) {
1537 Py_DECREF(u);
1538 return NULL;
1539 }
1540 r = PyString_AsString(w);
1541 rn = PyString_Size(w);
1542 assert(rn % 2 == 0);
1543 for (i = 0; i < rn; i += 2) {
1544 sprintf(p, "\\u%02x%02x",
1545 r[i + 0] & 0xFF,
1546 r[i + 1] & 0xFF);
1547 p += 6;
1548 }
1549 Py_DECREF(w);
1550 } else {
1551 *p++ = *s++;
1552 }
1553 }
1554 len = p - buf;
1555 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001556 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001557 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001558 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001559 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1560 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001561 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001562 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001563 return v;
1564
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001565 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001566#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001567 need_encoding = (encoding != NULL &&
1568 strcmp(encoding, "utf-8") != 0 &&
1569 strcmp(encoding, "iso-8859-1") != 0);
1570 if (rawmode || strchr(s, '\\') == NULL) {
1571 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001572#ifndef Py_USING_UNICODE
1573 /* This should not happen - we never see any other
1574 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001575 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001576#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001577 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1578 if (u == NULL)
1579 return NULL;
1580 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1581 Py_DECREF(u);
1582 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001583#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001584 } else {
1585 return PyString_FromStringAndSize(s, len);
1586 }
1587 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001588
1589 v = PyString_DecodeEscape(s, len, NULL, unicode,
1590 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001591 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001592 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001593 return v;
1594}
1595
Guido van Rossum79f25d91997-04-29 20:08:16 +00001596static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001597parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001598{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001599 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001600 int i;
1601 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001602 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001603 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001604 for (i = 1; i < NCH(n); i++) {
1605 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001606 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001607 if (s == NULL)
1608 goto onError;
1609 if (PyString_Check(v) && PyString_Check(s)) {
1610 PyString_ConcatAndDel(&v, s);
1611 if (v == NULL)
1612 goto onError;
1613 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001614#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001615 else {
1616 PyObject *temp;
1617 temp = PyUnicode_Concat(v, s);
1618 Py_DECREF(s);
1619 if (temp == NULL)
1620 goto onError;
1621 Py_DECREF(v);
1622 v = temp;
1623 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001624#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001625 }
1626 }
1627 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001628
1629 onError:
1630 Py_XDECREF(v);
1631 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001632}
1633
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001634static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001635com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001636{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001637 int anchor = 0;
1638 int save_begin = c->c_begin;
1639
Raymond Hettinger354433a2004-05-19 08:20:33 +00001640 /* list_for: for v in expr [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001641 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001642 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001643 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001644 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001645 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001646 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001647 c->c_loops++;
1648 com_list_iter(c, n, e, t);
1649 c->c_loops--;
1650 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1651 c->c_begin = save_begin;
1652 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001653 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001654}
1655
1656static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001657com_gen_for(struct compiling *c, node *n, node *t, int is_outmost)
1658{
1659 int break_anchor = 0;
1660 int anchor = 0;
1661 int save_begin = c->c_begin;
1662
1663 REQ(n, gen_for);
1664 /* gen_for: for v in test [gen_iter] */
1665
1666 com_addfwref(c, SETUP_LOOP, &break_anchor);
1667 block_push(c, SETUP_LOOP);
1668
1669 if (is_outmost) {
1670 com_addop_varname(c, VAR_LOAD, "[outmost-iterable]");
1671 com_push(c, 1);
1672 }
1673 else {
1674 com_node(c, CHILD(n, 3));
1675 com_addbyte(c, GET_ITER);
1676 }
1677
1678 c->c_begin = c->c_nexti;
1679 com_set_lineno(c, c->c_last_line);
1680 com_addfwref(c, FOR_ITER, &anchor);
1681 com_push(c, 1);
1682 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
1683
1684 if (NCH(n) == 5)
1685 com_gen_iter(c, CHILD(n, 4), t);
1686 else {
1687 com_test(c, t);
1688 com_addbyte(c, YIELD_VALUE);
1689 com_pop(c, 1);
1690 }
1691
1692 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1693 c->c_begin = save_begin;
1694
1695 com_backpatch(c, anchor);
1696 com_pop(c, 1); /* FOR_ITER has popped this */
1697 com_addbyte(c, POP_BLOCK);
1698 block_pop(c, SETUP_LOOP);
1699 com_backpatch(c, break_anchor);
1700}
1701
1702static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001703com_list_if(struct compiling *c, node *n, node *e, char *t)
1704{
1705 int anchor = 0;
1706 int a = 0;
1707 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001708 com_node(c, CHILD(n, 1));
1709 com_addfwref(c, JUMP_IF_FALSE, &a);
1710 com_addbyte(c, POP_TOP);
1711 com_pop(c, 1);
1712 com_list_iter(c, n, e, t);
1713 com_addfwref(c, JUMP_FORWARD, &anchor);
1714 com_backpatch(c, a);
1715 /* We jump here with an extra entry which we now pop */
1716 com_addbyte(c, POP_TOP);
1717 com_backpatch(c, anchor);
1718}
1719
1720static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001721com_gen_if(struct compiling *c, node *n, node *t)
1722{
1723 /* gen_if: 'if' test [gen_iter] */
1724 int anchor = 0;
1725 int a=0;
1726
1727 com_node(c, CHILD(n, 1));
1728 com_addfwref(c, JUMP_IF_FALSE, &a);
1729 com_addbyte(c, POP_TOP);
1730 com_pop(c, 1);
1731
1732 if (NCH(n) == 3)
1733 com_gen_iter(c, CHILD(n, 2), t);
1734 else {
1735 com_test(c, t);
1736 com_addbyte(c, YIELD_VALUE);
1737 com_pop(c, 1);
1738 }
1739 com_addfwref(c, JUMP_FORWARD, &anchor);
1740 com_backpatch(c, a);
1741 /* We jump here with an extra entry which we now pop */
1742 com_addbyte(c, POP_TOP);
1743 com_backpatch(c, anchor);
1744}
1745
1746static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001747com_list_iter(struct compiling *c,
1748 node *p, /* parent of list_iter node */
1749 node *e, /* element expression node */
1750 char *t /* name of result list temp local */)
1751{
1752 /* list_iter is the last child in a listmaker, list_for, or list_if */
1753 node *n = CHILD(p, NCH(p)-1);
1754 if (TYPE(n) == list_iter) {
1755 n = CHILD(n, 0);
1756 switch (TYPE(n)) {
1757 case list_for:
1758 com_list_for(c, n, e, t);
1759 break;
1760 case list_if:
1761 com_list_if(c, n, e, t);
1762 break;
1763 default:
1764 com_error(c, PyExc_SystemError,
1765 "invalid list_iter node type");
1766 }
1767 }
1768 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001769 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001770 com_push(c, 1);
1771 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001772 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001773 com_pop(c, 2);
1774 }
1775}
1776
1777static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001778com_gen_iter(struct compiling *c, node *n, node *t)
1779{
1780 /* gen_iter: gen_for | gen_if */
1781 node *ch;
1782 REQ(n, gen_iter);
1783
1784 ch = CHILD(n, 0);
1785
1786 switch (TYPE(ch)) {
1787 case gen_for:
1788 com_gen_for(c, ch, t, 0);
1789 break;
1790 case gen_if:
1791 com_gen_if(c, ch, t);
1792 break;
1793 default:
1794 com_error(c, PyExc_SystemError,
1795 "invalid gen_iter node type");
1796 }
1797}
1798
1799static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001800com_list_comprehension(struct compiling *c, node *n)
1801{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001802 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001803 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001804
1805 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001806 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001807 com_addoparg(c, BUILD_LIST, 0);
1808 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1809 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001810 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001811 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001812 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001813 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001814 --c->c_tmpname;
1815}
1816
1817static void
1818com_listmaker(struct compiling *c, node *n)
1819{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001820 /* listmaker: test ( list_for | (',' test)* [','] ) */
1821 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001822 com_list_comprehension(c, n);
1823 else {
1824 int len = 0;
1825 int i;
1826 for (i = 0; i < NCH(n); i += 2, len++)
1827 com_node(c, CHILD(n, i));
1828 com_addoparg(c, BUILD_LIST, len);
1829 com_pop(c, len-1);
1830 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001831}
1832
1833static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001834com_generator_expression(struct compiling *c, node *n)
1835{
1836 /* testlist_gexp: test gen_for */
1837 /* argument: test gen_for */
1838 PyCodeObject *co;
1839
1840 REQ(CHILD(n, 0), test);
1841 REQ(CHILD(n, 1), gen_for);
1842
1843 symtable_enter_scope(c->c_symtable, "<genexpr>", TYPE(n),
1844 n->n_lineno);
1845 co = icompile(n, c);
1846 symtable_exit_scope(c->c_symtable);
1847
1848 if (co == NULL)
1849 c->c_errors++;
1850 else {
1851 int closure = com_make_closure(c, co);
1852 int i = com_addconst(c, (PyObject *)co);
1853
1854 com_addoparg(c, LOAD_CONST, i);
1855 com_push(c, 1);
1856 if (closure)
1857 com_addoparg(c, MAKE_CLOSURE, 0);
1858 else
1859 com_addoparg(c, MAKE_FUNCTION, 0);
1860
1861 com_test(c, CHILD(CHILD(n, 1), 3));
1862 com_addbyte(c, GET_ITER);
1863 com_addoparg(c, CALL_FUNCTION, 1);
1864 com_pop(c, 1);
1865
1866 Py_DECREF(co);
1867 }
1868}
1869
1870static void
1871com_testlist_gexp(struct compiling *c, node *n)
1872{
1873 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
1874 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
1875 com_generator_expression(c, n);
1876 else com_list(c, n, 0);
1877}
1878
1879static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001880com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001881{
1882 int i;
1883 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1884 for (i = 0; i+2 < NCH(n); i += 4) {
1885 /* We must arrange things just right for STORE_SUBSCR.
1886 It wants the stack to look like (value) (dict) (key) */
1887 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001888 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001889 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00001890 com_node(c, CHILD(n, i+2)); /* value */
1891 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001892 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001893 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001894 }
1895}
1896
1897static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001898com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001899{
1900 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001901 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001902 int i;
1903 REQ(n, atom);
1904 ch = CHILD(n, 0);
1905 switch (TYPE(ch)) {
1906 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001907 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001908 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001909 com_push(c, 1);
1910 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001911 else
Raymond Hettinger354433a2004-05-19 08:20:33 +00001912 com_testlist_gexp(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001913 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001914 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001915 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001916 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001917 com_push(c, 1);
1918 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001919 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001920 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001921 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001922 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001923 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001924 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001925 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001926 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001927 break;
1928 case BACKQUOTE:
1929 com_node(c, CHILD(n, 1));
1930 com_addbyte(c, UNARY_CONVERT);
1931 break;
1932 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001933 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001934 i = 255;
1935 }
1936 else {
1937 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001938 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001939 }
1940 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001941 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001942 break;
1943 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001944 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001945 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001946 c->c_errors++;
1947 i = 255;
1948 }
1949 else {
1950 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001951 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001952 }
1953 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001954 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001955 break;
1956 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001957 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001958 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001959 break;
1960 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001961 com_error(c, PyExc_SystemError,
1962 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001963 }
1964}
1965
1966static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001967com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001968{
1969 if (NCH(n) == 1) {
1970 com_addbyte(c, op);
1971 }
1972 else if (NCH(n) == 2) {
1973 if (TYPE(CHILD(n, 0)) != COLON) {
1974 com_node(c, CHILD(n, 0));
1975 com_addbyte(c, op+1);
1976 }
1977 else {
1978 com_node(c, CHILD(n, 1));
1979 com_addbyte(c, op+2);
1980 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001981 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001982 }
1983 else {
1984 com_node(c, CHILD(n, 0));
1985 com_node(c, CHILD(n, 2));
1986 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001987 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001988 }
1989}
1990
Guido van Rossum635abd21997-01-06 22:56:52 +00001991static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001992com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1993{
1994 if (NCH(n) == 1) {
1995 com_addbyte(c, DUP_TOP);
1996 com_push(c, 1);
1997 com_addbyte(c, SLICE);
1998 com_node(c, augn);
1999 com_addbyte(c, opcode);
2000 com_pop(c, 1);
2001 com_addbyte(c, ROT_TWO);
2002 com_addbyte(c, STORE_SLICE);
2003 com_pop(c, 2);
2004 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
2005 com_node(c, CHILD(n, 0));
2006 com_addoparg(c, DUP_TOPX, 2);
2007 com_push(c, 2);
2008 com_addbyte(c, SLICE+1);
2009 com_pop(c, 1);
2010 com_node(c, augn);
2011 com_addbyte(c, opcode);
2012 com_pop(c, 1);
2013 com_addbyte(c, ROT_THREE);
2014 com_addbyte(c, STORE_SLICE+1);
2015 com_pop(c, 3);
2016 } else if (NCH(n) == 2) {
2017 com_node(c, CHILD(n, 1));
2018 com_addoparg(c, DUP_TOPX, 2);
2019 com_push(c, 2);
2020 com_addbyte(c, SLICE+2);
2021 com_pop(c, 1);
2022 com_node(c, augn);
2023 com_addbyte(c, opcode);
2024 com_pop(c, 1);
2025 com_addbyte(c, ROT_THREE);
2026 com_addbyte(c, STORE_SLICE+2);
2027 com_pop(c, 3);
2028 } else {
2029 com_node(c, CHILD(n, 0));
2030 com_node(c, CHILD(n, 2));
2031 com_addoparg(c, DUP_TOPX, 3);
2032 com_push(c, 3);
2033 com_addbyte(c, SLICE+3);
2034 com_pop(c, 2);
2035 com_node(c, augn);
2036 com_addbyte(c, opcode);
2037 com_pop(c, 1);
2038 com_addbyte(c, ROT_FOUR);
2039 com_addbyte(c, STORE_SLICE+3);
2040 com_pop(c, 4);
2041 }
2042}
2043
2044static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002045com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002046{
2047 node *m;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002048 REQ(n, argument); /* [test '='] test [gen_for]; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00002049 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00002050 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002051 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00002052 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002053 }
2054 else {
2055 com_node(c, CHILD(n, 0));
2056 }
Guido van Rossum635abd21997-01-06 22:56:52 +00002057 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002058 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00002059 if (NCH(n) == 2) {
2060 com_generator_expression(c, n);
2061 return;
2062 }
2063
Guido van Rossumf10570b1995-07-07 22:53:21 +00002064 m = n;
2065 do {
2066 m = CHILD(m, 0);
2067 } while (NCH(m) == 1);
2068 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00002069 /* f(lambda x: x[0] = 3) ends up getting parsed with
2070 * LHS test = lambda x: x[0], and RHS test = 3.
2071 * SF bug 132313 points out that complaining about a keyword
2072 * then is very confusing.
2073 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002074 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00002075 TYPE(m) == lambdef ?
2076 "lambda cannot contain assignment" :
2077 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002078 }
2079 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002080 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00002081 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00002082 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002083 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002084 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002085 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002086 else if (*pkeywords == NULL) {
2087 c->c_errors++;
2088 Py_DECREF(v);
2089 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002090 if (PyDict_GetItem(*pkeywords, v) != NULL)
2091 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00002092 "duplicate keyword argument");
2093 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002094 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00002095 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002096 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002097 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002098 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002099 }
2100 }
2101 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002102}
2103
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002104static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002105com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002106{
2107 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00002108 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002109 }
2110 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002111 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00002112 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00002113 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00002114 int star_flag = 0;
2115 int starstar_flag = 0;
2116 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002117 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002118 na = 0;
2119 nk = 0;
2120 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00002121 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00002122 if (TYPE(ch) == STAR ||
2123 TYPE(ch) == DOUBLESTAR)
2124 break;
Guido van Rossumca906051998-12-10 16:56:22 +00002125 if (ch->n_lineno != lineno) {
2126 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002127 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00002128 }
2129 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00002130 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002131 na++;
2132 else
2133 nk++;
2134 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002135 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00002136 while (i < NCH(n)) {
2137 node *tok = CHILD(n, i);
2138 node *ch = CHILD(n, i+1);
2139 i += 3;
2140 switch (TYPE(tok)) {
2141 case STAR: star_flag = 1; break;
2142 case DOUBLESTAR: starstar_flag = 1; break;
2143 }
2144 com_node(c, ch);
2145 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002146 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002147 com_error(c, PyExc_SyntaxError,
2148 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002149 }
Jeremy Hylton76901512000-03-28 23:49:17 +00002150 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00002151 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00002152 star_flag + (starstar_flag << 1);
2153 else
2154 opcode = CALL_FUNCTION;
2155 com_addoparg(c, opcode, na | (nk << 8));
2156 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002157 }
2158}
2159
2160static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002161com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002162{
2163 com_addopname(c, LOAD_ATTR, n);
2164}
2165
2166static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002167com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002168{
2169 int i=0;
2170 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00002171 node *ch;
2172
2173 /* first argument */
2174 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002175 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002176 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002177 i++;
2178 }
2179 else {
2180 com_node(c, CHILD(n,i));
2181 i++;
2182 REQ(CHILD(n,i),COLON);
2183 i++;
2184 }
2185 /* second argument */
2186 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
2187 com_node(c, CHILD(n,i));
2188 i++;
2189 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002190 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002191 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002192 com_push(c, 1);
2193 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002194 /* remaining arguments */
2195 for (; i < NCH(n); i++) {
2196 ns++;
2197 ch=CHILD(n,i);
2198 REQ(ch, sliceop);
2199 if (NCH(ch) == 1) {
2200 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002201 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002202 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002203 }
2204 else
2205 com_node(c, CHILD(ch,1));
2206 }
2207 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002208 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002209}
2210
2211static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002212com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002213{
2214 node *ch;
2215 REQ(n, subscript);
2216 ch = CHILD(n,0);
2217 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002218 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002219 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002220 com_push(c, 1);
2221 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002222 else {
2223 /* check for slice */
2224 if ((TYPE(ch) == COLON || NCH(n) > 1))
2225 com_sliceobj(c, n);
2226 else {
2227 REQ(ch, test);
2228 com_node(c, ch);
2229 }
2230 }
2231}
2232
2233static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002234com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002235{
2236 int i, op;
2237 REQ(n, subscriptlist);
2238 /* Check to make backward compatible slice behavior for '[i:j]' */
2239 if (NCH(n) == 1) {
2240 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002241 /* 'Basic' slice, should have exactly one colon. */
2242 if ((TYPE(CHILD(sub, 0)) == COLON
2243 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2244 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2245 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002246 switch (assigning) {
2247 case OP_DELETE:
2248 op = DELETE_SLICE;
2249 break;
2250 case OP_ASSIGN:
2251 op = STORE_SLICE;
2252 break;
2253 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002254 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002255 break;
2256 default:
2257 com_augassign_slice(c, sub, assigning, augn);
2258 return;
2259 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002260 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002261 if (op == STORE_SLICE)
2262 com_pop(c, 2);
2263 else if (op == DELETE_SLICE)
2264 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002265 return;
2266 }
2267 }
2268 /* Else normal subscriptlist. Compile each subscript. */
2269 for (i = 0; i < NCH(n); i += 2)
2270 com_subscript(c, CHILD(n, i));
2271 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002272 if (NCH(n) > 1) {
2273 i = (NCH(n)+1) / 2;
2274 com_addoparg(c, BUILD_TUPLE, i);
2275 com_pop(c, i-1);
2276 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002277 switch (assigning) {
2278 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002279 op = DELETE_SUBSCR;
2280 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002281 break;
2282 default:
2283 case OP_ASSIGN:
2284 op = STORE_SUBSCR;
2285 i = 3;
2286 break;
2287 case OP_APPLY:
2288 op = BINARY_SUBSCR;
2289 i = 1;
2290 break;
2291 }
2292 if (assigning > OP_APPLY) {
2293 com_addoparg(c, DUP_TOPX, 2);
2294 com_push(c, 2);
2295 com_addbyte(c, BINARY_SUBSCR);
2296 com_pop(c, 1);
2297 com_node(c, augn);
2298 com_addbyte(c, assigning);
2299 com_pop(c, 1);
2300 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002301 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002302 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002303 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002304}
2305
2306static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002307com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002308{
2309 REQ(n, trailer);
2310 switch (TYPE(CHILD(n, 0))) {
2311 case LPAR:
2312 com_call_function(c, CHILD(n, 1));
2313 break;
2314 case DOT:
2315 com_select_member(c, CHILD(n, 1));
2316 break;
2317 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002318 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002319 break;
2320 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002321 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002322 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002323 }
2324}
2325
2326static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002327com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002328{
2329 int i;
2330 REQ(n, power);
2331 com_atom(c, CHILD(n, 0));
2332 for (i = 1; i < NCH(n); i++) {
2333 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2334 com_factor(c, CHILD(n, i+1));
2335 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002336 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002337 break;
2338 }
2339 else
2340 com_apply_trailer(c, CHILD(n, i));
2341 }
2342}
2343
2344static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002345com_invert_constant(struct compiling *c, node *n)
2346{
2347 /* Compute the inverse of int and longs and use them directly,
2348 but be prepared to generate code for all other
2349 possibilities (invalid numbers, floats, complex).
2350 */
2351 PyObject *num, *inv = NULL;
2352 int i;
2353
2354 REQ(n, NUMBER);
2355 num = parsenumber(c, STR(n));
2356 if (num == NULL)
2357 i = 255;
2358 else {
2359 inv = PyNumber_Invert(num);
2360 if (inv == NULL) {
2361 PyErr_Clear();
2362 i = com_addconst(c, num);
2363 } else {
2364 i = com_addconst(c, inv);
2365 Py_DECREF(inv);
2366 }
2367 Py_DECREF(num);
2368 }
2369 com_addoparg(c, LOAD_CONST, i);
2370 com_push(c, 1);
2371 if (num != NULL && inv == NULL)
2372 com_addbyte(c, UNARY_INVERT);
2373}
2374
Tim Peters51e26512001-09-07 08:45:55 +00002375static int
2376is_float_zero(const char *p)
2377{
2378 int found_radix_point = 0;
2379 int ch;
2380 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2381 switch (ch) {
2382 case '0':
2383 /* no reason to believe it's not 0 -- continue */
2384 break;
2385
2386 case 'e': case 'E': case 'j': case 'J':
2387 /* If this was a hex constant, we already would have
2388 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2389 must be an exponent marker, and we haven't yet
2390 seen a non-zero digit, and it doesn't matter what
2391 the exponent is then. For 'j' or 'J' similarly,
2392 except that this is an imaginary 0 then. */
2393 return 1;
2394
2395 case '.':
2396 found_radix_point = 1;
2397 break;
2398
2399 default:
2400 return 0;
2401 }
2402 }
2403 return found_radix_point;
2404}
2405
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002406static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002407com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002408{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002409 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002410 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002411 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002412 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002413 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002414 approriate value as a constant. If the value is negative,
2415 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002416 negative in the 0th position -- unless we're doing unary minus
2417 of a floating zero! In that case the sign is significant, but
2418 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002419 */
2420 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002421 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002422 && TYPE((pfactor = CHILD(n, 1))) == factor
2423 && NCH(pfactor) == 1
2424 && TYPE((ppower = CHILD(pfactor, 0))) == power
2425 && NCH(ppower) == 1
2426 && TYPE((patom = CHILD(ppower, 0))) == atom
2427 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002428 && !(childtype == MINUS &&
2429 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002430 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002431 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002432 return;
2433 }
2434 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002435 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002436 if (s == NULL) {
2437 com_error(c, PyExc_MemoryError, "");
2438 com_addbyte(c, 255);
2439 return;
2440 }
2441 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002442 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002443 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002444 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002445 }
Tim Peters51e26512001-09-07 08:45:55 +00002446 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002447 }
2448 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002449 com_factor(c, CHILD(n, 1));
2450 com_addbyte(c, UNARY_POSITIVE);
2451 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002452 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002453 com_factor(c, CHILD(n, 1));
2454 com_addbyte(c, UNARY_NEGATIVE);
2455 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002456 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002457 com_factor(c, CHILD(n, 1));
2458 com_addbyte(c, UNARY_INVERT);
2459 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002460 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002461 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002462 }
2463}
2464
2465static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002466com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002467{
2468 int i;
2469 int op;
2470 REQ(n, term);
2471 com_factor(c, CHILD(n, 0));
2472 for (i = 2; i < NCH(n); i += 2) {
2473 com_factor(c, CHILD(n, i));
2474 switch (TYPE(CHILD(n, i-1))) {
2475 case STAR:
2476 op = BINARY_MULTIPLY;
2477 break;
2478 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002479 if (c->c_flags & CO_FUTURE_DIVISION)
2480 op = BINARY_TRUE_DIVIDE;
2481 else
2482 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002483 break;
2484 case PERCENT:
2485 op = BINARY_MODULO;
2486 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002487 case DOUBLESLASH:
2488 op = BINARY_FLOOR_DIVIDE;
2489 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002490 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002491 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002492 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002493 op = 255;
2494 }
2495 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002496 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002497 }
2498}
2499
2500static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002501com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002502{
2503 int i;
2504 int op;
2505 REQ(n, arith_expr);
2506 com_term(c, CHILD(n, 0));
2507 for (i = 2; i < NCH(n); i += 2) {
2508 com_term(c, CHILD(n, i));
2509 switch (TYPE(CHILD(n, i-1))) {
2510 case PLUS:
2511 op = BINARY_ADD;
2512 break;
2513 case MINUS:
2514 op = BINARY_SUBTRACT;
2515 break;
2516 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002517 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002518 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002519 op = 255;
2520 }
2521 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002522 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002523 }
2524}
2525
2526static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002527com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002528{
2529 int i;
2530 int op;
2531 REQ(n, shift_expr);
2532 com_arith_expr(c, CHILD(n, 0));
2533 for (i = 2; i < NCH(n); i += 2) {
2534 com_arith_expr(c, CHILD(n, i));
2535 switch (TYPE(CHILD(n, i-1))) {
2536 case LEFTSHIFT:
2537 op = BINARY_LSHIFT;
2538 break;
2539 case RIGHTSHIFT:
2540 op = BINARY_RSHIFT;
2541 break;
2542 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002543 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002544 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002545 op = 255;
2546 }
2547 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002548 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002549 }
2550}
2551
2552static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002553com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002554{
2555 int i;
2556 int op;
2557 REQ(n, and_expr);
2558 com_shift_expr(c, CHILD(n, 0));
2559 for (i = 2; i < NCH(n); i += 2) {
2560 com_shift_expr(c, CHILD(n, i));
2561 if (TYPE(CHILD(n, i-1)) == AMPER) {
2562 op = BINARY_AND;
2563 }
2564 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002565 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002566 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002567 op = 255;
2568 }
2569 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002570 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002571 }
2572}
2573
2574static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002575com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002576{
2577 int i;
2578 int op;
2579 REQ(n, xor_expr);
2580 com_and_expr(c, CHILD(n, 0));
2581 for (i = 2; i < NCH(n); i += 2) {
2582 com_and_expr(c, CHILD(n, i));
2583 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2584 op = BINARY_XOR;
2585 }
2586 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002587 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002588 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002589 op = 255;
2590 }
2591 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002592 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002593 }
2594}
2595
2596static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002597com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002598{
2599 int i;
2600 int op;
2601 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002602 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002603 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002604 com_xor_expr(c, CHILD(n, i));
2605 if (TYPE(CHILD(n, i-1)) == VBAR) {
2606 op = BINARY_OR;
2607 }
2608 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002609 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002610 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002611 op = 255;
2612 }
2613 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002614 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002615 }
2616}
2617
2618static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002619cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002620{
2621 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00002622 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002623 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2624 if (NCH(n) == 1) {
2625 n = CHILD(n, 0);
2626 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002627 case LESS: return PyCmp_LT;
2628 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00002629 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00002630 case LESSEQUAL: return PyCmp_LE;
2631 case GREATEREQUAL: return PyCmp_GE;
2632 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2633 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2634 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002635 }
2636 }
2637 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002638 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002639 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002640 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002641 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002642 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002643 }
2644 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002645 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002646}
2647
2648static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002649com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002650{
2651 int i;
2652 enum cmp_op op;
2653 int anchor;
2654 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2655 com_expr(c, CHILD(n, 0));
2656 if (NCH(n) == 1)
2657 return;
2658
2659 /****************************************************************
2660 The following code is generated for all but the last
2661 comparison in a chain:
2662
2663 label: on stack: opcode: jump to:
2664
2665 a <code to load b>
2666 a, b DUP_TOP
2667 a, b, b ROT_THREE
2668 b, a, b COMPARE_OP
2669 b, 0-or-1 JUMP_IF_FALSE L1
2670 b, 1 POP_TOP
2671 b
2672
2673 We are now ready to repeat this sequence for the next
2674 comparison in the chain.
2675
2676 For the last we generate:
2677
2678 b <code to load c>
2679 b, c COMPARE_OP
2680 0-or-1
2681
2682 If there were any jumps to L1 (i.e., there was more than one
2683 comparison), we generate:
2684
2685 0-or-1 JUMP_FORWARD L2
2686 L1: b, 0 ROT_TWO
2687 0, b POP_TOP
2688 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002689 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002690 ****************************************************************/
2691
2692 anchor = 0;
2693
2694 for (i = 2; i < NCH(n); i += 2) {
2695 com_expr(c, CHILD(n, i));
2696 if (i+2 < NCH(n)) {
2697 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002698 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002699 com_addbyte(c, ROT_THREE);
2700 }
2701 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002702 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002703 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002704 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002705 }
2706 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002707 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002708 if (i+2 < NCH(n)) {
2709 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2710 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002711 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002712 }
2713 }
2714
2715 if (anchor) {
2716 int anchor2 = 0;
2717 com_addfwref(c, JUMP_FORWARD, &anchor2);
2718 com_backpatch(c, anchor);
2719 com_addbyte(c, ROT_TWO);
2720 com_addbyte(c, POP_TOP);
2721 com_backpatch(c, anchor2);
2722 }
2723}
2724
2725static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002726com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002727{
2728 REQ(n, not_test); /* 'not' not_test | comparison */
2729 if (NCH(n) == 1) {
2730 com_comparison(c, CHILD(n, 0));
2731 }
2732 else {
2733 com_not_test(c, CHILD(n, 1));
2734 com_addbyte(c, UNARY_NOT);
2735 }
2736}
2737
2738static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002739com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002740{
2741 int i;
2742 int anchor;
2743 REQ(n, and_test); /* not_test ('and' not_test)* */
2744 anchor = 0;
2745 i = 0;
2746 for (;;) {
2747 com_not_test(c, CHILD(n, i));
2748 if ((i += 2) >= NCH(n))
2749 break;
2750 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2751 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002752 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002753 }
2754 if (anchor)
2755 com_backpatch(c, anchor);
2756}
2757
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002758static int
2759com_make_closure(struct compiling *c, PyCodeObject *co)
2760{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002761 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002762 if (free == 0)
2763 return 0;
2764 for (i = 0; i < free; ++i) {
2765 /* Bypass com_addop_varname because it will generate
2766 LOAD_DEREF but LOAD_CLOSURE is needed.
2767 */
2768 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2769 int arg, reftype;
2770
2771 /* Special case: If a class contains a method with a
2772 free variable that has the same name as a method,
2773 the name will be considered free *and* local in the
2774 class. It should be handled by the closure, as
2775 well as by the normal name loookup logic.
2776 */
2777 reftype = get_ref_type(c, PyString_AS_STRING(name));
2778 if (reftype == CELL)
2779 arg = com_lookup_arg(c->c_cellvars, name);
2780 else /* (reftype == FREE) */
2781 arg = com_lookup_arg(c->c_freevars, name);
2782 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002783 fprintf(stderr, "lookup %s in %s %d %d\n"
2784 "freevars of %s: %s\n",
2785 PyObject_REPR(name),
2786 c->c_name,
2787 reftype, arg,
2788 PyString_AS_STRING(co->co_name),
2789 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002790 Py_FatalError("com_make_closure()");
2791 }
2792 com_addoparg(c, LOAD_CLOSURE, arg);
2793
2794 }
2795 com_push(c, free);
2796 return 1;
2797}
2798
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002799static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002800com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002801{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002802 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002803 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002804 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002805 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002806 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002807 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2808 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002809 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002810 if (co == NULL) {
2811 c->c_errors++;
2812 return;
2813 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002814 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002815 i = com_addconst(c, (PyObject *)co);
2816 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002817 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002818 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002819 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002820 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002821 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002822 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002823 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002824 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002825 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002826 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002827 else {
2828 int anchor = 0;
2829 int i = 0;
2830 for (;;) {
2831 com_and_test(c, CHILD(n, i));
2832 if ((i += 2) >= NCH(n))
2833 break;
2834 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2835 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002836 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002837 }
2838 if (anchor)
2839 com_backpatch(c, anchor);
2840 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002841}
2842
2843static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002844com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002845{
2846 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002847 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002848 com_node(c, CHILD(n, 0));
2849 }
2850 else {
2851 int i;
2852 int len;
2853 len = (NCH(n) + 1) / 2;
2854 for (i = 0; i < NCH(n); i += 2)
2855 com_node(c, CHILD(n, i));
2856 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002857 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002858 }
2859}
2860
2861
2862/* Begin of assignment compilation */
2863
Thomas Wouters434d0822000-08-24 20:11:32 +00002864
2865static void
2866com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2867{
2868 com_addbyte(c, DUP_TOP);
2869 com_push(c, 1);
2870 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002871 com_node(c, augn);
2872 com_addbyte(c, opcode);
2873 com_pop(c, 1);
2874 com_addbyte(c, ROT_TWO);
2875 com_addopname(c, STORE_ATTR, n);
2876 com_pop(c, 2);
2877}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002878
2879static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002880com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002881{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00002882 if (none_assignment_check(c, STR(n), assigning))
2883 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002884 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002885 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002886}
2887
2888static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002889com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002890{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002891 REQ(n, trailer);
2892 switch (TYPE(CHILD(n, 0))) {
2893 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002894 if (assigning == OP_DELETE)
2895 com_error(c, PyExc_SyntaxError,
2896 "can't delete function call");
2897 else
2898 com_error(c, PyExc_SyntaxError,
2899 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002900 break;
2901 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002902 if (assigning > OP_APPLY)
2903 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2904 else
2905 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002906 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002907 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002908 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002909 break;
2910 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002911 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002912 }
2913}
2914
2915static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002916com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002917{
2918 int i;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002919 if (TYPE(n) != testlist && TYPE(n) != testlist_gexp &&
2920 TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002921 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002922 if (assigning) {
2923 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002924 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002925 com_push(c, i-1);
2926 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002927 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002928 com_assign(c, CHILD(n, i), assigning, NULL);
2929}
2930
2931static void
2932com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2933{
2934 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002935 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002936 com_push(c, 1);
2937 com_node(c, augn);
2938 com_addbyte(c, opcode);
2939 com_pop(c, 1);
2940 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002941}
2942
2943static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002944com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002945{
2946 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002947 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002948 if (assigning)
2949 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002950}
2951
2952static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002953com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002954{
2955 /* Loop to avoid trivial recursion */
2956 for (;;) {
2957 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002958
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002959 case exprlist:
2960 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002961 case testlist1:
Raymond Hettinger354433a2004-05-19 08:20:33 +00002962 case testlist_gexp:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002963 if (NCH(n) > 1) {
Raymond Hettinger354433a2004-05-19 08:20:33 +00002964 if (TYPE(CHILD(n, 1)) == gen_for) {
2965 com_error(c, PyExc_SystemError,
2966 "assign to generator expression not possible");
2967 return;
2968 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002969 if (assigning > OP_APPLY) {
2970 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002971 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002972 return;
2973 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002974 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002975 return;
2976 }
2977 n = CHILD(n, 0);
2978 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002979
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002980 case test:
2981 case and_test:
2982 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002983 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002984 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002985 case xor_expr:
2986 case and_expr:
2987 case shift_expr:
2988 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002989 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002990 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002991 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002992 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002993 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002994 return;
2995 }
2996 n = CHILD(n, 0);
2997 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002998
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002999 case power: /* atom trailer* ('**' power)*
3000 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00003001 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003002 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003003 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003004 return;
3005 }
Guido van Rossum50564e81996-01-12 01:13:16 +00003006 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003007 int i;
3008 com_node(c, CHILD(n, 0));
3009 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003010 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003011 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003012 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00003013 return;
3014 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003015 com_apply_trailer(c, CHILD(n, i));
3016 } /* NB i is still alive */
3017 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00003018 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003019 return;
3020 }
3021 n = CHILD(n, 0);
3022 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003023
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003024 case atom:
3025 switch (TYPE(CHILD(n, 0))) {
3026 case LPAR:
3027 n = CHILD(n, 1);
3028 if (TYPE(n) == RPAR) {
3029 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003030 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003031 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003032 return;
3033 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003034 if (assigning > OP_APPLY) {
3035 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003036 "augmented assign to tuple literal not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003037 return;
3038 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003039 break;
3040 case LSQB:
3041 n = CHILD(n, 1);
3042 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003043 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003044 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003045 return;
3046 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003047 if (assigning > OP_APPLY) {
3048 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003049 "augmented assign to list literal not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003050 return;
3051 }
3052 if (NCH(n) > 1
3053 && TYPE(CHILD(n, 1)) == list_for) {
3054 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003055 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00003056 return;
3057 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003058 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003059 return;
3060 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00003061 if (assigning > OP_APPLY)
3062 com_augassign_name(c, CHILD(n, 0),
3063 assigning, augn);
3064 else
3065 com_assign_name(c, CHILD(n, 0),
3066 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003067 return;
3068 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003069 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003070 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003071 return;
3072 }
3073 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003074
3075 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003076 com_error(c, PyExc_SyntaxError,
3077 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003078 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003079
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003080 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003081 com_error(c, PyExc_SystemError,
3082 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003083 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003084
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003085 }
3086 }
3087}
Guido van Rossum7c531111997-03-11 18:42:21 +00003088
Thomas Wouters434d0822000-08-24 20:11:32 +00003089static void
3090com_augassign(struct compiling *c, node *n)
3091{
3092 int opcode;
3093
3094 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
3095 case '+': opcode = INPLACE_ADD; break;
3096 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00003097 case '/':
3098 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
3099 opcode = INPLACE_FLOOR_DIVIDE;
3100 else if (c->c_flags & CO_FUTURE_DIVISION)
3101 opcode = INPLACE_TRUE_DIVIDE;
3102 else
3103 opcode = INPLACE_DIVIDE;
3104 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00003105 case '%': opcode = INPLACE_MODULO; break;
3106 case '<': opcode = INPLACE_LSHIFT; break;
3107 case '>': opcode = INPLACE_RSHIFT; break;
3108 case '&': opcode = INPLACE_AND; break;
3109 case '^': opcode = INPLACE_XOR; break;
3110 case '|': opcode = INPLACE_OR; break;
3111 case '*':
3112 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
3113 opcode = INPLACE_POWER;
3114 else
3115 opcode = INPLACE_MULTIPLY;
3116 break;
3117 default:
3118 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
3119 return;
3120 }
3121 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
3122}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003123
3124static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003125com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003126{
Thomas Wouters434d0822000-08-24 20:11:32 +00003127 REQ(n, expr_stmt);
3128 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003129 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00003130 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003131 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00003132 if (NCH(n) == 1) {
3133 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003134 if (c->c_interactive)
3135 com_addbyte(c, PRINT_EXPR);
3136 else
3137 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003138 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003139 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003140 else if (TYPE(CHILD(n,1)) == augassign)
3141 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003142 else {
3143 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00003144 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003145 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003146 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003147 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003148 com_push(c, 1);
3149 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003150 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003151 }
3152 }
3153}
3154
3155static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003156com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00003157{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003158 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003159 int i;
3160 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003161 if (Py_OptimizeFlag)
3162 return;
3163 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00003164
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003165 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00003166 raise AssertionError [, <message>]
3167
3168 where <message> is the second test, if present.
3169 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003170 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003171 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003172 com_addbyte(c, POP_TOP);
3173 com_pop(c, 1);
3174 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003175 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00003176 com_push(c, 1);
3177 i = NCH(n)/2; /* Either 2 or 4 */
3178 if (i > 1)
3179 com_node(c, CHILD(n, 3));
3180 com_addoparg(c, RAISE_VARARGS, i);
3181 com_pop(c, i);
3182 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003183 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003184 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003185 com_addbyte(c, POP_TOP);
3186}
3187
3188static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003189com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003190{
Barry Warsaw29c574e2000-08-21 15:38:56 +00003191 int i = 1;
3192 node* stream = NULL;
3193
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003194 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003195
3196 /* are we using the extended print form? */
3197 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
3198 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00003199 com_node(c, stream);
3200 /* stack: [...] => [... stream] */
3201 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003202 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3203 i = 4;
3204 else
3205 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003206 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003207 for (; i < NCH(n); i += 2) {
3208 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003209 com_addbyte(c, DUP_TOP);
3210 /* stack: [stream] => [stream stream] */
3211 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003212 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003213 /* stack: [stream stream] => [stream stream obj] */
3214 com_addbyte(c, ROT_TWO);
3215 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003216 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003217 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003218 com_pop(c, 2);
3219 }
3220 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003221 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003222 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003223 com_addbyte(c, PRINT_ITEM);
3224 com_pop(c, 1);
3225 }
3226 }
3227 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003228 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003229 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003230 /* must pop the extra stream object off the stack */
3231 com_addbyte(c, POP_TOP);
3232 /* stack: [... stream] => [...] */
3233 com_pop(c, 1);
3234 }
3235 }
3236 else {
3237 if (stream != NULL) {
3238 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003239 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003240 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003241 com_pop(c, 1);
3242 }
3243 else
3244 com_addbyte(c, PRINT_NEWLINE);
3245 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003246}
3247
3248static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003249com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003250{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003251 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003252 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003253 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003254 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003255 if (c->c_flags & CO_GENERATOR) {
3256 if (NCH(n) > 1) {
3257 com_error(c, PyExc_SyntaxError,
3258 "'return' with argument inside generator");
3259 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003260 }
3261 if (NCH(n) < 2) {
3262 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003263 com_push(c, 1);
3264 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003265 else
3266 com_node(c, CHILD(n, 1));
3267 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003268 com_pop(c, 1);
3269}
3270
3271static void
3272com_yield_stmt(struct compiling *c, node *n)
3273{
Tim Peters95c80f82001-06-23 02:07:08 +00003274 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003275 REQ(n, yield_stmt); /* 'yield' testlist */
3276 if (!c->c_infunction) {
3277 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3278 }
Tim Peters95c80f82001-06-23 02:07:08 +00003279
3280 for (i = 0; i < c->c_nblocks; ++i) {
3281 if (c->c_block[i] == SETUP_FINALLY) {
3282 com_error(c, PyExc_SyntaxError,
3283 "'yield' not allowed in a 'try' block "
3284 "with a 'finally' clause");
3285 return;
3286 }
3287 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003288 com_node(c, CHILD(n, 1));
3289 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003290 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003291}
3292
3293static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003294com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003295{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003296 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003297 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3298 if (NCH(n) > 1) {
3299 com_node(c, CHILD(n, 1));
3300 if (NCH(n) > 3) {
3301 com_node(c, CHILD(n, 3));
3302 if (NCH(n) > 5)
3303 com_node(c, CHILD(n, 5));
3304 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003305 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003306 i = NCH(n)/2;
3307 com_addoparg(c, RAISE_VARARGS, i);
3308 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003309}
3310
3311static void
Thomas Wouters52152252000-08-17 22:55:00 +00003312com_from_import(struct compiling *c, node *n)
3313{
3314 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3315 com_push(c, 1);
3316 if (NCH(n) > 1) {
3317 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3318 com_error(c, PyExc_SyntaxError, "invalid syntax");
3319 return;
3320 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003321 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003322 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003323 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003324 com_pop(c, 1);
3325}
3326
3327static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003328com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003329{
3330 int i;
3331 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003332 /* 'import' dotted_name (',' dotted_name)* |
3333 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003334 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00003335 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003336 /* 'from' dotted_name 'import' ... */
3337 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003338
3339 if (TYPE(CHILD(n, 3)) == STAR) {
3340 tup = Py_BuildValue("(s)", "*");
3341 } else {
3342 tup = PyTuple_New((NCH(n) - 2)/2);
3343 for (i = 3; i < NCH(n); i += 2) {
3344 PyTuple_SET_ITEM(tup, (i-3)/2,
Guido van Rossum633d90c2002-12-23 16:51:42 +00003345 PyString_FromString(STR(
3346 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003347 }
3348 }
3349 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003350 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003351 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003352 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00003353 if (TYPE(CHILD(n, 3)) == STAR)
3354 com_addbyte(c, IMPORT_STAR);
3355 else {
3356 for (i = 3; i < NCH(n); i += 2)
3357 com_from_import(c, CHILD(n, i));
3358 com_addbyte(c, POP_TOP);
3359 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003360 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003361 }
3362 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003363 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003364 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003365 node *subn = CHILD(n, i);
3366 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003367 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003368 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003369 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003370 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003371 int j;
3372 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003373 com_error(c, PyExc_SyntaxError,
3374 "invalid syntax");
3375 return;
3376 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003377 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3378 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003379 CHILD(CHILD(subn, 0),
3380 j));
3381 com_addop_varname(c, VAR_STORE,
3382 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003383 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003384 com_addop_varname(c, VAR_STORE,
3385 STR(CHILD(CHILD(subn, 0),
3386 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003387 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003388 }
3389 }
3390}
3391
3392static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003393com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003394{
3395 REQ(n, exec_stmt);
3396 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3397 com_node(c, CHILD(n, 1));
3398 if (NCH(n) >= 4)
3399 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003400 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003401 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003402 com_push(c, 1);
3403 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003404 if (NCH(n) >= 6)
3405 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003406 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003407 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003408 com_push(c, 1);
3409 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003410 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003411 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003412}
3413
Guido van Rossum7c531111997-03-11 18:42:21 +00003414static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003415is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003416{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003417 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003418 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003419 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003420
3421 /* Label to avoid tail recursion */
3422 next:
3423 switch (TYPE(n)) {
3424
3425 case suite:
3426 if (NCH(n) == 1) {
3427 n = CHILD(n, 0);
3428 goto next;
3429 }
3430 /* Fall through */
3431 case file_input:
3432 for (i = 0; i < NCH(n); i++) {
3433 node *ch = CHILD(n, i);
3434 if (TYPE(ch) == stmt) {
3435 n = ch;
3436 goto next;
3437 }
3438 }
3439 break;
3440
3441 case stmt:
3442 case simple_stmt:
3443 case small_stmt:
3444 n = CHILD(n, 0);
3445 goto next;
3446
3447 case expr_stmt:
3448 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003449 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003450 case test:
3451 case and_test:
3452 case not_test:
3453 case comparison:
3454 case expr:
3455 case xor_expr:
3456 case and_expr:
3457 case shift_expr:
3458 case arith_expr:
3459 case term:
3460 case factor:
3461 case power:
3462 case atom:
3463 if (NCH(n) == 1) {
3464 n = CHILD(n, 0);
3465 goto next;
3466 }
3467 break;
3468
3469 case NAME:
3470 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3471 return 1;
3472 break;
3473
3474 case NUMBER:
3475 v = parsenumber(c, STR(n));
3476 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003477 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003478 break;
3479 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003480 i = PyObject_IsTrue(v);
3481 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003482 return i == 0;
3483
3484 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003485 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003486 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003487 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003488 break;
3489 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003490 i = PyObject_IsTrue(v);
3491 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003492 return i == 0;
3493
3494 }
3495 return 0;
3496}
3497
Tim Peters08a898f2001-06-28 01:52:22 +00003498
3499/* Look under n for a return stmt with an expression.
3500 * This hack is used to find illegal returns under "if 0:" blocks in
3501 * functions already known to be generators (as determined by the symtable
3502 * pass).
3503 * Return the offending return node if found, else NULL.
3504 */
3505static node *
3506look_for_offending_return(node *n)
3507{
3508 int i;
3509
3510 for (i = 0; i < NCH(n); ++i) {
3511 node *kid = CHILD(n, i);
3512
3513 switch (TYPE(kid)) {
3514 case classdef:
3515 case funcdef:
3516 case lambdef:
3517 /* Stuff in nested functions & classes doesn't
3518 affect the code block we started in. */
3519 return NULL;
3520
3521 case return_stmt:
3522 if (NCH(kid) > 1)
3523 return kid;
3524 break;
3525
3526 default: {
3527 node *bad = look_for_offending_return(kid);
3528 if (bad != NULL)
3529 return bad;
3530 }
3531 }
3532 }
3533
3534 return NULL;
3535}
3536
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003537static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003538com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003539{
3540 int i;
3541 int anchor = 0;
3542 REQ(n, if_stmt);
3543 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3544 for (i = 0; i+3 < NCH(n); i+=4) {
3545 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003546 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003547 if (is_constant_false(c, ch)) {
3548 /* We're going to skip this block. However, if this
3549 is a generator, we have to check the dead code
3550 anyway to make sure there aren't any return stmts
3551 with expressions, in the same scope. */
3552 if (c->c_flags & CO_GENERATOR) {
3553 node *p = look_for_offending_return(n);
3554 if (p != NULL) {
3555 int savelineno = c->c_lineno;
3556 c->c_lineno = p->n_lineno;
3557 com_error(c, PyExc_SyntaxError,
3558 "'return' with argument "
3559 "inside generator");
3560 c->c_lineno = savelineno;
3561 }
3562 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003563 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003564 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003565 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003566 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003567 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003568 com_addfwref(c, JUMP_IF_FALSE, &a);
3569 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003570 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003571 com_node(c, CHILD(n, i+3));
3572 com_addfwref(c, JUMP_FORWARD, &anchor);
3573 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003574 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003575 com_addbyte(c, POP_TOP);
3576 }
3577 if (i+2 < NCH(n))
3578 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003579 if (anchor)
3580 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003581}
3582
3583static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003584com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003585{
3586 int break_anchor = 0;
3587 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003588 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003589 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3590 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003591 block_push(c, SETUP_LOOP);
3592 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003593 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003594 com_node(c, CHILD(n, 1));
3595 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3596 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003597 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003598 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003599 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003600 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003601 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3602 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003603 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003604 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003605 com_addbyte(c, POP_TOP);
3606 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003607 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003608 if (NCH(n) > 4)
3609 com_node(c, CHILD(n, 6));
3610 com_backpatch(c, break_anchor);
3611}
3612
3613static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003614com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003615{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003616 int break_anchor = 0;
3617 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003618 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003619 REQ(n, for_stmt);
3620 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3621 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003622 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003623 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003624 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003625 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00003626 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003627 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003628 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003629 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003630 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003631 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003632 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003633 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3634 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003635 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003636 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003637 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003638 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003639 if (NCH(n) > 8)
3640 com_node(c, CHILD(n, 8));
3641 com_backpatch(c, break_anchor);
3642}
3643
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003644/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003645
3646 SETUP_FINALLY L
3647 <code for S>
3648 POP_BLOCK
3649 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003650 L: <code for Sf>
3651 END_FINALLY
3652
3653 The special instructions use the block stack. Each block
3654 stack entry contains the instruction that created it (here
3655 SETUP_FINALLY), the level of the value stack at the time the
3656 block stack entry was created, and a label (here L).
3657
3658 SETUP_FINALLY:
3659 Pushes the current value stack level and the label
3660 onto the block stack.
3661 POP_BLOCK:
3662 Pops en entry from the block stack, and pops the value
3663 stack until its level is the same as indicated on the
3664 block stack. (The label is ignored.)
3665 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003666 Pops a variable number of entries from the *value* stack
3667 and re-raises the exception they specify. The number of
3668 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003669
3670 The block stack is unwound when an exception is raised:
3671 when a SETUP_FINALLY entry is found, the exception is pushed
3672 onto the value stack (and the exception condition is cleared),
3673 and the interpreter jumps to the label gotten from the block
3674 stack.
3675
3676 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003677 (The contents of the value stack is shown in [], with the top
3678 at the right; 'tb' is trace-back info, 'val' the exception's
3679 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003680
3681 Value stack Label Instruction Argument
3682 [] SETUP_EXCEPT L1
3683 [] <code for S>
3684 [] POP_BLOCK
3685 [] JUMP_FORWARD L0
3686
Guido van Rossum3f5da241990-12-20 15:06:42 +00003687 [tb, val, exc] L1: DUP )
3688 [tb, val, exc, exc] <evaluate E1> )
3689 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3690 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3691 [tb, val, exc, 1] POP )
3692 [tb, val, exc] POP
3693 [tb, val] <assign to V1> (or POP if no V1)
3694 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003695 [] <code for S1>
3696 JUMP_FORWARD L0
3697
Guido van Rossum3f5da241990-12-20 15:06:42 +00003698 [tb, val, exc, 0] L2: POP
3699 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003700 .............................etc.......................
3701
Guido van Rossum3f5da241990-12-20 15:06:42 +00003702 [tb, val, exc, 0] Ln+1: POP
3703 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003704
3705 [] L0: <next statement>
3706
3707 Of course, parts are not generated if Vi or Ei is not present.
3708*/
3709
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003710static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003711com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003712{
3713 int except_anchor = 0;
3714 int end_anchor = 0;
3715 int else_anchor = 0;
3716 int i;
3717 node *ch;
3718
3719 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3720 block_push(c, SETUP_EXCEPT);
3721 com_node(c, CHILD(n, 2));
3722 com_addbyte(c, POP_BLOCK);
3723 block_pop(c, SETUP_EXCEPT);
3724 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3725 com_backpatch(c, except_anchor);
3726 for (i = 3;
3727 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3728 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003729 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003730 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003731 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003732 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003733 break;
3734 }
3735 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003736 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003737 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003738 if (NCH(ch) > 1) {
3739 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003740 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003741 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003742 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003743 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003744 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3745 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003746 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003747 }
3748 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003749 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003750 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003751 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003752 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003753 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003754 com_pop(c, 1);
3755 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003756 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003757 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003758 com_node(c, CHILD(n, i+2));
3759 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3760 if (except_anchor) {
3761 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003762 /* We come in with [tb, val, exc, 0] on the
3763 stack; one pop and it's the same as
3764 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003765 com_addbyte(c, POP_TOP);
3766 }
3767 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003768 /* We actually come in here with [tb, val, exc] but the
3769 END_FINALLY will zap those and jump around.
3770 The c_stacklevel does not reflect them so we need not pop
3771 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003772 com_addbyte(c, END_FINALLY);
3773 com_backpatch(c, else_anchor);
3774 if (i < NCH(n))
3775 com_node(c, CHILD(n, i+2));
3776 com_backpatch(c, end_anchor);
3777}
3778
3779static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003780com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003781{
3782 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003783 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003784
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003785 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3786 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003787 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003788 com_addbyte(c, POP_BLOCK);
3789 block_pop(c, SETUP_FINALLY);
3790 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003791 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003792 /* While the generated code pushes only one item,
3793 the try-finally handling can enter here with
3794 up to three items. OK, here are the details:
3795 3 for an exception, 2 for RETURN, 1 for BREAK. */
3796 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003797 com_backpatch(c, finally_anchor);
3798 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003799 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003800 com_node(c, ch);
3801 com_addbyte(c, END_FINALLY);
3802 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003803 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003804}
3805
3806static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003807com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003808{
3809 REQ(n, try_stmt);
3810 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3811 | 'try' ':' suite 'finally' ':' suite */
3812 if (TYPE(CHILD(n, 3)) != except_clause)
3813 com_try_finally(c, n);
3814 else
3815 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003816}
3817
Guido van Rossum8b993a91997-01-17 21:04:03 +00003818static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003819get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003820{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003821 int i;
3822
Guido van Rossum8b993a91997-01-17 21:04:03 +00003823 /* Label to avoid tail recursion */
3824 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003825 switch (TYPE(n)) {
3826
3827 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003828 if (NCH(n) == 1) {
3829 n = CHILD(n, 0);
3830 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003831 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003832 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003833 case file_input:
3834 for (i = 0; i < NCH(n); i++) {
3835 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003836 if (TYPE(ch) == stmt) {
3837 n = ch;
3838 goto next;
3839 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003840 }
3841 break;
3842
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003843 case stmt:
3844 case simple_stmt:
3845 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003846 n = CHILD(n, 0);
3847 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003848
3849 case expr_stmt:
3850 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003851 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003852 case test:
3853 case and_test:
3854 case not_test:
3855 case comparison:
3856 case expr:
3857 case xor_expr:
3858 case and_expr:
3859 case shift_expr:
3860 case arith_expr:
3861 case term:
3862 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003863 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003864 if (NCH(n) == 1) {
3865 n = CHILD(n, 0);
3866 goto next;
3867 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003868 break;
3869
3870 case atom:
3871 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003872 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003873 break;
3874
3875 }
3876 return NULL;
3877}
3878
Guido van Rossum79f25d91997-04-29 20:08:16 +00003879static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003880get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003881{
Guido van Rossum541563e1999-01-28 15:08:09 +00003882 /* Don't generate doc-strings if run with -OO */
3883 if (Py_OptimizeFlag > 1)
3884 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003885 n = get_rawdocstring(n);
3886 if (n == NULL)
3887 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003888 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003889}
3890
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003891static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003892com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003893{
3894 REQ(n, suite);
3895 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3896 if (NCH(n) == 1) {
3897 com_node(c, CHILD(n, 0));
3898 }
3899 else {
3900 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003901 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003902 node *ch = CHILD(n, i);
3903 if (TYPE(ch) == stmt)
3904 com_node(c, ch);
3905 }
3906 }
3907}
3908
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003909/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003910static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003911com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003912{
3913 int i = c->c_nblocks;
3914 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3915 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3916 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003917 else if (i <= 0) {
3918 /* at the outer level */
3919 com_error(c, PyExc_SyntaxError,
3920 "'continue' not properly in loop");
3921 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003922 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003923 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003924 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003925 if (c->c_block[j] == SETUP_LOOP)
3926 break;
3927 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003928 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003929 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003930 for (; i > j; --i) {
3931 if (c->c_block[i] == SETUP_EXCEPT ||
3932 c->c_block[i] == SETUP_FINALLY) {
3933 com_addoparg(c, CONTINUE_LOOP,
3934 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003935 return;
3936 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003937 if (c->c_block[i] == END_FINALLY) {
3938 com_error(c, PyExc_SyntaxError,
3939 "'continue' not supported inside 'finally' clause");
3940 return;
3941 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003942 }
3943 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003944 com_error(c, PyExc_SyntaxError,
3945 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003946 }
3947 /* XXX Could allow it inside a 'finally' clause
3948 XXX if we could pop the exception still on the stack */
3949}
3950
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003951/* Return the number of default values in the argument list.
3952
3953 If a non-default argument follows a default argument, set an
3954 exception and return -1.
3955*/
3956
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003957static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003958com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003959{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003960 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003961 if (TYPE(n) == lambdef) {
3962 /* lambdef: 'lambda' [varargslist] ':' test */
3963 n = CHILD(n, 1);
3964 }
3965 else {
3966 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3967 n = CHILD(n, 2);
3968 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3969 n = CHILD(n, 1);
3970 }
3971 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003972 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003973 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003974 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003975 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3976 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003977 ndefs = 0;
3978 for (i = 0; i < nch; i++) {
3979 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003980 if (TYPE(CHILD(n, i)) == STAR ||
3981 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003982 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003983 i++;
3984 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003985 t = RPAR; /* Anything except EQUAL or COMMA */
3986 else
3987 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003988 if (t == EQUAL) {
3989 i++;
3990 ndefs++;
3991 com_node(c, CHILD(n, i));
3992 i++;
3993 if (i >= nch)
3994 break;
3995 t = TYPE(CHILD(n, i));
3996 }
3997 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003998 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003999 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004000 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00004001 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004002 return -1;
4003 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004004 }
4005 if (t != COMMA)
4006 break;
4007 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004008 return ndefs;
4009}
4010
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004011static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004012com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004013{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004014 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004015 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004016 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004017 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004018 if (ndefs < 0)
4019 return;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004020 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
4021 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004022 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004023 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004024 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004025 c->c_errors++;
4026 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004027 int closure = com_make_closure(c, (PyCodeObject *)co);
4028 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004029 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004030 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004031 if (closure)
4032 com_addoparg(c, MAKE_CLOSURE, ndefs);
4033 else
4034 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004035 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004036 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004037 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004038 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004039 }
4040}
4041
4042static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004043com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004044{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004045 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004046 REQ(n, testlist);
4047 /* testlist: test (',' test)* [','] */
4048 for (i = 0; i < NCH(n); i += 2)
4049 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004050 i = (NCH(n)+1) / 2;
4051 com_addoparg(c, BUILD_TUPLE, i);
4052 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004053}
4054
4055static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004056com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004057{
Guido van Rossum25831651993-05-19 14:50:45 +00004058 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004059 PyObject *v;
4060 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004061 char *name;
4062
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004063 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004064 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004065 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004066 c->c_errors++;
4067 return;
4068 }
4069 /* Push the class name on the stack */
4070 i = com_addconst(c, v);
4071 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004072 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004073 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004074 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004075 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004076 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004077 com_push(c, 1);
4078 }
Guido van Rossum25831651993-05-19 14:50:45 +00004079 else
4080 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004081 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004082 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004083 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004084 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004085 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004086 c->c_errors++;
4087 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004088 int closure = com_make_closure(c, co);
4089 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004090 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004091 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004092 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004093 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004094 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004095 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004096 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004097 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004098 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004099 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004100 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004101 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004102 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004103 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004104}
4105
4106static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004107com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004108{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004109 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004110 if (c->c_errors)
4111 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004112 switch (TYPE(n)) {
4113
4114 /* Definition nodes */
4115
4116 case funcdef:
4117 com_funcdef(c, n);
4118 break;
4119 case classdef:
4120 com_classdef(c, n);
4121 break;
4122
4123 /* Trivial parse tree nodes */
4124
4125 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004126 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004127 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004128 n = CHILD(n, 0);
4129 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004130
4131 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004132 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004133 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004134 {
4135 int i;
4136 for (i = 0; i < NCH(n)-1; i += 2)
4137 com_node(c, CHILD(n, i));
4138 }
4139 break;
4140
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004141 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004142 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004143 n = CHILD(n, 0);
4144 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004145
4146 /* Statement nodes */
4147
4148 case expr_stmt:
4149 com_expr_stmt(c, n);
4150 break;
4151 case print_stmt:
4152 com_print_stmt(c, n);
4153 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004154 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004155 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004156 break;
4157 case pass_stmt:
4158 break;
4159 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004160 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004161 com_error(c, PyExc_SyntaxError,
4162 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004163 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004164 com_addbyte(c, BREAK_LOOP);
4165 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004166 case continue_stmt:
4167 com_continue_stmt(c, n);
4168 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004169 case return_stmt:
4170 com_return_stmt(c, n);
4171 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004172 case yield_stmt:
4173 com_yield_stmt(c, n);
4174 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004175 case raise_stmt:
4176 com_raise_stmt(c, n);
4177 break;
4178 case import_stmt:
4179 com_import_stmt(c, n);
4180 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004181 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004182 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004183 case exec_stmt:
4184 com_exec_stmt(c, n);
4185 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004186 case assert_stmt:
4187 com_assert_stmt(c, n);
4188 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004189 case if_stmt:
4190 com_if_stmt(c, n);
4191 break;
4192 case while_stmt:
4193 com_while_stmt(c, n);
4194 break;
4195 case for_stmt:
4196 com_for_stmt(c, n);
4197 break;
4198 case try_stmt:
4199 com_try_stmt(c, n);
4200 break;
4201 case suite:
4202 com_suite(c, n);
4203 break;
4204
4205 /* Expression nodes */
4206
4207 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004208 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004209 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004210 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004211 break;
4212 case test:
4213 com_test(c, n);
4214 break;
4215 case and_test:
4216 com_and_test(c, n);
4217 break;
4218 case not_test:
4219 com_not_test(c, n);
4220 break;
4221 case comparison:
4222 com_comparison(c, n);
4223 break;
4224 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004225 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004226 break;
4227 case expr:
4228 com_expr(c, n);
4229 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004230 case xor_expr:
4231 com_xor_expr(c, n);
4232 break;
4233 case and_expr:
4234 com_and_expr(c, n);
4235 break;
4236 case shift_expr:
4237 com_shift_expr(c, n);
4238 break;
4239 case arith_expr:
4240 com_arith_expr(c, n);
4241 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004242 case term:
4243 com_term(c, n);
4244 break;
4245 case factor:
4246 com_factor(c, n);
4247 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004248 case power:
4249 com_power(c, n);
4250 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004251 case atom:
4252 com_atom(c, n);
4253 break;
4254
4255 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004256 com_error(c, PyExc_SystemError,
4257 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004258 }
4259}
4260
Tim Petersdbd9ba62000-07-09 03:09:57 +00004261static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004262
4263static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004264com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004265{
4266 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4267 if (TYPE(CHILD(n, 0)) == LPAR)
4268 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004269 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004270 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004271 com_pop(c, 1);
4272 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004273}
4274
4275static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004276com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004277{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004278 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004279 if (NCH(n) == 1) {
4280 com_fpdef(c, CHILD(n, 0));
4281 }
4282 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004283 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004284 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004285 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004286 for (i = 0; i < NCH(n); i += 2)
4287 com_fpdef(c, CHILD(n, i));
4288 }
4289}
4290
4291static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004292com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004293{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004294 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004295 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004296 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004297 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004298 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004299 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004300 nch = NCH(n);
4301 /* Enter all arguments in table of locals */
4302 for (i = 0, narg = 0; i < nch; i++) {
4303 node *ch = CHILD(n, i);
4304 node *fp;
4305 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004306 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004307 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4308 fp = CHILD(ch, 0);
4309 if (TYPE(fp) != NAME) {
4310 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4311 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004312 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004313 narg++;
4314 /* all name updates handled by symtable */
4315 if (++i >= nch)
4316 break;
4317 ch = CHILD(n, i);
4318 if (TYPE(ch) == EQUAL)
4319 i += 2;
4320 else
4321 REQ(ch, COMMA);
4322 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004323 if (complex) {
4324 /* Generate code for complex arguments only after
4325 having counted the simple arguments */
4326 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004327 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004328 node *ch = CHILD(n, i);
4329 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004330 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004331 break;
4332 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4333 fp = CHILD(ch, 0);
4334 if (TYPE(fp) != NAME) {
4335 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004336 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004337 com_fpdef(c, ch);
4338 }
4339 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004340 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004341 break;
4342 ch = CHILD(n, i);
4343 if (TYPE(ch) == EQUAL)
4344 i += 2;
4345 else
4346 REQ(ch, COMMA);
4347 }
4348 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004349}
4350
4351static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004352com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004353{
4354 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004355 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004356 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004357 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004358 if (doc != NULL) {
4359 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004360 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004361 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004362 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004363 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004364 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004365 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004366 for (i = 0; i < NCH(n); i++) {
4367 node *ch = CHILD(n, i);
4368 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4369 com_node(c, ch);
4370 }
4371}
4372
4373/* Top-level compile-node interface */
4374
4375static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004376compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004377{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004378 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004379 node *ch;
4380 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00004381 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004382 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004383 if (doc != NULL) {
4384 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004385 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004386 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004387 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004388 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004389 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
4390 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004391 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004392 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004393 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004394 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004395 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004396 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004397 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4398 com_push(c, 1);
4399 com_addbyte(c, RETURN_VALUE);
4400 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004401}
4402
4403static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004404compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004405{
Guido van Rossum590baa41993-11-30 13:40:46 +00004406 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004407 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004408 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004409
4410 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004411 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004412 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004413 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004414 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004415 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004416 else
4417 ch = CHILD(n, 2);
4418 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004419 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004420 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004421}
4422
4423static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004424compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004425{
4426 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004427 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004428 REQ(n, classdef);
4429 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4430 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004431 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004432 /* Initialize local __module__ from global __name__ */
4433 com_addop_name(c, LOAD_GLOBAL, "__name__");
4434 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004435 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004436 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004437 if (doc != NULL) {
4438 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004439 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004440 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004441 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004442 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004443 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004444 }
4445 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004446 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004447 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00004448 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004449 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004450 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004451 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004452 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004453}
4454
4455static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00004456compile_generator_expression(struct compiling *c, node *n)
4457{
4458 /* testlist_gexp: test gen_for */
4459 /* argument: test gen_for */
4460 REQ(CHILD(n, 0), test);
4461 REQ(CHILD(n, 1), gen_for);
4462
4463 c->c_name = "<generator expression>";
4464 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
4465
4466 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4467 com_push(c, 1);
4468 com_addbyte(c, RETURN_VALUE);
4469 com_pop(c, 1);
4470}
4471
4472static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004473compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004474{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004475 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004476
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004477 switch (TYPE(n)) {
4478
Guido van Rossum4c417781991-01-21 16:09:22 +00004479 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004480 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004481 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004482 n = CHILD(n, 0);
4483 if (TYPE(n) != NEWLINE)
4484 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004485 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004486 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4487 com_push(c, 1);
4488 com_addbyte(c, RETURN_VALUE);
4489 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004490 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004491 break;
4492
Guido van Rossum4c417781991-01-21 16:09:22 +00004493 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004494 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004495 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004496 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4497 com_push(c, 1);
4498 com_addbyte(c, RETURN_VALUE);
4499 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004500 break;
4501
Guido van Rossum590baa41993-11-30 13:40:46 +00004502 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004503 com_node(c, CHILD(n, 0));
4504 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004505 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004506 break;
4507
Guido van Rossum590baa41993-11-30 13:40:46 +00004508 case lambdef: /* anonymous function definition */
4509 compile_lambdef(c, n);
4510 break;
4511
Guido van Rossum4c417781991-01-21 16:09:22 +00004512 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004513 compile_funcdef(c, n);
4514 break;
4515
Guido van Rossum4c417781991-01-21 16:09:22 +00004516 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004517 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004518 break;
4519
Raymond Hettinger354433a2004-05-19 08:20:33 +00004520 case testlist_gexp: /* A generator expression */
4521 case argument: /* A generator expression */
4522 compile_generator_expression(c, n);
4523 break;
4524
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004525 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004526 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004527 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004528 }
4529}
4530
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004531static PyObject *
4532dict_keys_inorder(PyObject *dict, int offset)
4533{
4534 PyObject *tuple, *k, *v;
4535 int i, pos = 0, size = PyDict_Size(dict);
4536
4537 tuple = PyTuple_New(size);
4538 if (tuple == NULL)
4539 return NULL;
4540 while (PyDict_Next(dict, &pos, &k, &v)) {
4541 i = PyInt_AS_LONG(v);
4542 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004543 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004544 PyTuple_SET_ITEM(tuple, i - offset, k);
4545 }
4546 return tuple;
4547}
4548
Guido van Rossum79f25d91997-04-29 20:08:16 +00004549PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004550PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004551{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004552 return PyNode_CompileFlags(n, filename, NULL);
4553}
4554
4555PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004556PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004557{
4558 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004559}
4560
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004561struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004562PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004563{
4564 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004565 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004566
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004567 ff = PyNode_Future(n, filename);
4568 if (ff == NULL)
4569 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004570 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00004571 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004572 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004573 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004574 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004575 return st;
4576}
4577
Guido van Rossum79f25d91997-04-29 20:08:16 +00004578static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004579icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004580{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004581 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004582}
4583
Guido van Rossum79f25d91997-04-29 20:08:16 +00004584static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004585jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004586 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004587{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004588 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004589 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004590 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004591 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004592 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4593 sc.c_encoding = "utf-8";
4594 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004595 sc.c_encoding = STR(n);
4596 n = CHILD(n, 0);
4597 } else {
4598 sc.c_encoding = NULL;
4599 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004600 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004601 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004602 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004603 /* c_symtable still points to parent's symbols */
4604 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004605 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004606 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004607 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004608 if (base->c_encoding != NULL) {
4609 assert(sc.c_encoding == NULL);
4610 sc.c_encoding = base->c_encoding;
4611 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004612 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004613 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004614 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004615 if (sc.c_future == NULL) {
4616 com_free(&sc);
4617 return NULL;
4618 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004619 if (flags) {
4620 int merged = sc.c_future->ff_features |
4621 flags->cf_flags;
4622 sc.c_future->ff_features = merged;
4623 flags->cf_flags = merged;
4624 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004625 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
4626 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004627 com_free(&sc);
4628 return NULL;
4629 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004630 /* reset symbol table for second pass */
4631 sc.c_symtable->st_nscopes = 1;
4632 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004633 }
4634 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004635 if (symtable_load_symbols(&sc) < 0) {
4636 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004637 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004638 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004639 compile_node(&sc, n);
4640 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004641 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004642 PyObject *consts, *names, *varnames, *filename, *name,
4643 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004644 consts = PyList_AsTuple(sc.c_consts);
4645 names = PyList_AsTuple(sc.c_names);
4646 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004647 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4648 freevars = dict_keys_inorder(sc.c_freevars,
4649 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004650 filename = PyString_InternFromString(sc.c_filename);
4651 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004652 if (!PyErr_Occurred())
4653 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004654 sc.c_nlocals,
4655 sc.c_maxstacklevel,
4656 sc.c_flags,
4657 sc.c_code,
4658 consts,
4659 names,
4660 varnames,
4661 freevars,
4662 cellvars,
4663 filename,
4664 name,
4665 sc.c_firstlineno,
4666 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004667 Py_XDECREF(consts);
4668 Py_XDECREF(names);
4669 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004670 Py_XDECREF(freevars);
4671 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004672 Py_XDECREF(filename);
4673 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004674 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004675 else if (!PyErr_Occurred()) {
4676 /* This could happen if someone called PyErr_Clear() after an
4677 error was reported above. That's not supposed to happen,
4678 but I just plugged one case and I'm not sure there can't be
4679 others. In that case, raise SystemError so that at least
4680 it gets reported instead dumping core. */
4681 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4682 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004683 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004684 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004685 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004686 sc.c_symtable = NULL;
4687 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004688 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004689 return co;
4690}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004691
4692int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004693PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004694{
4695 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004696 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004697 int line = co->co_firstlineno;
4698 int addr = 0;
4699 while (--size >= 0) {
4700 addr += *p++;
4701 if (addr > addrq)
4702 break;
4703 line += *p++;
4704 }
4705 return line;
4706}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004707
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004708/* The test for LOCAL must come before the test for FREE in order to
4709 handle classes where name is both local and free. The local var is
4710 a method and the free var is a free var referenced within a method.
4711*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004712
4713static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004714get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004715{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004716 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004717 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004718
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004719 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4720 return CELL;
4721 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4722 return LOCAL;
4723 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4724 return FREE;
4725 v = PyDict_GetItemString(c->c_globals, name);
4726 if (v) {
4727 if (v == Py_None)
4728 return GLOBAL_EXPLICIT;
4729 else {
4730 return GLOBAL_IMPLICIT;
4731 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004732 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004733 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004734 "unknown scope for %.100s in %.100s(%s) "
4735 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4736 name, c->c_name,
4737 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4738 c->c_filename,
4739 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4740 PyObject_REPR(c->c_locals),
4741 PyObject_REPR(c->c_globals)
4742 );
4743
4744 Py_FatalError(buf);
4745 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004746}
4747
Guido van Rossum207fda62001-03-02 03:30:41 +00004748/* Helper functions to issue warnings */
4749
4750static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004751issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004752{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004753 if (PyErr_Occurred()) {
4754 /* This can happen because symtable_node continues
4755 processing even after raising a SyntaxError.
4756 Calling PyErr_WarnExplicit now would clobber the
4757 pending exception; instead we fail and let that
4758 exception propagate.
4759 */
4760 return -1;
4761 }
Guido van Rossum207fda62001-03-02 03:30:41 +00004762 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4763 lineno, NULL, NULL) < 0) {
4764 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4765 PyErr_SetString(PyExc_SyntaxError, msg);
4766 PyErr_SyntaxLocation(filename, lineno);
4767 }
4768 return -1;
4769 }
4770 return 0;
4771}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004772
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004773static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004774symtable_warn(struct symtable *st, char *msg)
4775{
Guido van Rossum207fda62001-03-02 03:30:41 +00004776 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004777 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004778 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004779 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004780 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004781}
4782
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004783/* Helper function for setting lineno and filename */
4784
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004785static struct symtable *
4786symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004787{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004788 struct symtable *st;
4789
4790 st = symtable_init();
4791 if (st == NULL)
4792 return NULL;
4793 st->st_future = ff;
4794 st->st_filename = filename;
4795 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
4796 if (st->st_errors > 0)
4797 goto fail;
4798 symtable_node(st, n);
4799 if (st->st_errors > 0)
4800 goto fail;
4801 return st;
4802 fail:
4803 if (!PyErr_Occurred()) {
4804 /* This could happen because after a syntax error is
4805 detected, the symbol-table-building continues for
4806 a while, and PyErr_Clear() might erroneously be
4807 called during that process. One such case has been
4808 fixed, but there might be more (now or later).
4809 */
4810 PyErr_SetString(PyExc_SystemError, "lost exception");
4811 }
4812 st->st_future = NULL;
4813 st->st_filename = NULL;
4814 PySymtable_Free(st);
4815 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004816}
4817
4818static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004819symtable_init_compiling_symbols(struct compiling *c)
4820{
4821 PyObject *varnames;
4822
4823 varnames = c->c_symtable->st_cur->ste_varnames;
4824 if (varnames == NULL) {
4825 varnames = PyList_New(0);
4826 if (varnames == NULL)
4827 return -1;
4828 c->c_symtable->st_cur->ste_varnames = varnames;
4829 Py_INCREF(varnames);
4830 } else
4831 Py_INCREF(varnames);
4832 c->c_varnames = varnames;
4833
4834 c->c_globals = PyDict_New();
4835 if (c->c_globals == NULL)
4836 return -1;
4837 c->c_freevars = PyDict_New();
4838 if (c->c_freevars == NULL)
4839 return -1;
4840 c->c_cellvars = PyDict_New();
4841 if (c->c_cellvars == NULL)
4842 return -1;
4843 return 0;
4844}
4845
4846struct symbol_info {
4847 int si_nlocals;
4848 int si_ncells;
4849 int si_nfrees;
4850 int si_nimplicit;
4851};
4852
4853static void
4854symtable_init_info(struct symbol_info *si)
4855{
4856 si->si_nlocals = 0;
4857 si->si_ncells = 0;
4858 si->si_nfrees = 0;
4859 si->si_nimplicit = 0;
4860}
4861
4862static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004863symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004864 struct symbol_info *si)
4865{
4866 PyObject *dict, *v;
4867
4868 /* Seperate logic for DEF_FREE. If it occurs in a function,
4869 it indicates a local that we must allocate storage for (a
4870 cell var). If it occurs in a class, then the class has a
4871 method and a free variable with the same name.
4872 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004873 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004874 /* If it isn't declared locally, it can't be a cell. */
4875 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4876 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004877 v = PyInt_FromLong(si->si_ncells++);
4878 dict = c->c_cellvars;
4879 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004880 /* If it is free anyway, then there is no need to do
4881 anything here.
4882 */
4883 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004884 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004885 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004886 v = PyInt_FromLong(si->si_nfrees++);
4887 dict = c->c_freevars;
4888 }
4889 if (v == NULL)
4890 return -1;
4891 if (PyDict_SetItem(dict, name, v) < 0) {
4892 Py_DECREF(v);
4893 return -1;
4894 }
4895 Py_DECREF(v);
4896 return 0;
4897}
4898
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004899/* If a variable is a cell and an argument, make sure that appears in
4900 co_cellvars before any variable to its right in varnames.
4901*/
4902
4903
4904static int
4905symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4906 PyObject *varnames, int flags)
4907{
Tim Petersb39903b2003-03-24 17:22:24 +00004908 PyObject *v = NULL;
4909 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004910 int i, pos;
4911
4912 if (flags & CO_VARARGS)
4913 argcount++;
4914 if (flags & CO_VARKEYWORDS)
4915 argcount++;
4916 for (i = argcount; --i >= 0; ) {
4917 v = PyList_GET_ITEM(varnames, i);
4918 if (PyDict_GetItem(*cellvars, v)) {
4919 if (list == NULL) {
4920 list = PyList_New(1);
4921 if (list == NULL)
4922 return -1;
4923 PyList_SET_ITEM(list, 0, v);
4924 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004925 } else {
4926 if (PyList_Insert(list, 0, v) < 0) {
4927 Py_DECREF(list);
4928 return -1;
4929 }
4930 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004931 }
4932 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00004933 if (list == NULL)
4934 return 0;
4935
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004936 /* There are cellvars that are also arguments. Create a dict
4937 to replace cellvars and put the args at the front.
4938 */
4939 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004940 if (d == NULL)
4941 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004942 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4943 v = PyInt_FromLong(i);
4944 if (v == NULL)
4945 goto fail;
4946 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4947 goto fail;
4948 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4949 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00004950 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004951 }
4952 pos = 0;
4953 i = PyList_GET_SIZE(list);
4954 Py_DECREF(list);
4955 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4956 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004957 if (w == NULL)
4958 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004959 if (PyDict_SetItem(d, v, w) < 0) {
4960 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00004961 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004962 goto fail;
4963 }
4964 Py_DECREF(w);
4965 }
4966 Py_DECREF(*cellvars);
4967 *cellvars = d;
4968 return 1;
4969 fail:
4970 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00004971 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004972 return -1;
4973}
4974
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004975static int
4976symtable_freevar_offsets(PyObject *freevars, int offset)
4977{
4978 PyObject *name, *v;
4979 int pos;
4980
4981 /* The cell vars are the first elements of the closure,
4982 followed by the free vars. Update the offsets in
4983 c_freevars to account for number of cellvars. */
4984 pos = 0;
4985 while (PyDict_Next(freevars, &pos, &name, &v)) {
4986 int i = PyInt_AS_LONG(v) + offset;
4987 PyObject *o = PyInt_FromLong(i);
4988 if (o == NULL)
4989 return -1;
4990 if (PyDict_SetItem(freevars, name, o) < 0) {
4991 Py_DECREF(o);
4992 return -1;
4993 }
4994 Py_DECREF(o);
4995 }
4996 return 0;
4997}
4998
4999static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005000symtable_check_unoptimized(struct compiling *c,
5001 PySymtableEntryObject *ste,
5002 struct symbol_info *si)
5003{
5004 char buf[300];
5005
5006 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
5007 || (ste->ste_nested && si->si_nimplicit)))
5008 return 0;
5009
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005010#define ILLEGAL_CONTAINS "contains a nested function with free variables"
5011
5012#define ILLEGAL_IS "is a nested function"
5013
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005014#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005015"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005016
5017#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005018"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005019
5020#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005021"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005022"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005023
5024 /* XXX perhaps the linenos for these opt-breaking statements
5025 should be stored so the exception can point to them. */
5026
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005027 if (ste->ste_child_free) {
5028 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005029 PyOS_snprintf(buf, sizeof(buf),
5030 ILLEGAL_IMPORT_STAR,
5031 PyString_AS_STRING(ste->ste_name),
5032 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005033 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005034 PyOS_snprintf(buf, sizeof(buf),
5035 ILLEGAL_BARE_EXEC,
5036 PyString_AS_STRING(ste->ste_name),
5037 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005038 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005039 PyOS_snprintf(buf, sizeof(buf),
5040 ILLEGAL_EXEC_AND_IMPORT_STAR,
5041 PyString_AS_STRING(ste->ste_name),
5042 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005043 }
5044 } else {
5045 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005046 PyOS_snprintf(buf, sizeof(buf),
5047 ILLEGAL_IMPORT_STAR,
5048 PyString_AS_STRING(ste->ste_name),
5049 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005050 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005051 PyOS_snprintf(buf, sizeof(buf),
5052 ILLEGAL_BARE_EXEC,
5053 PyString_AS_STRING(ste->ste_name),
5054 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005055 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005056 PyOS_snprintf(buf, sizeof(buf),
5057 ILLEGAL_EXEC_AND_IMPORT_STAR,
5058 PyString_AS_STRING(ste->ste_name),
5059 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005060 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005061 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005062
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005063 PyErr_SetString(PyExc_SyntaxError, buf);
5064 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5065 ste->ste_opt_lineno);
5066 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005067}
5068
5069static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005070symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5071 struct symbol_info *si)
5072{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005073 if (c->c_future)
5074 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005075 if (ste->ste_generator)
5076 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005077 if (ste->ste_type != TYPE_MODULE)
5078 c->c_flags |= CO_NEWLOCALS;
5079 if (ste->ste_type == TYPE_FUNCTION) {
5080 c->c_nlocals = si->si_nlocals;
5081 if (ste->ste_optimized == 0)
5082 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005083 else if (ste->ste_optimized != OPT_EXEC)
5084 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005085 }
5086 return 0;
5087}
5088
5089static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005090symtable_error(struct symtable *st, int lineno)
5091{
5092 if (lineno == 0)
5093 lineno = st->st_cur->ste_lineno;
5094 PyErr_SyntaxLocation(st->st_filename, lineno);
5095 st->st_errors++;
5096 return -1;
5097}
5098
5099static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005100symtable_load_symbols(struct compiling *c)
5101{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005102 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005103 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005104 PyObject *name, *varnames, *v;
5105 int i, flags, pos;
5106 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005107
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005108 v = NULL;
5109
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005110 if (symtable_init_compiling_symbols(c) < 0)
5111 goto fail;
5112 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005113 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005114 si.si_nlocals = PyList_GET_SIZE(varnames);
5115 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005116
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005117 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005118 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005119 if (v == NULL)
5120 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005121 if (PyDict_SetItem(c->c_locals,
5122 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005123 goto fail;
5124 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005125 }
5126
5127 /* XXX The cases below define the rules for whether a name is
5128 local or global. The logic could probably be clearer. */
5129 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005130 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5131 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005132
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005133 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005134 /* undo the original DEF_FREE */
5135 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005136
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005137 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005138 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005139 2. Free variables in methods that are also class
5140 variables or declared global.
5141 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005142 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005143 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005144
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005145 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005146 c->c_argcount--;
5147 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005148 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005149 c->c_argcount--;
5150 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005151 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005152 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005153 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005154 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005155 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005156 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005157 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005158 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005159 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005160 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5161 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005162 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005163 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005164 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005165 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005166 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005167 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005168 if (v == NULL)
5169 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005170 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005171 goto fail;
5172 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005173 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005174 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005175 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005176 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005177 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005178 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005179 if (v == NULL)
5180 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005181 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005182 goto fail;
5183 Py_DECREF(v);
5184 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005185 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005186 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005187 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005188 goto fail;
5189 if (st->st_nscopes != 1) {
5190 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005191 if (v == NULL)
5192 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005193 if (PyDict_SetItem(st->st_global,
5194 name, v))
5195 goto fail;
5196 Py_DECREF(v);
5197 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005198 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005199 }
5200 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005201 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5202
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005203 if (si.si_ncells > 1) { /* one cell is always in order */
5204 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5205 c->c_varnames, c->c_flags) < 0)
5206 return -1;
5207 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005208 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5209 return -1;
5210 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005211 fail:
5212 /* is this always the right thing to do? */
5213 Py_XDECREF(v);
5214 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005215}
5216
5217static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005218symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005219{
5220 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005221
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005222 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005223 if (st == NULL)
5224 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005225 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005226
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005227 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005228 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005229 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005230 goto fail;
5231 if ((st->st_symbols = PyDict_New()) == NULL)
5232 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005233 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005234 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005235 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005236 st->st_private = NULL;
5237 return st;
5238 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005239 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005240 return NULL;
5241}
5242
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005243void
5244PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005245{
5246 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005247 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005248 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005249 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005250}
5251
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005252/* When the compiler exits a scope, it must should update the scope's
5253 free variable information with the list of free variables in its
5254 children.
5255
5256 Variables that are free in children and defined in the current
5257 scope are cellvars.
5258
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005259 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005260 false), free variables in children that are not defined here are
5261 implicit globals.
5262
5263*/
5264
5265static int
5266symtable_update_free_vars(struct symtable *st)
5267{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005268 int i, j, def;
5269 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005270 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005271
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005272 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005273 def = DEF_FREE_CLASS;
5274 else
5275 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005276 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005277 int pos = 0;
5278
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005279 if (list && PyList_SetSlice(list, 0,
5280 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005281 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005282 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005283 PyList_GET_ITEM(ste->ste_children, i);
5284 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005285 int flags = PyInt_AS_LONG(o);
5286 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005287 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005288 if (list == NULL) {
5289 list = PyList_New(0);
5290 if (list == NULL)
5291 return -1;
5292 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005293 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005294 if (PyList_Append(list, name) < 0) {
5295 Py_DECREF(list);
5296 return -1;
5297 }
5298 }
5299 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005300 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005301 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005302 v = PyDict_GetItem(ste->ste_symbols, name);
5303 /* If a name N is declared global in scope A and
5304 referenced in scope B contained (perhaps
5305 indirectly) in A and there are no scopes
5306 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005307 is global in B. Unless A is a class scope,
5308 because class scopes are not considered for
5309 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005310 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005311 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005312 int flags = PyInt_AS_LONG(v);
5313 if (flags & DEF_GLOBAL) {
5314 symtable_undo_free(st, child->ste_id,
5315 name);
5316 continue;
5317 }
5318 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005319 if (ste->ste_nested) {
5320 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005321 name, def) < 0) {
5322 Py_DECREF(list);
5323 return -1;
5324 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005325 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005326 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005327 name) < 0) {
5328 Py_DECREF(list);
5329 return -1;
5330 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005331 }
5332 }
5333 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005334
5335 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005336 return 0;
5337}
5338
5339/* If the current scope is a non-nested class or if name is not
5340 defined in the current, non-nested scope, then it is an implicit
5341 global in all nested scopes.
5342*/
5343
5344static int
5345symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5346{
5347 PyObject *o;
5348 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005349 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005350
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005351 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005352 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005353 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005354 if (o == NULL)
5355 return symtable_undo_free(st, child, name);
5356 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005357
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005358 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005359 return symtable_undo_free(st, child, name);
5360 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005361 return symtable_add_def_o(st, ste->ste_symbols,
5362 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005363}
5364
5365static int
5366symtable_undo_free(struct symtable *st, PyObject *id,
5367 PyObject *name)
5368{
5369 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005370 PyObject *info;
5371 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005372
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005373 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5374 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005375 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005376
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005377 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005378 if (info == NULL)
5379 return 0;
5380 v = PyInt_AS_LONG(info);
5381 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005382 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005383 DEF_FREE_GLOBAL) < 0)
5384 return -1;
5385 } else
5386 /* If the name is defined here or declared global,
5387 then the recursion stops. */
5388 return 0;
5389
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005390 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5391 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005392 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005393 PyList_GET_ITEM(ste->ste_children, i);
5394 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005395 if (x < 0)
5396 return x;
5397 }
5398 return 0;
5399}
5400
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005401/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5402 This reference is released when the scope is exited, via the DECREF
5403 in symtable_exit_scope().
5404*/
5405
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005406static int
5407symtable_exit_scope(struct symtable *st)
5408{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005409 int end;
5410
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005411 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005412 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005413 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005414 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005415 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5416 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005417 if (PySequence_DelItem(st->st_stack, end) < 0)
5418 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005419 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005420}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005421
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005422static void
5423symtable_enter_scope(struct symtable *st, char *name, int type,
5424 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005425{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005426 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005427
5428 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005429 prev = st->st_cur;
5430 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005431 st->st_errors++;
5432 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005433 }
5434 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005435 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005436 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005437 if (st->st_cur == NULL) {
5438 st->st_errors++;
5439 return;
5440 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005441 if (strcmp(name, TOP) == 0)
5442 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005443 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005444 if (PyList_Append(prev->ste_children,
5445 (PyObject *)st->st_cur) < 0)
5446 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005447 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005448}
5449
5450static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005451symtable_lookup(struct symtable *st, char *name)
5452{
5453 char buffer[MANGLE_LEN];
5454 PyObject *v;
5455 int flags;
5456
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005457 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005458 name = buffer;
5459 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5460 if (v == NULL) {
5461 if (PyErr_Occurred())
5462 return -1;
5463 else
5464 return 0;
5465 }
5466
5467 flags = PyInt_AS_LONG(v);
5468 return flags;
5469}
5470
5471static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005472symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005473{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005474 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005475 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005476 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005477
Guido van Rossumb7164622002-08-16 02:48:11 +00005478 /* Warn about None, except inside a tuple (where the assignment
5479 code already issues a warning). */
5480 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5481 *name == 'N' && strcmp(name, "None") == 0)
5482 {
Raymond Hettinger11a70c72004-07-17 21:46:25 +00005483 PyErr_SetString(PyExc_SyntaxError,
5484 "Invalid syntax. Assignment to None.");
5485 symtable_error(st, 0);
5486 return -1;
Guido van Rossumb7164622002-08-16 02:48:11 +00005487 }
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}