blob: 5549e9f75b6aa5217e1742d334873b1815dbf632 [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";
1230 if (issue_warning(msg, c->c_filename, c->c_lineno) < 0) {
1231 c->c_errors++;
1232 return -1;
1233 }
1234 }
1235 return 0;
1236}
1237
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001238static void
1239com_addop_varname(struct compiling *c, int kind, char *name)
1240{
1241 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001242 int i, reftype;
1243 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001244 int op = STOP_CODE;
1245 char buffer[MANGLE_LEN];
1246
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001247 if (kind != VAR_LOAD &&
1248 none_assignment_check(c, name, kind == VAR_STORE))
1249 {
1250 c->c_errors++;
1251 i = 255;
1252 goto done;
1253 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001254 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001255 name = buffer;
1256 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1257 c->c_errors++;
1258 i = 255;
1259 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001260 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001261
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001262 reftype = get_ref_type(c, name);
1263 switch (reftype) {
1264 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001265 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001266 scope = NAME_LOCAL;
1267 break;
1268 case GLOBAL_EXPLICIT:
1269 scope = NAME_GLOBAL;
1270 break;
1271 case GLOBAL_IMPLICIT:
1272 if (c->c_flags & CO_OPTIMIZED)
1273 scope = NAME_GLOBAL;
1274 break;
1275 case FREE:
1276 case CELL:
1277 scope = NAME_CLOSURE;
1278 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001279 }
1280
1281 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001282 if (scope == NAME_LOCAL)
1283 i = com_lookup_arg(c->c_locals, v);
1284 else if (reftype == FREE)
1285 i = com_lookup_arg(c->c_freevars, v);
1286 else if (reftype == CELL)
1287 i = com_lookup_arg(c->c_cellvars, v);
1288 if (i == -1) {
1289 c->c_errors++; /* XXX no exception set */
1290 i = 255;
1291 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001292 }
1293 Py_DECREF(v);
1294
1295 switch (kind) {
1296 case VAR_LOAD:
1297 switch (scope) {
1298 case NAME_LOCAL:
1299 op = LOAD_FAST;
1300 break;
1301 case NAME_GLOBAL:
1302 op = LOAD_GLOBAL;
1303 break;
1304 case NAME_DEFAULT:
1305 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001306 break;
1307 case NAME_CLOSURE:
1308 op = LOAD_DEREF;
1309 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001310 }
1311 break;
1312 case VAR_STORE:
1313 switch (scope) {
1314 case NAME_LOCAL:
1315 op = STORE_FAST;
1316 break;
1317 case NAME_GLOBAL:
1318 op = STORE_GLOBAL;
1319 break;
1320 case NAME_DEFAULT:
1321 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001322 break;
1323 case NAME_CLOSURE:
1324 op = STORE_DEREF;
1325 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001326 }
1327 break;
1328 case VAR_DELETE:
1329 switch (scope) {
1330 case NAME_LOCAL:
1331 op = DELETE_FAST;
1332 break;
1333 case NAME_GLOBAL:
1334 op = DELETE_GLOBAL;
1335 break;
1336 case NAME_DEFAULT:
1337 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001338 break;
1339 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001340 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001341 PyOS_snprintf(buf, sizeof(buf),
1342 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001343 com_error(c, PyExc_SyntaxError, buf);
1344 i = 255;
1345 break;
1346 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001347 }
1348 break;
1349 }
1350done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001351 com_addoparg(c, op, i);
1352}
1353
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001354static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001355com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001356{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001357 char *name;
1358 char buffer[1000];
1359 /* XXX it is possible to write this code without the 1000
1360 chars on the total length of dotted names, I just can't be
1361 bothered right now */
1362 if (TYPE(n) == STAR)
1363 name = "*";
1364 else if (TYPE(n) == dotted_name) {
1365 char *p = buffer;
1366 int i;
1367 name = buffer;
1368 for (i = 0; i < NCH(n); i += 2) {
1369 char *s = STR(CHILD(n, i));
1370 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001371 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001372 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001373 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001374 break;
1375 }
1376 if (p != buffer)
1377 *p++ = '.';
1378 strcpy(p, s);
1379 p = strchr(p, '\0');
1380 }
1381 }
1382 else {
1383 REQ(n, NAME);
1384 name = STR(n);
1385 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001386 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001387}
1388
Guido van Rossum79f25d91997-04-29 20:08:16 +00001389static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001390parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001391{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001392 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001393 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001394 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001395#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001396 int imflag;
1397#endif
1398
Guido van Rossum282914b1991-04-04 10:42:56 +00001399 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001400 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001401#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001402 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001403#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001404 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001405 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001406 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001407 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001408 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001409 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001410 }
1411 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001412 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001413 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001414 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001415 if (errno != 0)
1416 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001417 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001418 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001419 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001420#ifndef WITHOUT_COMPLEX
1421 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001422 Py_complex z;
1423 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001424 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001425 z.imag = PyOS_ascii_atof(s);
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001426 PyFPE_END_PROTECT(z)
1427 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001428 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001429 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001430#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001431 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001432 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001433 dx = PyOS_ascii_atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001434 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001435 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001436 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001437}
1438
Guido van Rossum79f25d91997-04-29 20:08:16 +00001439static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001440decode_utf8(char **sPtr, char *end, char* encoding)
1441{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001442#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001443 Py_FatalError("decode_utf8 should not be called in this build.");
1444 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001445#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001446 PyObject *u, *v;
1447 char *s, *t;
1448 t = s = *sPtr;
1449 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1450 while (s < end && (*s & 0x80)) s++;
1451 *sPtr = s;
1452 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1453 if (u == NULL)
1454 return NULL;
1455 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1456 Py_DECREF(u);
1457 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001458#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001459}
1460
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001461/* compiler.transformer.Transformer.decode_literal depends on what
1462 might seem like minor details of this function -- changes here
1463 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001464static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001465parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001466{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001467 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001468 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001469 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001470 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001471 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001472 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001473 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001474
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001475 if (isalpha(quote) || quote == '_') {
1476 if (quote == 'u' || quote == 'U') {
1477 quote = *++s;
1478 unicode = 1;
1479 }
1480 if (quote == 'r' || quote == 'R') {
1481 quote = *++s;
1482 rawmode = 1;
1483 }
1484 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001485 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001486 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001487 return NULL;
1488 }
1489 s++;
1490 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001491 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001492 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001493 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001494 return NULL;
1495 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001496 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001497 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001498 return NULL;
1499 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001500 if (len >= 4 && s[0] == quote && s[1] == quote) {
1501 s += 2;
1502 len -= 2;
1503 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001504 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001505 return NULL;
1506 }
1507 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001508#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001509 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001510 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001511 char *buf;
1512 char *p;
1513 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001514 if (encoding == NULL) {
1515 buf = s;
1516 u = NULL;
1517 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1518 buf = s;
1519 u = NULL;
1520 } else {
1521 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1522 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1523 if (u == NULL)
1524 return NULL;
1525 p = buf = PyString_AsString(u);
1526 end = s + len;
1527 while (s < end) {
1528 if (*s == '\\') {
1529 *p++ = *s++;
1530 if (*s & 0x80) {
1531 strcpy(p, "u005c");
1532 p += 5;
1533 }
1534 }
1535 if (*s & 0x80) { /* XXX inefficient */
1536 char *r;
1537 int rn, i;
1538 w = decode_utf8(&s, end, "utf-16-be");
1539 if (w == NULL) {
1540 Py_DECREF(u);
1541 return NULL;
1542 }
1543 r = PyString_AsString(w);
1544 rn = PyString_Size(w);
1545 assert(rn % 2 == 0);
1546 for (i = 0; i < rn; i += 2) {
1547 sprintf(p, "\\u%02x%02x",
1548 r[i + 0] & 0xFF,
1549 r[i + 1] & 0xFF);
1550 p += 6;
1551 }
1552 Py_DECREF(w);
1553 } else {
1554 *p++ = *s++;
1555 }
1556 }
1557 len = p - buf;
1558 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001559 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001560 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001561 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001562 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1563 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001564 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001565 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001566 return v;
1567
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001568 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001569#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001570 need_encoding = (encoding != NULL &&
1571 strcmp(encoding, "utf-8") != 0 &&
1572 strcmp(encoding, "iso-8859-1") != 0);
1573 if (rawmode || strchr(s, '\\') == NULL) {
1574 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001575#ifndef Py_USING_UNICODE
1576 /* This should not happen - we never see any other
1577 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001578 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001579#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001580 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1581 if (u == NULL)
1582 return NULL;
1583 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1584 Py_DECREF(u);
1585 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001586#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001587 } else {
1588 return PyString_FromStringAndSize(s, len);
1589 }
1590 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001591
1592 v = PyString_DecodeEscape(s, len, NULL, unicode,
1593 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001594 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001595 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001596 return v;
1597}
1598
Guido van Rossum79f25d91997-04-29 20:08:16 +00001599static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001600parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001601{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001602 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001603 int i;
1604 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001605 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001606 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001607 for (i = 1; i < NCH(n); i++) {
1608 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001609 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001610 if (s == NULL)
1611 goto onError;
1612 if (PyString_Check(v) && PyString_Check(s)) {
1613 PyString_ConcatAndDel(&v, s);
1614 if (v == NULL)
1615 goto onError;
1616 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001617#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001618 else {
1619 PyObject *temp;
1620 temp = PyUnicode_Concat(v, s);
1621 Py_DECREF(s);
1622 if (temp == NULL)
1623 goto onError;
1624 Py_DECREF(v);
1625 v = temp;
1626 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001627#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001628 }
1629 }
1630 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001631
1632 onError:
1633 Py_XDECREF(v);
1634 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001635}
1636
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001637static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001638com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001639{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001640 int anchor = 0;
1641 int save_begin = c->c_begin;
1642
Raymond Hettinger354433a2004-05-19 08:20:33 +00001643 /* list_for: for v in expr [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001644 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001645 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001646 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001647 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001648 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001649 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001650 c->c_loops++;
1651 com_list_iter(c, n, e, t);
1652 c->c_loops--;
1653 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1654 c->c_begin = save_begin;
1655 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001656 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001657}
1658
1659static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001660com_gen_for(struct compiling *c, node *n, node *t, int is_outmost)
1661{
1662 int break_anchor = 0;
1663 int anchor = 0;
1664 int save_begin = c->c_begin;
1665
1666 REQ(n, gen_for);
1667 /* gen_for: for v in test [gen_iter] */
1668
1669 com_addfwref(c, SETUP_LOOP, &break_anchor);
1670 block_push(c, SETUP_LOOP);
1671
1672 if (is_outmost) {
1673 com_addop_varname(c, VAR_LOAD, "[outmost-iterable]");
1674 com_push(c, 1);
1675 }
1676 else {
1677 com_node(c, CHILD(n, 3));
1678 com_addbyte(c, GET_ITER);
1679 }
1680
1681 c->c_begin = c->c_nexti;
1682 com_set_lineno(c, c->c_last_line);
1683 com_addfwref(c, FOR_ITER, &anchor);
1684 com_push(c, 1);
1685 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
1686
1687 if (NCH(n) == 5)
1688 com_gen_iter(c, CHILD(n, 4), t);
1689 else {
1690 com_test(c, t);
1691 com_addbyte(c, YIELD_VALUE);
1692 com_pop(c, 1);
1693 }
1694
1695 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1696 c->c_begin = save_begin;
1697
1698 com_backpatch(c, anchor);
1699 com_pop(c, 1); /* FOR_ITER has popped this */
1700 com_addbyte(c, POP_BLOCK);
1701 block_pop(c, SETUP_LOOP);
1702 com_backpatch(c, break_anchor);
1703}
1704
1705static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001706com_list_if(struct compiling *c, node *n, node *e, char *t)
1707{
1708 int anchor = 0;
1709 int a = 0;
1710 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001711 com_node(c, CHILD(n, 1));
1712 com_addfwref(c, JUMP_IF_FALSE, &a);
1713 com_addbyte(c, POP_TOP);
1714 com_pop(c, 1);
1715 com_list_iter(c, n, e, t);
1716 com_addfwref(c, JUMP_FORWARD, &anchor);
1717 com_backpatch(c, a);
1718 /* We jump here with an extra entry which we now pop */
1719 com_addbyte(c, POP_TOP);
1720 com_backpatch(c, anchor);
1721}
1722
1723static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001724com_gen_if(struct compiling *c, node *n, node *t)
1725{
1726 /* gen_if: 'if' test [gen_iter] */
1727 int anchor = 0;
1728 int a=0;
1729
1730 com_node(c, CHILD(n, 1));
1731 com_addfwref(c, JUMP_IF_FALSE, &a);
1732 com_addbyte(c, POP_TOP);
1733 com_pop(c, 1);
1734
1735 if (NCH(n) == 3)
1736 com_gen_iter(c, CHILD(n, 2), t);
1737 else {
1738 com_test(c, t);
1739 com_addbyte(c, YIELD_VALUE);
1740 com_pop(c, 1);
1741 }
1742 com_addfwref(c, JUMP_FORWARD, &anchor);
1743 com_backpatch(c, a);
1744 /* We jump here with an extra entry which we now pop */
1745 com_addbyte(c, POP_TOP);
1746 com_backpatch(c, anchor);
1747}
1748
1749static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001750com_list_iter(struct compiling *c,
1751 node *p, /* parent of list_iter node */
1752 node *e, /* element expression node */
1753 char *t /* name of result list temp local */)
1754{
1755 /* list_iter is the last child in a listmaker, list_for, or list_if */
1756 node *n = CHILD(p, NCH(p)-1);
1757 if (TYPE(n) == list_iter) {
1758 n = CHILD(n, 0);
1759 switch (TYPE(n)) {
1760 case list_for:
1761 com_list_for(c, n, e, t);
1762 break;
1763 case list_if:
1764 com_list_if(c, n, e, t);
1765 break;
1766 default:
1767 com_error(c, PyExc_SystemError,
1768 "invalid list_iter node type");
1769 }
1770 }
1771 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001772 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001773 com_push(c, 1);
1774 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001775 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001776 com_pop(c, 2);
1777 }
1778}
1779
1780static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001781com_gen_iter(struct compiling *c, node *n, node *t)
1782{
1783 /* gen_iter: gen_for | gen_if */
1784 node *ch;
1785 REQ(n, gen_iter);
1786
1787 ch = CHILD(n, 0);
1788
1789 switch (TYPE(ch)) {
1790 case gen_for:
1791 com_gen_for(c, ch, t, 0);
1792 break;
1793 case gen_if:
1794 com_gen_if(c, ch, t);
1795 break;
1796 default:
1797 com_error(c, PyExc_SystemError,
1798 "invalid gen_iter node type");
1799 }
1800}
1801
1802static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001803com_list_comprehension(struct compiling *c, node *n)
1804{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001805 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001806 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001807
1808 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001809 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001810 com_addoparg(c, BUILD_LIST, 0);
1811 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1812 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001813 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001814 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001815 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001816 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001817 --c->c_tmpname;
1818}
1819
1820static void
1821com_listmaker(struct compiling *c, node *n)
1822{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001823 /* listmaker: test ( list_for | (',' test)* [','] ) */
1824 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001825 com_list_comprehension(c, n);
1826 else {
1827 int len = 0;
1828 int i;
1829 for (i = 0; i < NCH(n); i += 2, len++)
1830 com_node(c, CHILD(n, i));
1831 com_addoparg(c, BUILD_LIST, len);
1832 com_pop(c, len-1);
1833 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001834}
1835
1836static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001837com_generator_expression(struct compiling *c, node *n)
1838{
1839 /* testlist_gexp: test gen_for */
1840 /* argument: test gen_for */
1841 PyCodeObject *co;
1842
1843 REQ(CHILD(n, 0), test);
1844 REQ(CHILD(n, 1), gen_for);
1845
1846 symtable_enter_scope(c->c_symtable, "<genexpr>", TYPE(n),
1847 n->n_lineno);
1848 co = icompile(n, c);
1849 symtable_exit_scope(c->c_symtable);
1850
1851 if (co == NULL)
1852 c->c_errors++;
1853 else {
1854 int closure = com_make_closure(c, co);
1855 int i = com_addconst(c, (PyObject *)co);
1856
1857 com_addoparg(c, LOAD_CONST, i);
1858 com_push(c, 1);
1859 if (closure)
1860 com_addoparg(c, MAKE_CLOSURE, 0);
1861 else
1862 com_addoparg(c, MAKE_FUNCTION, 0);
1863
1864 com_test(c, CHILD(CHILD(n, 1), 3));
1865 com_addbyte(c, GET_ITER);
1866 com_addoparg(c, CALL_FUNCTION, 1);
1867 com_pop(c, 1);
1868
1869 Py_DECREF(co);
1870 }
1871}
1872
1873static void
1874com_testlist_gexp(struct compiling *c, node *n)
1875{
1876 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
1877 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
1878 com_generator_expression(c, n);
1879 else com_list(c, n, 0);
1880}
1881
1882static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001883com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001884{
1885 int i;
1886 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1887 for (i = 0; i+2 < NCH(n); i += 4) {
1888 /* We must arrange things just right for STORE_SUBSCR.
1889 It wants the stack to look like (value) (dict) (key) */
1890 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001891 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001892 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00001893 com_node(c, CHILD(n, i+2)); /* value */
1894 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001895 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001896 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001897 }
1898}
1899
1900static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001901com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001902{
1903 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001904 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001905 int i;
1906 REQ(n, atom);
1907 ch = CHILD(n, 0);
1908 switch (TYPE(ch)) {
1909 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001910 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001911 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001912 com_push(c, 1);
1913 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001914 else
Raymond Hettinger354433a2004-05-19 08:20:33 +00001915 com_testlist_gexp(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001916 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001917 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001918 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001919 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001920 com_push(c, 1);
1921 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001922 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001923 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001924 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001925 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001926 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001927 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001928 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001929 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001930 break;
1931 case BACKQUOTE:
1932 com_node(c, CHILD(n, 1));
1933 com_addbyte(c, UNARY_CONVERT);
1934 break;
1935 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001936 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001937 i = 255;
1938 }
1939 else {
1940 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001941 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001942 }
1943 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001944 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001945 break;
1946 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001947 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001948 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001949 c->c_errors++;
1950 i = 255;
1951 }
1952 else {
1953 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001954 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001955 }
1956 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001957 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001958 break;
1959 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001960 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001961 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001962 break;
1963 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001964 com_error(c, PyExc_SystemError,
1965 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001966 }
1967}
1968
1969static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001970com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001971{
1972 if (NCH(n) == 1) {
1973 com_addbyte(c, op);
1974 }
1975 else if (NCH(n) == 2) {
1976 if (TYPE(CHILD(n, 0)) != COLON) {
1977 com_node(c, CHILD(n, 0));
1978 com_addbyte(c, op+1);
1979 }
1980 else {
1981 com_node(c, CHILD(n, 1));
1982 com_addbyte(c, op+2);
1983 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001984 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001985 }
1986 else {
1987 com_node(c, CHILD(n, 0));
1988 com_node(c, CHILD(n, 2));
1989 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001990 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001991 }
1992}
1993
Guido van Rossum635abd21997-01-06 22:56:52 +00001994static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001995com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1996{
1997 if (NCH(n) == 1) {
1998 com_addbyte(c, DUP_TOP);
1999 com_push(c, 1);
2000 com_addbyte(c, SLICE);
2001 com_node(c, augn);
2002 com_addbyte(c, opcode);
2003 com_pop(c, 1);
2004 com_addbyte(c, ROT_TWO);
2005 com_addbyte(c, STORE_SLICE);
2006 com_pop(c, 2);
2007 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
2008 com_node(c, CHILD(n, 0));
2009 com_addoparg(c, DUP_TOPX, 2);
2010 com_push(c, 2);
2011 com_addbyte(c, SLICE+1);
2012 com_pop(c, 1);
2013 com_node(c, augn);
2014 com_addbyte(c, opcode);
2015 com_pop(c, 1);
2016 com_addbyte(c, ROT_THREE);
2017 com_addbyte(c, STORE_SLICE+1);
2018 com_pop(c, 3);
2019 } else if (NCH(n) == 2) {
2020 com_node(c, CHILD(n, 1));
2021 com_addoparg(c, DUP_TOPX, 2);
2022 com_push(c, 2);
2023 com_addbyte(c, SLICE+2);
2024 com_pop(c, 1);
2025 com_node(c, augn);
2026 com_addbyte(c, opcode);
2027 com_pop(c, 1);
2028 com_addbyte(c, ROT_THREE);
2029 com_addbyte(c, STORE_SLICE+2);
2030 com_pop(c, 3);
2031 } else {
2032 com_node(c, CHILD(n, 0));
2033 com_node(c, CHILD(n, 2));
2034 com_addoparg(c, DUP_TOPX, 3);
2035 com_push(c, 3);
2036 com_addbyte(c, SLICE+3);
2037 com_pop(c, 2);
2038 com_node(c, augn);
2039 com_addbyte(c, opcode);
2040 com_pop(c, 1);
2041 com_addbyte(c, ROT_FOUR);
2042 com_addbyte(c, STORE_SLICE+3);
2043 com_pop(c, 4);
2044 }
2045}
2046
2047static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002048com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002049{
2050 node *m;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002051 REQ(n, argument); /* [test '='] test [gen_for]; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00002052 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00002053 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002054 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00002055 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002056 }
2057 else {
2058 com_node(c, CHILD(n, 0));
2059 }
Guido van Rossum635abd21997-01-06 22:56:52 +00002060 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002061 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00002062 if (NCH(n) == 2) {
2063 com_generator_expression(c, n);
2064 return;
2065 }
2066
Guido van Rossumf10570b1995-07-07 22:53:21 +00002067 m = n;
2068 do {
2069 m = CHILD(m, 0);
2070 } while (NCH(m) == 1);
2071 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00002072 /* f(lambda x: x[0] = 3) ends up getting parsed with
2073 * LHS test = lambda x: x[0], and RHS test = 3.
2074 * SF bug 132313 points out that complaining about a keyword
2075 * then is very confusing.
2076 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002077 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00002078 TYPE(m) == lambdef ?
2079 "lambda cannot contain assignment" :
2080 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002081 }
2082 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002083 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00002084 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00002085 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002086 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002087 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002088 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002089 else if (*pkeywords == NULL) {
2090 c->c_errors++;
2091 Py_DECREF(v);
2092 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002093 if (PyDict_GetItem(*pkeywords, v) != NULL)
2094 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00002095 "duplicate keyword argument");
2096 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002097 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00002098 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002099 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002100 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002101 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002102 }
2103 }
2104 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002105}
2106
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002107static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002108com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002109{
2110 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00002111 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002112 }
2113 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002114 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00002115 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00002116 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00002117 int star_flag = 0;
2118 int starstar_flag = 0;
2119 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002120 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002121 na = 0;
2122 nk = 0;
2123 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00002124 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00002125 if (TYPE(ch) == STAR ||
2126 TYPE(ch) == DOUBLESTAR)
2127 break;
Guido van Rossumca906051998-12-10 16:56:22 +00002128 if (ch->n_lineno != lineno) {
2129 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002130 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00002131 }
2132 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00002133 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002134 na++;
2135 else
2136 nk++;
2137 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002138 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00002139 while (i < NCH(n)) {
2140 node *tok = CHILD(n, i);
2141 node *ch = CHILD(n, i+1);
2142 i += 3;
2143 switch (TYPE(tok)) {
2144 case STAR: star_flag = 1; break;
2145 case DOUBLESTAR: starstar_flag = 1; break;
2146 }
2147 com_node(c, ch);
2148 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002149 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002150 com_error(c, PyExc_SyntaxError,
2151 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002152 }
Jeremy Hylton76901512000-03-28 23:49:17 +00002153 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00002154 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00002155 star_flag + (starstar_flag << 1);
2156 else
2157 opcode = CALL_FUNCTION;
2158 com_addoparg(c, opcode, na | (nk << 8));
2159 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002160 }
2161}
2162
2163static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002164com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002165{
2166 com_addopname(c, LOAD_ATTR, n);
2167}
2168
2169static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002170com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002171{
2172 int i=0;
2173 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00002174 node *ch;
2175
2176 /* first argument */
2177 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002178 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002179 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002180 i++;
2181 }
2182 else {
2183 com_node(c, CHILD(n,i));
2184 i++;
2185 REQ(CHILD(n,i),COLON);
2186 i++;
2187 }
2188 /* second argument */
2189 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
2190 com_node(c, CHILD(n,i));
2191 i++;
2192 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002193 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002194 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002195 com_push(c, 1);
2196 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002197 /* remaining arguments */
2198 for (; i < NCH(n); i++) {
2199 ns++;
2200 ch=CHILD(n,i);
2201 REQ(ch, sliceop);
2202 if (NCH(ch) == 1) {
2203 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002204 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002205 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002206 }
2207 else
2208 com_node(c, CHILD(ch,1));
2209 }
2210 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002211 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002212}
2213
2214static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002215com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002216{
2217 node *ch;
2218 REQ(n, subscript);
2219 ch = CHILD(n,0);
2220 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002221 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002222 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002223 com_push(c, 1);
2224 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002225 else {
2226 /* check for slice */
2227 if ((TYPE(ch) == COLON || NCH(n) > 1))
2228 com_sliceobj(c, n);
2229 else {
2230 REQ(ch, test);
2231 com_node(c, ch);
2232 }
2233 }
2234}
2235
2236static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002237com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002238{
2239 int i, op;
2240 REQ(n, subscriptlist);
2241 /* Check to make backward compatible slice behavior for '[i:j]' */
2242 if (NCH(n) == 1) {
2243 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002244 /* 'Basic' slice, should have exactly one colon. */
2245 if ((TYPE(CHILD(sub, 0)) == COLON
2246 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2247 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2248 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002249 switch (assigning) {
2250 case OP_DELETE:
2251 op = DELETE_SLICE;
2252 break;
2253 case OP_ASSIGN:
2254 op = STORE_SLICE;
2255 break;
2256 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002257 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002258 break;
2259 default:
2260 com_augassign_slice(c, sub, assigning, augn);
2261 return;
2262 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002263 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002264 if (op == STORE_SLICE)
2265 com_pop(c, 2);
2266 else if (op == DELETE_SLICE)
2267 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002268 return;
2269 }
2270 }
2271 /* Else normal subscriptlist. Compile each subscript. */
2272 for (i = 0; i < NCH(n); i += 2)
2273 com_subscript(c, CHILD(n, i));
2274 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002275 if (NCH(n) > 1) {
2276 i = (NCH(n)+1) / 2;
2277 com_addoparg(c, BUILD_TUPLE, i);
2278 com_pop(c, i-1);
2279 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002280 switch (assigning) {
2281 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002282 op = DELETE_SUBSCR;
2283 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002284 break;
2285 default:
2286 case OP_ASSIGN:
2287 op = STORE_SUBSCR;
2288 i = 3;
2289 break;
2290 case OP_APPLY:
2291 op = BINARY_SUBSCR;
2292 i = 1;
2293 break;
2294 }
2295 if (assigning > OP_APPLY) {
2296 com_addoparg(c, DUP_TOPX, 2);
2297 com_push(c, 2);
2298 com_addbyte(c, BINARY_SUBSCR);
2299 com_pop(c, 1);
2300 com_node(c, augn);
2301 com_addbyte(c, assigning);
2302 com_pop(c, 1);
2303 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002304 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002305 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002306 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002307}
2308
2309static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002310com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002311{
2312 REQ(n, trailer);
2313 switch (TYPE(CHILD(n, 0))) {
2314 case LPAR:
2315 com_call_function(c, CHILD(n, 1));
2316 break;
2317 case DOT:
2318 com_select_member(c, CHILD(n, 1));
2319 break;
2320 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002321 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002322 break;
2323 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002324 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002325 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002326 }
2327}
2328
2329static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002330com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002331{
2332 int i;
2333 REQ(n, power);
2334 com_atom(c, CHILD(n, 0));
2335 for (i = 1; i < NCH(n); i++) {
2336 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2337 com_factor(c, CHILD(n, i+1));
2338 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002339 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002340 break;
2341 }
2342 else
2343 com_apply_trailer(c, CHILD(n, i));
2344 }
2345}
2346
2347static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002348com_invert_constant(struct compiling *c, node *n)
2349{
2350 /* Compute the inverse of int and longs and use them directly,
2351 but be prepared to generate code for all other
2352 possibilities (invalid numbers, floats, complex).
2353 */
2354 PyObject *num, *inv = NULL;
2355 int i;
2356
2357 REQ(n, NUMBER);
2358 num = parsenumber(c, STR(n));
2359 if (num == NULL)
2360 i = 255;
2361 else {
2362 inv = PyNumber_Invert(num);
2363 if (inv == NULL) {
2364 PyErr_Clear();
2365 i = com_addconst(c, num);
2366 } else {
2367 i = com_addconst(c, inv);
2368 Py_DECREF(inv);
2369 }
2370 Py_DECREF(num);
2371 }
2372 com_addoparg(c, LOAD_CONST, i);
2373 com_push(c, 1);
2374 if (num != NULL && inv == NULL)
2375 com_addbyte(c, UNARY_INVERT);
2376}
2377
Tim Peters51e26512001-09-07 08:45:55 +00002378static int
2379is_float_zero(const char *p)
2380{
2381 int found_radix_point = 0;
2382 int ch;
2383 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2384 switch (ch) {
2385 case '0':
2386 /* no reason to believe it's not 0 -- continue */
2387 break;
2388
2389 case 'e': case 'E': case 'j': case 'J':
2390 /* If this was a hex constant, we already would have
2391 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2392 must be an exponent marker, and we haven't yet
2393 seen a non-zero digit, and it doesn't matter what
2394 the exponent is then. For 'j' or 'J' similarly,
2395 except that this is an imaginary 0 then. */
2396 return 1;
2397
2398 case '.':
2399 found_radix_point = 1;
2400 break;
2401
2402 default:
2403 return 0;
2404 }
2405 }
2406 return found_radix_point;
2407}
2408
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002409static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002410com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002411{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002412 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002413 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002414 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002415 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002416 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002417 approriate value as a constant. If the value is negative,
2418 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002419 negative in the 0th position -- unless we're doing unary minus
2420 of a floating zero! In that case the sign is significant, but
2421 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002422 */
2423 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002424 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002425 && TYPE((pfactor = CHILD(n, 1))) == factor
2426 && NCH(pfactor) == 1
2427 && TYPE((ppower = CHILD(pfactor, 0))) == power
2428 && NCH(ppower) == 1
2429 && TYPE((patom = CHILD(ppower, 0))) == atom
2430 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002431 && !(childtype == MINUS &&
2432 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002433 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002434 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002435 return;
2436 }
2437 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002438 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002439 if (s == NULL) {
2440 com_error(c, PyExc_MemoryError, "");
2441 com_addbyte(c, 255);
2442 return;
2443 }
2444 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002445 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002446 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002447 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002448 }
Tim Peters51e26512001-09-07 08:45:55 +00002449 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002450 }
2451 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002452 com_factor(c, CHILD(n, 1));
2453 com_addbyte(c, UNARY_POSITIVE);
2454 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002455 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002456 com_factor(c, CHILD(n, 1));
2457 com_addbyte(c, UNARY_NEGATIVE);
2458 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002459 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002460 com_factor(c, CHILD(n, 1));
2461 com_addbyte(c, UNARY_INVERT);
2462 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002463 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002464 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002465 }
2466}
2467
2468static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002469com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002470{
2471 int i;
2472 int op;
2473 REQ(n, term);
2474 com_factor(c, CHILD(n, 0));
2475 for (i = 2; i < NCH(n); i += 2) {
2476 com_factor(c, CHILD(n, i));
2477 switch (TYPE(CHILD(n, i-1))) {
2478 case STAR:
2479 op = BINARY_MULTIPLY;
2480 break;
2481 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002482 if (c->c_flags & CO_FUTURE_DIVISION)
2483 op = BINARY_TRUE_DIVIDE;
2484 else
2485 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002486 break;
2487 case PERCENT:
2488 op = BINARY_MODULO;
2489 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002490 case DOUBLESLASH:
2491 op = BINARY_FLOOR_DIVIDE;
2492 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002493 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002494 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002495 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002496 op = 255;
2497 }
2498 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002499 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002500 }
2501}
2502
2503static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002504com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002505{
2506 int i;
2507 int op;
2508 REQ(n, arith_expr);
2509 com_term(c, CHILD(n, 0));
2510 for (i = 2; i < NCH(n); i += 2) {
2511 com_term(c, CHILD(n, i));
2512 switch (TYPE(CHILD(n, i-1))) {
2513 case PLUS:
2514 op = BINARY_ADD;
2515 break;
2516 case MINUS:
2517 op = BINARY_SUBTRACT;
2518 break;
2519 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002520 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002521 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002522 op = 255;
2523 }
2524 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002525 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002526 }
2527}
2528
2529static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002530com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002531{
2532 int i;
2533 int op;
2534 REQ(n, shift_expr);
2535 com_arith_expr(c, CHILD(n, 0));
2536 for (i = 2; i < NCH(n); i += 2) {
2537 com_arith_expr(c, CHILD(n, i));
2538 switch (TYPE(CHILD(n, i-1))) {
2539 case LEFTSHIFT:
2540 op = BINARY_LSHIFT;
2541 break;
2542 case RIGHTSHIFT:
2543 op = BINARY_RSHIFT;
2544 break;
2545 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002546 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002547 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002548 op = 255;
2549 }
2550 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002551 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002552 }
2553}
2554
2555static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002556com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002557{
2558 int i;
2559 int op;
2560 REQ(n, and_expr);
2561 com_shift_expr(c, CHILD(n, 0));
2562 for (i = 2; i < NCH(n); i += 2) {
2563 com_shift_expr(c, CHILD(n, i));
2564 if (TYPE(CHILD(n, i-1)) == AMPER) {
2565 op = BINARY_AND;
2566 }
2567 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002568 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002569 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002570 op = 255;
2571 }
2572 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002573 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002574 }
2575}
2576
2577static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002578com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002579{
2580 int i;
2581 int op;
2582 REQ(n, xor_expr);
2583 com_and_expr(c, CHILD(n, 0));
2584 for (i = 2; i < NCH(n); i += 2) {
2585 com_and_expr(c, CHILD(n, i));
2586 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2587 op = BINARY_XOR;
2588 }
2589 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002590 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002591 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002592 op = 255;
2593 }
2594 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002595 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002596 }
2597}
2598
2599static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002600com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002601{
2602 int i;
2603 int op;
2604 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002605 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002606 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002607 com_xor_expr(c, CHILD(n, i));
2608 if (TYPE(CHILD(n, i-1)) == VBAR) {
2609 op = BINARY_OR;
2610 }
2611 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002612 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002613 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002614 op = 255;
2615 }
2616 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002617 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002618 }
2619}
2620
2621static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002622cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002623{
2624 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00002625 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002626 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2627 if (NCH(n) == 1) {
2628 n = CHILD(n, 0);
2629 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002630 case LESS: return PyCmp_LT;
2631 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00002632 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00002633 case LESSEQUAL: return PyCmp_LE;
2634 case GREATEREQUAL: return PyCmp_GE;
2635 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2636 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2637 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002638 }
2639 }
2640 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002641 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002642 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002643 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002644 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002645 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002646 }
2647 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002648 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002649}
2650
2651static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002652com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002653{
2654 int i;
2655 enum cmp_op op;
2656 int anchor;
2657 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2658 com_expr(c, CHILD(n, 0));
2659 if (NCH(n) == 1)
2660 return;
2661
2662 /****************************************************************
2663 The following code is generated for all but the last
2664 comparison in a chain:
2665
2666 label: on stack: opcode: jump to:
2667
2668 a <code to load b>
2669 a, b DUP_TOP
2670 a, b, b ROT_THREE
2671 b, a, b COMPARE_OP
2672 b, 0-or-1 JUMP_IF_FALSE L1
2673 b, 1 POP_TOP
2674 b
2675
2676 We are now ready to repeat this sequence for the next
2677 comparison in the chain.
2678
2679 For the last we generate:
2680
2681 b <code to load c>
2682 b, c COMPARE_OP
2683 0-or-1
2684
2685 If there were any jumps to L1 (i.e., there was more than one
2686 comparison), we generate:
2687
2688 0-or-1 JUMP_FORWARD L2
2689 L1: b, 0 ROT_TWO
2690 0, b POP_TOP
2691 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002692 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002693 ****************************************************************/
2694
2695 anchor = 0;
2696
2697 for (i = 2; i < NCH(n); i += 2) {
2698 com_expr(c, CHILD(n, i));
2699 if (i+2 < NCH(n)) {
2700 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002701 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002702 com_addbyte(c, ROT_THREE);
2703 }
2704 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002705 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002706 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002707 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002708 }
2709 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002710 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002711 if (i+2 < NCH(n)) {
2712 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2713 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002714 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002715 }
2716 }
2717
2718 if (anchor) {
2719 int anchor2 = 0;
2720 com_addfwref(c, JUMP_FORWARD, &anchor2);
2721 com_backpatch(c, anchor);
2722 com_addbyte(c, ROT_TWO);
2723 com_addbyte(c, POP_TOP);
2724 com_backpatch(c, anchor2);
2725 }
2726}
2727
2728static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002729com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002730{
2731 REQ(n, not_test); /* 'not' not_test | comparison */
2732 if (NCH(n) == 1) {
2733 com_comparison(c, CHILD(n, 0));
2734 }
2735 else {
2736 com_not_test(c, CHILD(n, 1));
2737 com_addbyte(c, UNARY_NOT);
2738 }
2739}
2740
2741static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002742com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002743{
2744 int i;
2745 int anchor;
2746 REQ(n, and_test); /* not_test ('and' not_test)* */
2747 anchor = 0;
2748 i = 0;
2749 for (;;) {
2750 com_not_test(c, CHILD(n, i));
2751 if ((i += 2) >= NCH(n))
2752 break;
2753 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2754 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002755 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002756 }
2757 if (anchor)
2758 com_backpatch(c, anchor);
2759}
2760
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002761static int
2762com_make_closure(struct compiling *c, PyCodeObject *co)
2763{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002764 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002765 if (free == 0)
2766 return 0;
2767 for (i = 0; i < free; ++i) {
2768 /* Bypass com_addop_varname because it will generate
2769 LOAD_DEREF but LOAD_CLOSURE is needed.
2770 */
2771 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2772 int arg, reftype;
2773
2774 /* Special case: If a class contains a method with a
2775 free variable that has the same name as a method,
2776 the name will be considered free *and* local in the
2777 class. It should be handled by the closure, as
2778 well as by the normal name loookup logic.
2779 */
2780 reftype = get_ref_type(c, PyString_AS_STRING(name));
2781 if (reftype == CELL)
2782 arg = com_lookup_arg(c->c_cellvars, name);
2783 else /* (reftype == FREE) */
2784 arg = com_lookup_arg(c->c_freevars, name);
2785 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002786 fprintf(stderr, "lookup %s in %s %d %d\n"
2787 "freevars of %s: %s\n",
2788 PyObject_REPR(name),
2789 c->c_name,
2790 reftype, arg,
2791 PyString_AS_STRING(co->co_name),
2792 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002793 Py_FatalError("com_make_closure()");
2794 }
2795 com_addoparg(c, LOAD_CLOSURE, arg);
2796
2797 }
2798 com_push(c, free);
2799 return 1;
2800}
2801
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002802static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002803com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002804{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002805 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002806 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002807 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002808 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002809 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002810 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2811 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002812 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002813 if (co == NULL) {
2814 c->c_errors++;
2815 return;
2816 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002817 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002818 i = com_addconst(c, (PyObject *)co);
2819 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002820 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002821 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002822 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002823 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002824 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002825 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002826 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002827 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002828 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002829 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002830 else {
2831 int anchor = 0;
2832 int i = 0;
2833 for (;;) {
2834 com_and_test(c, CHILD(n, i));
2835 if ((i += 2) >= NCH(n))
2836 break;
2837 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2838 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002839 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002840 }
2841 if (anchor)
2842 com_backpatch(c, anchor);
2843 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002844}
2845
2846static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002847com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002848{
2849 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002850 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002851 com_node(c, CHILD(n, 0));
2852 }
2853 else {
2854 int i;
2855 int len;
2856 len = (NCH(n) + 1) / 2;
2857 for (i = 0; i < NCH(n); i += 2)
2858 com_node(c, CHILD(n, i));
2859 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002860 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002861 }
2862}
2863
2864
2865/* Begin of assignment compilation */
2866
Thomas Wouters434d0822000-08-24 20:11:32 +00002867
2868static void
2869com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2870{
2871 com_addbyte(c, DUP_TOP);
2872 com_push(c, 1);
2873 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002874 com_node(c, augn);
2875 com_addbyte(c, opcode);
2876 com_pop(c, 1);
2877 com_addbyte(c, ROT_TWO);
2878 com_addopname(c, STORE_ATTR, n);
2879 com_pop(c, 2);
2880}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002881
2882static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002883com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002884{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00002885 if (none_assignment_check(c, STR(n), assigning))
2886 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002887 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002888 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002889}
2890
2891static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002892com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002893{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002894 REQ(n, trailer);
2895 switch (TYPE(CHILD(n, 0))) {
2896 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002897 if (assigning == OP_DELETE)
2898 com_error(c, PyExc_SyntaxError,
2899 "can't delete function call");
2900 else
2901 com_error(c, PyExc_SyntaxError,
2902 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002903 break;
2904 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002905 if (assigning > OP_APPLY)
2906 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2907 else
2908 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002909 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002910 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002911 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002912 break;
2913 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002914 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002915 }
2916}
2917
2918static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002919com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002920{
2921 int i;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002922 if (TYPE(n) != testlist && TYPE(n) != testlist_gexp &&
2923 TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002924 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002925 if (assigning) {
2926 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002927 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002928 com_push(c, i-1);
2929 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002930 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002931 com_assign(c, CHILD(n, i), assigning, NULL);
2932}
2933
2934static void
2935com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2936{
2937 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002938 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002939 com_push(c, 1);
2940 com_node(c, augn);
2941 com_addbyte(c, opcode);
2942 com_pop(c, 1);
2943 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002944}
2945
2946static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002947com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002948{
2949 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002950 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002951 if (assigning)
2952 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002953}
2954
2955static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002956com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002957{
2958 /* Loop to avoid trivial recursion */
2959 for (;;) {
2960 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002961
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002962 case exprlist:
2963 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002964 case testlist1:
Raymond Hettinger354433a2004-05-19 08:20:33 +00002965 case testlist_gexp:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002966 if (NCH(n) > 1) {
Raymond Hettinger354433a2004-05-19 08:20:33 +00002967 if (TYPE(CHILD(n, 1)) == gen_for) {
2968 com_error(c, PyExc_SystemError,
2969 "assign to generator expression not possible");
2970 return;
2971 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002972 if (assigning > OP_APPLY) {
2973 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002974 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002975 return;
2976 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002977 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002978 return;
2979 }
2980 n = CHILD(n, 0);
2981 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002982
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002983 case test:
2984 case and_test:
2985 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002986 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002987 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002988 case xor_expr:
2989 case and_expr:
2990 case shift_expr:
2991 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002992 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002993 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002994 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002995 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002996 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002997 return;
2998 }
2999 n = CHILD(n, 0);
3000 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003001
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003002 case power: /* atom trailer* ('**' power)*
3003 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00003004 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003005 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003006 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003007 return;
3008 }
Guido van Rossum50564e81996-01-12 01:13:16 +00003009 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003010 int i;
3011 com_node(c, CHILD(n, 0));
3012 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003013 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003014 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003015 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00003016 return;
3017 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003018 com_apply_trailer(c, CHILD(n, i));
3019 } /* NB i is still alive */
3020 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00003021 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003022 return;
3023 }
3024 n = CHILD(n, 0);
3025 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003026
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003027 case atom:
3028 switch (TYPE(CHILD(n, 0))) {
3029 case LPAR:
3030 n = CHILD(n, 1);
3031 if (TYPE(n) == RPAR) {
3032 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003033 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003034 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003035 return;
3036 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003037 if (assigning > OP_APPLY) {
3038 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003039 "augmented assign to tuple literal not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003040 return;
3041 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003042 break;
3043 case LSQB:
3044 n = CHILD(n, 1);
3045 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003046 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003047 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003048 return;
3049 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003050 if (assigning > OP_APPLY) {
3051 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003052 "augmented assign to list literal not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003053 return;
3054 }
3055 if (NCH(n) > 1
3056 && TYPE(CHILD(n, 1)) == list_for) {
3057 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003058 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00003059 return;
3060 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003061 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003062 return;
3063 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00003064 if (assigning > OP_APPLY)
3065 com_augassign_name(c, CHILD(n, 0),
3066 assigning, augn);
3067 else
3068 com_assign_name(c, CHILD(n, 0),
3069 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003070 return;
3071 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003072 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003073 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003074 return;
3075 }
3076 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003077
3078 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003079 com_error(c, PyExc_SyntaxError,
3080 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003081 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003082
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003083 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003084 com_error(c, PyExc_SystemError,
3085 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003086 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003087
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003088 }
3089 }
3090}
Guido van Rossum7c531111997-03-11 18:42:21 +00003091
Thomas Wouters434d0822000-08-24 20:11:32 +00003092static void
3093com_augassign(struct compiling *c, node *n)
3094{
3095 int opcode;
3096
3097 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
3098 case '+': opcode = INPLACE_ADD; break;
3099 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00003100 case '/':
3101 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
3102 opcode = INPLACE_FLOOR_DIVIDE;
3103 else if (c->c_flags & CO_FUTURE_DIVISION)
3104 opcode = INPLACE_TRUE_DIVIDE;
3105 else
3106 opcode = INPLACE_DIVIDE;
3107 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00003108 case '%': opcode = INPLACE_MODULO; break;
3109 case '<': opcode = INPLACE_LSHIFT; break;
3110 case '>': opcode = INPLACE_RSHIFT; break;
3111 case '&': opcode = INPLACE_AND; break;
3112 case '^': opcode = INPLACE_XOR; break;
3113 case '|': opcode = INPLACE_OR; break;
3114 case '*':
3115 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
3116 opcode = INPLACE_POWER;
3117 else
3118 opcode = INPLACE_MULTIPLY;
3119 break;
3120 default:
3121 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
3122 return;
3123 }
3124 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
3125}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003126
3127static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003128com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003129{
Thomas Wouters434d0822000-08-24 20:11:32 +00003130 REQ(n, expr_stmt);
3131 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003132 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00003133 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003134 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00003135 if (NCH(n) == 1) {
3136 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003137 if (c->c_interactive)
3138 com_addbyte(c, PRINT_EXPR);
3139 else
3140 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003141 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003142 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003143 else if (TYPE(CHILD(n,1)) == augassign)
3144 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003145 else {
3146 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00003147 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003148 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003149 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003150 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003151 com_push(c, 1);
3152 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003153 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003154 }
3155 }
3156}
3157
3158static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003159com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00003160{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003161 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003162 int i;
3163 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003164 if (Py_OptimizeFlag)
3165 return;
3166 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00003167
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003168 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00003169 raise AssertionError [, <message>]
3170
3171 where <message> is the second test, if present.
3172 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003173 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003174 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003175 com_addbyte(c, POP_TOP);
3176 com_pop(c, 1);
3177 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003178 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00003179 com_push(c, 1);
3180 i = NCH(n)/2; /* Either 2 or 4 */
3181 if (i > 1)
3182 com_node(c, CHILD(n, 3));
3183 com_addoparg(c, RAISE_VARARGS, i);
3184 com_pop(c, i);
3185 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003186 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003187 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003188 com_addbyte(c, POP_TOP);
3189}
3190
3191static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003192com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003193{
Barry Warsaw29c574e2000-08-21 15:38:56 +00003194 int i = 1;
3195 node* stream = NULL;
3196
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003197 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003198
3199 /* are we using the extended print form? */
3200 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
3201 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00003202 com_node(c, stream);
3203 /* stack: [...] => [... stream] */
3204 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003205 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3206 i = 4;
3207 else
3208 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003209 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003210 for (; i < NCH(n); i += 2) {
3211 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003212 com_addbyte(c, DUP_TOP);
3213 /* stack: [stream] => [stream stream] */
3214 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003215 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003216 /* stack: [stream stream] => [stream stream obj] */
3217 com_addbyte(c, ROT_TWO);
3218 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003219 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003220 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003221 com_pop(c, 2);
3222 }
3223 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003224 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003225 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003226 com_addbyte(c, PRINT_ITEM);
3227 com_pop(c, 1);
3228 }
3229 }
3230 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003231 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003232 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003233 /* must pop the extra stream object off the stack */
3234 com_addbyte(c, POP_TOP);
3235 /* stack: [... stream] => [...] */
3236 com_pop(c, 1);
3237 }
3238 }
3239 else {
3240 if (stream != NULL) {
3241 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003242 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003243 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003244 com_pop(c, 1);
3245 }
3246 else
3247 com_addbyte(c, PRINT_NEWLINE);
3248 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003249}
3250
3251static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003252com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003253{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003254 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003255 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003256 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003257 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003258 if (c->c_flags & CO_GENERATOR) {
3259 if (NCH(n) > 1) {
3260 com_error(c, PyExc_SyntaxError,
3261 "'return' with argument inside generator");
3262 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003263 }
3264 if (NCH(n) < 2) {
3265 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003266 com_push(c, 1);
3267 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003268 else
3269 com_node(c, CHILD(n, 1));
3270 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003271 com_pop(c, 1);
3272}
3273
3274static void
3275com_yield_stmt(struct compiling *c, node *n)
3276{
Tim Peters95c80f82001-06-23 02:07:08 +00003277 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003278 REQ(n, yield_stmt); /* 'yield' testlist */
3279 if (!c->c_infunction) {
3280 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3281 }
Tim Peters95c80f82001-06-23 02:07:08 +00003282
3283 for (i = 0; i < c->c_nblocks; ++i) {
3284 if (c->c_block[i] == SETUP_FINALLY) {
3285 com_error(c, PyExc_SyntaxError,
3286 "'yield' not allowed in a 'try' block "
3287 "with a 'finally' clause");
3288 return;
3289 }
3290 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003291 com_node(c, CHILD(n, 1));
3292 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003293 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003294}
3295
3296static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003297com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003298{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003299 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003300 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3301 if (NCH(n) > 1) {
3302 com_node(c, CHILD(n, 1));
3303 if (NCH(n) > 3) {
3304 com_node(c, CHILD(n, 3));
3305 if (NCH(n) > 5)
3306 com_node(c, CHILD(n, 5));
3307 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003308 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003309 i = NCH(n)/2;
3310 com_addoparg(c, RAISE_VARARGS, i);
3311 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003312}
3313
3314static void
Thomas Wouters52152252000-08-17 22:55:00 +00003315com_from_import(struct compiling *c, node *n)
3316{
3317 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3318 com_push(c, 1);
3319 if (NCH(n) > 1) {
3320 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3321 com_error(c, PyExc_SyntaxError, "invalid syntax");
3322 return;
3323 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003324 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003325 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003326 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003327 com_pop(c, 1);
3328}
3329
3330static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003331com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003332{
3333 int i;
3334 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003335 /* 'import' dotted_name (',' dotted_name)* |
3336 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003337 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00003338 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003339 /* 'from' dotted_name 'import' ... */
3340 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003341
3342 if (TYPE(CHILD(n, 3)) == STAR) {
3343 tup = Py_BuildValue("(s)", "*");
3344 } else {
3345 tup = PyTuple_New((NCH(n) - 2)/2);
3346 for (i = 3; i < NCH(n); i += 2) {
3347 PyTuple_SET_ITEM(tup, (i-3)/2,
Guido van Rossum633d90c2002-12-23 16:51:42 +00003348 PyString_FromString(STR(
3349 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003350 }
3351 }
3352 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003353 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003354 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003355 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00003356 if (TYPE(CHILD(n, 3)) == STAR)
3357 com_addbyte(c, IMPORT_STAR);
3358 else {
3359 for (i = 3; i < NCH(n); i += 2)
3360 com_from_import(c, CHILD(n, i));
3361 com_addbyte(c, POP_TOP);
3362 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003363 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003364 }
3365 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003366 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003367 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003368 node *subn = CHILD(n, i);
3369 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003370 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003371 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003372 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003373 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003374 int j;
3375 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003376 com_error(c, PyExc_SyntaxError,
3377 "invalid syntax");
3378 return;
3379 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003380 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3381 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003382 CHILD(CHILD(subn, 0),
3383 j));
3384 com_addop_varname(c, VAR_STORE,
3385 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003386 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003387 com_addop_varname(c, VAR_STORE,
3388 STR(CHILD(CHILD(subn, 0),
3389 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003390 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003391 }
3392 }
3393}
3394
3395static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003396com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003397{
3398 REQ(n, exec_stmt);
3399 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3400 com_node(c, CHILD(n, 1));
3401 if (NCH(n) >= 4)
3402 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003403 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003404 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003405 com_push(c, 1);
3406 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003407 if (NCH(n) >= 6)
3408 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003409 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003410 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003411 com_push(c, 1);
3412 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003413 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003414 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003415}
3416
Guido van Rossum7c531111997-03-11 18:42:21 +00003417static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003418is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003419{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003420 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003421 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003422 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003423
3424 /* Label to avoid tail recursion */
3425 next:
3426 switch (TYPE(n)) {
3427
3428 case suite:
3429 if (NCH(n) == 1) {
3430 n = CHILD(n, 0);
3431 goto next;
3432 }
3433 /* Fall through */
3434 case file_input:
3435 for (i = 0; i < NCH(n); i++) {
3436 node *ch = CHILD(n, i);
3437 if (TYPE(ch) == stmt) {
3438 n = ch;
3439 goto next;
3440 }
3441 }
3442 break;
3443
3444 case stmt:
3445 case simple_stmt:
3446 case small_stmt:
3447 n = CHILD(n, 0);
3448 goto next;
3449
3450 case expr_stmt:
3451 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003452 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003453 case test:
3454 case and_test:
3455 case not_test:
3456 case comparison:
3457 case expr:
3458 case xor_expr:
3459 case and_expr:
3460 case shift_expr:
3461 case arith_expr:
3462 case term:
3463 case factor:
3464 case power:
3465 case atom:
3466 if (NCH(n) == 1) {
3467 n = CHILD(n, 0);
3468 goto next;
3469 }
3470 break;
3471
3472 case NAME:
3473 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3474 return 1;
3475 break;
3476
3477 case NUMBER:
3478 v = parsenumber(c, STR(n));
3479 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003480 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003481 break;
3482 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003483 i = PyObject_IsTrue(v);
3484 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003485 return i == 0;
3486
3487 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003488 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003489 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003490 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003491 break;
3492 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003493 i = PyObject_IsTrue(v);
3494 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003495 return i == 0;
3496
3497 }
3498 return 0;
3499}
3500
Tim Peters08a898f2001-06-28 01:52:22 +00003501
3502/* Look under n for a return stmt with an expression.
3503 * This hack is used to find illegal returns under "if 0:" blocks in
3504 * functions already known to be generators (as determined by the symtable
3505 * pass).
3506 * Return the offending return node if found, else NULL.
3507 */
3508static node *
3509look_for_offending_return(node *n)
3510{
3511 int i;
3512
3513 for (i = 0; i < NCH(n); ++i) {
3514 node *kid = CHILD(n, i);
3515
3516 switch (TYPE(kid)) {
3517 case classdef:
3518 case funcdef:
3519 case lambdef:
3520 /* Stuff in nested functions & classes doesn't
3521 affect the code block we started in. */
3522 return NULL;
3523
3524 case return_stmt:
3525 if (NCH(kid) > 1)
3526 return kid;
3527 break;
3528
3529 default: {
3530 node *bad = look_for_offending_return(kid);
3531 if (bad != NULL)
3532 return bad;
3533 }
3534 }
3535 }
3536
3537 return NULL;
3538}
3539
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003540static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003541com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003542{
3543 int i;
3544 int anchor = 0;
3545 REQ(n, if_stmt);
3546 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3547 for (i = 0; i+3 < NCH(n); i+=4) {
3548 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003549 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003550 if (is_constant_false(c, ch)) {
3551 /* We're going to skip this block. However, if this
3552 is a generator, we have to check the dead code
3553 anyway to make sure there aren't any return stmts
3554 with expressions, in the same scope. */
3555 if (c->c_flags & CO_GENERATOR) {
3556 node *p = look_for_offending_return(n);
3557 if (p != NULL) {
3558 int savelineno = c->c_lineno;
3559 c->c_lineno = p->n_lineno;
3560 com_error(c, PyExc_SyntaxError,
3561 "'return' with argument "
3562 "inside generator");
3563 c->c_lineno = savelineno;
3564 }
3565 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003566 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003567 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003568 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003569 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003570 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003571 com_addfwref(c, JUMP_IF_FALSE, &a);
3572 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003573 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003574 com_node(c, CHILD(n, i+3));
3575 com_addfwref(c, JUMP_FORWARD, &anchor);
3576 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003577 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003578 com_addbyte(c, POP_TOP);
3579 }
3580 if (i+2 < NCH(n))
3581 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003582 if (anchor)
3583 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003584}
3585
3586static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003587com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003588{
3589 int break_anchor = 0;
3590 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003591 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003592 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3593 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003594 block_push(c, SETUP_LOOP);
3595 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003596 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003597 com_node(c, CHILD(n, 1));
3598 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3599 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003600 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003601 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003602 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003603 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003604 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3605 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003606 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003607 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003608 com_addbyte(c, POP_TOP);
3609 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003610 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003611 if (NCH(n) > 4)
3612 com_node(c, CHILD(n, 6));
3613 com_backpatch(c, break_anchor);
3614}
3615
3616static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003617com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003618{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003619 int break_anchor = 0;
3620 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003621 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003622 REQ(n, for_stmt);
3623 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3624 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003625 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003626 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003627 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003628 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00003629 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003630 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003631 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003632 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003633 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003634 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003635 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003636 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3637 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003638 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003639 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003640 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003641 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003642 if (NCH(n) > 8)
3643 com_node(c, CHILD(n, 8));
3644 com_backpatch(c, break_anchor);
3645}
3646
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003647/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003648
3649 SETUP_FINALLY L
3650 <code for S>
3651 POP_BLOCK
3652 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003653 L: <code for Sf>
3654 END_FINALLY
3655
3656 The special instructions use the block stack. Each block
3657 stack entry contains the instruction that created it (here
3658 SETUP_FINALLY), the level of the value stack at the time the
3659 block stack entry was created, and a label (here L).
3660
3661 SETUP_FINALLY:
3662 Pushes the current value stack level and the label
3663 onto the block stack.
3664 POP_BLOCK:
3665 Pops en entry from the block stack, and pops the value
3666 stack until its level is the same as indicated on the
3667 block stack. (The label is ignored.)
3668 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003669 Pops a variable number of entries from the *value* stack
3670 and re-raises the exception they specify. The number of
3671 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003672
3673 The block stack is unwound when an exception is raised:
3674 when a SETUP_FINALLY entry is found, the exception is pushed
3675 onto the value stack (and the exception condition is cleared),
3676 and the interpreter jumps to the label gotten from the block
3677 stack.
3678
3679 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003680 (The contents of the value stack is shown in [], with the top
3681 at the right; 'tb' is trace-back info, 'val' the exception's
3682 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003683
3684 Value stack Label Instruction Argument
3685 [] SETUP_EXCEPT L1
3686 [] <code for S>
3687 [] POP_BLOCK
3688 [] JUMP_FORWARD L0
3689
Guido van Rossum3f5da241990-12-20 15:06:42 +00003690 [tb, val, exc] L1: DUP )
3691 [tb, val, exc, exc] <evaluate E1> )
3692 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3693 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3694 [tb, val, exc, 1] POP )
3695 [tb, val, exc] POP
3696 [tb, val] <assign to V1> (or POP if no V1)
3697 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003698 [] <code for S1>
3699 JUMP_FORWARD L0
3700
Guido van Rossum3f5da241990-12-20 15:06:42 +00003701 [tb, val, exc, 0] L2: POP
3702 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003703 .............................etc.......................
3704
Guido van Rossum3f5da241990-12-20 15:06:42 +00003705 [tb, val, exc, 0] Ln+1: POP
3706 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003707
3708 [] L0: <next statement>
3709
3710 Of course, parts are not generated if Vi or Ei is not present.
3711*/
3712
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003713static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003714com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003715{
3716 int except_anchor = 0;
3717 int end_anchor = 0;
3718 int else_anchor = 0;
3719 int i;
3720 node *ch;
3721
3722 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3723 block_push(c, SETUP_EXCEPT);
3724 com_node(c, CHILD(n, 2));
3725 com_addbyte(c, POP_BLOCK);
3726 block_pop(c, SETUP_EXCEPT);
3727 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3728 com_backpatch(c, except_anchor);
3729 for (i = 3;
3730 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3731 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003732 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003733 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003734 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003735 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003736 break;
3737 }
3738 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003739 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003740 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003741 if (NCH(ch) > 1) {
3742 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003743 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003744 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003745 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003746 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003747 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
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 }
3751 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003752 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003753 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003754 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003755 else {
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);
3758 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003759 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003760 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003761 com_node(c, CHILD(n, i+2));
3762 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3763 if (except_anchor) {
3764 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003765 /* We come in with [tb, val, exc, 0] on the
3766 stack; one pop and it's the same as
3767 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003768 com_addbyte(c, POP_TOP);
3769 }
3770 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003771 /* We actually come in here with [tb, val, exc] but the
3772 END_FINALLY will zap those and jump around.
3773 The c_stacklevel does not reflect them so we need not pop
3774 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003775 com_addbyte(c, END_FINALLY);
3776 com_backpatch(c, else_anchor);
3777 if (i < NCH(n))
3778 com_node(c, CHILD(n, i+2));
3779 com_backpatch(c, end_anchor);
3780}
3781
3782static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003783com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003784{
3785 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003786 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003787
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003788 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3789 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003790 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003791 com_addbyte(c, POP_BLOCK);
3792 block_pop(c, SETUP_FINALLY);
3793 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003794 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003795 /* While the generated code pushes only one item,
3796 the try-finally handling can enter here with
3797 up to three items. OK, here are the details:
3798 3 for an exception, 2 for RETURN, 1 for BREAK. */
3799 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003800 com_backpatch(c, finally_anchor);
3801 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003802 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003803 com_node(c, ch);
3804 com_addbyte(c, END_FINALLY);
3805 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003806 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003807}
3808
3809static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003810com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003811{
3812 REQ(n, try_stmt);
3813 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3814 | 'try' ':' suite 'finally' ':' suite */
3815 if (TYPE(CHILD(n, 3)) != except_clause)
3816 com_try_finally(c, n);
3817 else
3818 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003819}
3820
Guido van Rossum8b993a91997-01-17 21:04:03 +00003821static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003822get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003823{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003824 int i;
3825
Guido van Rossum8b993a91997-01-17 21:04:03 +00003826 /* Label to avoid tail recursion */
3827 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003828 switch (TYPE(n)) {
3829
3830 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003831 if (NCH(n) == 1) {
3832 n = CHILD(n, 0);
3833 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003834 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003835 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003836 case file_input:
3837 for (i = 0; i < NCH(n); i++) {
3838 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003839 if (TYPE(ch) == stmt) {
3840 n = ch;
3841 goto next;
3842 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003843 }
3844 break;
3845
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003846 case stmt:
3847 case simple_stmt:
3848 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003849 n = CHILD(n, 0);
3850 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003851
3852 case expr_stmt:
3853 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003854 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003855 case test:
3856 case and_test:
3857 case not_test:
3858 case comparison:
3859 case expr:
3860 case xor_expr:
3861 case and_expr:
3862 case shift_expr:
3863 case arith_expr:
3864 case term:
3865 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003866 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003867 if (NCH(n) == 1) {
3868 n = CHILD(n, 0);
3869 goto next;
3870 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003871 break;
3872
3873 case atom:
3874 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003875 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003876 break;
3877
3878 }
3879 return NULL;
3880}
3881
Guido van Rossum79f25d91997-04-29 20:08:16 +00003882static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003883get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003884{
Guido van Rossum541563e1999-01-28 15:08:09 +00003885 /* Don't generate doc-strings if run with -OO */
3886 if (Py_OptimizeFlag > 1)
3887 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003888 n = get_rawdocstring(n);
3889 if (n == NULL)
3890 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003891 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003892}
3893
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003894static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003895com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003896{
3897 REQ(n, suite);
3898 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3899 if (NCH(n) == 1) {
3900 com_node(c, CHILD(n, 0));
3901 }
3902 else {
3903 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003904 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003905 node *ch = CHILD(n, i);
3906 if (TYPE(ch) == stmt)
3907 com_node(c, ch);
3908 }
3909 }
3910}
3911
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003912/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003913static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003914com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003915{
3916 int i = c->c_nblocks;
3917 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3918 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3919 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003920 else if (i <= 0) {
3921 /* at the outer level */
3922 com_error(c, PyExc_SyntaxError,
3923 "'continue' not properly in loop");
3924 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003925 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003926 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003927 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003928 if (c->c_block[j] == SETUP_LOOP)
3929 break;
3930 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003931 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003932 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003933 for (; i > j; --i) {
3934 if (c->c_block[i] == SETUP_EXCEPT ||
3935 c->c_block[i] == SETUP_FINALLY) {
3936 com_addoparg(c, CONTINUE_LOOP,
3937 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003938 return;
3939 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003940 if (c->c_block[i] == END_FINALLY) {
3941 com_error(c, PyExc_SyntaxError,
3942 "'continue' not supported inside 'finally' clause");
3943 return;
3944 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003945 }
3946 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003947 com_error(c, PyExc_SyntaxError,
3948 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003949 }
3950 /* XXX Could allow it inside a 'finally' clause
3951 XXX if we could pop the exception still on the stack */
3952}
3953
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003954/* Return the number of default values in the argument list.
3955
3956 If a non-default argument follows a default argument, set an
3957 exception and return -1.
3958*/
3959
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003960static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003961com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003962{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003963 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003964 if (TYPE(n) == lambdef) {
3965 /* lambdef: 'lambda' [varargslist] ':' test */
3966 n = CHILD(n, 1);
3967 }
3968 else {
3969 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3970 n = CHILD(n, 2);
3971 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3972 n = CHILD(n, 1);
3973 }
3974 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003975 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003976 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003977 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003978 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3979 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003980 ndefs = 0;
3981 for (i = 0; i < nch; i++) {
3982 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003983 if (TYPE(CHILD(n, i)) == STAR ||
3984 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003985 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003986 i++;
3987 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003988 t = RPAR; /* Anything except EQUAL or COMMA */
3989 else
3990 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003991 if (t == EQUAL) {
3992 i++;
3993 ndefs++;
3994 com_node(c, CHILD(n, i));
3995 i++;
3996 if (i >= nch)
3997 break;
3998 t = TYPE(CHILD(n, i));
3999 }
4000 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004001 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004002 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004003 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00004004 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004005 return -1;
4006 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004007 }
4008 if (t != COMMA)
4009 break;
4010 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004011 return ndefs;
4012}
4013
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004014static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004015com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004016{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004017 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004018 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004019 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004020 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004021 if (ndefs < 0)
4022 return;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004023 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
4024 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004025 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004026 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004027 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004028 c->c_errors++;
4029 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004030 int closure = com_make_closure(c, (PyCodeObject *)co);
4031 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004032 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004033 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004034 if (closure)
4035 com_addoparg(c, MAKE_CLOSURE, ndefs);
4036 else
4037 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004038 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004039 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004040 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004041 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004042 }
4043}
4044
4045static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004046com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004047{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004048 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004049 REQ(n, testlist);
4050 /* testlist: test (',' test)* [','] */
4051 for (i = 0; i < NCH(n); i += 2)
4052 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004053 i = (NCH(n)+1) / 2;
4054 com_addoparg(c, BUILD_TUPLE, i);
4055 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004056}
4057
4058static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004059com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004060{
Guido van Rossum25831651993-05-19 14:50:45 +00004061 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004062 PyObject *v;
4063 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004064 char *name;
4065
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004066 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004067 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004068 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004069 c->c_errors++;
4070 return;
4071 }
4072 /* Push the class name on the stack */
4073 i = com_addconst(c, v);
4074 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004075 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004076 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004077 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004078 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004079 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004080 com_push(c, 1);
4081 }
Guido van Rossum25831651993-05-19 14:50:45 +00004082 else
4083 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004084 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004085 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004086 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004087 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004088 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004089 c->c_errors++;
4090 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004091 int closure = com_make_closure(c, co);
4092 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004093 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004094 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004095 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004096 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004097 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004098 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004099 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004100 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004101 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004102 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004103 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004104 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004105 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004106 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004107}
4108
4109static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004110com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004111{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004112 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004113 if (c->c_errors)
4114 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004115 switch (TYPE(n)) {
4116
4117 /* Definition nodes */
4118
4119 case funcdef:
4120 com_funcdef(c, n);
4121 break;
4122 case classdef:
4123 com_classdef(c, n);
4124 break;
4125
4126 /* Trivial parse tree nodes */
4127
4128 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004129 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004130 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004131 n = CHILD(n, 0);
4132 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004133
4134 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004135 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004136 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004137 {
4138 int i;
4139 for (i = 0; i < NCH(n)-1; i += 2)
4140 com_node(c, CHILD(n, i));
4141 }
4142 break;
4143
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004144 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004145 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004146 n = CHILD(n, 0);
4147 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004148
4149 /* Statement nodes */
4150
4151 case expr_stmt:
4152 com_expr_stmt(c, n);
4153 break;
4154 case print_stmt:
4155 com_print_stmt(c, n);
4156 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004157 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004158 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004159 break;
4160 case pass_stmt:
4161 break;
4162 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004163 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004164 com_error(c, PyExc_SyntaxError,
4165 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004166 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004167 com_addbyte(c, BREAK_LOOP);
4168 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004169 case continue_stmt:
4170 com_continue_stmt(c, n);
4171 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004172 case return_stmt:
4173 com_return_stmt(c, n);
4174 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004175 case yield_stmt:
4176 com_yield_stmt(c, n);
4177 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004178 case raise_stmt:
4179 com_raise_stmt(c, n);
4180 break;
4181 case import_stmt:
4182 com_import_stmt(c, n);
4183 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004184 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004185 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004186 case exec_stmt:
4187 com_exec_stmt(c, n);
4188 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004189 case assert_stmt:
4190 com_assert_stmt(c, n);
4191 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004192 case if_stmt:
4193 com_if_stmt(c, n);
4194 break;
4195 case while_stmt:
4196 com_while_stmt(c, n);
4197 break;
4198 case for_stmt:
4199 com_for_stmt(c, n);
4200 break;
4201 case try_stmt:
4202 com_try_stmt(c, n);
4203 break;
4204 case suite:
4205 com_suite(c, n);
4206 break;
4207
4208 /* Expression nodes */
4209
4210 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004211 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004212 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004213 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004214 break;
4215 case test:
4216 com_test(c, n);
4217 break;
4218 case and_test:
4219 com_and_test(c, n);
4220 break;
4221 case not_test:
4222 com_not_test(c, n);
4223 break;
4224 case comparison:
4225 com_comparison(c, n);
4226 break;
4227 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004228 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004229 break;
4230 case expr:
4231 com_expr(c, n);
4232 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004233 case xor_expr:
4234 com_xor_expr(c, n);
4235 break;
4236 case and_expr:
4237 com_and_expr(c, n);
4238 break;
4239 case shift_expr:
4240 com_shift_expr(c, n);
4241 break;
4242 case arith_expr:
4243 com_arith_expr(c, n);
4244 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004245 case term:
4246 com_term(c, n);
4247 break;
4248 case factor:
4249 com_factor(c, n);
4250 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004251 case power:
4252 com_power(c, n);
4253 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004254 case atom:
4255 com_atom(c, n);
4256 break;
4257
4258 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004259 com_error(c, PyExc_SystemError,
4260 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004261 }
4262}
4263
Tim Petersdbd9ba62000-07-09 03:09:57 +00004264static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004265
4266static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004267com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004268{
4269 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4270 if (TYPE(CHILD(n, 0)) == LPAR)
4271 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004272 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004273 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004274 com_pop(c, 1);
4275 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004276}
4277
4278static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004279com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004280{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004281 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004282 if (NCH(n) == 1) {
4283 com_fpdef(c, CHILD(n, 0));
4284 }
4285 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004286 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004287 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004288 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004289 for (i = 0; i < NCH(n); i += 2)
4290 com_fpdef(c, CHILD(n, i));
4291 }
4292}
4293
4294static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004295com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004296{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004297 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004298 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004299 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004300 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004301 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004302 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004303 nch = NCH(n);
4304 /* Enter all arguments in table of locals */
4305 for (i = 0, narg = 0; i < nch; i++) {
4306 node *ch = CHILD(n, i);
4307 node *fp;
4308 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004309 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004310 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4311 fp = CHILD(ch, 0);
4312 if (TYPE(fp) != NAME) {
4313 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4314 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004315 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004316 narg++;
4317 /* all name updates handled by symtable */
4318 if (++i >= nch)
4319 break;
4320 ch = CHILD(n, i);
4321 if (TYPE(ch) == EQUAL)
4322 i += 2;
4323 else
4324 REQ(ch, COMMA);
4325 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004326 if (complex) {
4327 /* Generate code for complex arguments only after
4328 having counted the simple arguments */
4329 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004330 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004331 node *ch = CHILD(n, i);
4332 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004333 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004334 break;
4335 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4336 fp = CHILD(ch, 0);
4337 if (TYPE(fp) != NAME) {
4338 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004339 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004340 com_fpdef(c, ch);
4341 }
4342 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004343 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004344 break;
4345 ch = CHILD(n, i);
4346 if (TYPE(ch) == EQUAL)
4347 i += 2;
4348 else
4349 REQ(ch, COMMA);
4350 }
4351 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004352}
4353
4354static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004355com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004356{
4357 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004358 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004359 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004360 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004361 if (doc != NULL) {
4362 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004363 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004364 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004365 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004366 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004367 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004368 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004369 for (i = 0; i < NCH(n); i++) {
4370 node *ch = CHILD(n, i);
4371 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4372 com_node(c, ch);
4373 }
4374}
4375
4376/* Top-level compile-node interface */
4377
4378static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004379compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004380{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004381 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004382 node *ch;
4383 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00004384 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004385 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004386 if (doc != NULL) {
4387 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004388 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004389 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004390 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004391 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004392 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
4393 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004394 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004395 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004396 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004397 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004398 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004399 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004400 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4401 com_push(c, 1);
4402 com_addbyte(c, RETURN_VALUE);
4403 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004404}
4405
4406static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004407compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004408{
Guido van Rossum590baa41993-11-30 13:40:46 +00004409 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004410 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004411 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004412
4413 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004414 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004415 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004416 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004417 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004418 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004419 else
4420 ch = CHILD(n, 2);
4421 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004422 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004423 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004424}
4425
4426static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004427compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004428{
4429 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004430 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004431 REQ(n, classdef);
4432 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4433 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004434 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004435 /* Initialize local __module__ from global __name__ */
4436 com_addop_name(c, LOAD_GLOBAL, "__name__");
4437 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004438 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004439 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004440 if (doc != NULL) {
4441 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004442 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004443 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004444 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004445 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004446 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004447 }
4448 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004449 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004450 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00004451 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004452 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004453 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004454 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004455 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004456}
4457
4458static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00004459compile_generator_expression(struct compiling *c, node *n)
4460{
4461 /* testlist_gexp: test gen_for */
4462 /* argument: test gen_for */
4463 REQ(CHILD(n, 0), test);
4464 REQ(CHILD(n, 1), gen_for);
4465
4466 c->c_name = "<generator expression>";
4467 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
4468
4469 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4470 com_push(c, 1);
4471 com_addbyte(c, RETURN_VALUE);
4472 com_pop(c, 1);
4473}
4474
4475static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004476compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004477{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004478 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004479
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004480 switch (TYPE(n)) {
4481
Guido van Rossum4c417781991-01-21 16:09:22 +00004482 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004483 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004484 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004485 n = CHILD(n, 0);
4486 if (TYPE(n) != NEWLINE)
4487 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004488 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004489 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4490 com_push(c, 1);
4491 com_addbyte(c, RETURN_VALUE);
4492 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004493 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004494 break;
4495
Guido van Rossum4c417781991-01-21 16:09:22 +00004496 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004497 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004498 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004499 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4500 com_push(c, 1);
4501 com_addbyte(c, RETURN_VALUE);
4502 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004503 break;
4504
Guido van Rossum590baa41993-11-30 13:40:46 +00004505 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004506 com_node(c, CHILD(n, 0));
4507 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004508 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004509 break;
4510
Guido van Rossum590baa41993-11-30 13:40:46 +00004511 case lambdef: /* anonymous function definition */
4512 compile_lambdef(c, n);
4513 break;
4514
Guido van Rossum4c417781991-01-21 16:09:22 +00004515 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004516 compile_funcdef(c, n);
4517 break;
4518
Guido van Rossum4c417781991-01-21 16:09:22 +00004519 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004520 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004521 break;
4522
Raymond Hettinger354433a2004-05-19 08:20:33 +00004523 case testlist_gexp: /* A generator expression */
4524 case argument: /* A generator expression */
4525 compile_generator_expression(c, n);
4526 break;
4527
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004528 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004529 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004530 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004531 }
4532}
4533
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004534static PyObject *
4535dict_keys_inorder(PyObject *dict, int offset)
4536{
4537 PyObject *tuple, *k, *v;
4538 int i, pos = 0, size = PyDict_Size(dict);
4539
4540 tuple = PyTuple_New(size);
4541 if (tuple == NULL)
4542 return NULL;
4543 while (PyDict_Next(dict, &pos, &k, &v)) {
4544 i = PyInt_AS_LONG(v);
4545 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004546 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004547 PyTuple_SET_ITEM(tuple, i - offset, k);
4548 }
4549 return tuple;
4550}
4551
Guido van Rossum79f25d91997-04-29 20:08:16 +00004552PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004553PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004554{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004555 return PyNode_CompileFlags(n, filename, NULL);
4556}
4557
4558PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004559PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004560{
4561 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004562}
4563
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004564struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004565PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004566{
4567 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004568 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004569
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004570 ff = PyNode_Future(n, filename);
4571 if (ff == NULL)
4572 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004573 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00004574 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004575 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004576 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004577 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004578 return st;
4579}
4580
Guido van Rossum79f25d91997-04-29 20:08:16 +00004581static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004582icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004583{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004584 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004585}
4586
Guido van Rossum79f25d91997-04-29 20:08:16 +00004587static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004588jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004589 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004590{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004591 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004592 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004593 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004594 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004595 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4596 sc.c_encoding = "utf-8";
4597 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004598 sc.c_encoding = STR(n);
4599 n = CHILD(n, 0);
4600 } else {
4601 sc.c_encoding = NULL;
4602 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004603 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004604 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004605 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004606 /* c_symtable still points to parent's symbols */
4607 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004608 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004609 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004610 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004611 if (base->c_encoding != NULL) {
4612 assert(sc.c_encoding == NULL);
4613 sc.c_encoding = base->c_encoding;
4614 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004615 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004616 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004617 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004618 if (sc.c_future == NULL) {
4619 com_free(&sc);
4620 return NULL;
4621 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004622 if (flags) {
4623 int merged = sc.c_future->ff_features |
4624 flags->cf_flags;
4625 sc.c_future->ff_features = merged;
4626 flags->cf_flags = merged;
4627 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004628 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
4629 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004630 com_free(&sc);
4631 return NULL;
4632 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004633 /* reset symbol table for second pass */
4634 sc.c_symtable->st_nscopes = 1;
4635 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004636 }
4637 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004638 if (symtable_load_symbols(&sc) < 0) {
4639 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004640 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004641 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004642 compile_node(&sc, n);
4643 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004644 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004645 PyObject *consts, *names, *varnames, *filename, *name,
4646 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004647 consts = PyList_AsTuple(sc.c_consts);
4648 names = PyList_AsTuple(sc.c_names);
4649 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004650 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4651 freevars = dict_keys_inorder(sc.c_freevars,
4652 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004653 filename = PyString_InternFromString(sc.c_filename);
4654 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004655 if (!PyErr_Occurred())
4656 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004657 sc.c_nlocals,
4658 sc.c_maxstacklevel,
4659 sc.c_flags,
4660 sc.c_code,
4661 consts,
4662 names,
4663 varnames,
4664 freevars,
4665 cellvars,
4666 filename,
4667 name,
4668 sc.c_firstlineno,
4669 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004670 Py_XDECREF(consts);
4671 Py_XDECREF(names);
4672 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004673 Py_XDECREF(freevars);
4674 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004675 Py_XDECREF(filename);
4676 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004677 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004678 else if (!PyErr_Occurred()) {
4679 /* This could happen if someone called PyErr_Clear() after an
4680 error was reported above. That's not supposed to happen,
4681 but I just plugged one case and I'm not sure there can't be
4682 others. In that case, raise SystemError so that at least
4683 it gets reported instead dumping core. */
4684 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4685 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004686 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004687 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004688 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004689 sc.c_symtable = NULL;
4690 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004691 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004692 return co;
4693}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004694
4695int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004696PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004697{
4698 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004699 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004700 int line = co->co_firstlineno;
4701 int addr = 0;
4702 while (--size >= 0) {
4703 addr += *p++;
4704 if (addr > addrq)
4705 break;
4706 line += *p++;
4707 }
4708 return line;
4709}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004710
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004711/* The test for LOCAL must come before the test for FREE in order to
4712 handle classes where name is both local and free. The local var is
4713 a method and the free var is a free var referenced within a method.
4714*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004715
4716static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004717get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004718{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004719 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004720 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004721
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004722 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4723 return CELL;
4724 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4725 return LOCAL;
4726 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4727 return FREE;
4728 v = PyDict_GetItemString(c->c_globals, name);
4729 if (v) {
4730 if (v == Py_None)
4731 return GLOBAL_EXPLICIT;
4732 else {
4733 return GLOBAL_IMPLICIT;
4734 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004735 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004736 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004737 "unknown scope for %.100s in %.100s(%s) "
4738 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4739 name, c->c_name,
4740 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4741 c->c_filename,
4742 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4743 PyObject_REPR(c->c_locals),
4744 PyObject_REPR(c->c_globals)
4745 );
4746
4747 Py_FatalError(buf);
4748 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004749}
4750
Guido van Rossum207fda62001-03-02 03:30:41 +00004751/* Helper functions to issue warnings */
4752
4753static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004754issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004755{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004756 if (PyErr_Occurred()) {
4757 /* This can happen because symtable_node continues
4758 processing even after raising a SyntaxError.
4759 Calling PyErr_WarnExplicit now would clobber the
4760 pending exception; instead we fail and let that
4761 exception propagate.
4762 */
4763 return -1;
4764 }
Guido van Rossum207fda62001-03-02 03:30:41 +00004765 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4766 lineno, NULL, NULL) < 0) {
4767 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4768 PyErr_SetString(PyExc_SyntaxError, msg);
4769 PyErr_SyntaxLocation(filename, lineno);
4770 }
4771 return -1;
4772 }
4773 return 0;
4774}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004775
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004776static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004777symtable_warn(struct symtable *st, char *msg)
4778{
Guido van Rossum207fda62001-03-02 03:30:41 +00004779 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004780 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004781 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004782 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004783 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004784}
4785
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004786/* Helper function for setting lineno and filename */
4787
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004788static struct symtable *
4789symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004790{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004791 struct symtable *st;
4792
4793 st = symtable_init();
4794 if (st == NULL)
4795 return NULL;
4796 st->st_future = ff;
4797 st->st_filename = filename;
4798 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
4799 if (st->st_errors > 0)
4800 goto fail;
4801 symtable_node(st, n);
4802 if (st->st_errors > 0)
4803 goto fail;
4804 return st;
4805 fail:
4806 if (!PyErr_Occurred()) {
4807 /* This could happen because after a syntax error is
4808 detected, the symbol-table-building continues for
4809 a while, and PyErr_Clear() might erroneously be
4810 called during that process. One such case has been
4811 fixed, but there might be more (now or later).
4812 */
4813 PyErr_SetString(PyExc_SystemError, "lost exception");
4814 }
4815 st->st_future = NULL;
4816 st->st_filename = NULL;
4817 PySymtable_Free(st);
4818 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004819}
4820
4821static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004822symtable_init_compiling_symbols(struct compiling *c)
4823{
4824 PyObject *varnames;
4825
4826 varnames = c->c_symtable->st_cur->ste_varnames;
4827 if (varnames == NULL) {
4828 varnames = PyList_New(0);
4829 if (varnames == NULL)
4830 return -1;
4831 c->c_symtable->st_cur->ste_varnames = varnames;
4832 Py_INCREF(varnames);
4833 } else
4834 Py_INCREF(varnames);
4835 c->c_varnames = varnames;
4836
4837 c->c_globals = PyDict_New();
4838 if (c->c_globals == NULL)
4839 return -1;
4840 c->c_freevars = PyDict_New();
4841 if (c->c_freevars == NULL)
4842 return -1;
4843 c->c_cellvars = PyDict_New();
4844 if (c->c_cellvars == NULL)
4845 return -1;
4846 return 0;
4847}
4848
4849struct symbol_info {
4850 int si_nlocals;
4851 int si_ncells;
4852 int si_nfrees;
4853 int si_nimplicit;
4854};
4855
4856static void
4857symtable_init_info(struct symbol_info *si)
4858{
4859 si->si_nlocals = 0;
4860 si->si_ncells = 0;
4861 si->si_nfrees = 0;
4862 si->si_nimplicit = 0;
4863}
4864
4865static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004866symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004867 struct symbol_info *si)
4868{
4869 PyObject *dict, *v;
4870
4871 /* Seperate logic for DEF_FREE. If it occurs in a function,
4872 it indicates a local that we must allocate storage for (a
4873 cell var). If it occurs in a class, then the class has a
4874 method and a free variable with the same name.
4875 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004876 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004877 /* If it isn't declared locally, it can't be a cell. */
4878 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4879 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004880 v = PyInt_FromLong(si->si_ncells++);
4881 dict = c->c_cellvars;
4882 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004883 /* If it is free anyway, then there is no need to do
4884 anything here.
4885 */
4886 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004887 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004888 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004889 v = PyInt_FromLong(si->si_nfrees++);
4890 dict = c->c_freevars;
4891 }
4892 if (v == NULL)
4893 return -1;
4894 if (PyDict_SetItem(dict, name, v) < 0) {
4895 Py_DECREF(v);
4896 return -1;
4897 }
4898 Py_DECREF(v);
4899 return 0;
4900}
4901
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004902/* If a variable is a cell and an argument, make sure that appears in
4903 co_cellvars before any variable to its right in varnames.
4904*/
4905
4906
4907static int
4908symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4909 PyObject *varnames, int flags)
4910{
Tim Petersb39903b2003-03-24 17:22:24 +00004911 PyObject *v = NULL;
4912 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004913 int i, pos;
4914
4915 if (flags & CO_VARARGS)
4916 argcount++;
4917 if (flags & CO_VARKEYWORDS)
4918 argcount++;
4919 for (i = argcount; --i >= 0; ) {
4920 v = PyList_GET_ITEM(varnames, i);
4921 if (PyDict_GetItem(*cellvars, v)) {
4922 if (list == NULL) {
4923 list = PyList_New(1);
4924 if (list == NULL)
4925 return -1;
4926 PyList_SET_ITEM(list, 0, v);
4927 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004928 } else {
4929 if (PyList_Insert(list, 0, v) < 0) {
4930 Py_DECREF(list);
4931 return -1;
4932 }
4933 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004934 }
4935 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00004936 if (list == NULL)
4937 return 0;
4938
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004939 /* There are cellvars that are also arguments. Create a dict
4940 to replace cellvars and put the args at the front.
4941 */
4942 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004943 if (d == NULL)
4944 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004945 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4946 v = PyInt_FromLong(i);
4947 if (v == NULL)
4948 goto fail;
4949 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4950 goto fail;
4951 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4952 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00004953 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004954 }
4955 pos = 0;
4956 i = PyList_GET_SIZE(list);
4957 Py_DECREF(list);
4958 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4959 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004960 if (w == NULL)
4961 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004962 if (PyDict_SetItem(d, v, w) < 0) {
4963 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00004964 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004965 goto fail;
4966 }
4967 Py_DECREF(w);
4968 }
4969 Py_DECREF(*cellvars);
4970 *cellvars = d;
4971 return 1;
4972 fail:
4973 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00004974 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004975 return -1;
4976}
4977
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004978static int
4979symtable_freevar_offsets(PyObject *freevars, int offset)
4980{
4981 PyObject *name, *v;
4982 int pos;
4983
4984 /* The cell vars are the first elements of the closure,
4985 followed by the free vars. Update the offsets in
4986 c_freevars to account for number of cellvars. */
4987 pos = 0;
4988 while (PyDict_Next(freevars, &pos, &name, &v)) {
4989 int i = PyInt_AS_LONG(v) + offset;
4990 PyObject *o = PyInt_FromLong(i);
4991 if (o == NULL)
4992 return -1;
4993 if (PyDict_SetItem(freevars, name, o) < 0) {
4994 Py_DECREF(o);
4995 return -1;
4996 }
4997 Py_DECREF(o);
4998 }
4999 return 0;
5000}
5001
5002static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005003symtable_check_unoptimized(struct compiling *c,
5004 PySymtableEntryObject *ste,
5005 struct symbol_info *si)
5006{
5007 char buf[300];
5008
5009 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
5010 || (ste->ste_nested && si->si_nimplicit)))
5011 return 0;
5012
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005013#define ILLEGAL_CONTAINS "contains a nested function with free variables"
5014
5015#define ILLEGAL_IS "is a nested function"
5016
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005017#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005018"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005019
5020#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005021"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005022
5023#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005024"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005025"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005026
5027 /* XXX perhaps the linenos for these opt-breaking statements
5028 should be stored so the exception can point to them. */
5029
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005030 if (ste->ste_child_free) {
5031 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005032 PyOS_snprintf(buf, sizeof(buf),
5033 ILLEGAL_IMPORT_STAR,
5034 PyString_AS_STRING(ste->ste_name),
5035 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005036 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005037 PyOS_snprintf(buf, sizeof(buf),
5038 ILLEGAL_BARE_EXEC,
5039 PyString_AS_STRING(ste->ste_name),
5040 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005041 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005042 PyOS_snprintf(buf, sizeof(buf),
5043 ILLEGAL_EXEC_AND_IMPORT_STAR,
5044 PyString_AS_STRING(ste->ste_name),
5045 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005046 }
5047 } else {
5048 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005049 PyOS_snprintf(buf, sizeof(buf),
5050 ILLEGAL_IMPORT_STAR,
5051 PyString_AS_STRING(ste->ste_name),
5052 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005053 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005054 PyOS_snprintf(buf, sizeof(buf),
5055 ILLEGAL_BARE_EXEC,
5056 PyString_AS_STRING(ste->ste_name),
5057 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005058 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005059 PyOS_snprintf(buf, sizeof(buf),
5060 ILLEGAL_EXEC_AND_IMPORT_STAR,
5061 PyString_AS_STRING(ste->ste_name),
5062 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005063 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005064 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005065
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005066 PyErr_SetString(PyExc_SyntaxError, buf);
5067 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5068 ste->ste_opt_lineno);
5069 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005070}
5071
5072static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005073symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5074 struct symbol_info *si)
5075{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005076 if (c->c_future)
5077 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005078 if (ste->ste_generator)
5079 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005080 if (ste->ste_type != TYPE_MODULE)
5081 c->c_flags |= CO_NEWLOCALS;
5082 if (ste->ste_type == TYPE_FUNCTION) {
5083 c->c_nlocals = si->si_nlocals;
5084 if (ste->ste_optimized == 0)
5085 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005086 else if (ste->ste_optimized != OPT_EXEC)
5087 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005088 }
5089 return 0;
5090}
5091
5092static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005093symtable_error(struct symtable *st, int lineno)
5094{
5095 if (lineno == 0)
5096 lineno = st->st_cur->ste_lineno;
5097 PyErr_SyntaxLocation(st->st_filename, lineno);
5098 st->st_errors++;
5099 return -1;
5100}
5101
5102static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005103symtable_load_symbols(struct compiling *c)
5104{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005105 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005106 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005107 PyObject *name, *varnames, *v;
5108 int i, flags, pos;
5109 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005110
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005111 v = NULL;
5112
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005113 if (symtable_init_compiling_symbols(c) < 0)
5114 goto fail;
5115 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005116 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005117 si.si_nlocals = PyList_GET_SIZE(varnames);
5118 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005119
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005120 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005121 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005122 if (v == NULL)
5123 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005124 if (PyDict_SetItem(c->c_locals,
5125 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005126 goto fail;
5127 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005128 }
5129
5130 /* XXX The cases below define the rules for whether a name is
5131 local or global. The logic could probably be clearer. */
5132 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005133 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5134 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005135
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005136 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005137 /* undo the original DEF_FREE */
5138 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005139
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005140 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005141 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005142 2. Free variables in methods that are also class
5143 variables or declared global.
5144 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005145 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005146 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005147
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005148 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005149 c->c_argcount--;
5150 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005151 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005152 c->c_argcount--;
5153 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005154 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005155 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005156 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005157 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005158 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005159 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005160 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005161 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005162 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005163 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5164 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005165 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005166 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005167 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005168 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005169 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005170 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005171 if (v == NULL)
5172 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005173 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005174 goto fail;
5175 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005176 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005177 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005178 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005179 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005180 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005181 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005182 if (v == NULL)
5183 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005184 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005185 goto fail;
5186 Py_DECREF(v);
5187 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005188 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005189 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005190 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005191 goto fail;
5192 if (st->st_nscopes != 1) {
5193 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005194 if (v == NULL)
5195 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005196 if (PyDict_SetItem(st->st_global,
5197 name, v))
5198 goto fail;
5199 Py_DECREF(v);
5200 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005201 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005202 }
5203 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005204 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5205
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005206 if (si.si_ncells > 1) { /* one cell is always in order */
5207 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5208 c->c_varnames, c->c_flags) < 0)
5209 return -1;
5210 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005211 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5212 return -1;
5213 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005214 fail:
5215 /* is this always the right thing to do? */
5216 Py_XDECREF(v);
5217 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005218}
5219
5220static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005221symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005222{
5223 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005224
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005225 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005226 if (st == NULL)
5227 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005228 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005229
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005230 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005231 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005232 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005233 goto fail;
5234 if ((st->st_symbols = PyDict_New()) == NULL)
5235 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005236 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005237 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005238 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005239 st->st_private = NULL;
5240 return st;
5241 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005242 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005243 return NULL;
5244}
5245
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005246void
5247PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005248{
5249 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005250 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005251 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005252 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005253}
5254
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005255/* When the compiler exits a scope, it must should update the scope's
5256 free variable information with the list of free variables in its
5257 children.
5258
5259 Variables that are free in children and defined in the current
5260 scope are cellvars.
5261
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005262 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005263 false), free variables in children that are not defined here are
5264 implicit globals.
5265
5266*/
5267
5268static int
5269symtable_update_free_vars(struct symtable *st)
5270{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005271 int i, j, def;
5272 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005273 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005274
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005275 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005276 def = DEF_FREE_CLASS;
5277 else
5278 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005279 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005280 int pos = 0;
5281
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005282 if (list && PyList_SetSlice(list, 0,
5283 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005284 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005285 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005286 PyList_GET_ITEM(ste->ste_children, i);
5287 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005288 int flags = PyInt_AS_LONG(o);
5289 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005290 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005291 if (list == NULL) {
5292 list = PyList_New(0);
5293 if (list == NULL)
5294 return -1;
5295 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005296 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005297 if (PyList_Append(list, name) < 0) {
5298 Py_DECREF(list);
5299 return -1;
5300 }
5301 }
5302 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005303 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005304 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005305 v = PyDict_GetItem(ste->ste_symbols, name);
5306 /* If a name N is declared global in scope A and
5307 referenced in scope B contained (perhaps
5308 indirectly) in A and there are no scopes
5309 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005310 is global in B. Unless A is a class scope,
5311 because class scopes are not considered for
5312 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005313 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005314 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005315 int flags = PyInt_AS_LONG(v);
5316 if (flags & DEF_GLOBAL) {
5317 symtable_undo_free(st, child->ste_id,
5318 name);
5319 continue;
5320 }
5321 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005322 if (ste->ste_nested) {
5323 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005324 name, def) < 0) {
5325 Py_DECREF(list);
5326 return -1;
5327 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005328 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005329 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005330 name) < 0) {
5331 Py_DECREF(list);
5332 return -1;
5333 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005334 }
5335 }
5336 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005337
5338 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005339 return 0;
5340}
5341
5342/* If the current scope is a non-nested class or if name is not
5343 defined in the current, non-nested scope, then it is an implicit
5344 global in all nested scopes.
5345*/
5346
5347static int
5348symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5349{
5350 PyObject *o;
5351 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005352 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005353
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005354 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005355 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005356 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005357 if (o == NULL)
5358 return symtable_undo_free(st, child, name);
5359 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005360
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005361 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005362 return symtable_undo_free(st, child, name);
5363 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005364 return symtable_add_def_o(st, ste->ste_symbols,
5365 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005366}
5367
5368static int
5369symtable_undo_free(struct symtable *st, PyObject *id,
5370 PyObject *name)
5371{
5372 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005373 PyObject *info;
5374 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005375
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005376 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5377 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005378 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005379
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005380 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005381 if (info == NULL)
5382 return 0;
5383 v = PyInt_AS_LONG(info);
5384 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005385 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005386 DEF_FREE_GLOBAL) < 0)
5387 return -1;
5388 } else
5389 /* If the name is defined here or declared global,
5390 then the recursion stops. */
5391 return 0;
5392
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005393 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5394 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005395 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005396 PyList_GET_ITEM(ste->ste_children, i);
5397 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005398 if (x < 0)
5399 return x;
5400 }
5401 return 0;
5402}
5403
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005404/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5405 This reference is released when the scope is exited, via the DECREF
5406 in symtable_exit_scope().
5407*/
5408
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005409static int
5410symtable_exit_scope(struct symtable *st)
5411{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005412 int end;
5413
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005414 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005415 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005416 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005417 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005418 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5419 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005420 if (PySequence_DelItem(st->st_stack, end) < 0)
5421 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005422 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005423}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005424
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005425static void
5426symtable_enter_scope(struct symtable *st, char *name, int type,
5427 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005428{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005429 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005430
5431 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005432 prev = st->st_cur;
5433 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005434 st->st_errors++;
5435 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005436 }
5437 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005438 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005439 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005440 if (st->st_cur == NULL) {
5441 st->st_errors++;
5442 return;
5443 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005444 if (strcmp(name, TOP) == 0)
5445 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005446 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005447 if (PyList_Append(prev->ste_children,
5448 (PyObject *)st->st_cur) < 0)
5449 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005450 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005451}
5452
5453static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005454symtable_lookup(struct symtable *st, char *name)
5455{
5456 char buffer[MANGLE_LEN];
5457 PyObject *v;
5458 int flags;
5459
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005460 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005461 name = buffer;
5462 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5463 if (v == NULL) {
5464 if (PyErr_Occurred())
5465 return -1;
5466 else
5467 return 0;
5468 }
5469
5470 flags = PyInt_AS_LONG(v);
5471 return flags;
5472}
5473
5474static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005475symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005476{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005477 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005478 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005479 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005480
Guido van Rossumb7164622002-08-16 02:48:11 +00005481 /* Warn about None, except inside a tuple (where the assignment
5482 code already issues a warning). */
5483 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5484 *name == 'N' && strcmp(name, "None") == 0)
5485 {
5486 if (symtable_warn(st, "argument named None"))
5487 return -1;
5488 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005489 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005490 name = buffer;
5491 if ((s = PyString_InternFromString(name)) == NULL)
5492 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005493 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5494 Py_DECREF(s);
5495 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005496}
5497
5498/* Must only be called with mangled names */
5499
5500static int
5501symtable_add_def_o(struct symtable *st, PyObject *dict,
5502 PyObject *name, int flag)
5503{
5504 PyObject *o;
5505 int val;
5506
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005507 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005508 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005509 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005510 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005511 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005512 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005513 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005514 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005515 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005516 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005517 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005518 if (o == NULL)
5519 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005520 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005521 Py_DECREF(o);
5522 return -1;
5523 }
5524 Py_DECREF(o);
5525
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005526 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005527 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005528 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005529 } else if (flag & DEF_GLOBAL) {
5530 /* XXX need to update DEF_GLOBAL for other flags too;
5531 perhaps only DEF_FREE_GLOBAL */
5532 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005533 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005534 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005535 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005536 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005537 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005538 if (o == NULL)
5539 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005540 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005541 Py_DECREF(o);
5542 return -1;
5543 }
5544 Py_DECREF(o);
5545 }
5546 return 0;
5547}
5548
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005549#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005550
Tim Peters08a898f2001-06-28 01:52:22 +00005551/* Look for a yield stmt under n. Return 1 if found, else 0.
5552 This hack is used to look inside "if 0:" blocks (which are normally
5553 ignored) in case those are the only places a yield occurs (so that this
5554 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005555static int
5556look_for_yield(node *n)
5557{
5558 int i;
5559
5560 for (i = 0; i < NCH(n); ++i) {
5561 node *kid = CHILD(n, i);
5562
5563 switch (TYPE(kid)) {
5564
5565 case classdef:
5566 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005567 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005568 /* Stuff in nested functions and classes can't make
5569 the parent a generator. */
5570 return 0;
5571
5572 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00005573 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005574
5575 default:
5576 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00005577 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005578 }
5579 }
5580 return 0;
5581}
5582
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005583static void
5584symtable_node(struct symtable *st, node *n)
5585{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005586 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005587
5588 loop:
5589 switch (TYPE(n)) {
5590 case funcdef: {
5591 char *func_name = STR(CHILD(n, 1));
5592 symtable_add_def(st, func_name, DEF_LOCAL);
5593 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005594 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005595 symtable_funcdef(st, n);
5596 symtable_exit_scope(st);
5597 break;
5598 }
5599 case lambdef:
5600 if (NCH(n) == 4)
5601 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005602 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005603 symtable_funcdef(st, n);
5604 symtable_exit_scope(st);
5605 break;
5606 case classdef: {
5607 char *tmp, *class_name = STR(CHILD(n, 1));
5608 symtable_add_def(st, class_name, DEF_LOCAL);
5609 if (TYPE(CHILD(n, 2)) == LPAR) {
5610 node *bases = CHILD(n, 3);
5611 int i;
5612 for (i = 0; i < NCH(bases); i += 2) {
5613 symtable_node(st, CHILD(bases, i));
5614 }
5615 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005616 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005617 tmp = st->st_private;
5618 st->st_private = class_name;
5619 symtable_node(st, CHILD(n, NCH(n) - 1));
5620 st->st_private = tmp;
5621 symtable_exit_scope(st);
5622 break;
5623 }
5624 case if_stmt:
5625 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005626 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5627 if (st->st_cur->ste_generator == 0)
5628 st->st_cur->ste_generator =
5629 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005630 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005631 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005632 symtable_node(st, CHILD(n, i + 1));
5633 symtable_node(st, CHILD(n, i + 3));
5634 }
5635 if (i + 2 < NCH(n))
5636 symtable_node(st, CHILD(n, i + 2));
5637 break;
5638 case global_stmt:
5639 symtable_global(st, n);
5640 break;
5641 case import_stmt:
5642 symtable_import(st, n);
5643 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005644 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005645 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005646 symtable_node(st, CHILD(n, 1));
5647 if (NCH(n) > 2)
5648 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005649 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005650 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005651 st->st_cur->ste_opt_lineno = n->n_lineno;
5652 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005653 if (NCH(n) > 4)
5654 symtable_node(st, CHILD(n, 5));
5655 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005656
5657 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005658 case assert_stmt:
5659 if (Py_OptimizeFlag)
5660 return;
5661 if (NCH(n) == 2) {
5662 n = CHILD(n, 1);
5663 goto loop;
5664 } else {
5665 symtable_node(st, CHILD(n, 1));
5666 n = CHILD(n, 3);
5667 goto loop;
5668 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005669 case except_clause:
5670 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005671 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005672 if (NCH(n) > 1) {
5673 n = CHILD(n, 1);
5674 goto loop;
5675 }
5676 break;
5677 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005678 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005679 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005680 case yield_stmt:
5681 st->st_cur->ste_generator = 1;
5682 n = CHILD(n, 1);
5683 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005684 case expr_stmt:
5685 if (NCH(n) == 1)
5686 n = CHILD(n, 0);
5687 else {
5688 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005689 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005690 symtable_node(st, CHILD(n, 2));
5691 break;
5692 } else {
5693 int i;
5694 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005695 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005696 n = CHILD(n, NCH(n) - 1);
5697 }
5698 }
5699 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005700 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005701 /* only occurs when there are multiple for loops
5702 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005703 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005704 if (TYPE(n) == list_for)
5705 symtable_list_for(st, n);
5706 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005707 REQ(n, list_if);
5708 symtable_node(st, CHILD(n, 1));
5709 if (NCH(n) == 3) {
5710 n = CHILD(n, 2);
5711 goto loop;
5712 }
5713 }
5714 break;
5715 case for_stmt:
5716 symtable_assign(st, CHILD(n, 1), 0);
5717 for (i = 3; i < NCH(n); ++i)
5718 if (TYPE(CHILD(n, i)) >= single_input)
5719 symtable_node(st, CHILD(n, i));
5720 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00005721 case arglist:
5722 if (NCH(n) > 1)
5723 for (i = 0; i < NCH(n); ++i) {
5724 node *ch = CHILD(n, i);
5725 if (TYPE(ch) == argument && NCH(ch) == 2 &&
5726 TYPE(CHILD(ch, 1)) == gen_for) {
5727 PyErr_SetString(PyExc_SyntaxError,
5728 "invalid syntax");
5729 symtable_error(st, n->n_lineno);
5730 return;
5731 }
5732 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005733 /* The remaining cases fall through to default except in
5734 special circumstances. This requires the individual cases
5735 to be coded with great care, even though they look like
5736 rather innocuous. Each case must double-check TYPE(n).
5737 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005738 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005739 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005740 n = CHILD(n, 2);
5741 goto loop;
5742 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00005743 else if (TYPE(n) == argument && NCH(n) == 2 &&
5744 TYPE(CHILD(n, 1)) == gen_for) {
5745 symtable_generator_expression(st, n);
5746 break;
5747 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005748 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005749 case listmaker:
5750 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005751 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005752 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005753 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005754 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00005755 case testlist_gexp:
5756 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
5757 symtable_generator_expression(st, n);
5758 break;
5759 }
5760 /* fall through */
5761
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005762 case atom:
5763 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5764 symtable_add_use(st, STR(CHILD(n, 0)));
5765 break;
5766 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005767 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005768 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005769 /* Walk over every non-token child with a special case
5770 for one child.
5771 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005772 if (NCH(n) == 1) {
5773 n = CHILD(n, 0);
5774 goto loop;
5775 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005776 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005777 if (TYPE(CHILD(n, i)) >= single_input)
5778 symtable_node(st, CHILD(n, i));
5779 }
5780}
5781
5782static void
5783symtable_funcdef(struct symtable *st, node *n)
5784{
5785 node *body;
5786
5787 if (TYPE(n) == lambdef) {
5788 if (NCH(n) == 4)
5789 symtable_params(st, CHILD(n, 1));
5790 } else
5791 symtable_params(st, CHILD(n, 2));
5792 body = CHILD(n, NCH(n) - 1);
5793 symtable_node(st, body);
5794}
5795
5796/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00005797 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005798 which are references in the defining scope. symtable_params()
5799 parses the parameter names, which are defined in the function's
5800 body.
5801
5802 varargslist:
5803 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5804 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5805*/
5806
5807static void
5808symtable_default_args(struct symtable *st, node *n)
5809{
5810 node *c;
5811 int i;
5812
5813 if (TYPE(n) == parameters) {
5814 n = CHILD(n, 1);
5815 if (TYPE(n) == RPAR)
5816 return;
5817 }
5818 REQ(n, varargslist);
5819 for (i = 0; i < NCH(n); i += 2) {
5820 c = CHILD(n, i);
5821 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5822 break;
5823 }
5824 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5825 symtable_node(st, CHILD(n, i));
5826 }
5827}
5828
5829static void
5830symtable_params(struct symtable *st, node *n)
5831{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005832 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00005833 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005834
5835 if (TYPE(n) == parameters) {
5836 n = CHILD(n, 1);
5837 if (TYPE(n) == RPAR)
5838 return;
5839 }
5840 REQ(n, varargslist);
5841 for (i = 0; i < NCH(n); i += 2) {
5842 c = CHILD(n, i);
5843 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5844 ext = 1;
5845 break;
5846 }
5847 if (TYPE(c) == test) {
5848 continue;
5849 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00005850 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005851 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00005852 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005853 char nbuf[30];
5854 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005855 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005856 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005857 }
5858 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005859 if (ext) {
5860 c = CHILD(n, i);
5861 if (TYPE(c) == STAR) {
5862 i++;
5863 symtable_add_def(st, STR(CHILD(n, i)),
5864 DEF_PARAM | DEF_STAR);
5865 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005866 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005867 c = NULL;
5868 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005869 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005870 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005871 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005872 i++;
5873 symtable_add_def(st, STR(CHILD(n, i)),
5874 DEF_PARAM | DEF_DOUBLESTAR);
5875 }
5876 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005877 if (complex >= 0) {
5878 int j;
5879 for (j = 0; j <= complex; j++) {
5880 c = CHILD(n, j);
5881 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005882 c = CHILD(n, ++j);
5883 else if (TYPE(c) == EQUAL)
5884 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005885 if (TYPE(CHILD(c, 0)) == LPAR)
5886 symtable_params_fplist(st, CHILD(c, 1));
5887 }
5888 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005889}
5890
5891static void
5892symtable_params_fplist(struct symtable *st, node *n)
5893{
5894 int i;
5895 node *c;
5896
5897 REQ(n, fplist);
5898 for (i = 0; i < NCH(n); i += 2) {
5899 c = CHILD(n, i);
5900 REQ(c, fpdef);
5901 if (NCH(c) == 1)
5902 symtable_add_def(st, STR(CHILD(c, 0)),
5903 DEF_PARAM | DEF_INTUPLE);
5904 else
5905 symtable_params_fplist(st, CHILD(c, 1));
5906 }
5907
5908}
5909
5910static void
5911symtable_global(struct symtable *st, node *n)
5912{
5913 int i;
5914
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005915 /* XXX It might be helpful to warn about module-level global
5916 statements, but it's hard to tell the difference between
5917 module-level and a string passed to exec.
5918 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005919
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005920 for (i = 1; i < NCH(n); i += 2) {
5921 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005922 int flags;
5923
5924 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005925 if (flags < 0)
5926 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005927 if (flags && flags != DEF_GLOBAL) {
5928 char buf[500];
5929 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005930 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005931 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00005932 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005933 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005934 }
5935 else {
5936 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005937 PyOS_snprintf(buf, sizeof(buf),
5938 GLOBAL_AFTER_ASSIGN,
5939 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005940 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005941 PyOS_snprintf(buf, sizeof(buf),
5942 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005943 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005944 }
5945 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005946 symtable_add_def(st, name, DEF_GLOBAL);
5947 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005948}
5949
5950static void
5951symtable_list_comprehension(struct symtable *st, node *n)
5952{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005953 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005954 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005955
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005956 REQ(n, listmaker);
5957 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
5958 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005959 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005960 symtable_list_for(st, CHILD(n, 1));
5961 symtable_node(st, CHILD(n, 0));
5962 --st->st_cur->ste_tmpname;
5963}
5964
5965static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00005966symtable_generator_expression(struct symtable *st, node *n)
5967{
5968 /* testlist_gexp: test gen_for */
5969 REQ(CHILD(n, 0), test);
5970 REQ(CHILD(n, 1), gen_for);
5971
5972 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
5973 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
5974
5975 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
5976
5977 symtable_gen_for(st, CHILD(n, 1), 1);
5978 symtable_node(st, CHILD(n, 0));
5979 symtable_exit_scope(st);
5980
5981 /* for outmost iterable precomputation */
5982 symtable_node(st, CHILD(CHILD(n, 1), 3));
5983}
5984
5985static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005986symtable_list_for(struct symtable *st, node *n)
5987{
5988 REQ(n, list_for);
5989 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005990 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005991 symtable_node(st, CHILD(n, 3));
5992 if (NCH(n) == 5)
5993 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005994}
5995
5996static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00005997symtable_gen_for(struct symtable *st, node *n, int is_outmost)
5998{
5999 REQ(n, gen_for);
6000
6001 /* gen_for: for v in test [gen_iter] */
6002 symtable_assign(st, CHILD(n, 1), 0);
6003 if (is_outmost)
6004 symtable_add_use(st, "[outmost-iterable]");
6005 else
6006 symtable_node(st, CHILD(n, 3));
6007
6008 if (NCH(n) == 5)
6009 symtable_gen_iter(st, CHILD(n, 4));
6010}
6011
6012static void
6013symtable_gen_iter(struct symtable *st, node *n)
6014{
6015 REQ(n, gen_iter);
6016
6017 n = CHILD(n, 0);
6018 if (TYPE(n) == gen_for)
6019 symtable_gen_for(st, n, 0);
6020 else {
6021 REQ(n, gen_if);
6022 symtable_node(st, CHILD(n, 1));
6023
6024 if (NCH(n) == 3)
6025 symtable_gen_iter(st, CHILD(n, 2));
6026 }
6027}
6028
6029static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006030symtable_import(struct symtable *st, node *n)
6031{
6032 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006033 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006034 | 'from' dotted_name 'import'
6035 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00006036 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006037 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006038 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006039 node *dotname = CHILD(n, 1);
6040 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6041 /* check for bogus imports */
6042 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6043 PyErr_SetString(PyExc_SyntaxError,
6044 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006045 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006046 return;
6047 }
6048 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006049 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006050 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006051 if (symtable_warn(st,
6052 "import * only allowed at module level") < 0)
6053 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006054 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006055 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006056 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006057 } else {
6058 for (i = 3; i < NCH(n); i += 2) {
6059 node *c = CHILD(n, i);
6060 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006061 symtable_assign(st, CHILD(c, 2),
6062 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006063 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006064 symtable_assign(st, CHILD(c, 0),
6065 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006066 }
6067 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006068 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006069 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006070 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006071 }
6072 }
6073}
6074
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006075/* The third argument to symatble_assign() is a flag to be passed to
6076 symtable_add_def() if it is eventually called. The flag is useful
6077 to specify the particular type of assignment that should be
6078 recorded, e.g. an assignment caused by import.
6079 */
6080
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006081static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006082symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006083{
6084 node *tmp;
6085 int i;
6086
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006087 loop:
6088 switch (TYPE(n)) {
6089 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006090 /* invalid assignment, e.g. lambda x:x=2. The next
6091 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006092 return;
6093 case power:
6094 if (NCH(n) > 2) {
6095 for (i = 2; i < NCH(n); ++i)
6096 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6097 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006098 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006099 if (NCH(n) > 1) {
6100 symtable_node(st, CHILD(n, 0));
6101 symtable_node(st, CHILD(n, 1));
6102 } else {
6103 n = CHILD(n, 0);
6104 goto loop;
6105 }
6106 return;
6107 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006108 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6109 /* XXX This is an error, but the next pass
6110 will catch it. */
6111 return;
6112 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006113 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006114 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006115 }
6116 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006117 case testlist_gexp:
6118 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6119 /* XXX This is an error, but the next pass
6120 will catch it. */
6121 return;
6122 } else {
6123 for (i = 0; i < NCH(n); i += 2)
6124 symtable_assign(st, CHILD(n, i), def_flag);
6125 }
6126 return;
6127
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006128 case exprlist:
6129 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006130 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006131 if (NCH(n) == 1) {
6132 n = CHILD(n, 0);
6133 goto loop;
6134 }
6135 else {
6136 int i;
6137 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006138 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006139 return;
6140 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006141 case atom:
6142 tmp = CHILD(n, 0);
6143 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6144 n = CHILD(n, 1);
6145 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006146 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006147 if (strcmp(STR(tmp), "__debug__") == 0) {
6148 PyErr_SetString(PyExc_SyntaxError,
6149 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006150 symtable_error(st, n->n_lineno);
6151 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006152 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006153 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006154 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006155 return;
6156 case dotted_as_name:
6157 if (NCH(n) == 3)
6158 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006159 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006160 else
6161 symtable_add_def(st,
6162 STR(CHILD(CHILD(n,
6163 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006164 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006165 return;
6166 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006167 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006168 return;
6169 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006170 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006171 return;
6172 default:
6173 if (NCH(n) == 0)
6174 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006175 if (NCH(n) == 1) {
6176 n = CHILD(n, 0);
6177 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006178 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006179 /* Should only occur for errors like x + 1 = 1,
6180 which will be caught in the next pass. */
6181 for (i = 0; i < NCH(n); ++i)
6182 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006183 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006184 }
6185}