blob: 0d230d643a1540e69b142d9dabefdb74c53dc95d [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 *
366optimize_code(PyObject *code, PyObject* consts)
367{
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 Hettingerf6f575a2003-03-26 01:07:54 +0000372
373 /* Make a modifiable copy of the code string */
374 if (!PyString_Check(code))
375 goto exitUnchanged;
376 codelen = PyString_Size(code);
377 codestr = PyMem_Malloc(codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000378 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000379 goto exitUnchanged;
380 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000381 blocks = markblocks(codestr, codelen);
382 if (blocks == NULL) {
383 PyMem_Free(codestr);
384 goto exitUnchanged;
385 }
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000386 assert(PyTuple_Check(consts));
387
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000388 for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000389 opcode = codestr[i];
390 switch (opcode) {
391
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000392 /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with
393 with JUMP_IF_TRUE POP_TOP NOP */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000394 case UNARY_NOT:
395 if (codestr[i+1] != JUMP_IF_FALSE ||
396 codestr[i+4] != POP_TOP ||
397 !ISBASICBLOCK(blocks,i,5))
398 continue;
399 tgt = GETJUMPTGT(codestr, (i+1));
400 if (codestr[tgt] != POP_TOP)
401 continue;
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000402 j = GETARG(codestr, i+1) + 1;
403 codestr[i] = JUMP_IF_TRUE;
404 SETARG(codestr, i, j);
405 codestr[i+3] = POP_TOP;
406 codestr[i+4] = NOP;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000407 break;
408
409 /* not a is b --> a is not b
410 not a in b --> a not in b
411 not a is not b --> a is b
412 not a not in b --> a in b */
413 case COMPARE_OP:
414 j = GETARG(codestr, i);
415 if (j < 6 || j > 9 ||
416 codestr[i+3] != UNARY_NOT ||
417 !ISBASICBLOCK(blocks,i,4))
418 continue;
419 SETARG(codestr, i, (j^1));
420 codestr[i+3] = NOP;
421 break;
422
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000423 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP.
424 Note, only the first opcode is changed, the others still
425 perform normally if they happen to be jump targets. */
426 case LOAD_CONST:
427 j = GETARG(codestr, i);
428 if (codestr[i+3] != JUMP_IF_FALSE ||
429 codestr[i+6] != POP_TOP ||
430 !PyObject_IsTrue(PyTuple_GET_ITEM(consts, j)))
431 continue;
432 codestr[i] = JUMP_FORWARD;
433 SETARG(codestr, i, 4);
434 break;
435
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000436 /* Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2 JMP+2 NOP NOP.
437 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2 JMP+1 NOP. */
438 case BUILD_TUPLE:
439 case BUILD_LIST:
440 if (codestr[i+3] != UNPACK_SEQUENCE)
441 continue;
442 if (!ISBASICBLOCK(blocks,i,6))
443 continue;
444 if (GETARG(codestr, i) == 2 && \
445 GETARG(codestr, i+3) == 2) {
446 codestr[i] = ROT_TWO;
447 codestr[i+1] = JUMP_FORWARD;
448 SETARG(codestr, i+1, 2);
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000449 codestr[i+4] = NOP;
450 codestr[i+5] = NOP;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000451 continue;
452 }
453 if (GETARG(codestr, i) == 3 && \
454 GETARG(codestr, i+3) == 3) {
455 codestr[i] = ROT_THREE;
456 codestr[i+1] = ROT_TWO;
457 codestr[i+2] = JUMP_FORWARD;
458 SETARG(codestr, i+2, 1);
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000459 codestr[i+5] = NOP;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000460 }
461 break;
462
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000463 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000464 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000465 case JUMP_FORWARD:
466 case JUMP_IF_FALSE:
467 case JUMP_IF_TRUE:
468 case JUMP_ABSOLUTE:
469 case CONTINUE_LOOP:
470 case SETUP_LOOP:
471 case SETUP_EXCEPT:
472 case SETUP_FINALLY:
473 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000474 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000475 continue;
476 tgttgt = GETJUMPTGT(codestr, tgt);
477 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
478 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000479 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000480 tgttgt -= i + 3; /* Calc relative jump addr */
481 if (tgttgt < 0) /* No backward relative jumps */
482 continue;
483 codestr[i] = opcode;
484 SETARG(codestr, i, tgttgt);
485 break;
486
487 case EXTENDED_ARG:
488 PyMem_Free(codestr);
489 goto exitUnchanged;
490 }
491 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000492 code = PyString_FromStringAndSize((char *)codestr, codelen);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000493 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000494 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000495 return code;
496
497exitUnchanged:
498 Py_INCREF(code);
499 return code;
500}
501
Guido van Rossum79f25d91997-04-29 20:08:16 +0000502PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000503PyCode_New(int argcount, int nlocals, int stacksize, int flags,
504 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000505 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
506 PyObject *filename, PyObject *name, int firstlineno,
507 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000508{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000509 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000510 int i;
511 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000512 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000513 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000514 consts == NULL || !PyTuple_Check(consts) ||
515 names == NULL || !PyTuple_Check(names) ||
516 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000517 freevars == NULL || !PyTuple_Check(freevars) ||
518 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000519 name == NULL || !PyString_Check(name) ||
520 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000521 lnotab == NULL || !PyString_Check(lnotab) ||
522 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000523 PyErr_BadInternalCall();
524 return NULL;
525 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000526 intern_strings(names);
527 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000528 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000529 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000530 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000531 for (i = PyTuple_Size(consts); --i >= 0; ) {
532 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000533 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000534 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000535 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000536 continue;
537 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000538 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000539 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000540 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000541 co->co_argcount = argcount;
542 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000543 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000544 co->co_flags = flags;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000545 co->co_code = optimize_code(code, consts);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000546 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000547 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000548 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000549 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000550 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000551 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000552 Py_INCREF(freevars);
553 co->co_freevars = freevars;
554 Py_INCREF(cellvars);
555 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000556 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000557 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000558 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000559 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000560 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000561 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000562 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000563 if (PyTuple_GET_SIZE(freevars) == 0 &&
564 PyTuple_GET_SIZE(cellvars) == 0)
565 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000566 }
567 return co;
568}
569
570
571/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000572
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000573/* The compiler uses two passes to generate bytecodes. The first pass
574 builds the symbol table. The second pass generates the bytecode.
575
576 The first pass uses a single symtable struct. The second pass uses
577 a compiling struct for each code block. The compiling structs
578 share a reference to the symtable.
579
580 The two passes communicate via symtable_load_symbols() and via
581 is_local() and is_global(). The former initializes several slots
582 in the compiling struct: c_varnames, c_locals, c_nlocals,
583 c_argcount, c_globals, and c_flags.
584*/
585
Tim Peters2a7f3842001-06-09 09:26:21 +0000586/* All about c_lnotab.
587
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000588c_lnotab is an array of unsigned bytes disguised as a Python string. Since
589version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
590mapped to source code line #s via c_lnotab instead.
591
Tim Peters2a7f3842001-06-09 09:26:21 +0000592The array is conceptually a list of
593 (bytecode offset increment, line number increment)
594pairs. The details are important and delicate, best illustrated by example:
595
596 byte code offset source code line number
597 0 1
598 6 2
599 50 7
600 350 307
601 361 308
602
603The first trick is that these numbers aren't stored, only the increments
604from one row to the next (this doesn't really work, but it's a start):
605
606 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
607
608The second trick is that an unsigned byte can't hold negative values, or
609values larger than 255, so (a) there's a deep assumption that byte code
610offsets and their corresponding line #s both increase monotonically, and (b)
611if at least one column jumps by more than 255 from one row to the next, more
612than one pair is written to the table. In case #b, there's no way to know
613from looking at the table later how many were written. That's the delicate
614part. A user of c_lnotab desiring to find the source line number
615corresponding to a bytecode address A should do something like this
616
617 lineno = addr = 0
618 for addr_incr, line_incr in c_lnotab:
619 addr += addr_incr
620 if addr > A:
621 return lineno
622 lineno += line_incr
623
624In order for this to work, when the addr field increments by more than 255,
625the line # increment in each pair generated must be 0 until the remaining addr
626increment is < 256. So, in the example above, com_set_lineno should not (as
627was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
628255, 0, 45, 255, 0, 45.
629*/
630
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000631struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000632 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000633 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000634 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000635 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000636 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +0000637 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000638 PyObject *c_locals; /* dictionary (value=localID) */
639 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000640 PyObject *c_freevars; /* dictionary (value=None) */
641 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000642 int c_nlocals; /* index of next local */
643 int c_argcount; /* number of top-level arguments */
644 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000645 int c_nexti; /* index into c_code */
646 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000647 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000648 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000649 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000650 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000651 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000652 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +0000653 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000654 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000655 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000656 int c_stacklevel; /* Current stack level */
657 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000658 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000659 PyObject *c_lnotab; /* Table mapping address to line number */
Armin Rigo80d937e2004-03-22 17:52:53 +0000660 int c_last_addr; /* last op addr seen and recorded in lnotab */
661 int c_last_line; /* last line seen and recorded in lnotab */
662 int c_lnotab_next; /* current length of lnotab */
663 int c_lnotab_last; /* start of last lnotab record added */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000664 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000665 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000666 int c_nested; /* Is block nested funcdef or lamdef? */
667 int c_closure; /* Is nested w/freevars? */
668 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000669 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000670 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000671};
672
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000673static int
674is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000675{
676 if ((v & (USE | DEF_FREE))
677 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
678 return 1;
679 if (v & DEF_FREE_CLASS)
680 return 1;
681 return 0;
682}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000683
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000684static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000685com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000686{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000687 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
688
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000689 if (c == NULL) {
690 /* Error occurred via symtable call to
691 is_constant_false */
692 PyErr_SetString(exc, msg);
693 return;
694 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000695 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000696 if (c->c_lineno < 1 || c->c_interactive) {
697 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000698 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000699 return;
700 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000701 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000702 if (v == NULL)
703 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000704
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000705 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000706 if (line == NULL) {
707 Py_INCREF(Py_None);
708 line = Py_None;
709 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000710 if (exc == PyExc_SyntaxError) {
711 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
712 Py_None, line);
713 if (t == NULL)
714 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000715 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000716 if (w == NULL)
717 goto exit;
718 PyErr_SetObject(exc, w);
719 } else {
720 /* Make sure additional exceptions are printed with
721 file and line, also. */
722 PyErr_SetObject(exc, v);
723 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
724 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000725 exit:
726 Py_XDECREF(t);
727 Py_XDECREF(v);
728 Py_XDECREF(w);
729 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000730}
731
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000732/* Interface to the block stack */
733
734static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000735block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000736{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000737 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000738 com_error(c, PyExc_SystemError,
739 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000740 }
741 else {
742 c->c_block[c->c_nblocks++] = type;
743 }
744}
745
746static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000747block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000748{
749 if (c->c_nblocks > 0)
750 c->c_nblocks--;
751 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000752 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000753 }
754}
755
Guido van Rossum681d79a1995-07-18 14:51:37 +0000756/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000757
Martin v. Löwis95292d62002-12-11 14:04:59 +0000758static int issue_warning(const char *, const char *, int);
759static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000760static void com_free(struct compiling *);
761static void com_push(struct compiling *, int);
762static void com_pop(struct compiling *, int);
763static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000764static void com_node(struct compiling *, node *);
765static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000766static void com_addbyte(struct compiling *, int);
767static void com_addint(struct compiling *, int);
768static void com_addoparg(struct compiling *, int, int);
769static void com_addfwref(struct compiling *, int, int *);
770static void com_backpatch(struct compiling *, int);
771static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
772static int com_addconst(struct compiling *, PyObject *);
773static int com_addname(struct compiling *, PyObject *);
774static void com_addopname(struct compiling *, int, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000775static void com_test(struct compiling *c, node *n);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000776static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000777static void com_list_iter(struct compiling *, node *, node *, char *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000778static void com_gen_iter(struct compiling *, node *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000779static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000780static void com_assign(struct compiling *, node *, int, node *);
781static void com_assign_name(struct compiling *, node *, int);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000782static int com_make_closure(struct compiling *c, PyCodeObject *co);
783
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000784static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +0000785static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000786 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000787static PyObject *parsestrplus(struct compiling*, node *);
788static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000789static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000790
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000791static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000792
793/* symtable operations */
Raymond Hettinger354433a2004-05-19 08:20:33 +0000794static int symtable_lookup(struct symtable *st, char *name);
Jeremy Hylton1955fcf2003-07-15 20:23:26 +0000795static struct symtable *symtable_build(node *, PyFutureFeatures *,
796 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000797static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000798static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000799static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000800static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000801static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000802static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000803
804static void symtable_node(struct symtable *, node *);
805static void symtable_funcdef(struct symtable *, node *);
806static void symtable_default_args(struct symtable *, node *);
807static void symtable_params(struct symtable *, node *);
808static void symtable_params_fplist(struct symtable *, node *n);
809static void symtable_global(struct symtable *, node *);
810static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000811static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000812static void symtable_list_comprehension(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000813static void symtable_generator_expression(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +0000814static void symtable_list_for(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000815static void symtable_gen_for(struct symtable *, node *, int);
816static void symtable_gen_iter(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000817
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000818static int symtable_update_free_vars(struct symtable *);
819static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
820static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
821
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000822/* helper */
823static void
824do_pad(int pad)
825{
826 int i;
827 for (i = 0; i < pad; ++i)
828 fprintf(stderr, " ");
829}
830
831static void
832dump(node *n, int pad, int depth)
833{
834 int i;
835 if (depth == 0)
836 return;
837 do_pad(pad);
838 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
839 if (depth > 0)
840 depth--;
841 for (i = 0; i < NCH(n); ++i)
842 dump(CHILD(n, i), pad + 1, depth);
843}
844
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000845static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000846com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000847{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000848 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000849 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
850 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000851 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000852 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000853 goto fail;
854 if ((c->c_const_dict = PyDict_New()) == NULL)
855 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000856 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000857 goto fail;
858 if ((c->c_name_dict = PyDict_New()) == NULL)
859 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000860 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000861 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000862 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
863 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000864 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000865 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000866 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000867 c->c_freevars = NULL;
868 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000869 c->c_nlocals = 0;
870 c->c_argcount = 0;
871 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000872 c->c_nexti = 0;
873 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000874 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000875 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000876 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000877 c->c_begin = 0;
878 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000879 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000880 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000881 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000882 c->c_stacklevel = 0;
883 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000884 c->c_firstlineno = 0;
885 c->c_last_addr = 0;
886 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000887 c->c_lnotab_next = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +0000888 c->c_lnotab_last = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000889 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000890 c->c_nested = 0;
891 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000892 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000893 return 1;
894
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000895 fail:
896 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000897 return 0;
898}
899
900static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000901com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000902{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000903 Py_XDECREF(c->c_code);
904 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000905 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000906 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000907 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000908 Py_XDECREF(c->c_globals);
909 Py_XDECREF(c->c_locals);
910 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000911 Py_XDECREF(c->c_freevars);
912 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000913 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000914 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +0000915 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000916}
917
918static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000919com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000920{
921 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000922 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +0000923 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000924 /*
925 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
926 c->c_filename, c->c_name, c->c_lineno,
927 c->c_nexti, c->c_stacklevel, n);
928 */
929 }
Guido van Rossum8b993a91997-01-17 21:04:03 +0000930}
931
932static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000933com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000934{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000935 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000936 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000937 else
938 c->c_stacklevel -= n;
939}
940
941static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000942com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000943{
944 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000945 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000946 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000947 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000948}
949
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000950static int
951com_check_size(PyObject **s, int offset)
952{
953 int len = PyString_GET_SIZE(*s);
954 if (offset >= len)
955 return _PyString_Resize(s, len * 2);
956 return 0;
957}
958
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000959static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000960com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000961{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000962 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000963 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +0000964 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000965 if (com_check_size(&c->c_code, c->c_nexti)) {
966 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000967 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000968 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000969 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000970}
971
972static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000973com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000974{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000975 com_addbyte(c, x & 0xff);
976 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000977}
978
979static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000980com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000981{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000982 char *p;
983 if (c->c_lnotab == NULL)
984 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000985 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
986 c->c_errors++;
987 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000988 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000989 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000990 *p++ = addr;
991 *p++ = line;
992 c->c_lnotab_next += 2;
993}
994
995static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000996com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000997{
998 c->c_lineno = lineno;
999 if (c->c_firstlineno == 0) {
1000 c->c_firstlineno = c->c_last_line = lineno;
1001 }
1002 else {
1003 int incr_addr = c->c_nexti - c->c_last_addr;
1004 int incr_line = lineno - c->c_last_line;
Armin Rigo80d937e2004-03-22 17:52:53 +00001005 c->c_lnotab_last = c->c_lnotab_next;
Tim Peters2a7f3842001-06-09 09:26:21 +00001006 while (incr_addr > 255) {
1007 com_add_lnotab(c, 255, 0);
1008 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001009 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001010 while (incr_line > 255) {
1011 com_add_lnotab(c, incr_addr, 255);
1012 incr_line -=255;
1013 incr_addr = 0;
1014 }
1015 if (incr_addr > 0 || incr_line > 0)
1016 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001017 c->c_last_addr = c->c_nexti;
1018 c->c_last_line = lineno;
1019 }
1020}
1021
1022static void
Armin Rigo80d937e2004-03-22 17:52:53 +00001023com_strip_lnotab(struct compiling *c)
1024{
1025 /* strip the last lnotab entry if no opcode were emitted.
1026 * This prevents a line number to be generated on a final
1027 * pass, like in the following example:
1028 *
1029 * if a:
1030 * print 5
1031 * else:
1032 * pass
1033 *
1034 * Without the fix, a line trace event would be generated
1035 * on the pass even if a is true (because of the implicit
1036 * return).
1037 */
1038 if (c->c_nexti == c->c_last_addr && c->c_lnotab_last > 0) {
1039 c->c_lnotab_next = c->c_lnotab_last;
1040 }
1041}
1042
1043static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001044com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001045{
Fred Drakeef8ace32000-08-24 00:32:09 +00001046 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +00001047 if (extended_arg){
1048 com_addbyte(c, EXTENDED_ARG);
1049 com_addint(c, extended_arg);
1050 arg &= 0xffff;
1051 }
Guido van Rossum8e793d91997-03-03 19:13:14 +00001052 com_addbyte(c, op);
1053 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001054}
1055
1056static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001057com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001058{
1059 /* Compile a forward reference for backpatching */
1060 int here;
1061 int anchor;
1062 com_addbyte(c, op);
1063 here = c->c_nexti;
1064 anchor = *p_anchor;
1065 *p_anchor = here;
1066 com_addint(c, anchor == 0 ? 0 : here - anchor);
1067}
1068
1069static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001070com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001071{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001072 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001073 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001074 int dist;
1075 int prev;
1076 for (;;) {
1077 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001078 prev = code[anchor] + (code[anchor+1] << 8);
1079 dist = target - (anchor+2);
1080 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001081 dist >>= 8;
1082 code[anchor+1] = dist;
1083 dist >>= 8;
1084 if (dist) {
1085 com_error(c, PyExc_SystemError,
1086 "com_backpatch: offset too large");
1087 break;
1088 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001089 if (!prev)
1090 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001091 anchor -= prev;
1092 }
1093}
1094
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001095/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001096
1097static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001098com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001099{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001100 PyObject *w, *t, *np=NULL;
1101 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001102
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001103 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001104 if (t == NULL)
1105 goto fail;
1106 w = PyDict_GetItem(dict, t);
1107 if (w != NULL) {
1108 n = PyInt_AsLong(w);
1109 } else {
1110 n = PyList_Size(list);
1111 np = PyInt_FromLong(n);
1112 if (np == NULL)
1113 goto fail;
1114 if (PyList_Append(list, v) != 0)
1115 goto fail;
1116 if (PyDict_SetItem(dict, t, np) != 0)
1117 goto fail;
1118 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001119 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001120 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001121 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001122 fail:
1123 Py_XDECREF(np);
1124 Py_XDECREF(t);
1125 c->c_errors++;
1126 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001127}
1128
1129static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001130com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001131{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001132 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001133}
1134
1135static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001136com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001137{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001138 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001139}
1140
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001141int
1142_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001143{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001144 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001145 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001146 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001147 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1148 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001149 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001150 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001151 return 0; /* Don't mangle __extremely_long_names */
1152 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1153 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001154 /* Strip leading underscores from class name */
1155 while (*p == '_')
1156 p++;
1157 if (*p == '\0')
1158 return 0; /* Don't mangle if class is just underscores */
1159 plen = strlen(p);
1160 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001161 plen = maxlen-nlen-2; /* Truncate class name if too long */
1162 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001163 buffer[0] = '_';
1164 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001165 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001166 return 1;
1167}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001168
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001169static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001170com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001171{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001172 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001173 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001174 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001175
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001176 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001177 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001178 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001179 c->c_errors++;
1180 i = 255;
1181 }
1182 else {
1183 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001184 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001185 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001186 com_addoparg(c, op, i);
1187}
1188
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001189#define NAME_LOCAL 0
1190#define NAME_GLOBAL 1
1191#define NAME_DEFAULT 2
1192#define NAME_CLOSURE 3
1193
1194static int
1195com_lookup_arg(PyObject *dict, PyObject *name)
1196{
1197 PyObject *v = PyDict_GetItem(dict, name);
1198 if (v == NULL)
1199 return -1;
1200 else
1201 return PyInt_AS_LONG(v);
1202}
1203
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001204static int
1205none_assignment_check(struct compiling *c, char *name, int assigning)
1206{
1207 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1208 char *msg;
1209 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001210 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001211 else
1212 msg = "deleting None";
1213 if (issue_warning(msg, c->c_filename, c->c_lineno) < 0) {
1214 c->c_errors++;
1215 return -1;
1216 }
1217 }
1218 return 0;
1219}
1220
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001221static void
1222com_addop_varname(struct compiling *c, int kind, char *name)
1223{
1224 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001225 int i, reftype;
1226 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001227 int op = STOP_CODE;
1228 char buffer[MANGLE_LEN];
1229
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001230 if (kind != VAR_LOAD &&
1231 none_assignment_check(c, name, kind == VAR_STORE))
1232 {
1233 c->c_errors++;
1234 i = 255;
1235 goto done;
1236 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001237 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001238 name = buffer;
1239 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1240 c->c_errors++;
1241 i = 255;
1242 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001243 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001244
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001245 reftype = get_ref_type(c, name);
1246 switch (reftype) {
1247 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001248 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001249 scope = NAME_LOCAL;
1250 break;
1251 case GLOBAL_EXPLICIT:
1252 scope = NAME_GLOBAL;
1253 break;
1254 case GLOBAL_IMPLICIT:
1255 if (c->c_flags & CO_OPTIMIZED)
1256 scope = NAME_GLOBAL;
1257 break;
1258 case FREE:
1259 case CELL:
1260 scope = NAME_CLOSURE;
1261 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001262 }
1263
1264 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001265 if (scope == NAME_LOCAL)
1266 i = com_lookup_arg(c->c_locals, v);
1267 else if (reftype == FREE)
1268 i = com_lookup_arg(c->c_freevars, v);
1269 else if (reftype == CELL)
1270 i = com_lookup_arg(c->c_cellvars, v);
1271 if (i == -1) {
1272 c->c_errors++; /* XXX no exception set */
1273 i = 255;
1274 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001275 }
1276 Py_DECREF(v);
1277
1278 switch (kind) {
1279 case VAR_LOAD:
1280 switch (scope) {
1281 case NAME_LOCAL:
1282 op = LOAD_FAST;
1283 break;
1284 case NAME_GLOBAL:
1285 op = LOAD_GLOBAL;
1286 break;
1287 case NAME_DEFAULT:
1288 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001289 break;
1290 case NAME_CLOSURE:
1291 op = LOAD_DEREF;
1292 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001293 }
1294 break;
1295 case VAR_STORE:
1296 switch (scope) {
1297 case NAME_LOCAL:
1298 op = STORE_FAST;
1299 break;
1300 case NAME_GLOBAL:
1301 op = STORE_GLOBAL;
1302 break;
1303 case NAME_DEFAULT:
1304 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001305 break;
1306 case NAME_CLOSURE:
1307 op = STORE_DEREF;
1308 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001309 }
1310 break;
1311 case VAR_DELETE:
1312 switch (scope) {
1313 case NAME_LOCAL:
1314 op = DELETE_FAST;
1315 break;
1316 case NAME_GLOBAL:
1317 op = DELETE_GLOBAL;
1318 break;
1319 case NAME_DEFAULT:
1320 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001321 break;
1322 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001323 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001324 PyOS_snprintf(buf, sizeof(buf),
1325 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001326 com_error(c, PyExc_SyntaxError, buf);
1327 i = 255;
1328 break;
1329 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001330 }
1331 break;
1332 }
1333done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001334 com_addoparg(c, op, i);
1335}
1336
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001337static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001338com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001339{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001340 char *name;
1341 char buffer[1000];
1342 /* XXX it is possible to write this code without the 1000
1343 chars on the total length of dotted names, I just can't be
1344 bothered right now */
1345 if (TYPE(n) == STAR)
1346 name = "*";
1347 else if (TYPE(n) == dotted_name) {
1348 char *p = buffer;
1349 int i;
1350 name = buffer;
1351 for (i = 0; i < NCH(n); i += 2) {
1352 char *s = STR(CHILD(n, i));
1353 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001354 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001355 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001356 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001357 break;
1358 }
1359 if (p != buffer)
1360 *p++ = '.';
1361 strcpy(p, s);
1362 p = strchr(p, '\0');
1363 }
1364 }
1365 else {
1366 REQ(n, NAME);
1367 name = STR(n);
1368 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001369 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001370}
1371
Guido van Rossum79f25d91997-04-29 20:08:16 +00001372static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001373parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001374{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001375 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001376 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001377 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001378#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001379 int imflag;
1380#endif
1381
Guido van Rossum282914b1991-04-04 10:42:56 +00001382 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001383 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001384#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001385 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001386#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001387 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001388 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001389 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001390 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001391 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001392 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001393 }
1394 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001395 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001396 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001397 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001398 if (errno != 0)
1399 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001400 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001401 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001402 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001403#ifndef WITHOUT_COMPLEX
1404 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001405 Py_complex z;
1406 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001407 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001408 z.imag = PyOS_ascii_atof(s);
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001409 PyFPE_END_PROTECT(z)
1410 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001411 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001412 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001413#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001414 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001415 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001416 dx = PyOS_ascii_atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001417 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001418 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001419 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001420}
1421
Guido van Rossum79f25d91997-04-29 20:08:16 +00001422static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001423decode_utf8(char **sPtr, char *end, char* encoding)
1424{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001425#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001426 Py_FatalError("decode_utf8 should not be called in this build.");
1427 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001428#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001429 PyObject *u, *v;
1430 char *s, *t;
1431 t = s = *sPtr;
1432 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1433 while (s < end && (*s & 0x80)) s++;
1434 *sPtr = s;
1435 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1436 if (u == NULL)
1437 return NULL;
1438 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1439 Py_DECREF(u);
1440 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001441#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001442}
1443
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001444/* compiler.transformer.Transformer.decode_literal depends on what
1445 might seem like minor details of this function -- changes here
1446 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001447static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001448parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001449{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001450 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001451 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001452 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001453 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001454 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001455 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001456 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001457
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001458 if (isalpha(quote) || quote == '_') {
1459 if (quote == 'u' || quote == 'U') {
1460 quote = *++s;
1461 unicode = 1;
1462 }
1463 if (quote == 'r' || quote == 'R') {
1464 quote = *++s;
1465 rawmode = 1;
1466 }
1467 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001468 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001469 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001470 return NULL;
1471 }
1472 s++;
1473 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001474 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001475 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001476 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001477 return NULL;
1478 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001479 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001480 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001481 return NULL;
1482 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001483 if (len >= 4 && s[0] == quote && s[1] == quote) {
1484 s += 2;
1485 len -= 2;
1486 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001487 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001488 return NULL;
1489 }
1490 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001491#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001492 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001493 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001494 char *buf;
1495 char *p;
1496 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001497 if (encoding == NULL) {
1498 buf = s;
1499 u = NULL;
1500 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1501 buf = s;
1502 u = NULL;
1503 } else {
1504 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1505 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1506 if (u == NULL)
1507 return NULL;
1508 p = buf = PyString_AsString(u);
1509 end = s + len;
1510 while (s < end) {
1511 if (*s == '\\') {
1512 *p++ = *s++;
1513 if (*s & 0x80) {
1514 strcpy(p, "u005c");
1515 p += 5;
1516 }
1517 }
1518 if (*s & 0x80) { /* XXX inefficient */
1519 char *r;
1520 int rn, i;
1521 w = decode_utf8(&s, end, "utf-16-be");
1522 if (w == NULL) {
1523 Py_DECREF(u);
1524 return NULL;
1525 }
1526 r = PyString_AsString(w);
1527 rn = PyString_Size(w);
1528 assert(rn % 2 == 0);
1529 for (i = 0; i < rn; i += 2) {
1530 sprintf(p, "\\u%02x%02x",
1531 r[i + 0] & 0xFF,
1532 r[i + 1] & 0xFF);
1533 p += 6;
1534 }
1535 Py_DECREF(w);
1536 } else {
1537 *p++ = *s++;
1538 }
1539 }
1540 len = p - buf;
1541 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001542 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001543 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001544 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001545 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1546 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001547 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001548 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001549 return v;
1550
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001551 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001552#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001553 need_encoding = (encoding != NULL &&
1554 strcmp(encoding, "utf-8") != 0 &&
1555 strcmp(encoding, "iso-8859-1") != 0);
1556 if (rawmode || strchr(s, '\\') == NULL) {
1557 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001558#ifndef Py_USING_UNICODE
1559 /* This should not happen - we never see any other
1560 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001561 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001562#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001563 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1564 if (u == NULL)
1565 return NULL;
1566 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1567 Py_DECREF(u);
1568 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001569#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001570 } else {
1571 return PyString_FromStringAndSize(s, len);
1572 }
1573 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001574
1575 v = PyString_DecodeEscape(s, len, NULL, unicode,
1576 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001577 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001578 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001579 return v;
1580}
1581
Guido van Rossum79f25d91997-04-29 20:08:16 +00001582static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001583parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001584{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001585 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001586 int i;
1587 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001588 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001589 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001590 for (i = 1; i < NCH(n); i++) {
1591 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001592 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001593 if (s == NULL)
1594 goto onError;
1595 if (PyString_Check(v) && PyString_Check(s)) {
1596 PyString_ConcatAndDel(&v, s);
1597 if (v == NULL)
1598 goto onError;
1599 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001600#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001601 else {
1602 PyObject *temp;
1603 temp = PyUnicode_Concat(v, s);
1604 Py_DECREF(s);
1605 if (temp == NULL)
1606 goto onError;
1607 Py_DECREF(v);
1608 v = temp;
1609 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001610#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001611 }
1612 }
1613 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001614
1615 onError:
1616 Py_XDECREF(v);
1617 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001618}
1619
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001620static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001621com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001622{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001623 int anchor = 0;
1624 int save_begin = c->c_begin;
1625
Raymond Hettinger354433a2004-05-19 08:20:33 +00001626 /* list_for: for v in expr [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001627 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001628 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001629 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001630 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001631 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001632 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001633 c->c_loops++;
1634 com_list_iter(c, n, e, t);
1635 c->c_loops--;
1636 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1637 c->c_begin = save_begin;
1638 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001639 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001640}
1641
1642static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001643com_gen_for(struct compiling *c, node *n, node *t, int is_outmost)
1644{
1645 int break_anchor = 0;
1646 int anchor = 0;
1647 int save_begin = c->c_begin;
1648
1649 REQ(n, gen_for);
1650 /* gen_for: for v in test [gen_iter] */
1651
1652 com_addfwref(c, SETUP_LOOP, &break_anchor);
1653 block_push(c, SETUP_LOOP);
1654
1655 if (is_outmost) {
1656 com_addop_varname(c, VAR_LOAD, "[outmost-iterable]");
1657 com_push(c, 1);
1658 }
1659 else {
1660 com_node(c, CHILD(n, 3));
1661 com_addbyte(c, GET_ITER);
1662 }
1663
1664 c->c_begin = c->c_nexti;
1665 com_set_lineno(c, c->c_last_line);
1666 com_addfwref(c, FOR_ITER, &anchor);
1667 com_push(c, 1);
1668 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
1669
1670 if (NCH(n) == 5)
1671 com_gen_iter(c, CHILD(n, 4), t);
1672 else {
1673 com_test(c, t);
1674 com_addbyte(c, YIELD_VALUE);
1675 com_pop(c, 1);
1676 }
1677
1678 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1679 c->c_begin = save_begin;
1680
1681 com_backpatch(c, anchor);
1682 com_pop(c, 1); /* FOR_ITER has popped this */
1683 com_addbyte(c, POP_BLOCK);
1684 block_pop(c, SETUP_LOOP);
1685 com_backpatch(c, break_anchor);
1686}
1687
1688static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001689com_list_if(struct compiling *c, node *n, node *e, char *t)
1690{
1691 int anchor = 0;
1692 int a = 0;
1693 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001694 com_node(c, CHILD(n, 1));
1695 com_addfwref(c, JUMP_IF_FALSE, &a);
1696 com_addbyte(c, POP_TOP);
1697 com_pop(c, 1);
1698 com_list_iter(c, n, e, t);
1699 com_addfwref(c, JUMP_FORWARD, &anchor);
1700 com_backpatch(c, a);
1701 /* We jump here with an extra entry which we now pop */
1702 com_addbyte(c, POP_TOP);
1703 com_backpatch(c, anchor);
1704}
1705
1706static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001707com_gen_if(struct compiling *c, node *n, node *t)
1708{
1709 /* gen_if: 'if' test [gen_iter] */
1710 int anchor = 0;
1711 int a=0;
1712
1713 com_node(c, CHILD(n, 1));
1714 com_addfwref(c, JUMP_IF_FALSE, &a);
1715 com_addbyte(c, POP_TOP);
1716 com_pop(c, 1);
1717
1718 if (NCH(n) == 3)
1719 com_gen_iter(c, CHILD(n, 2), t);
1720 else {
1721 com_test(c, t);
1722 com_addbyte(c, YIELD_VALUE);
1723 com_pop(c, 1);
1724 }
1725 com_addfwref(c, JUMP_FORWARD, &anchor);
1726 com_backpatch(c, a);
1727 /* We jump here with an extra entry which we now pop */
1728 com_addbyte(c, POP_TOP);
1729 com_backpatch(c, anchor);
1730}
1731
1732static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001733com_list_iter(struct compiling *c,
1734 node *p, /* parent of list_iter node */
1735 node *e, /* element expression node */
1736 char *t /* name of result list temp local */)
1737{
1738 /* list_iter is the last child in a listmaker, list_for, or list_if */
1739 node *n = CHILD(p, NCH(p)-1);
1740 if (TYPE(n) == list_iter) {
1741 n = CHILD(n, 0);
1742 switch (TYPE(n)) {
1743 case list_for:
1744 com_list_for(c, n, e, t);
1745 break;
1746 case list_if:
1747 com_list_if(c, n, e, t);
1748 break;
1749 default:
1750 com_error(c, PyExc_SystemError,
1751 "invalid list_iter node type");
1752 }
1753 }
1754 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001755 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001756 com_push(c, 1);
1757 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001758 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001759 com_pop(c, 2);
1760 }
1761}
1762
1763static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001764com_gen_iter(struct compiling *c, node *n, node *t)
1765{
1766 /* gen_iter: gen_for | gen_if */
1767 node *ch;
1768 REQ(n, gen_iter);
1769
1770 ch = CHILD(n, 0);
1771
1772 switch (TYPE(ch)) {
1773 case gen_for:
1774 com_gen_for(c, ch, t, 0);
1775 break;
1776 case gen_if:
1777 com_gen_if(c, ch, t);
1778 break;
1779 default:
1780 com_error(c, PyExc_SystemError,
1781 "invalid gen_iter node type");
1782 }
1783}
1784
1785static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001786com_list_comprehension(struct compiling *c, node *n)
1787{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001788 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001789 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001790
1791 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001792 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001793 com_addoparg(c, BUILD_LIST, 0);
1794 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1795 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001796 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001797 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001798 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001799 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001800 --c->c_tmpname;
1801}
1802
1803static void
1804com_listmaker(struct compiling *c, node *n)
1805{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001806 /* listmaker: test ( list_for | (',' test)* [','] ) */
1807 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001808 com_list_comprehension(c, n);
1809 else {
1810 int len = 0;
1811 int i;
1812 for (i = 0; i < NCH(n); i += 2, len++)
1813 com_node(c, CHILD(n, i));
1814 com_addoparg(c, BUILD_LIST, len);
1815 com_pop(c, len-1);
1816 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001817}
1818
1819static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001820com_generator_expression(struct compiling *c, node *n)
1821{
1822 /* testlist_gexp: test gen_for */
1823 /* argument: test gen_for */
1824 PyCodeObject *co;
1825
1826 REQ(CHILD(n, 0), test);
1827 REQ(CHILD(n, 1), gen_for);
1828
1829 symtable_enter_scope(c->c_symtable, "<genexpr>", TYPE(n),
1830 n->n_lineno);
1831 co = icompile(n, c);
1832 symtable_exit_scope(c->c_symtable);
1833
1834 if (co == NULL)
1835 c->c_errors++;
1836 else {
1837 int closure = com_make_closure(c, co);
1838 int i = com_addconst(c, (PyObject *)co);
1839
1840 com_addoparg(c, LOAD_CONST, i);
1841 com_push(c, 1);
1842 if (closure)
1843 com_addoparg(c, MAKE_CLOSURE, 0);
1844 else
1845 com_addoparg(c, MAKE_FUNCTION, 0);
1846
1847 com_test(c, CHILD(CHILD(n, 1), 3));
1848 com_addbyte(c, GET_ITER);
1849 com_addoparg(c, CALL_FUNCTION, 1);
1850 com_pop(c, 1);
1851
1852 Py_DECREF(co);
1853 }
1854}
1855
1856static void
1857com_testlist_gexp(struct compiling *c, node *n)
1858{
1859 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
1860 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
1861 com_generator_expression(c, n);
1862 else com_list(c, n, 0);
1863}
1864
1865static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001866com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001867{
1868 int i;
1869 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1870 for (i = 0; i+2 < NCH(n); i += 4) {
1871 /* We must arrange things just right for STORE_SUBSCR.
1872 It wants the stack to look like (value) (dict) (key) */
1873 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001874 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001875 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00001876 com_node(c, CHILD(n, i+2)); /* value */
1877 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001878 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001879 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001880 }
1881}
1882
1883static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001884com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001885{
1886 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001887 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001888 int i;
1889 REQ(n, atom);
1890 ch = CHILD(n, 0);
1891 switch (TYPE(ch)) {
1892 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001893 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001894 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001895 com_push(c, 1);
1896 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001897 else
Raymond Hettinger354433a2004-05-19 08:20:33 +00001898 com_testlist_gexp(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001899 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001900 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001901 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001902 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001903 com_push(c, 1);
1904 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001905 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001906 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001907 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001908 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001909 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001910 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001911 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001912 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001913 break;
1914 case BACKQUOTE:
1915 com_node(c, CHILD(n, 1));
1916 com_addbyte(c, UNARY_CONVERT);
1917 break;
1918 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001919 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001920 i = 255;
1921 }
1922 else {
1923 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001924 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001925 }
1926 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001927 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001928 break;
1929 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001930 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001931 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001932 c->c_errors++;
1933 i = 255;
1934 }
1935 else {
1936 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001937 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001938 }
1939 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001940 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001941 break;
1942 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001943 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001944 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001945 break;
1946 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001947 com_error(c, PyExc_SystemError,
1948 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001949 }
1950}
1951
1952static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001953com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001954{
1955 if (NCH(n) == 1) {
1956 com_addbyte(c, op);
1957 }
1958 else if (NCH(n) == 2) {
1959 if (TYPE(CHILD(n, 0)) != COLON) {
1960 com_node(c, CHILD(n, 0));
1961 com_addbyte(c, op+1);
1962 }
1963 else {
1964 com_node(c, CHILD(n, 1));
1965 com_addbyte(c, op+2);
1966 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001967 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001968 }
1969 else {
1970 com_node(c, CHILD(n, 0));
1971 com_node(c, CHILD(n, 2));
1972 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001973 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001974 }
1975}
1976
Guido van Rossum635abd21997-01-06 22:56:52 +00001977static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001978com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1979{
1980 if (NCH(n) == 1) {
1981 com_addbyte(c, DUP_TOP);
1982 com_push(c, 1);
1983 com_addbyte(c, SLICE);
1984 com_node(c, augn);
1985 com_addbyte(c, opcode);
1986 com_pop(c, 1);
1987 com_addbyte(c, ROT_TWO);
1988 com_addbyte(c, STORE_SLICE);
1989 com_pop(c, 2);
1990 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1991 com_node(c, CHILD(n, 0));
1992 com_addoparg(c, DUP_TOPX, 2);
1993 com_push(c, 2);
1994 com_addbyte(c, SLICE+1);
1995 com_pop(c, 1);
1996 com_node(c, augn);
1997 com_addbyte(c, opcode);
1998 com_pop(c, 1);
1999 com_addbyte(c, ROT_THREE);
2000 com_addbyte(c, STORE_SLICE+1);
2001 com_pop(c, 3);
2002 } else if (NCH(n) == 2) {
2003 com_node(c, CHILD(n, 1));
2004 com_addoparg(c, DUP_TOPX, 2);
2005 com_push(c, 2);
2006 com_addbyte(c, SLICE+2);
2007 com_pop(c, 1);
2008 com_node(c, augn);
2009 com_addbyte(c, opcode);
2010 com_pop(c, 1);
2011 com_addbyte(c, ROT_THREE);
2012 com_addbyte(c, STORE_SLICE+2);
2013 com_pop(c, 3);
2014 } else {
2015 com_node(c, CHILD(n, 0));
2016 com_node(c, CHILD(n, 2));
2017 com_addoparg(c, DUP_TOPX, 3);
2018 com_push(c, 3);
2019 com_addbyte(c, SLICE+3);
2020 com_pop(c, 2);
2021 com_node(c, augn);
2022 com_addbyte(c, opcode);
2023 com_pop(c, 1);
2024 com_addbyte(c, ROT_FOUR);
2025 com_addbyte(c, STORE_SLICE+3);
2026 com_pop(c, 4);
2027 }
2028}
2029
2030static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002031com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002032{
2033 node *m;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002034 REQ(n, argument); /* [test '='] test [gen_for]; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00002035 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00002036 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002037 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00002038 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002039 }
2040 else {
2041 com_node(c, CHILD(n, 0));
2042 }
Guido van Rossum635abd21997-01-06 22:56:52 +00002043 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002044 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00002045 if (NCH(n) == 2) {
2046 com_generator_expression(c, n);
2047 return;
2048 }
2049
Guido van Rossumf10570b1995-07-07 22:53:21 +00002050 m = n;
2051 do {
2052 m = CHILD(m, 0);
2053 } while (NCH(m) == 1);
2054 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00002055 /* f(lambda x: x[0] = 3) ends up getting parsed with
2056 * LHS test = lambda x: x[0], and RHS test = 3.
2057 * SF bug 132313 points out that complaining about a keyword
2058 * then is very confusing.
2059 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002060 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00002061 TYPE(m) == lambdef ?
2062 "lambda cannot contain assignment" :
2063 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002064 }
2065 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002066 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00002067 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00002068 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002069 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002070 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002071 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002072 else if (*pkeywords == NULL) {
2073 c->c_errors++;
2074 Py_DECREF(v);
2075 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002076 if (PyDict_GetItem(*pkeywords, v) != NULL)
2077 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00002078 "duplicate keyword argument");
2079 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002080 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00002081 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002082 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002083 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002084 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002085 }
2086 }
2087 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002088}
2089
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002090static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002091com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002092{
2093 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00002094 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002095 }
2096 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002097 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00002098 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00002099 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00002100 int star_flag = 0;
2101 int starstar_flag = 0;
2102 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002103 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002104 na = 0;
2105 nk = 0;
2106 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00002107 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00002108 if (TYPE(ch) == STAR ||
2109 TYPE(ch) == DOUBLESTAR)
2110 break;
Guido van Rossumca906051998-12-10 16:56:22 +00002111 if (ch->n_lineno != lineno) {
2112 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002113 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00002114 }
2115 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00002116 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002117 na++;
2118 else
2119 nk++;
2120 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002121 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00002122 while (i < NCH(n)) {
2123 node *tok = CHILD(n, i);
2124 node *ch = CHILD(n, i+1);
2125 i += 3;
2126 switch (TYPE(tok)) {
2127 case STAR: star_flag = 1; break;
2128 case DOUBLESTAR: starstar_flag = 1; break;
2129 }
2130 com_node(c, ch);
2131 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002132 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002133 com_error(c, PyExc_SyntaxError,
2134 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002135 }
Jeremy Hylton76901512000-03-28 23:49:17 +00002136 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00002137 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00002138 star_flag + (starstar_flag << 1);
2139 else
2140 opcode = CALL_FUNCTION;
2141 com_addoparg(c, opcode, na | (nk << 8));
2142 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002143 }
2144}
2145
2146static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002147com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002148{
2149 com_addopname(c, LOAD_ATTR, n);
2150}
2151
2152static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002153com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002154{
2155 int i=0;
2156 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00002157 node *ch;
2158
2159 /* first argument */
2160 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002161 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002162 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002163 i++;
2164 }
2165 else {
2166 com_node(c, CHILD(n,i));
2167 i++;
2168 REQ(CHILD(n,i),COLON);
2169 i++;
2170 }
2171 /* second argument */
2172 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
2173 com_node(c, CHILD(n,i));
2174 i++;
2175 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002176 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002177 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002178 com_push(c, 1);
2179 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002180 /* remaining arguments */
2181 for (; i < NCH(n); i++) {
2182 ns++;
2183 ch=CHILD(n,i);
2184 REQ(ch, sliceop);
2185 if (NCH(ch) == 1) {
2186 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002187 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002188 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002189 }
2190 else
2191 com_node(c, CHILD(ch,1));
2192 }
2193 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002194 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002195}
2196
2197static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002198com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002199{
2200 node *ch;
2201 REQ(n, subscript);
2202 ch = CHILD(n,0);
2203 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002204 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002205 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002206 com_push(c, 1);
2207 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002208 else {
2209 /* check for slice */
2210 if ((TYPE(ch) == COLON || NCH(n) > 1))
2211 com_sliceobj(c, n);
2212 else {
2213 REQ(ch, test);
2214 com_node(c, ch);
2215 }
2216 }
2217}
2218
2219static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002220com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002221{
2222 int i, op;
2223 REQ(n, subscriptlist);
2224 /* Check to make backward compatible slice behavior for '[i:j]' */
2225 if (NCH(n) == 1) {
2226 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002227 /* 'Basic' slice, should have exactly one colon. */
2228 if ((TYPE(CHILD(sub, 0)) == COLON
2229 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2230 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2231 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002232 switch (assigning) {
2233 case OP_DELETE:
2234 op = DELETE_SLICE;
2235 break;
2236 case OP_ASSIGN:
2237 op = STORE_SLICE;
2238 break;
2239 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002240 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002241 break;
2242 default:
2243 com_augassign_slice(c, sub, assigning, augn);
2244 return;
2245 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002246 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002247 if (op == STORE_SLICE)
2248 com_pop(c, 2);
2249 else if (op == DELETE_SLICE)
2250 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002251 return;
2252 }
2253 }
2254 /* Else normal subscriptlist. Compile each subscript. */
2255 for (i = 0; i < NCH(n); i += 2)
2256 com_subscript(c, CHILD(n, i));
2257 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002258 if (NCH(n) > 1) {
2259 i = (NCH(n)+1) / 2;
2260 com_addoparg(c, BUILD_TUPLE, i);
2261 com_pop(c, i-1);
2262 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002263 switch (assigning) {
2264 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002265 op = DELETE_SUBSCR;
2266 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002267 break;
2268 default:
2269 case OP_ASSIGN:
2270 op = STORE_SUBSCR;
2271 i = 3;
2272 break;
2273 case OP_APPLY:
2274 op = BINARY_SUBSCR;
2275 i = 1;
2276 break;
2277 }
2278 if (assigning > OP_APPLY) {
2279 com_addoparg(c, DUP_TOPX, 2);
2280 com_push(c, 2);
2281 com_addbyte(c, BINARY_SUBSCR);
2282 com_pop(c, 1);
2283 com_node(c, augn);
2284 com_addbyte(c, assigning);
2285 com_pop(c, 1);
2286 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002287 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002288 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002289 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002290}
2291
2292static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002293com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002294{
2295 REQ(n, trailer);
2296 switch (TYPE(CHILD(n, 0))) {
2297 case LPAR:
2298 com_call_function(c, CHILD(n, 1));
2299 break;
2300 case DOT:
2301 com_select_member(c, CHILD(n, 1));
2302 break;
2303 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002304 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002305 break;
2306 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002307 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002308 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002309 }
2310}
2311
2312static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002313com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002314{
2315 int i;
2316 REQ(n, power);
2317 com_atom(c, CHILD(n, 0));
2318 for (i = 1; i < NCH(n); i++) {
2319 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2320 com_factor(c, CHILD(n, i+1));
2321 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002322 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002323 break;
2324 }
2325 else
2326 com_apply_trailer(c, CHILD(n, i));
2327 }
2328}
2329
2330static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002331com_invert_constant(struct compiling *c, node *n)
2332{
2333 /* Compute the inverse of int and longs and use them directly,
2334 but be prepared to generate code for all other
2335 possibilities (invalid numbers, floats, complex).
2336 */
2337 PyObject *num, *inv = NULL;
2338 int i;
2339
2340 REQ(n, NUMBER);
2341 num = parsenumber(c, STR(n));
2342 if (num == NULL)
2343 i = 255;
2344 else {
2345 inv = PyNumber_Invert(num);
2346 if (inv == NULL) {
2347 PyErr_Clear();
2348 i = com_addconst(c, num);
2349 } else {
2350 i = com_addconst(c, inv);
2351 Py_DECREF(inv);
2352 }
2353 Py_DECREF(num);
2354 }
2355 com_addoparg(c, LOAD_CONST, i);
2356 com_push(c, 1);
2357 if (num != NULL && inv == NULL)
2358 com_addbyte(c, UNARY_INVERT);
2359}
2360
Tim Peters51e26512001-09-07 08:45:55 +00002361static int
2362is_float_zero(const char *p)
2363{
2364 int found_radix_point = 0;
2365 int ch;
2366 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2367 switch (ch) {
2368 case '0':
2369 /* no reason to believe it's not 0 -- continue */
2370 break;
2371
2372 case 'e': case 'E': case 'j': case 'J':
2373 /* If this was a hex constant, we already would have
2374 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2375 must be an exponent marker, and we haven't yet
2376 seen a non-zero digit, and it doesn't matter what
2377 the exponent is then. For 'j' or 'J' similarly,
2378 except that this is an imaginary 0 then. */
2379 return 1;
2380
2381 case '.':
2382 found_radix_point = 1;
2383 break;
2384
2385 default:
2386 return 0;
2387 }
2388 }
2389 return found_radix_point;
2390}
2391
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002392static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002393com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002394{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002395 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002396 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002397 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002398 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002399 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002400 approriate value as a constant. If the value is negative,
2401 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002402 negative in the 0th position -- unless we're doing unary minus
2403 of a floating zero! In that case the sign is significant, but
2404 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002405 */
2406 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002407 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002408 && TYPE((pfactor = CHILD(n, 1))) == factor
2409 && NCH(pfactor) == 1
2410 && TYPE((ppower = CHILD(pfactor, 0))) == power
2411 && NCH(ppower) == 1
2412 && TYPE((patom = CHILD(ppower, 0))) == atom
2413 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002414 && !(childtype == MINUS &&
2415 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002416 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002417 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002418 return;
2419 }
2420 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002421 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002422 if (s == NULL) {
2423 com_error(c, PyExc_MemoryError, "");
2424 com_addbyte(c, 255);
2425 return;
2426 }
2427 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002428 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002429 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002430 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002431 }
Tim Peters51e26512001-09-07 08:45:55 +00002432 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002433 }
2434 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002435 com_factor(c, CHILD(n, 1));
2436 com_addbyte(c, UNARY_POSITIVE);
2437 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002438 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002439 com_factor(c, CHILD(n, 1));
2440 com_addbyte(c, UNARY_NEGATIVE);
2441 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002442 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002443 com_factor(c, CHILD(n, 1));
2444 com_addbyte(c, UNARY_INVERT);
2445 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002446 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002447 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002448 }
2449}
2450
2451static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002452com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002453{
2454 int i;
2455 int op;
2456 REQ(n, term);
2457 com_factor(c, CHILD(n, 0));
2458 for (i = 2; i < NCH(n); i += 2) {
2459 com_factor(c, CHILD(n, i));
2460 switch (TYPE(CHILD(n, i-1))) {
2461 case STAR:
2462 op = BINARY_MULTIPLY;
2463 break;
2464 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002465 if (c->c_flags & CO_FUTURE_DIVISION)
2466 op = BINARY_TRUE_DIVIDE;
2467 else
2468 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002469 break;
2470 case PERCENT:
2471 op = BINARY_MODULO;
2472 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002473 case DOUBLESLASH:
2474 op = BINARY_FLOOR_DIVIDE;
2475 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002476 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002477 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002478 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002479 op = 255;
2480 }
2481 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002482 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002483 }
2484}
2485
2486static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002487com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002488{
2489 int i;
2490 int op;
2491 REQ(n, arith_expr);
2492 com_term(c, CHILD(n, 0));
2493 for (i = 2; i < NCH(n); i += 2) {
2494 com_term(c, CHILD(n, i));
2495 switch (TYPE(CHILD(n, i-1))) {
2496 case PLUS:
2497 op = BINARY_ADD;
2498 break;
2499 case MINUS:
2500 op = BINARY_SUBTRACT;
2501 break;
2502 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002503 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002504 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002505 op = 255;
2506 }
2507 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002508 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002509 }
2510}
2511
2512static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002513com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002514{
2515 int i;
2516 int op;
2517 REQ(n, shift_expr);
2518 com_arith_expr(c, CHILD(n, 0));
2519 for (i = 2; i < NCH(n); i += 2) {
2520 com_arith_expr(c, CHILD(n, i));
2521 switch (TYPE(CHILD(n, i-1))) {
2522 case LEFTSHIFT:
2523 op = BINARY_LSHIFT;
2524 break;
2525 case RIGHTSHIFT:
2526 op = BINARY_RSHIFT;
2527 break;
2528 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002529 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002530 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002531 op = 255;
2532 }
2533 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002534 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002535 }
2536}
2537
2538static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002539com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002540{
2541 int i;
2542 int op;
2543 REQ(n, and_expr);
2544 com_shift_expr(c, CHILD(n, 0));
2545 for (i = 2; i < NCH(n); i += 2) {
2546 com_shift_expr(c, CHILD(n, i));
2547 if (TYPE(CHILD(n, i-1)) == AMPER) {
2548 op = BINARY_AND;
2549 }
2550 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002551 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002552 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002553 op = 255;
2554 }
2555 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002556 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002557 }
2558}
2559
2560static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002561com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002562{
2563 int i;
2564 int op;
2565 REQ(n, xor_expr);
2566 com_and_expr(c, CHILD(n, 0));
2567 for (i = 2; i < NCH(n); i += 2) {
2568 com_and_expr(c, CHILD(n, i));
2569 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2570 op = BINARY_XOR;
2571 }
2572 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002573 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002574 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002575 op = 255;
2576 }
2577 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002578 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002579 }
2580}
2581
2582static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002583com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002584{
2585 int i;
2586 int op;
2587 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002588 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002589 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002590 com_xor_expr(c, CHILD(n, i));
2591 if (TYPE(CHILD(n, i-1)) == VBAR) {
2592 op = BINARY_OR;
2593 }
2594 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002595 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002596 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002597 op = 255;
2598 }
2599 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002600 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002601 }
2602}
2603
2604static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002605cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002606{
2607 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00002608 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002609 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2610 if (NCH(n) == 1) {
2611 n = CHILD(n, 0);
2612 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002613 case LESS: return PyCmp_LT;
2614 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00002615 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00002616 case LESSEQUAL: return PyCmp_LE;
2617 case GREATEREQUAL: return PyCmp_GE;
2618 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2619 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2620 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002621 }
2622 }
2623 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002624 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002625 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002626 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002627 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002628 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002629 }
2630 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002631 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002632}
2633
2634static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002635com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002636{
2637 int i;
2638 enum cmp_op op;
2639 int anchor;
2640 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2641 com_expr(c, CHILD(n, 0));
2642 if (NCH(n) == 1)
2643 return;
2644
2645 /****************************************************************
2646 The following code is generated for all but the last
2647 comparison in a chain:
2648
2649 label: on stack: opcode: jump to:
2650
2651 a <code to load b>
2652 a, b DUP_TOP
2653 a, b, b ROT_THREE
2654 b, a, b COMPARE_OP
2655 b, 0-or-1 JUMP_IF_FALSE L1
2656 b, 1 POP_TOP
2657 b
2658
2659 We are now ready to repeat this sequence for the next
2660 comparison in the chain.
2661
2662 For the last we generate:
2663
2664 b <code to load c>
2665 b, c COMPARE_OP
2666 0-or-1
2667
2668 If there were any jumps to L1 (i.e., there was more than one
2669 comparison), we generate:
2670
2671 0-or-1 JUMP_FORWARD L2
2672 L1: b, 0 ROT_TWO
2673 0, b POP_TOP
2674 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002675 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002676 ****************************************************************/
2677
2678 anchor = 0;
2679
2680 for (i = 2; i < NCH(n); i += 2) {
2681 com_expr(c, CHILD(n, i));
2682 if (i+2 < NCH(n)) {
2683 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002684 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002685 com_addbyte(c, ROT_THREE);
2686 }
2687 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002688 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002689 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002690 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002691 }
2692 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002693 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002694 if (i+2 < NCH(n)) {
2695 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2696 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002697 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002698 }
2699 }
2700
2701 if (anchor) {
2702 int anchor2 = 0;
2703 com_addfwref(c, JUMP_FORWARD, &anchor2);
2704 com_backpatch(c, anchor);
2705 com_addbyte(c, ROT_TWO);
2706 com_addbyte(c, POP_TOP);
2707 com_backpatch(c, anchor2);
2708 }
2709}
2710
2711static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002712com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002713{
2714 REQ(n, not_test); /* 'not' not_test | comparison */
2715 if (NCH(n) == 1) {
2716 com_comparison(c, CHILD(n, 0));
2717 }
2718 else {
2719 com_not_test(c, CHILD(n, 1));
2720 com_addbyte(c, UNARY_NOT);
2721 }
2722}
2723
2724static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002725com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002726{
2727 int i;
2728 int anchor;
2729 REQ(n, and_test); /* not_test ('and' not_test)* */
2730 anchor = 0;
2731 i = 0;
2732 for (;;) {
2733 com_not_test(c, CHILD(n, i));
2734 if ((i += 2) >= NCH(n))
2735 break;
2736 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2737 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002738 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002739 }
2740 if (anchor)
2741 com_backpatch(c, anchor);
2742}
2743
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002744static int
2745com_make_closure(struct compiling *c, PyCodeObject *co)
2746{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002747 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002748 if (free == 0)
2749 return 0;
2750 for (i = 0; i < free; ++i) {
2751 /* Bypass com_addop_varname because it will generate
2752 LOAD_DEREF but LOAD_CLOSURE is needed.
2753 */
2754 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2755 int arg, reftype;
2756
2757 /* Special case: If a class contains a method with a
2758 free variable that has the same name as a method,
2759 the name will be considered free *and* local in the
2760 class. It should be handled by the closure, as
2761 well as by the normal name loookup logic.
2762 */
2763 reftype = get_ref_type(c, PyString_AS_STRING(name));
2764 if (reftype == CELL)
2765 arg = com_lookup_arg(c->c_cellvars, name);
2766 else /* (reftype == FREE) */
2767 arg = com_lookup_arg(c->c_freevars, name);
2768 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002769 fprintf(stderr, "lookup %s in %s %d %d\n"
2770 "freevars of %s: %s\n",
2771 PyObject_REPR(name),
2772 c->c_name,
2773 reftype, arg,
2774 PyString_AS_STRING(co->co_name),
2775 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002776 Py_FatalError("com_make_closure()");
2777 }
2778 com_addoparg(c, LOAD_CLOSURE, arg);
2779
2780 }
2781 com_push(c, free);
2782 return 1;
2783}
2784
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002785static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002786com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002787{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002788 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002789 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002790 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002791 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002792 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002793 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2794 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002795 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002796 if (co == NULL) {
2797 c->c_errors++;
2798 return;
2799 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002800 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002801 i = com_addconst(c, (PyObject *)co);
2802 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002803 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002804 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002805 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002806 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002807 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002808 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002809 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002810 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002811 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002812 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002813 else {
2814 int anchor = 0;
2815 int i = 0;
2816 for (;;) {
2817 com_and_test(c, CHILD(n, i));
2818 if ((i += 2) >= NCH(n))
2819 break;
2820 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2821 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002822 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002823 }
2824 if (anchor)
2825 com_backpatch(c, anchor);
2826 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002827}
2828
2829static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002830com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002831{
2832 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002833 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002834 com_node(c, CHILD(n, 0));
2835 }
2836 else {
2837 int i;
2838 int len;
2839 len = (NCH(n) + 1) / 2;
2840 for (i = 0; i < NCH(n); i += 2)
2841 com_node(c, CHILD(n, i));
2842 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002843 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002844 }
2845}
2846
2847
2848/* Begin of assignment compilation */
2849
Thomas Wouters434d0822000-08-24 20:11:32 +00002850
2851static void
2852com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2853{
2854 com_addbyte(c, DUP_TOP);
2855 com_push(c, 1);
2856 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002857 com_node(c, augn);
2858 com_addbyte(c, opcode);
2859 com_pop(c, 1);
2860 com_addbyte(c, ROT_TWO);
2861 com_addopname(c, STORE_ATTR, n);
2862 com_pop(c, 2);
2863}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002864
2865static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002866com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002867{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00002868 if (none_assignment_check(c, STR(n), assigning))
2869 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002870 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002871 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002872}
2873
2874static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002875com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002876{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002877 REQ(n, trailer);
2878 switch (TYPE(CHILD(n, 0))) {
2879 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002880 if (assigning == OP_DELETE)
2881 com_error(c, PyExc_SyntaxError,
2882 "can't delete function call");
2883 else
2884 com_error(c, PyExc_SyntaxError,
2885 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002886 break;
2887 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002888 if (assigning > OP_APPLY)
2889 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2890 else
2891 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002892 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002893 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002894 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002895 break;
2896 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002897 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002898 }
2899}
2900
2901static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002902com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002903{
2904 int i;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002905 if (TYPE(n) != testlist && TYPE(n) != testlist_gexp &&
2906 TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002907 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002908 if (assigning) {
2909 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002910 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002911 com_push(c, i-1);
2912 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002913 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002914 com_assign(c, CHILD(n, i), assigning, NULL);
2915}
2916
2917static void
2918com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2919{
2920 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002921 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002922 com_push(c, 1);
2923 com_node(c, augn);
2924 com_addbyte(c, opcode);
2925 com_pop(c, 1);
2926 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002927}
2928
2929static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002930com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002931{
2932 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002933 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002934 if (assigning)
2935 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002936}
2937
2938static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002939com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002940{
2941 /* Loop to avoid trivial recursion */
2942 for (;;) {
2943 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002944
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002945 case exprlist:
2946 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002947 case testlist1:
Raymond Hettinger354433a2004-05-19 08:20:33 +00002948 case testlist_gexp:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002949 if (NCH(n) > 1) {
Raymond Hettinger354433a2004-05-19 08:20:33 +00002950 if (TYPE(CHILD(n, 1)) == gen_for) {
2951 com_error(c, PyExc_SystemError,
2952 "assign to generator expression not possible");
2953 return;
2954 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002955 if (assigning > OP_APPLY) {
2956 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002957 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002958 return;
2959 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002960 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002961 return;
2962 }
2963 n = CHILD(n, 0);
2964 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002965
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002966 case test:
2967 case and_test:
2968 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002969 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002970 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002971 case xor_expr:
2972 case and_expr:
2973 case shift_expr:
2974 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002975 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002976 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002977 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002978 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002979 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002980 return;
2981 }
2982 n = CHILD(n, 0);
2983 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002984
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002985 case power: /* atom trailer* ('**' power)*
2986 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002987 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002988 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002989 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002990 return;
2991 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002992 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002993 int i;
2994 com_node(c, CHILD(n, 0));
2995 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002996 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002997 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002998 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002999 return;
3000 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003001 com_apply_trailer(c, CHILD(n, i));
3002 } /* NB i is still alive */
3003 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00003004 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003005 return;
3006 }
3007 n = CHILD(n, 0);
3008 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003009
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003010 case atom:
3011 switch (TYPE(CHILD(n, 0))) {
3012 case LPAR:
3013 n = CHILD(n, 1);
3014 if (TYPE(n) == RPAR) {
3015 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003016 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003017 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003018 return;
3019 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003020 if (assigning > OP_APPLY) {
3021 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003022 "augmented assign to tuple literal not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003023 return;
3024 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003025 break;
3026 case LSQB:
3027 n = CHILD(n, 1);
3028 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003029 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003030 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003031 return;
3032 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003033 if (assigning > OP_APPLY) {
3034 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003035 "augmented assign to list literal not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003036 return;
3037 }
3038 if (NCH(n) > 1
3039 && TYPE(CHILD(n, 1)) == list_for) {
3040 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003041 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00003042 return;
3043 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003044 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003045 return;
3046 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00003047 if (assigning > OP_APPLY)
3048 com_augassign_name(c, CHILD(n, 0),
3049 assigning, augn);
3050 else
3051 com_assign_name(c, CHILD(n, 0),
3052 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003053 return;
3054 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003055 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003056 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003057 return;
3058 }
3059 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003060
3061 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003062 com_error(c, PyExc_SyntaxError,
3063 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003064 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003065
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003066 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003067 com_error(c, PyExc_SystemError,
3068 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003069 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003070
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003071 }
3072 }
3073}
Guido van Rossum7c531111997-03-11 18:42:21 +00003074
Thomas Wouters434d0822000-08-24 20:11:32 +00003075static void
3076com_augassign(struct compiling *c, node *n)
3077{
3078 int opcode;
3079
3080 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
3081 case '+': opcode = INPLACE_ADD; break;
3082 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00003083 case '/':
3084 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
3085 opcode = INPLACE_FLOOR_DIVIDE;
3086 else if (c->c_flags & CO_FUTURE_DIVISION)
3087 opcode = INPLACE_TRUE_DIVIDE;
3088 else
3089 opcode = INPLACE_DIVIDE;
3090 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00003091 case '%': opcode = INPLACE_MODULO; break;
3092 case '<': opcode = INPLACE_LSHIFT; break;
3093 case '>': opcode = INPLACE_RSHIFT; break;
3094 case '&': opcode = INPLACE_AND; break;
3095 case '^': opcode = INPLACE_XOR; break;
3096 case '|': opcode = INPLACE_OR; break;
3097 case '*':
3098 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
3099 opcode = INPLACE_POWER;
3100 else
3101 opcode = INPLACE_MULTIPLY;
3102 break;
3103 default:
3104 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
3105 return;
3106 }
3107 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
3108}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003109
3110static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003111com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003112{
Thomas Wouters434d0822000-08-24 20:11:32 +00003113 REQ(n, expr_stmt);
3114 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003115 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00003116 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003117 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00003118 if (NCH(n) == 1) {
3119 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003120 if (c->c_interactive)
3121 com_addbyte(c, PRINT_EXPR);
3122 else
3123 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003124 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003125 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003126 else if (TYPE(CHILD(n,1)) == augassign)
3127 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003128 else {
3129 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00003130 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003131 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003132 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003133 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003134 com_push(c, 1);
3135 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003136 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003137 }
3138 }
3139}
3140
3141static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003142com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00003143{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003144 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003145 int i;
3146 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003147 if (Py_OptimizeFlag)
3148 return;
3149 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00003150
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003151 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00003152 raise AssertionError [, <message>]
3153
3154 where <message> is the second test, if present.
3155 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003156 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003157 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003158 com_addbyte(c, POP_TOP);
3159 com_pop(c, 1);
3160 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003161 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00003162 com_push(c, 1);
3163 i = NCH(n)/2; /* Either 2 or 4 */
3164 if (i > 1)
3165 com_node(c, CHILD(n, 3));
3166 com_addoparg(c, RAISE_VARARGS, i);
3167 com_pop(c, i);
3168 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003169 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003170 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003171 com_addbyte(c, POP_TOP);
3172}
3173
3174static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003175com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003176{
Barry Warsaw29c574e2000-08-21 15:38:56 +00003177 int i = 1;
3178 node* stream = NULL;
3179
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003180 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003181
3182 /* are we using the extended print form? */
3183 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
3184 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00003185 com_node(c, stream);
3186 /* stack: [...] => [... stream] */
3187 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003188 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3189 i = 4;
3190 else
3191 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003192 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003193 for (; i < NCH(n); i += 2) {
3194 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003195 com_addbyte(c, DUP_TOP);
3196 /* stack: [stream] => [stream stream] */
3197 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003198 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003199 /* stack: [stream stream] => [stream stream obj] */
3200 com_addbyte(c, ROT_TWO);
3201 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003202 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003203 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003204 com_pop(c, 2);
3205 }
3206 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003207 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003208 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003209 com_addbyte(c, PRINT_ITEM);
3210 com_pop(c, 1);
3211 }
3212 }
3213 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003214 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003215 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003216 /* must pop the extra stream object off the stack */
3217 com_addbyte(c, POP_TOP);
3218 /* stack: [... stream] => [...] */
3219 com_pop(c, 1);
3220 }
3221 }
3222 else {
3223 if (stream != NULL) {
3224 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003225 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003226 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003227 com_pop(c, 1);
3228 }
3229 else
3230 com_addbyte(c, PRINT_NEWLINE);
3231 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003232}
3233
3234static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003235com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003236{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003237 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003238 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003239 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003240 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003241 if (c->c_flags & CO_GENERATOR) {
3242 if (NCH(n) > 1) {
3243 com_error(c, PyExc_SyntaxError,
3244 "'return' with argument inside generator");
3245 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003246 }
3247 if (NCH(n) < 2) {
3248 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003249 com_push(c, 1);
3250 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003251 else
3252 com_node(c, CHILD(n, 1));
3253 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003254 com_pop(c, 1);
3255}
3256
3257static void
3258com_yield_stmt(struct compiling *c, node *n)
3259{
Tim Peters95c80f82001-06-23 02:07:08 +00003260 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003261 REQ(n, yield_stmt); /* 'yield' testlist */
3262 if (!c->c_infunction) {
3263 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3264 }
Tim Peters95c80f82001-06-23 02:07:08 +00003265
3266 for (i = 0; i < c->c_nblocks; ++i) {
3267 if (c->c_block[i] == SETUP_FINALLY) {
3268 com_error(c, PyExc_SyntaxError,
3269 "'yield' not allowed in a 'try' block "
3270 "with a 'finally' clause");
3271 return;
3272 }
3273 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003274 com_node(c, CHILD(n, 1));
3275 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003276 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003277}
3278
3279static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003280com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003281{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003282 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003283 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3284 if (NCH(n) > 1) {
3285 com_node(c, CHILD(n, 1));
3286 if (NCH(n) > 3) {
3287 com_node(c, CHILD(n, 3));
3288 if (NCH(n) > 5)
3289 com_node(c, CHILD(n, 5));
3290 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003291 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003292 i = NCH(n)/2;
3293 com_addoparg(c, RAISE_VARARGS, i);
3294 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003295}
3296
3297static void
Thomas Wouters52152252000-08-17 22:55:00 +00003298com_from_import(struct compiling *c, node *n)
3299{
3300 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3301 com_push(c, 1);
3302 if (NCH(n) > 1) {
3303 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3304 com_error(c, PyExc_SyntaxError, "invalid syntax");
3305 return;
3306 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003307 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003308 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003309 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003310 com_pop(c, 1);
3311}
3312
3313static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003314com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003315{
3316 int i;
3317 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003318 /* 'import' dotted_name (',' dotted_name)* |
3319 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003320 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00003321 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003322 /* 'from' dotted_name 'import' ... */
3323 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003324
3325 if (TYPE(CHILD(n, 3)) == STAR) {
3326 tup = Py_BuildValue("(s)", "*");
3327 } else {
3328 tup = PyTuple_New((NCH(n) - 2)/2);
3329 for (i = 3; i < NCH(n); i += 2) {
3330 PyTuple_SET_ITEM(tup, (i-3)/2,
Guido van Rossum633d90c2002-12-23 16:51:42 +00003331 PyString_FromString(STR(
3332 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003333 }
3334 }
3335 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003336 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003337 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003338 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00003339 if (TYPE(CHILD(n, 3)) == STAR)
3340 com_addbyte(c, IMPORT_STAR);
3341 else {
3342 for (i = 3; i < NCH(n); i += 2)
3343 com_from_import(c, CHILD(n, i));
3344 com_addbyte(c, POP_TOP);
3345 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003346 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003347 }
3348 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003349 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003350 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003351 node *subn = CHILD(n, i);
3352 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003353 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
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(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003356 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003357 int j;
3358 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003359 com_error(c, PyExc_SyntaxError,
3360 "invalid syntax");
3361 return;
3362 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003363 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3364 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003365 CHILD(CHILD(subn, 0),
3366 j));
3367 com_addop_varname(c, VAR_STORE,
3368 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003369 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003370 com_addop_varname(c, VAR_STORE,
3371 STR(CHILD(CHILD(subn, 0),
3372 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003373 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003374 }
3375 }
3376}
3377
3378static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003379com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003380{
3381 REQ(n, exec_stmt);
3382 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3383 com_node(c, CHILD(n, 1));
3384 if (NCH(n) >= 4)
3385 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003386 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003387 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003388 com_push(c, 1);
3389 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003390 if (NCH(n) >= 6)
3391 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003392 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003393 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003394 com_push(c, 1);
3395 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003396 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003397 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003398}
3399
Guido van Rossum7c531111997-03-11 18:42:21 +00003400static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003401is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003402{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003403 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003404 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003405 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003406
3407 /* Label to avoid tail recursion */
3408 next:
3409 switch (TYPE(n)) {
3410
3411 case suite:
3412 if (NCH(n) == 1) {
3413 n = CHILD(n, 0);
3414 goto next;
3415 }
3416 /* Fall through */
3417 case file_input:
3418 for (i = 0; i < NCH(n); i++) {
3419 node *ch = CHILD(n, i);
3420 if (TYPE(ch) == stmt) {
3421 n = ch;
3422 goto next;
3423 }
3424 }
3425 break;
3426
3427 case stmt:
3428 case simple_stmt:
3429 case small_stmt:
3430 n = CHILD(n, 0);
3431 goto next;
3432
3433 case expr_stmt:
3434 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003435 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003436 case test:
3437 case and_test:
3438 case not_test:
3439 case comparison:
3440 case expr:
3441 case xor_expr:
3442 case and_expr:
3443 case shift_expr:
3444 case arith_expr:
3445 case term:
3446 case factor:
3447 case power:
3448 case atom:
3449 if (NCH(n) == 1) {
3450 n = CHILD(n, 0);
3451 goto next;
3452 }
3453 break;
3454
3455 case NAME:
3456 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3457 return 1;
3458 break;
3459
3460 case NUMBER:
3461 v = parsenumber(c, STR(n));
3462 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003463 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003464 break;
3465 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003466 i = PyObject_IsTrue(v);
3467 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003468 return i == 0;
3469
3470 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003471 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003472 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003473 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003474 break;
3475 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003476 i = PyObject_IsTrue(v);
3477 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003478 return i == 0;
3479
3480 }
3481 return 0;
3482}
3483
Tim Peters08a898f2001-06-28 01:52:22 +00003484
3485/* Look under n for a return stmt with an expression.
3486 * This hack is used to find illegal returns under "if 0:" blocks in
3487 * functions already known to be generators (as determined by the symtable
3488 * pass).
3489 * Return the offending return node if found, else NULL.
3490 */
3491static node *
3492look_for_offending_return(node *n)
3493{
3494 int i;
3495
3496 for (i = 0; i < NCH(n); ++i) {
3497 node *kid = CHILD(n, i);
3498
3499 switch (TYPE(kid)) {
3500 case classdef:
3501 case funcdef:
3502 case lambdef:
3503 /* Stuff in nested functions & classes doesn't
3504 affect the code block we started in. */
3505 return NULL;
3506
3507 case return_stmt:
3508 if (NCH(kid) > 1)
3509 return kid;
3510 break;
3511
3512 default: {
3513 node *bad = look_for_offending_return(kid);
3514 if (bad != NULL)
3515 return bad;
3516 }
3517 }
3518 }
3519
3520 return NULL;
3521}
3522
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003523static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003524com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003525{
3526 int i;
3527 int anchor = 0;
3528 REQ(n, if_stmt);
3529 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3530 for (i = 0; i+3 < NCH(n); i+=4) {
3531 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003532 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003533 if (is_constant_false(c, ch)) {
3534 /* We're going to skip this block. However, if this
3535 is a generator, we have to check the dead code
3536 anyway to make sure there aren't any return stmts
3537 with expressions, in the same scope. */
3538 if (c->c_flags & CO_GENERATOR) {
3539 node *p = look_for_offending_return(n);
3540 if (p != NULL) {
3541 int savelineno = c->c_lineno;
3542 c->c_lineno = p->n_lineno;
3543 com_error(c, PyExc_SyntaxError,
3544 "'return' with argument "
3545 "inside generator");
3546 c->c_lineno = savelineno;
3547 }
3548 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003549 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003550 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003551 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003552 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003553 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003554 com_addfwref(c, JUMP_IF_FALSE, &a);
3555 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003556 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003557 com_node(c, CHILD(n, i+3));
3558 com_addfwref(c, JUMP_FORWARD, &anchor);
3559 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003560 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003561 com_addbyte(c, POP_TOP);
3562 }
3563 if (i+2 < NCH(n))
3564 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003565 if (anchor)
3566 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003567}
3568
3569static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003570com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003571{
3572 int break_anchor = 0;
3573 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003574 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003575 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3576 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003577 block_push(c, SETUP_LOOP);
3578 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003579 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003580 com_node(c, CHILD(n, 1));
3581 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3582 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003583 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003584 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003585 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003586 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003587 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3588 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003589 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003590 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003591 com_addbyte(c, POP_TOP);
3592 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003593 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003594 if (NCH(n) > 4)
3595 com_node(c, CHILD(n, 6));
3596 com_backpatch(c, break_anchor);
3597}
3598
3599static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003600com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003601{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003602 int break_anchor = 0;
3603 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003604 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003605 REQ(n, for_stmt);
3606 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3607 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003608 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003609 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003610 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003611 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00003612 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003613 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003614 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003615 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003616 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003617 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003618 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003619 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3620 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003621 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003622 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003623 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003624 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003625 if (NCH(n) > 8)
3626 com_node(c, CHILD(n, 8));
3627 com_backpatch(c, break_anchor);
3628}
3629
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003630/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003631
3632 SETUP_FINALLY L
3633 <code for S>
3634 POP_BLOCK
3635 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003636 L: <code for Sf>
3637 END_FINALLY
3638
3639 The special instructions use the block stack. Each block
3640 stack entry contains the instruction that created it (here
3641 SETUP_FINALLY), the level of the value stack at the time the
3642 block stack entry was created, and a label (here L).
3643
3644 SETUP_FINALLY:
3645 Pushes the current value stack level and the label
3646 onto the block stack.
3647 POP_BLOCK:
3648 Pops en entry from the block stack, and pops the value
3649 stack until its level is the same as indicated on the
3650 block stack. (The label is ignored.)
3651 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003652 Pops a variable number of entries from the *value* stack
3653 and re-raises the exception they specify. The number of
3654 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003655
3656 The block stack is unwound when an exception is raised:
3657 when a SETUP_FINALLY entry is found, the exception is pushed
3658 onto the value stack (and the exception condition is cleared),
3659 and the interpreter jumps to the label gotten from the block
3660 stack.
3661
3662 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003663 (The contents of the value stack is shown in [], with the top
3664 at the right; 'tb' is trace-back info, 'val' the exception's
3665 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003666
3667 Value stack Label Instruction Argument
3668 [] SETUP_EXCEPT L1
3669 [] <code for S>
3670 [] POP_BLOCK
3671 [] JUMP_FORWARD L0
3672
Guido van Rossum3f5da241990-12-20 15:06:42 +00003673 [tb, val, exc] L1: DUP )
3674 [tb, val, exc, exc] <evaluate E1> )
3675 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3676 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3677 [tb, val, exc, 1] POP )
3678 [tb, val, exc] POP
3679 [tb, val] <assign to V1> (or POP if no V1)
3680 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003681 [] <code for S1>
3682 JUMP_FORWARD L0
3683
Guido van Rossum3f5da241990-12-20 15:06:42 +00003684 [tb, val, exc, 0] L2: POP
3685 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003686 .............................etc.......................
3687
Guido van Rossum3f5da241990-12-20 15:06:42 +00003688 [tb, val, exc, 0] Ln+1: POP
3689 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003690
3691 [] L0: <next statement>
3692
3693 Of course, parts are not generated if Vi or Ei is not present.
3694*/
3695
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003696static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003697com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003698{
3699 int except_anchor = 0;
3700 int end_anchor = 0;
3701 int else_anchor = 0;
3702 int i;
3703 node *ch;
3704
3705 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3706 block_push(c, SETUP_EXCEPT);
3707 com_node(c, CHILD(n, 2));
3708 com_addbyte(c, POP_BLOCK);
3709 block_pop(c, SETUP_EXCEPT);
3710 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3711 com_backpatch(c, except_anchor);
3712 for (i = 3;
3713 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3714 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003715 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003716 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003717 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003718 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003719 break;
3720 }
3721 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003722 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003723 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003724 if (NCH(ch) > 1) {
3725 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003726 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003727 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003728 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003729 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003730 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3731 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003732 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003733 }
3734 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003735 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003736 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003737 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003738 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003739 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003740 com_pop(c, 1);
3741 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003742 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003743 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003744 com_node(c, CHILD(n, i+2));
3745 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3746 if (except_anchor) {
3747 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003748 /* We come in with [tb, val, exc, 0] on the
3749 stack; one pop and it's the same as
3750 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003751 com_addbyte(c, POP_TOP);
3752 }
3753 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003754 /* We actually come in here with [tb, val, exc] but the
3755 END_FINALLY will zap those and jump around.
3756 The c_stacklevel does not reflect them so we need not pop
3757 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003758 com_addbyte(c, END_FINALLY);
3759 com_backpatch(c, else_anchor);
3760 if (i < NCH(n))
3761 com_node(c, CHILD(n, i+2));
3762 com_backpatch(c, end_anchor);
3763}
3764
3765static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003766com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003767{
3768 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003769 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003770
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003771 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3772 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003773 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003774 com_addbyte(c, POP_BLOCK);
3775 block_pop(c, SETUP_FINALLY);
3776 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003777 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003778 /* While the generated code pushes only one item,
3779 the try-finally handling can enter here with
3780 up to three items. OK, here are the details:
3781 3 for an exception, 2 for RETURN, 1 for BREAK. */
3782 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003783 com_backpatch(c, finally_anchor);
3784 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003785 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003786 com_node(c, ch);
3787 com_addbyte(c, END_FINALLY);
3788 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003789 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003790}
3791
3792static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003793com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003794{
3795 REQ(n, try_stmt);
3796 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3797 | 'try' ':' suite 'finally' ':' suite */
3798 if (TYPE(CHILD(n, 3)) != except_clause)
3799 com_try_finally(c, n);
3800 else
3801 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003802}
3803
Guido van Rossum8b993a91997-01-17 21:04:03 +00003804static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003805get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003806{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003807 int i;
3808
Guido van Rossum8b993a91997-01-17 21:04:03 +00003809 /* Label to avoid tail recursion */
3810 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003811 switch (TYPE(n)) {
3812
3813 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003814 if (NCH(n) == 1) {
3815 n = CHILD(n, 0);
3816 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003817 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003818 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003819 case file_input:
3820 for (i = 0; i < NCH(n); i++) {
3821 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003822 if (TYPE(ch) == stmt) {
3823 n = ch;
3824 goto next;
3825 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003826 }
3827 break;
3828
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003829 case stmt:
3830 case simple_stmt:
3831 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003832 n = CHILD(n, 0);
3833 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003834
3835 case expr_stmt:
3836 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003837 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003838 case test:
3839 case and_test:
3840 case not_test:
3841 case comparison:
3842 case expr:
3843 case xor_expr:
3844 case and_expr:
3845 case shift_expr:
3846 case arith_expr:
3847 case term:
3848 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003849 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003850 if (NCH(n) == 1) {
3851 n = CHILD(n, 0);
3852 goto next;
3853 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003854 break;
3855
3856 case atom:
3857 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003858 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003859 break;
3860
3861 }
3862 return NULL;
3863}
3864
Guido van Rossum79f25d91997-04-29 20:08:16 +00003865static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003866get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003867{
Guido van Rossum541563e1999-01-28 15:08:09 +00003868 /* Don't generate doc-strings if run with -OO */
3869 if (Py_OptimizeFlag > 1)
3870 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003871 n = get_rawdocstring(n);
3872 if (n == NULL)
3873 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003874 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003875}
3876
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003877static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003878com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003879{
3880 REQ(n, suite);
3881 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3882 if (NCH(n) == 1) {
3883 com_node(c, CHILD(n, 0));
3884 }
3885 else {
3886 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003887 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003888 node *ch = CHILD(n, i);
3889 if (TYPE(ch) == stmt)
3890 com_node(c, ch);
3891 }
3892 }
3893}
3894
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003895/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003896static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003897com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003898{
3899 int i = c->c_nblocks;
3900 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3901 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3902 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003903 else if (i <= 0) {
3904 /* at the outer level */
3905 com_error(c, PyExc_SyntaxError,
3906 "'continue' not properly in loop");
3907 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003908 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003909 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003910 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003911 if (c->c_block[j] == SETUP_LOOP)
3912 break;
3913 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003914 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003915 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003916 for (; i > j; --i) {
3917 if (c->c_block[i] == SETUP_EXCEPT ||
3918 c->c_block[i] == SETUP_FINALLY) {
3919 com_addoparg(c, CONTINUE_LOOP,
3920 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003921 return;
3922 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003923 if (c->c_block[i] == END_FINALLY) {
3924 com_error(c, PyExc_SyntaxError,
3925 "'continue' not supported inside 'finally' clause");
3926 return;
3927 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003928 }
3929 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003930 com_error(c, PyExc_SyntaxError,
3931 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003932 }
3933 /* XXX Could allow it inside a 'finally' clause
3934 XXX if we could pop the exception still on the stack */
3935}
3936
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003937/* Return the number of default values in the argument list.
3938
3939 If a non-default argument follows a default argument, set an
3940 exception and return -1.
3941*/
3942
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003943static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003944com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003945{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003946 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003947 if (TYPE(n) == lambdef) {
3948 /* lambdef: 'lambda' [varargslist] ':' test */
3949 n = CHILD(n, 1);
3950 }
3951 else {
3952 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3953 n = CHILD(n, 2);
3954 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3955 n = CHILD(n, 1);
3956 }
3957 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003958 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003959 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003960 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003961 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3962 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003963 ndefs = 0;
3964 for (i = 0; i < nch; i++) {
3965 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003966 if (TYPE(CHILD(n, i)) == STAR ||
3967 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003968 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003969 i++;
3970 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003971 t = RPAR; /* Anything except EQUAL or COMMA */
3972 else
3973 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003974 if (t == EQUAL) {
3975 i++;
3976 ndefs++;
3977 com_node(c, CHILD(n, i));
3978 i++;
3979 if (i >= nch)
3980 break;
3981 t = TYPE(CHILD(n, i));
3982 }
3983 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003984 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003985 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003986 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003987 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003988 return -1;
3989 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003990 }
3991 if (t != COMMA)
3992 break;
3993 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003994 return ndefs;
3995}
3996
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003997static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003998com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003999{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004000 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004001 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004002 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004003 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004004 if (ndefs < 0)
4005 return;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004006 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
4007 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004008 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004009 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004010 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004011 c->c_errors++;
4012 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004013 int closure = com_make_closure(c, (PyCodeObject *)co);
4014 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004015 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004016 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004017 if (closure)
4018 com_addoparg(c, MAKE_CLOSURE, ndefs);
4019 else
4020 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004021 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004022 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004023 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004024 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004025 }
4026}
4027
4028static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004029com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004030{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004031 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004032 REQ(n, testlist);
4033 /* testlist: test (',' test)* [','] */
4034 for (i = 0; i < NCH(n); i += 2)
4035 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004036 i = (NCH(n)+1) / 2;
4037 com_addoparg(c, BUILD_TUPLE, i);
4038 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004039}
4040
4041static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004042com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004043{
Guido van Rossum25831651993-05-19 14:50:45 +00004044 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004045 PyObject *v;
4046 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004047 char *name;
4048
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004049 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004050 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004051 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004052 c->c_errors++;
4053 return;
4054 }
4055 /* Push the class name on the stack */
4056 i = com_addconst(c, v);
4057 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004058 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004059 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004060 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004061 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004062 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004063 com_push(c, 1);
4064 }
Guido van Rossum25831651993-05-19 14:50:45 +00004065 else
4066 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004067 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004068 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004069 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004070 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004071 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004072 c->c_errors++;
4073 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004074 int closure = com_make_closure(c, co);
4075 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004076 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004077 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004078 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004079 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004080 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004081 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004082 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004083 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004084 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004085 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004086 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004087 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004088 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004089 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004090}
4091
4092static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004093com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004094{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004095 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004096 if (c->c_errors)
4097 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004098 switch (TYPE(n)) {
4099
4100 /* Definition nodes */
4101
4102 case funcdef:
4103 com_funcdef(c, n);
4104 break;
4105 case classdef:
4106 com_classdef(c, n);
4107 break;
4108
4109 /* Trivial parse tree nodes */
4110
4111 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004112 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004113 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004114 n = CHILD(n, 0);
4115 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004116
4117 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004118 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004119 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004120 {
4121 int i;
4122 for (i = 0; i < NCH(n)-1; i += 2)
4123 com_node(c, CHILD(n, i));
4124 }
4125 break;
4126
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004127 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004128 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004129 n = CHILD(n, 0);
4130 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004131
4132 /* Statement nodes */
4133
4134 case expr_stmt:
4135 com_expr_stmt(c, n);
4136 break;
4137 case print_stmt:
4138 com_print_stmt(c, n);
4139 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004140 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004141 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004142 break;
4143 case pass_stmt:
4144 break;
4145 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004146 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004147 com_error(c, PyExc_SyntaxError,
4148 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004149 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004150 com_addbyte(c, BREAK_LOOP);
4151 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004152 case continue_stmt:
4153 com_continue_stmt(c, n);
4154 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004155 case return_stmt:
4156 com_return_stmt(c, n);
4157 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004158 case yield_stmt:
4159 com_yield_stmt(c, n);
4160 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004161 case raise_stmt:
4162 com_raise_stmt(c, n);
4163 break;
4164 case import_stmt:
4165 com_import_stmt(c, n);
4166 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004167 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004168 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004169 case exec_stmt:
4170 com_exec_stmt(c, n);
4171 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004172 case assert_stmt:
4173 com_assert_stmt(c, n);
4174 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004175 case if_stmt:
4176 com_if_stmt(c, n);
4177 break;
4178 case while_stmt:
4179 com_while_stmt(c, n);
4180 break;
4181 case for_stmt:
4182 com_for_stmt(c, n);
4183 break;
4184 case try_stmt:
4185 com_try_stmt(c, n);
4186 break;
4187 case suite:
4188 com_suite(c, n);
4189 break;
4190
4191 /* Expression nodes */
4192
4193 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004194 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004195 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004196 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004197 break;
4198 case test:
4199 com_test(c, n);
4200 break;
4201 case and_test:
4202 com_and_test(c, n);
4203 break;
4204 case not_test:
4205 com_not_test(c, n);
4206 break;
4207 case comparison:
4208 com_comparison(c, n);
4209 break;
4210 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004211 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004212 break;
4213 case expr:
4214 com_expr(c, n);
4215 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004216 case xor_expr:
4217 com_xor_expr(c, n);
4218 break;
4219 case and_expr:
4220 com_and_expr(c, n);
4221 break;
4222 case shift_expr:
4223 com_shift_expr(c, n);
4224 break;
4225 case arith_expr:
4226 com_arith_expr(c, n);
4227 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004228 case term:
4229 com_term(c, n);
4230 break;
4231 case factor:
4232 com_factor(c, n);
4233 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004234 case power:
4235 com_power(c, n);
4236 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004237 case atom:
4238 com_atom(c, n);
4239 break;
4240
4241 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004242 com_error(c, PyExc_SystemError,
4243 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004244 }
4245}
4246
Tim Petersdbd9ba62000-07-09 03:09:57 +00004247static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004248
4249static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004250com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004251{
4252 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4253 if (TYPE(CHILD(n, 0)) == LPAR)
4254 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004255 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004256 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004257 com_pop(c, 1);
4258 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004259}
4260
4261static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004262com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004263{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004264 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004265 if (NCH(n) == 1) {
4266 com_fpdef(c, CHILD(n, 0));
4267 }
4268 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004269 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004270 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004271 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004272 for (i = 0; i < NCH(n); i += 2)
4273 com_fpdef(c, CHILD(n, i));
4274 }
4275}
4276
4277static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004278com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004279{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004280 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004281 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004282 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004283 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004284 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004285 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004286 nch = NCH(n);
4287 /* Enter all arguments in table of locals */
4288 for (i = 0, narg = 0; i < nch; i++) {
4289 node *ch = CHILD(n, i);
4290 node *fp;
4291 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004292 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004293 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4294 fp = CHILD(ch, 0);
4295 if (TYPE(fp) != NAME) {
4296 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4297 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004298 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004299 narg++;
4300 /* all name updates handled by symtable */
4301 if (++i >= nch)
4302 break;
4303 ch = CHILD(n, i);
4304 if (TYPE(ch) == EQUAL)
4305 i += 2;
4306 else
4307 REQ(ch, COMMA);
4308 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004309 if (complex) {
4310 /* Generate code for complex arguments only after
4311 having counted the simple arguments */
4312 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004313 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004314 node *ch = CHILD(n, i);
4315 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004316 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004317 break;
4318 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4319 fp = CHILD(ch, 0);
4320 if (TYPE(fp) != NAME) {
4321 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004322 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004323 com_fpdef(c, ch);
4324 }
4325 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004326 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004327 break;
4328 ch = CHILD(n, i);
4329 if (TYPE(ch) == EQUAL)
4330 i += 2;
4331 else
4332 REQ(ch, COMMA);
4333 }
4334 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004335}
4336
4337static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004338com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004339{
4340 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004341 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004342 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004343 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004344 if (doc != NULL) {
4345 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004346 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004347 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004348 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004349 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004350 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004351 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004352 for (i = 0; i < NCH(n); i++) {
4353 node *ch = CHILD(n, i);
4354 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4355 com_node(c, ch);
4356 }
4357}
4358
4359/* Top-level compile-node interface */
4360
4361static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004362compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004363{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004364 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004365 node *ch;
4366 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00004367 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004368 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004369 if (doc != NULL) {
4370 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004371 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004372 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004373 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004374 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004375 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
4376 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004377 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004378 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004379 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004380 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004381 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004382 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004383 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4384 com_push(c, 1);
4385 com_addbyte(c, RETURN_VALUE);
4386 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004387}
4388
4389static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004390compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004391{
Guido van Rossum590baa41993-11-30 13:40:46 +00004392 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004393 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004394 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004395
4396 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004397 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004398 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004399 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004400 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004401 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004402 else
4403 ch = CHILD(n, 2);
4404 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004405 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004406 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004407}
4408
4409static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004410compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004411{
4412 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004413 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004414 REQ(n, classdef);
4415 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4416 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004417 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004418 /* Initialize local __module__ from global __name__ */
4419 com_addop_name(c, LOAD_GLOBAL, "__name__");
4420 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004421 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004422 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004423 if (doc != NULL) {
4424 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004425 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004426 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004427 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004428 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004429 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004430 }
4431 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004432 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004433 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00004434 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004435 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004436 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004437 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004438 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004439}
4440
4441static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00004442compile_generator_expression(struct compiling *c, node *n)
4443{
4444 /* testlist_gexp: test gen_for */
4445 /* argument: test gen_for */
4446 REQ(CHILD(n, 0), test);
4447 REQ(CHILD(n, 1), gen_for);
4448
4449 c->c_name = "<generator expression>";
4450 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
4451
4452 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4453 com_push(c, 1);
4454 com_addbyte(c, RETURN_VALUE);
4455 com_pop(c, 1);
4456}
4457
4458static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004459compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004460{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004461 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004462
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004463 switch (TYPE(n)) {
4464
Guido van Rossum4c417781991-01-21 16:09:22 +00004465 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004466 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004467 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004468 n = CHILD(n, 0);
4469 if (TYPE(n) != NEWLINE)
4470 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004471 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004472 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4473 com_push(c, 1);
4474 com_addbyte(c, RETURN_VALUE);
4475 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004476 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004477 break;
4478
Guido van Rossum4c417781991-01-21 16:09:22 +00004479 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004480 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004481 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004482 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4483 com_push(c, 1);
4484 com_addbyte(c, RETURN_VALUE);
4485 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004486 break;
4487
Guido van Rossum590baa41993-11-30 13:40:46 +00004488 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004489 com_node(c, CHILD(n, 0));
4490 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004491 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004492 break;
4493
Guido van Rossum590baa41993-11-30 13:40:46 +00004494 case lambdef: /* anonymous function definition */
4495 compile_lambdef(c, n);
4496 break;
4497
Guido van Rossum4c417781991-01-21 16:09:22 +00004498 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004499 compile_funcdef(c, n);
4500 break;
4501
Guido van Rossum4c417781991-01-21 16:09:22 +00004502 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004503 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004504 break;
4505
Raymond Hettinger354433a2004-05-19 08:20:33 +00004506 case testlist_gexp: /* A generator expression */
4507 case argument: /* A generator expression */
4508 compile_generator_expression(c, n);
4509 break;
4510
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004511 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004512 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004513 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004514 }
4515}
4516
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004517static PyObject *
4518dict_keys_inorder(PyObject *dict, int offset)
4519{
4520 PyObject *tuple, *k, *v;
4521 int i, pos = 0, size = PyDict_Size(dict);
4522
4523 tuple = PyTuple_New(size);
4524 if (tuple == NULL)
4525 return NULL;
4526 while (PyDict_Next(dict, &pos, &k, &v)) {
4527 i = PyInt_AS_LONG(v);
4528 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004529 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004530 PyTuple_SET_ITEM(tuple, i - offset, k);
4531 }
4532 return tuple;
4533}
4534
Guido van Rossum79f25d91997-04-29 20:08:16 +00004535PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004536PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004537{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004538 return PyNode_CompileFlags(n, filename, NULL);
4539}
4540
4541PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004542PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004543{
4544 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004545}
4546
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004547struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004548PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004549{
4550 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004551 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004552
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004553 ff = PyNode_Future(n, filename);
4554 if (ff == NULL)
4555 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004556 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00004557 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004558 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004559 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004560 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004561 return st;
4562}
4563
Guido van Rossum79f25d91997-04-29 20:08:16 +00004564static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004565icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004566{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004567 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004568}
4569
Guido van Rossum79f25d91997-04-29 20:08:16 +00004570static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004571jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004572 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004573{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004574 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004575 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004576 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004577 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004578 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4579 sc.c_encoding = "utf-8";
4580 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004581 sc.c_encoding = STR(n);
4582 n = CHILD(n, 0);
4583 } else {
4584 sc.c_encoding = NULL;
4585 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004586 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004587 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004588 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004589 /* c_symtable still points to parent's symbols */
4590 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004591 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004592 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004593 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004594 if (base->c_encoding != NULL) {
4595 assert(sc.c_encoding == NULL);
4596 sc.c_encoding = base->c_encoding;
4597 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004598 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004599 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004600 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004601 if (sc.c_future == NULL) {
4602 com_free(&sc);
4603 return NULL;
4604 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004605 if (flags) {
4606 int merged = sc.c_future->ff_features |
4607 flags->cf_flags;
4608 sc.c_future->ff_features = merged;
4609 flags->cf_flags = merged;
4610 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004611 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
4612 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004613 com_free(&sc);
4614 return NULL;
4615 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004616 /* reset symbol table for second pass */
4617 sc.c_symtable->st_nscopes = 1;
4618 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004619 }
4620 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004621 if (symtable_load_symbols(&sc) < 0) {
4622 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004623 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004624 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004625 compile_node(&sc, n);
4626 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004627 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004628 PyObject *consts, *names, *varnames, *filename, *name,
4629 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004630 consts = PyList_AsTuple(sc.c_consts);
4631 names = PyList_AsTuple(sc.c_names);
4632 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004633 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4634 freevars = dict_keys_inorder(sc.c_freevars,
4635 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004636 filename = PyString_InternFromString(sc.c_filename);
4637 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004638 if (!PyErr_Occurred())
4639 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004640 sc.c_nlocals,
4641 sc.c_maxstacklevel,
4642 sc.c_flags,
4643 sc.c_code,
4644 consts,
4645 names,
4646 varnames,
4647 freevars,
4648 cellvars,
4649 filename,
4650 name,
4651 sc.c_firstlineno,
4652 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004653 Py_XDECREF(consts);
4654 Py_XDECREF(names);
4655 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004656 Py_XDECREF(freevars);
4657 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004658 Py_XDECREF(filename);
4659 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004660 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004661 else if (!PyErr_Occurred()) {
4662 /* This could happen if someone called PyErr_Clear() after an
4663 error was reported above. That's not supposed to happen,
4664 but I just plugged one case and I'm not sure there can't be
4665 others. In that case, raise SystemError so that at least
4666 it gets reported instead dumping core. */
4667 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4668 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004669 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004670 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004671 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004672 sc.c_symtable = NULL;
4673 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004674 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004675 return co;
4676}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004677
4678int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004679PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004680{
4681 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004682 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004683 int line = co->co_firstlineno;
4684 int addr = 0;
4685 while (--size >= 0) {
4686 addr += *p++;
4687 if (addr > addrq)
4688 break;
4689 line += *p++;
4690 }
4691 return line;
4692}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004693
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004694/* The test for LOCAL must come before the test for FREE in order to
4695 handle classes where name is both local and free. The local var is
4696 a method and the free var is a free var referenced within a method.
4697*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004698
4699static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004700get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004701{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004702 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004703 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004704
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004705 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4706 return CELL;
4707 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4708 return LOCAL;
4709 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4710 return FREE;
4711 v = PyDict_GetItemString(c->c_globals, name);
4712 if (v) {
4713 if (v == Py_None)
4714 return GLOBAL_EXPLICIT;
4715 else {
4716 return GLOBAL_IMPLICIT;
4717 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004718 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004719 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004720 "unknown scope for %.100s in %.100s(%s) "
4721 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4722 name, c->c_name,
4723 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4724 c->c_filename,
4725 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4726 PyObject_REPR(c->c_locals),
4727 PyObject_REPR(c->c_globals)
4728 );
4729
4730 Py_FatalError(buf);
4731 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004732}
4733
Guido van Rossum207fda62001-03-02 03:30:41 +00004734/* Helper functions to issue warnings */
4735
4736static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004737issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004738{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004739 if (PyErr_Occurred()) {
4740 /* This can happen because symtable_node continues
4741 processing even after raising a SyntaxError.
4742 Calling PyErr_WarnExplicit now would clobber the
4743 pending exception; instead we fail and let that
4744 exception propagate.
4745 */
4746 return -1;
4747 }
Guido van Rossum207fda62001-03-02 03:30:41 +00004748 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4749 lineno, NULL, NULL) < 0) {
4750 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4751 PyErr_SetString(PyExc_SyntaxError, msg);
4752 PyErr_SyntaxLocation(filename, lineno);
4753 }
4754 return -1;
4755 }
4756 return 0;
4757}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004758
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004759static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004760symtable_warn(struct symtable *st, char *msg)
4761{
Guido van Rossum207fda62001-03-02 03:30:41 +00004762 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004763 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004764 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004765 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004766 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004767}
4768
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004769/* Helper function for setting lineno and filename */
4770
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004771static struct symtable *
4772symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004773{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004774 struct symtable *st;
4775
4776 st = symtable_init();
4777 if (st == NULL)
4778 return NULL;
4779 st->st_future = ff;
4780 st->st_filename = filename;
4781 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
4782 if (st->st_errors > 0)
4783 goto fail;
4784 symtable_node(st, n);
4785 if (st->st_errors > 0)
4786 goto fail;
4787 return st;
4788 fail:
4789 if (!PyErr_Occurred()) {
4790 /* This could happen because after a syntax error is
4791 detected, the symbol-table-building continues for
4792 a while, and PyErr_Clear() might erroneously be
4793 called during that process. One such case has been
4794 fixed, but there might be more (now or later).
4795 */
4796 PyErr_SetString(PyExc_SystemError, "lost exception");
4797 }
4798 st->st_future = NULL;
4799 st->st_filename = NULL;
4800 PySymtable_Free(st);
4801 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004802}
4803
4804static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004805symtable_init_compiling_symbols(struct compiling *c)
4806{
4807 PyObject *varnames;
4808
4809 varnames = c->c_symtable->st_cur->ste_varnames;
4810 if (varnames == NULL) {
4811 varnames = PyList_New(0);
4812 if (varnames == NULL)
4813 return -1;
4814 c->c_symtable->st_cur->ste_varnames = varnames;
4815 Py_INCREF(varnames);
4816 } else
4817 Py_INCREF(varnames);
4818 c->c_varnames = varnames;
4819
4820 c->c_globals = PyDict_New();
4821 if (c->c_globals == NULL)
4822 return -1;
4823 c->c_freevars = PyDict_New();
4824 if (c->c_freevars == NULL)
4825 return -1;
4826 c->c_cellvars = PyDict_New();
4827 if (c->c_cellvars == NULL)
4828 return -1;
4829 return 0;
4830}
4831
4832struct symbol_info {
4833 int si_nlocals;
4834 int si_ncells;
4835 int si_nfrees;
4836 int si_nimplicit;
4837};
4838
4839static void
4840symtable_init_info(struct symbol_info *si)
4841{
4842 si->si_nlocals = 0;
4843 si->si_ncells = 0;
4844 si->si_nfrees = 0;
4845 si->si_nimplicit = 0;
4846}
4847
4848static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004849symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004850 struct symbol_info *si)
4851{
4852 PyObject *dict, *v;
4853
4854 /* Seperate logic for DEF_FREE. If it occurs in a function,
4855 it indicates a local that we must allocate storage for (a
4856 cell var). If it occurs in a class, then the class has a
4857 method and a free variable with the same name.
4858 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004859 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004860 /* If it isn't declared locally, it can't be a cell. */
4861 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4862 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004863 v = PyInt_FromLong(si->si_ncells++);
4864 dict = c->c_cellvars;
4865 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004866 /* If it is free anyway, then there is no need to do
4867 anything here.
4868 */
4869 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004870 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004871 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004872 v = PyInt_FromLong(si->si_nfrees++);
4873 dict = c->c_freevars;
4874 }
4875 if (v == NULL)
4876 return -1;
4877 if (PyDict_SetItem(dict, name, v) < 0) {
4878 Py_DECREF(v);
4879 return -1;
4880 }
4881 Py_DECREF(v);
4882 return 0;
4883}
4884
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004885/* If a variable is a cell and an argument, make sure that appears in
4886 co_cellvars before any variable to its right in varnames.
4887*/
4888
4889
4890static int
4891symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4892 PyObject *varnames, int flags)
4893{
Tim Petersb39903b2003-03-24 17:22:24 +00004894 PyObject *v = NULL;
4895 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004896 int i, pos;
4897
4898 if (flags & CO_VARARGS)
4899 argcount++;
4900 if (flags & CO_VARKEYWORDS)
4901 argcount++;
4902 for (i = argcount; --i >= 0; ) {
4903 v = PyList_GET_ITEM(varnames, i);
4904 if (PyDict_GetItem(*cellvars, v)) {
4905 if (list == NULL) {
4906 list = PyList_New(1);
4907 if (list == NULL)
4908 return -1;
4909 PyList_SET_ITEM(list, 0, v);
4910 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004911 } else {
4912 if (PyList_Insert(list, 0, v) < 0) {
4913 Py_DECREF(list);
4914 return -1;
4915 }
4916 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004917 }
4918 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00004919 if (list == NULL)
4920 return 0;
4921
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004922 /* There are cellvars that are also arguments. Create a dict
4923 to replace cellvars and put the args at the front.
4924 */
4925 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004926 if (d == NULL)
4927 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004928 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4929 v = PyInt_FromLong(i);
4930 if (v == NULL)
4931 goto fail;
4932 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4933 goto fail;
4934 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4935 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00004936 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004937 }
4938 pos = 0;
4939 i = PyList_GET_SIZE(list);
4940 Py_DECREF(list);
4941 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4942 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004943 if (w == NULL)
4944 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004945 if (PyDict_SetItem(d, v, w) < 0) {
4946 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00004947 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004948 goto fail;
4949 }
4950 Py_DECREF(w);
4951 }
4952 Py_DECREF(*cellvars);
4953 *cellvars = d;
4954 return 1;
4955 fail:
4956 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00004957 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004958 return -1;
4959}
4960
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004961static int
4962symtable_freevar_offsets(PyObject *freevars, int offset)
4963{
4964 PyObject *name, *v;
4965 int pos;
4966
4967 /* The cell vars are the first elements of the closure,
4968 followed by the free vars. Update the offsets in
4969 c_freevars to account for number of cellvars. */
4970 pos = 0;
4971 while (PyDict_Next(freevars, &pos, &name, &v)) {
4972 int i = PyInt_AS_LONG(v) + offset;
4973 PyObject *o = PyInt_FromLong(i);
4974 if (o == NULL)
4975 return -1;
4976 if (PyDict_SetItem(freevars, name, o) < 0) {
4977 Py_DECREF(o);
4978 return -1;
4979 }
4980 Py_DECREF(o);
4981 }
4982 return 0;
4983}
4984
4985static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004986symtable_check_unoptimized(struct compiling *c,
4987 PySymtableEntryObject *ste,
4988 struct symbol_info *si)
4989{
4990 char buf[300];
4991
4992 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4993 || (ste->ste_nested && si->si_nimplicit)))
4994 return 0;
4995
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004996#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4997
4998#define ILLEGAL_IS "is a nested function"
4999
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005000#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005001"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005002
5003#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005004"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005005
5006#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005007"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005008"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005009
5010 /* XXX perhaps the linenos for these opt-breaking statements
5011 should be stored so the exception can point to them. */
5012
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005013 if (ste->ste_child_free) {
5014 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005015 PyOS_snprintf(buf, sizeof(buf),
5016 ILLEGAL_IMPORT_STAR,
5017 PyString_AS_STRING(ste->ste_name),
5018 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005019 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005020 PyOS_snprintf(buf, sizeof(buf),
5021 ILLEGAL_BARE_EXEC,
5022 PyString_AS_STRING(ste->ste_name),
5023 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005024 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005025 PyOS_snprintf(buf, sizeof(buf),
5026 ILLEGAL_EXEC_AND_IMPORT_STAR,
5027 PyString_AS_STRING(ste->ste_name),
5028 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005029 }
5030 } else {
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_IS);
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_IS);
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_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005046 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005047 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005048
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005049 PyErr_SetString(PyExc_SyntaxError, buf);
5050 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5051 ste->ste_opt_lineno);
5052 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005053}
5054
5055static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005056symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5057 struct symbol_info *si)
5058{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005059 if (c->c_future)
5060 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005061 if (ste->ste_generator)
5062 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005063 if (ste->ste_type != TYPE_MODULE)
5064 c->c_flags |= CO_NEWLOCALS;
5065 if (ste->ste_type == TYPE_FUNCTION) {
5066 c->c_nlocals = si->si_nlocals;
5067 if (ste->ste_optimized == 0)
5068 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005069 else if (ste->ste_optimized != OPT_EXEC)
5070 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005071 }
5072 return 0;
5073}
5074
5075static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005076symtable_error(struct symtable *st, int lineno)
5077{
5078 if (lineno == 0)
5079 lineno = st->st_cur->ste_lineno;
5080 PyErr_SyntaxLocation(st->st_filename, lineno);
5081 st->st_errors++;
5082 return -1;
5083}
5084
5085static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005086symtable_load_symbols(struct compiling *c)
5087{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005088 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005089 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005090 PyObject *name, *varnames, *v;
5091 int i, flags, pos;
5092 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005093
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005094 v = NULL;
5095
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005096 if (symtable_init_compiling_symbols(c) < 0)
5097 goto fail;
5098 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005099 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005100 si.si_nlocals = PyList_GET_SIZE(varnames);
5101 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005102
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005103 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005104 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005105 if (v == NULL)
5106 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005107 if (PyDict_SetItem(c->c_locals,
5108 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005109 goto fail;
5110 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005111 }
5112
5113 /* XXX The cases below define the rules for whether a name is
5114 local or global. The logic could probably be clearer. */
5115 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005116 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5117 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005118
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005119 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005120 /* undo the original DEF_FREE */
5121 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005122
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005123 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005124 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005125 2. Free variables in methods that are also class
5126 variables or declared global.
5127 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005128 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005129 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005130
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005131 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005132 c->c_argcount--;
5133 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005134 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005135 c->c_argcount--;
5136 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005137 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005138 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005139 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005140 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005141 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005142 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005143 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005144 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005145 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005146 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5147 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005148 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005149 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005150 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005151 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005152 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005153 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005154 if (v == NULL)
5155 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005156 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005157 goto fail;
5158 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005159 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005160 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005161 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005162 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005163 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005164 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005165 if (v == NULL)
5166 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005167 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005168 goto fail;
5169 Py_DECREF(v);
5170 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005171 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005172 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005173 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005174 goto fail;
5175 if (st->st_nscopes != 1) {
5176 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005177 if (v == NULL)
5178 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005179 if (PyDict_SetItem(st->st_global,
5180 name, v))
5181 goto fail;
5182 Py_DECREF(v);
5183 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005184 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005185 }
5186 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005187 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5188
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005189 if (si.si_ncells > 1) { /* one cell is always in order */
5190 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5191 c->c_varnames, c->c_flags) < 0)
5192 return -1;
5193 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005194 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5195 return -1;
5196 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005197 fail:
5198 /* is this always the right thing to do? */
5199 Py_XDECREF(v);
5200 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005201}
5202
5203static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005204symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005205{
5206 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005207
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005208 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005209 if (st == NULL)
5210 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005211 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005212
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005213 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005214 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005215 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005216 goto fail;
5217 if ((st->st_symbols = PyDict_New()) == NULL)
5218 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005219 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005220 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005221 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005222 st->st_private = NULL;
5223 return st;
5224 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005225 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005226 return NULL;
5227}
5228
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005229void
5230PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005231{
5232 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005233 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005234 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005235 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005236}
5237
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005238/* When the compiler exits a scope, it must should update the scope's
5239 free variable information with the list of free variables in its
5240 children.
5241
5242 Variables that are free in children and defined in the current
5243 scope are cellvars.
5244
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005245 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005246 false), free variables in children that are not defined here are
5247 implicit globals.
5248
5249*/
5250
5251static int
5252symtable_update_free_vars(struct symtable *st)
5253{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005254 int i, j, def;
5255 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005256 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005257
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005258 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005259 def = DEF_FREE_CLASS;
5260 else
5261 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005262 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005263 int pos = 0;
5264
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005265 if (list && PyList_SetSlice(list, 0,
5266 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005267 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005268 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005269 PyList_GET_ITEM(ste->ste_children, i);
5270 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005271 int flags = PyInt_AS_LONG(o);
5272 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005273 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005274 if (list == NULL) {
5275 list = PyList_New(0);
5276 if (list == NULL)
5277 return -1;
5278 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005279 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005280 if (PyList_Append(list, name) < 0) {
5281 Py_DECREF(list);
5282 return -1;
5283 }
5284 }
5285 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005286 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005287 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005288 v = PyDict_GetItem(ste->ste_symbols, name);
5289 /* If a name N is declared global in scope A and
5290 referenced in scope B contained (perhaps
5291 indirectly) in A and there are no scopes
5292 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005293 is global in B. Unless A is a class scope,
5294 because class scopes are not considered for
5295 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005296 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005297 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005298 int flags = PyInt_AS_LONG(v);
5299 if (flags & DEF_GLOBAL) {
5300 symtable_undo_free(st, child->ste_id,
5301 name);
5302 continue;
5303 }
5304 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005305 if (ste->ste_nested) {
5306 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005307 name, def) < 0) {
5308 Py_DECREF(list);
5309 return -1;
5310 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005311 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005312 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005313 name) < 0) {
5314 Py_DECREF(list);
5315 return -1;
5316 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005317 }
5318 }
5319 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005320
5321 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005322 return 0;
5323}
5324
5325/* If the current scope is a non-nested class or if name is not
5326 defined in the current, non-nested scope, then it is an implicit
5327 global in all nested scopes.
5328*/
5329
5330static int
5331symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5332{
5333 PyObject *o;
5334 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005335 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005336
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005337 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005338 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005339 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005340 if (o == NULL)
5341 return symtable_undo_free(st, child, name);
5342 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005343
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005344 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005345 return symtable_undo_free(st, child, name);
5346 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005347 return symtable_add_def_o(st, ste->ste_symbols,
5348 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005349}
5350
5351static int
5352symtable_undo_free(struct symtable *st, PyObject *id,
5353 PyObject *name)
5354{
5355 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005356 PyObject *info;
5357 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005358
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005359 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5360 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005361 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005362
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005363 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005364 if (info == NULL)
5365 return 0;
5366 v = PyInt_AS_LONG(info);
5367 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005368 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005369 DEF_FREE_GLOBAL) < 0)
5370 return -1;
5371 } else
5372 /* If the name is defined here or declared global,
5373 then the recursion stops. */
5374 return 0;
5375
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005376 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5377 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005378 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005379 PyList_GET_ITEM(ste->ste_children, i);
5380 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005381 if (x < 0)
5382 return x;
5383 }
5384 return 0;
5385}
5386
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005387/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5388 This reference is released when the scope is exited, via the DECREF
5389 in symtable_exit_scope().
5390*/
5391
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005392static int
5393symtable_exit_scope(struct symtable *st)
5394{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005395 int end;
5396
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005397 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005398 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005399 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005400 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005401 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5402 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005403 if (PySequence_DelItem(st->st_stack, end) < 0)
5404 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005405 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005406}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005407
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005408static void
5409symtable_enter_scope(struct symtable *st, char *name, int type,
5410 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005411{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005412 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005413
5414 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005415 prev = st->st_cur;
5416 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005417 st->st_errors++;
5418 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005419 }
5420 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005421 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005422 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005423 if (st->st_cur == NULL) {
5424 st->st_errors++;
5425 return;
5426 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005427 if (strcmp(name, TOP) == 0)
5428 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005429 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005430 if (PyList_Append(prev->ste_children,
5431 (PyObject *)st->st_cur) < 0)
5432 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005433 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005434}
5435
5436static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005437symtable_lookup(struct symtable *st, char *name)
5438{
5439 char buffer[MANGLE_LEN];
5440 PyObject *v;
5441 int flags;
5442
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005443 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005444 name = buffer;
5445 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5446 if (v == NULL) {
5447 if (PyErr_Occurred())
5448 return -1;
5449 else
5450 return 0;
5451 }
5452
5453 flags = PyInt_AS_LONG(v);
5454 return flags;
5455}
5456
5457static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005458symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005459{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005460 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005461 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005462 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005463
Guido van Rossumb7164622002-08-16 02:48:11 +00005464 /* Warn about None, except inside a tuple (where the assignment
5465 code already issues a warning). */
5466 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5467 *name == 'N' && strcmp(name, "None") == 0)
5468 {
5469 if (symtable_warn(st, "argument named None"))
5470 return -1;
5471 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005472 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005473 name = buffer;
5474 if ((s = PyString_InternFromString(name)) == NULL)
5475 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005476 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5477 Py_DECREF(s);
5478 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005479}
5480
5481/* Must only be called with mangled names */
5482
5483static int
5484symtable_add_def_o(struct symtable *st, PyObject *dict,
5485 PyObject *name, int flag)
5486{
5487 PyObject *o;
5488 int val;
5489
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005490 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005491 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005492 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005493 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005494 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005495 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005496 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005497 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005498 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005499 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005500 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005501 if (o == NULL)
5502 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005503 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005504 Py_DECREF(o);
5505 return -1;
5506 }
5507 Py_DECREF(o);
5508
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005509 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005510 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005511 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005512 } else if (flag & DEF_GLOBAL) {
5513 /* XXX need to update DEF_GLOBAL for other flags too;
5514 perhaps only DEF_FREE_GLOBAL */
5515 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005516 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005517 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005518 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005519 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005520 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005521 if (o == NULL)
5522 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005523 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005524 Py_DECREF(o);
5525 return -1;
5526 }
5527 Py_DECREF(o);
5528 }
5529 return 0;
5530}
5531
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005532#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005533
Tim Peters08a898f2001-06-28 01:52:22 +00005534/* Look for a yield stmt under n. Return 1 if found, else 0.
5535 This hack is used to look inside "if 0:" blocks (which are normally
5536 ignored) in case those are the only places a yield occurs (so that this
5537 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005538static int
5539look_for_yield(node *n)
5540{
5541 int i;
5542
5543 for (i = 0; i < NCH(n); ++i) {
5544 node *kid = CHILD(n, i);
5545
5546 switch (TYPE(kid)) {
5547
5548 case classdef:
5549 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005550 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005551 /* Stuff in nested functions and classes can't make
5552 the parent a generator. */
5553 return 0;
5554
5555 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00005556 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005557
5558 default:
5559 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00005560 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005561 }
5562 }
5563 return 0;
5564}
5565
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005566static void
5567symtable_node(struct symtable *st, node *n)
5568{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005569 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005570
5571 loop:
5572 switch (TYPE(n)) {
5573 case funcdef: {
5574 char *func_name = STR(CHILD(n, 1));
5575 symtable_add_def(st, func_name, DEF_LOCAL);
5576 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005577 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005578 symtable_funcdef(st, n);
5579 symtable_exit_scope(st);
5580 break;
5581 }
5582 case lambdef:
5583 if (NCH(n) == 4)
5584 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005585 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005586 symtable_funcdef(st, n);
5587 symtable_exit_scope(st);
5588 break;
5589 case classdef: {
5590 char *tmp, *class_name = STR(CHILD(n, 1));
5591 symtable_add_def(st, class_name, DEF_LOCAL);
5592 if (TYPE(CHILD(n, 2)) == LPAR) {
5593 node *bases = CHILD(n, 3);
5594 int i;
5595 for (i = 0; i < NCH(bases); i += 2) {
5596 symtable_node(st, CHILD(bases, i));
5597 }
5598 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005599 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005600 tmp = st->st_private;
5601 st->st_private = class_name;
5602 symtable_node(st, CHILD(n, NCH(n) - 1));
5603 st->st_private = tmp;
5604 symtable_exit_scope(st);
5605 break;
5606 }
5607 case if_stmt:
5608 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005609 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5610 if (st->st_cur->ste_generator == 0)
5611 st->st_cur->ste_generator =
5612 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005613 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005614 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005615 symtable_node(st, CHILD(n, i + 1));
5616 symtable_node(st, CHILD(n, i + 3));
5617 }
5618 if (i + 2 < NCH(n))
5619 symtable_node(st, CHILD(n, i + 2));
5620 break;
5621 case global_stmt:
5622 symtable_global(st, n);
5623 break;
5624 case import_stmt:
5625 symtable_import(st, n);
5626 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005627 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005628 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005629 symtable_node(st, CHILD(n, 1));
5630 if (NCH(n) > 2)
5631 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005632 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005633 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005634 st->st_cur->ste_opt_lineno = n->n_lineno;
5635 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005636 if (NCH(n) > 4)
5637 symtable_node(st, CHILD(n, 5));
5638 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005639
5640 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005641 case assert_stmt:
5642 if (Py_OptimizeFlag)
5643 return;
5644 if (NCH(n) == 2) {
5645 n = CHILD(n, 1);
5646 goto loop;
5647 } else {
5648 symtable_node(st, CHILD(n, 1));
5649 n = CHILD(n, 3);
5650 goto loop;
5651 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005652 case except_clause:
5653 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005654 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005655 if (NCH(n) > 1) {
5656 n = CHILD(n, 1);
5657 goto loop;
5658 }
5659 break;
5660 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005661 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005662 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005663 case yield_stmt:
5664 st->st_cur->ste_generator = 1;
5665 n = CHILD(n, 1);
5666 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005667 case expr_stmt:
5668 if (NCH(n) == 1)
5669 n = CHILD(n, 0);
5670 else {
5671 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005672 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005673 symtable_node(st, CHILD(n, 2));
5674 break;
5675 } else {
5676 int i;
5677 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005678 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005679 n = CHILD(n, NCH(n) - 1);
5680 }
5681 }
5682 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005683 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005684 /* only occurs when there are multiple for loops
5685 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005686 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005687 if (TYPE(n) == list_for)
5688 symtable_list_for(st, n);
5689 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005690 REQ(n, list_if);
5691 symtable_node(st, CHILD(n, 1));
5692 if (NCH(n) == 3) {
5693 n = CHILD(n, 2);
5694 goto loop;
5695 }
5696 }
5697 break;
5698 case for_stmt:
5699 symtable_assign(st, CHILD(n, 1), 0);
5700 for (i = 3; i < NCH(n); ++i)
5701 if (TYPE(CHILD(n, i)) >= single_input)
5702 symtable_node(st, CHILD(n, i));
5703 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00005704 case arglist:
5705 if (NCH(n) > 1)
5706 for (i = 0; i < NCH(n); ++i) {
5707 node *ch = CHILD(n, i);
5708 if (TYPE(ch) == argument && NCH(ch) == 2 &&
5709 TYPE(CHILD(ch, 1)) == gen_for) {
5710 PyErr_SetString(PyExc_SyntaxError,
5711 "invalid syntax");
5712 symtable_error(st, n->n_lineno);
5713 return;
5714 }
5715 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005716 /* The remaining cases fall through to default except in
5717 special circumstances. This requires the individual cases
5718 to be coded with great care, even though they look like
5719 rather innocuous. Each case must double-check TYPE(n).
5720 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005721 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005722 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005723 n = CHILD(n, 2);
5724 goto loop;
5725 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00005726 else if (TYPE(n) == argument && NCH(n) == 2 &&
5727 TYPE(CHILD(n, 1)) == gen_for) {
5728 symtable_generator_expression(st, n);
5729 break;
5730 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005731 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005732 case listmaker:
5733 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005734 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005735 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005736 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005737 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00005738 case testlist_gexp:
5739 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
5740 symtable_generator_expression(st, n);
5741 break;
5742 }
5743 /* fall through */
5744
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005745 case atom:
5746 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5747 symtable_add_use(st, STR(CHILD(n, 0)));
5748 break;
5749 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005750 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005751 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005752 /* Walk over every non-token child with a special case
5753 for one child.
5754 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005755 if (NCH(n) == 1) {
5756 n = CHILD(n, 0);
5757 goto loop;
5758 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005759 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005760 if (TYPE(CHILD(n, i)) >= single_input)
5761 symtable_node(st, CHILD(n, i));
5762 }
5763}
5764
5765static void
5766symtable_funcdef(struct symtable *st, node *n)
5767{
5768 node *body;
5769
5770 if (TYPE(n) == lambdef) {
5771 if (NCH(n) == 4)
5772 symtable_params(st, CHILD(n, 1));
5773 } else
5774 symtable_params(st, CHILD(n, 2));
5775 body = CHILD(n, NCH(n) - 1);
5776 symtable_node(st, body);
5777}
5778
5779/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00005780 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005781 which are references in the defining scope. symtable_params()
5782 parses the parameter names, which are defined in the function's
5783 body.
5784
5785 varargslist:
5786 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5787 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5788*/
5789
5790static void
5791symtable_default_args(struct symtable *st, node *n)
5792{
5793 node *c;
5794 int i;
5795
5796 if (TYPE(n) == parameters) {
5797 n = CHILD(n, 1);
5798 if (TYPE(n) == RPAR)
5799 return;
5800 }
5801 REQ(n, varargslist);
5802 for (i = 0; i < NCH(n); i += 2) {
5803 c = CHILD(n, i);
5804 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5805 break;
5806 }
5807 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5808 symtable_node(st, CHILD(n, i));
5809 }
5810}
5811
5812static void
5813symtable_params(struct symtable *st, node *n)
5814{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005815 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00005816 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005817
5818 if (TYPE(n) == parameters) {
5819 n = CHILD(n, 1);
5820 if (TYPE(n) == RPAR)
5821 return;
5822 }
5823 REQ(n, varargslist);
5824 for (i = 0; i < NCH(n); i += 2) {
5825 c = CHILD(n, i);
5826 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5827 ext = 1;
5828 break;
5829 }
5830 if (TYPE(c) == test) {
5831 continue;
5832 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00005833 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005834 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00005835 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005836 char nbuf[30];
5837 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005838 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005839 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005840 }
5841 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005842 if (ext) {
5843 c = CHILD(n, i);
5844 if (TYPE(c) == STAR) {
5845 i++;
5846 symtable_add_def(st, STR(CHILD(n, i)),
5847 DEF_PARAM | DEF_STAR);
5848 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005849 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005850 c = NULL;
5851 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005852 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005853 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005854 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005855 i++;
5856 symtable_add_def(st, STR(CHILD(n, i)),
5857 DEF_PARAM | DEF_DOUBLESTAR);
5858 }
5859 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005860 if (complex >= 0) {
5861 int j;
5862 for (j = 0; j <= complex; j++) {
5863 c = CHILD(n, j);
5864 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005865 c = CHILD(n, ++j);
5866 else if (TYPE(c) == EQUAL)
5867 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005868 if (TYPE(CHILD(c, 0)) == LPAR)
5869 symtable_params_fplist(st, CHILD(c, 1));
5870 }
5871 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005872}
5873
5874static void
5875symtable_params_fplist(struct symtable *st, node *n)
5876{
5877 int i;
5878 node *c;
5879
5880 REQ(n, fplist);
5881 for (i = 0; i < NCH(n); i += 2) {
5882 c = CHILD(n, i);
5883 REQ(c, fpdef);
5884 if (NCH(c) == 1)
5885 symtable_add_def(st, STR(CHILD(c, 0)),
5886 DEF_PARAM | DEF_INTUPLE);
5887 else
5888 symtable_params_fplist(st, CHILD(c, 1));
5889 }
5890
5891}
5892
5893static void
5894symtable_global(struct symtable *st, node *n)
5895{
5896 int i;
5897
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005898 /* XXX It might be helpful to warn about module-level global
5899 statements, but it's hard to tell the difference between
5900 module-level and a string passed to exec.
5901 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005902
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005903 for (i = 1; i < NCH(n); i += 2) {
5904 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005905 int flags;
5906
5907 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005908 if (flags < 0)
5909 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005910 if (flags && flags != DEF_GLOBAL) {
5911 char buf[500];
5912 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005913 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005914 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00005915 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005916 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005917 }
5918 else {
5919 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005920 PyOS_snprintf(buf, sizeof(buf),
5921 GLOBAL_AFTER_ASSIGN,
5922 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005923 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005924 PyOS_snprintf(buf, sizeof(buf),
5925 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005926 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005927 }
5928 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005929 symtable_add_def(st, name, DEF_GLOBAL);
5930 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005931}
5932
5933static void
5934symtable_list_comprehension(struct symtable *st, node *n)
5935{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005936 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005937 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005938
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005939 REQ(n, listmaker);
5940 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
5941 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005942 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005943 symtable_list_for(st, CHILD(n, 1));
5944 symtable_node(st, CHILD(n, 0));
5945 --st->st_cur->ste_tmpname;
5946}
5947
5948static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00005949symtable_generator_expression(struct symtable *st, node *n)
5950{
5951 /* testlist_gexp: test gen_for */
5952 REQ(CHILD(n, 0), test);
5953 REQ(CHILD(n, 1), gen_for);
5954
5955 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
5956 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
5957
5958 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
5959
5960 symtable_gen_for(st, CHILD(n, 1), 1);
5961 symtable_node(st, CHILD(n, 0));
5962 symtable_exit_scope(st);
5963
5964 /* for outmost iterable precomputation */
5965 symtable_node(st, CHILD(CHILD(n, 1), 3));
5966}
5967
5968static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005969symtable_list_for(struct symtable *st, node *n)
5970{
5971 REQ(n, list_for);
5972 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005973 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005974 symtable_node(st, CHILD(n, 3));
5975 if (NCH(n) == 5)
5976 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005977}
5978
5979static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00005980symtable_gen_for(struct symtable *st, node *n, int is_outmost)
5981{
5982 REQ(n, gen_for);
5983
5984 /* gen_for: for v in test [gen_iter] */
5985 symtable_assign(st, CHILD(n, 1), 0);
5986 if (is_outmost)
5987 symtable_add_use(st, "[outmost-iterable]");
5988 else
5989 symtable_node(st, CHILD(n, 3));
5990
5991 if (NCH(n) == 5)
5992 symtable_gen_iter(st, CHILD(n, 4));
5993}
5994
5995static void
5996symtable_gen_iter(struct symtable *st, node *n)
5997{
5998 REQ(n, gen_iter);
5999
6000 n = CHILD(n, 0);
6001 if (TYPE(n) == gen_for)
6002 symtable_gen_for(st, n, 0);
6003 else {
6004 REQ(n, gen_if);
6005 symtable_node(st, CHILD(n, 1));
6006
6007 if (NCH(n) == 3)
6008 symtable_gen_iter(st, CHILD(n, 2));
6009 }
6010}
6011
6012static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006013symtable_import(struct symtable *st, node *n)
6014{
6015 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006016 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006017 | 'from' dotted_name 'import'
6018 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00006019 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006020 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006021 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006022 node *dotname = CHILD(n, 1);
6023 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6024 /* check for bogus imports */
6025 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6026 PyErr_SetString(PyExc_SyntaxError,
6027 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006028 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006029 return;
6030 }
6031 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006032 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006033 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006034 if (symtable_warn(st,
6035 "import * only allowed at module level") < 0)
6036 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006037 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006038 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006039 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006040 } else {
6041 for (i = 3; i < NCH(n); i += 2) {
6042 node *c = CHILD(n, i);
6043 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006044 symtable_assign(st, CHILD(c, 2),
6045 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006046 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006047 symtable_assign(st, CHILD(c, 0),
6048 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006049 }
6050 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006051 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006052 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006053 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006054 }
6055 }
6056}
6057
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006058/* The third argument to symatble_assign() is a flag to be passed to
6059 symtable_add_def() if it is eventually called. The flag is useful
6060 to specify the particular type of assignment that should be
6061 recorded, e.g. an assignment caused by import.
6062 */
6063
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006064static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006065symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006066{
6067 node *tmp;
6068 int i;
6069
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006070 loop:
6071 switch (TYPE(n)) {
6072 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006073 /* invalid assignment, e.g. lambda x:x=2. The next
6074 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006075 return;
6076 case power:
6077 if (NCH(n) > 2) {
6078 for (i = 2; i < NCH(n); ++i)
6079 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6080 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006081 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006082 if (NCH(n) > 1) {
6083 symtable_node(st, CHILD(n, 0));
6084 symtable_node(st, CHILD(n, 1));
6085 } else {
6086 n = CHILD(n, 0);
6087 goto loop;
6088 }
6089 return;
6090 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006091 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6092 /* XXX This is an error, but the next pass
6093 will catch it. */
6094 return;
6095 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006096 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006097 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006098 }
6099 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006100 case testlist_gexp:
6101 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6102 /* XXX This is an error, but the next pass
6103 will catch it. */
6104 return;
6105 } else {
6106 for (i = 0; i < NCH(n); i += 2)
6107 symtable_assign(st, CHILD(n, i), def_flag);
6108 }
6109 return;
6110
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006111 case exprlist:
6112 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006113 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006114 if (NCH(n) == 1) {
6115 n = CHILD(n, 0);
6116 goto loop;
6117 }
6118 else {
6119 int i;
6120 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006121 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006122 return;
6123 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006124 case atom:
6125 tmp = CHILD(n, 0);
6126 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6127 n = CHILD(n, 1);
6128 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006129 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006130 if (strcmp(STR(tmp), "__debug__") == 0) {
6131 PyErr_SetString(PyExc_SyntaxError,
6132 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006133 symtable_error(st, n->n_lineno);
6134 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006135 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006136 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006137 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006138 return;
6139 case dotted_as_name:
6140 if (NCH(n) == 3)
6141 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006142 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006143 else
6144 symtable_add_def(st,
6145 STR(CHILD(CHILD(n,
6146 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006147 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006148 return;
6149 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006150 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006151 return;
6152 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006153 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006154 return;
6155 default:
6156 if (NCH(n) == 0)
6157 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006158 if (NCH(n) == 1) {
6159 n = CHILD(n, 0);
6160 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006161 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006162 /* Should only occur for errors like x + 1 = 1,
6163 which will be caught in the next pass. */
6164 for (i = 0; i < NCH(n); ++i)
6165 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006166 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006167 }
6168}