blob: 337cc2ef02c0f3da1f22ce422554709c04c0b07e [file] [log] [blame]
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001/* Compile an expression node to intermediate code */
2
Guido van Rossum3f5da241990-12-20 15:06:42 +00003/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004 XXX add __doc__ attribute == co_doc to code object attributes?
5 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +00006 XXX Generate simple jump for break/return outside 'try...finally'
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00007 XXX Allow 'continue' inside finally clause of try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +00008 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +00009 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000010*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011
Guido van Rossum79f25d91997-04-29 20:08:16 +000012#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000013
Guido van Rossum10dc2e81990-11-18 17:27:39 +000014#include "node.h"
15#include "token.h"
16#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000017#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000018#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000019#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000020#include "structmember.h"
21
22#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000023
Guido van Rossumb05a5c71997-05-07 17:46:13 +000024/* Three symbols from graminit.h are also defined in Python.h, with
25 Py_ prefixes to their names. Python.h can't include graminit.h
26 (which defines too many confusing symbols), but we can check here
27 that they haven't changed (which is very unlikely, but possible). */
28#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000029 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000030#endif
31#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000032 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000033#endif
34#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000035 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000036#endif
37
Guido van Rossum8e793d91997-03-03 19:13:14 +000038int Py_OptimizeFlag = 0;
39
Guido van Rossum8861b741996-07-30 16:49:37 +000040#define OP_DELETE 0
41#define OP_ASSIGN 1
42#define OP_APPLY 2
43
Jeremy Hyltone36f7782001-01-19 03:21:30 +000044#define VAR_LOAD 0
45#define VAR_STORE 1
46#define VAR_DELETE 2
47
Jeremy Hylton64949cb2001-01-25 20:06:59 +000048#define DEL_CLOSURE_ERROR \
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000049"can not delete variable '%.400s' referenced in nested scope"
50
51#define DUPLICATE_ARGUMENT \
52"duplicate argument '%s' in function definition"
53
Jeremy Hylton29906ee2001-02-27 04:23:34 +000054#define GLOBAL_AFTER_ASSIGN \
55"name '%.400s' is assigned to before global declaration"
56
57#define GLOBAL_AFTER_USE \
58"name '%.400s' is used prior to global declaration"
59
Martin v. Löwisdd7eb142003-10-18 22:05:25 +000060#define PARAM_GLOBAL \
Neal Norwitz2a47c0f2002-01-29 00:53:41 +000061"name '%.400s' is a function parameter and declared global"
Jeremy Hylton29906ee2001-02-27 04:23:34 +000062
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +000063#define LATE_FUTURE \
64"from __future__ imports must occur at the beginning of the file"
65
Jeremy Hylton897b8212001-03-23 14:08:38 +000066#define ASSIGN_DEBUG \
67"can not assign to __debug__"
68
Jeremy Hyltone36f7782001-01-19 03:21:30 +000069#define MANGLE_LEN 256
70
Guido van Rossum79f25d91997-04-29 20:08:16 +000071#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000072
Guido van Rossum6f799372001-09-20 20:46:19 +000073static PyMemberDef code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000074 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
75 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000076 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000077 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000078 {"co_code", T_OBJECT, OFF(co_code), READONLY},
79 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
80 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000081 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000082 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
83 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000084 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000085 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000086 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
87 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000088 {NULL} /* Sentinel */
89};
90
Guido van Rossumbea18cc2002-06-14 20:41:17 +000091PyDoc_STRVAR(code_doc,
92"code(argcount, nlocals, stacksize, flags, codestring, constants, names,\n\
93 varnames, filename, name, firstlineno, lnotab[, freevars[, cellvars]])\n\
94\n\
95Create a code object. Not for the faint of heart.");
96
97static PyObject *
98code_new(PyTypeObject *type, PyObject *args, PyObject *kw)
99{
100 int argcount;
101 int nlocals;
102 int stacksize;
103 int flags;
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000104 PyObject *co;
Raymond Hettingercc1798e2003-09-16 04:27:52 +0000105 PyObject *empty = NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000106 PyObject *code;
107 PyObject *consts;
108 PyObject *names;
109 PyObject *varnames;
110 PyObject *freevars = NULL;
111 PyObject *cellvars = NULL;
112 PyObject *filename;
113 PyObject *name;
114 int firstlineno;
115 PyObject *lnotab;
116
117 if (!PyArg_ParseTuple(args, "iiiiSO!O!O!SSiS|O!O!:code",
118 &argcount, &nlocals, &stacksize, &flags,
119 &code,
120 &PyTuple_Type, &consts,
121 &PyTuple_Type, &names,
122 &PyTuple_Type, &varnames,
123 &filename, &name,
124 &firstlineno, &lnotab,
125 &PyTuple_Type, &freevars,
126 &PyTuple_Type, &cellvars))
127 return NULL;
128
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000129 if (!PyObject_CheckReadBuffer(code)) {
130 PyErr_SetString(PyExc_TypeError,
131 "bytecode object must be a single-segment read-only buffer");
132 return NULL;
133 }
134
Raymond Hettingercc1798e2003-09-16 04:27:52 +0000135 if (freevars == NULL || cellvars == NULL) {
136 empty = PyTuple_New(0);
137 if (empty == NULL)
138 return NULL;
139 if (freevars == NULL)
140 freevars = empty;
141 if (cellvars == NULL)
142 cellvars = empty;
143 }
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000144
145 co = (PyObject *) PyCode_New(argcount, nlocals, stacksize, flags,
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000146 code, consts, names, varnames,
147 freevars, cellvars, filename, name,
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000148 firstlineno, lnotab);
Raymond Hettingercc1798e2003-09-16 04:27:52 +0000149 Py_XDECREF(empty);
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000150 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000151}
152
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000153static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000154code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000155{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000156 Py_XDECREF(co->co_code);
157 Py_XDECREF(co->co_consts);
158 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000159 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000160 Py_XDECREF(co->co_freevars);
161 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000162 Py_XDECREF(co->co_filename);
163 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000164 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000165 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000166}
167
Guido van Rossum79f25d91997-04-29 20:08:16 +0000168static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000169code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000170{
171 char buf[500];
172 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000173 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000174 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000175
Guido van Rossuma396a882000-04-07 01:21:36 +0000176 if (co->co_firstlineno != 0)
177 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000178 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000179 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000180 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000181 name = PyString_AS_STRING(co->co_name);
Barry Warsaw8f6d8682001-11-28 21:10:39 +0000182 PyOS_snprintf(buf, sizeof(buf),
183 "<code object %.100s at %p, file \"%.300s\", line %d>",
184 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000185 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000186}
187
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000188static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000189code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000190{
191 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000192 cmp = PyObject_Compare(co->co_name, cp->co_name);
193 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000194 cmp = co->co_argcount - cp->co_argcount;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000195 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000196 cmp = co->co_nlocals - cp->co_nlocals;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000197 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000198 cmp = co->co_flags - cp->co_flags;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000199 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000200 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000201 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000202 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000203 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000204 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000205 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000206 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000207 if (cmp) return cmp;
208 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
209 if (cmp) return cmp;
210 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000211 return cmp;
212}
213
214static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000215code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000216{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000217 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000218 h0 = PyObject_Hash(co->co_name);
219 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000220 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000221 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000222 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000223 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000224 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000225 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000227 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000228 h5 = PyObject_Hash(co->co_freevars);
229 if (h5 == -1) return -1;
230 h6 = PyObject_Hash(co->co_cellvars);
231 if (h6 == -1) return -1;
232 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000233 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000234 if (h == -1) h = -2;
235 return h;
236}
237
Jeremy Hylton78891072001-03-01 06:09:34 +0000238/* XXX code objects need to participate in GC? */
239
Guido van Rossum79f25d91997-04-29 20:08:16 +0000240PyTypeObject PyCode_Type = {
241 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000242 0,
243 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000245 0,
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000246 (destructor)code_dealloc, /* tp_dealloc */
247 0, /* tp_print */
248 0, /* tp_getattr */
249 0, /* tp_setattr */
250 (cmpfunc)code_compare, /* tp_compare */
251 (reprfunc)code_repr, /* tp_repr */
252 0, /* tp_as_number */
253 0, /* tp_as_sequence */
254 0, /* tp_as_mapping */
255 (hashfunc)code_hash, /* tp_hash */
256 0, /* tp_call */
257 0, /* tp_str */
258 PyObject_GenericGetAttr, /* tp_getattro */
259 0, /* tp_setattro */
260 0, /* tp_as_buffer */
261 Py_TPFLAGS_DEFAULT, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000262 code_doc, /* tp_doc */
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000263 0, /* tp_traverse */
264 0, /* tp_clear */
265 0, /* tp_richcompare */
266 0, /* tp_weaklistoffset */
267 0, /* tp_iter */
268 0, /* tp_iternext */
269 0, /* tp_methods */
270 code_memberlist, /* tp_members */
271 0, /* tp_getset */
272 0, /* tp_base */
273 0, /* tp_dict */
274 0, /* tp_descr_get */
275 0, /* tp_descr_set */
276 0, /* tp_dictoffset */
277 0, /* tp_init */
278 0, /* tp_alloc */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000279 code_new, /* tp_new */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000280};
281
Guido van Rossum644a12b1997-04-09 19:24:53 +0000282#define NAME_CHARS \
283 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
284
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000285/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
286
287static int
288all_name_chars(unsigned char *s)
289{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000290 static char ok_name_char[256];
291 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000292
Guido van Rossumcd90c202001-02-09 15:06:42 +0000293 if (ok_name_char[*name_chars] == 0) {
294 unsigned char *p;
295 for (p = name_chars; *p; p++)
296 ok_name_char[*p] = 1;
297 }
298 while (*s) {
299 if (ok_name_char[*s++] == 0)
300 return 0;
301 }
302 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000303}
304
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000305static int
306intern_strings(PyObject *tuple)
307{
308 int i;
309
310 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
311 PyObject *v = PyTuple_GET_ITEM(tuple, i);
312 if (v == NULL || !PyString_Check(v)) {
313 Py_FatalError("non-string found in code slot");
314 PyErr_BadInternalCall();
315 return -1;
316 }
317 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
318 }
319 return 0;
320}
321
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000322#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
323#define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD)
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000324#define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE || op==CONTINUE_LOOP)
325#define GETJUMPTGT(arr, i) (GETARG(arr,i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+3))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000326#define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000327#define CODESIZE(op) (HAS_ARG(op) ? 3 : 1)
328#define ISBASICBLOCK(blocks, start, bytes) (blocks[start]==blocks[start+bytes-1])
329
330static unsigned int *
331markblocks(unsigned char *code, int len)
332{
333 unsigned int *blocks = PyMem_Malloc(len*sizeof(int));
334 int i,j, opcode, oldblock, newblock, blockcnt = 0;
335
336 if (blocks == NULL)
337 return NULL;
338 memset(blocks, 0, len*sizeof(int));
339 for (i=0 ; i<len ; i+=CODESIZE(opcode)) {
340 opcode = code[i];
341 switch (opcode) {
342 case FOR_ITER:
343 case JUMP_FORWARD:
344 case JUMP_IF_FALSE:
345 case JUMP_IF_TRUE:
346 case JUMP_ABSOLUTE:
347 case CONTINUE_LOOP:
348 case SETUP_LOOP:
349 case SETUP_EXCEPT:
350 case SETUP_FINALLY:
351 j = GETJUMPTGT(code, i);
352 oldblock = blocks[j];
353 newblock = ++blockcnt;
354 for (; j<len ; j++) {
355 if (blocks[j] != (unsigned)oldblock)
356 break;
357 blocks[j] = newblock;
358 }
359 break;
360 }
361 }
362 return blocks;
363}
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000364
365static PyObject *
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000366optimize_code(PyObject *code, PyObject* consts, PyObject *names)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000367{
368 int i, j, codelen;
369 int tgt, tgttgt, opcode;
370 unsigned char *codestr;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000371 unsigned int *blocks;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000372 char *name;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000373
374 /* Make a modifiable copy of the code string */
375 if (!PyString_Check(code))
376 goto exitUnchanged;
377 codelen = PyString_Size(code);
378 codestr = PyMem_Malloc(codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000379 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000380 goto exitUnchanged;
381 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000382 blocks = markblocks(codestr, codelen);
383 if (blocks == NULL) {
384 PyMem_Free(codestr);
385 goto exitUnchanged;
386 }
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000387 assert(PyTuple_Check(consts));
388
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000389 for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000390 opcode = codestr[i];
391 switch (opcode) {
392
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000393 /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with
394 with JUMP_IF_TRUE POP_TOP NOP */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000395 case UNARY_NOT:
396 if (codestr[i+1] != JUMP_IF_FALSE ||
397 codestr[i+4] != POP_TOP ||
398 !ISBASICBLOCK(blocks,i,5))
399 continue;
400 tgt = GETJUMPTGT(codestr, (i+1));
401 if (codestr[tgt] != POP_TOP)
402 continue;
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000403 j = GETARG(codestr, i+1) + 1;
404 codestr[i] = JUMP_IF_TRUE;
405 SETARG(codestr, i, j);
406 codestr[i+3] = POP_TOP;
407 codestr[i+4] = NOP;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000408 break;
409
410 /* not a is b --> a is not b
411 not a in b --> a not in b
412 not a is not b --> a is b
413 not a not in b --> a in b */
414 case COMPARE_OP:
415 j = GETARG(codestr, i);
416 if (j < 6 || j > 9 ||
417 codestr[i+3] != UNARY_NOT ||
418 !ISBASICBLOCK(blocks,i,4))
419 continue;
420 SETARG(codestr, i, (j^1));
421 codestr[i+3] = NOP;
Tim Petersdb5860b2004-07-17 05:00:52 +0000422 break;
423
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000424 /* Replace LOAD_GLOBAL/LOAD_NAME None with LOAD_CONST None */
425 case LOAD_NAME:
426 case LOAD_GLOBAL:
427 j = GETARG(codestr, i);
428 name = PyString_AsString(PyTuple_GET_ITEM(names, j));
429 if (name == NULL || strcmp(name, "None") != 0)
430 continue;
431 for (j=0 ; j < PyTuple_GET_SIZE(consts) ; j++) {
432 if (PyTuple_GET_ITEM(consts, j) == Py_None) {
433 codestr[i] = LOAD_CONST;
434 SETARG(codestr, i, j);
435 break;
436 }
437 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000438 break;
439
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000440 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP.
441 Note, only the first opcode is changed, the others still
442 perform normally if they happen to be jump targets. */
443 case LOAD_CONST:
444 j = GETARG(codestr, i);
445 if (codestr[i+3] != JUMP_IF_FALSE ||
446 codestr[i+6] != POP_TOP ||
447 !PyObject_IsTrue(PyTuple_GET_ITEM(consts, j)))
448 continue;
449 codestr[i] = JUMP_FORWARD;
450 SETARG(codestr, i, 4);
451 break;
452
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000453 /* Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2 JMP+2 NOP NOP.
454 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2 JMP+1 NOP. */
455 case BUILD_TUPLE:
456 case BUILD_LIST:
457 if (codestr[i+3] != UNPACK_SEQUENCE)
458 continue;
459 if (!ISBASICBLOCK(blocks,i,6))
460 continue;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000461 if (GETARG(codestr, i) == 2 &&
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000462 GETARG(codestr, i+3) == 2) {
463 codestr[i] = ROT_TWO;
464 codestr[i+1] = JUMP_FORWARD;
465 SETARG(codestr, i+1, 2);
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000466 codestr[i+4] = NOP;
467 codestr[i+5] = NOP;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000468 continue;
469 }
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000470 if (GETARG(codestr, i) == 3 &&
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000471 GETARG(codestr, i+3) == 3) {
472 codestr[i] = ROT_THREE;
473 codestr[i+1] = ROT_TWO;
474 codestr[i+2] = JUMP_FORWARD;
475 SETARG(codestr, i+2, 1);
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000476 codestr[i+5] = NOP;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000477 }
478 break;
479
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000480 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000481 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000482 case JUMP_FORWARD:
483 case JUMP_IF_FALSE:
484 case JUMP_IF_TRUE:
485 case JUMP_ABSOLUTE:
486 case CONTINUE_LOOP:
487 case SETUP_LOOP:
488 case SETUP_EXCEPT:
489 case SETUP_FINALLY:
490 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000491 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000492 continue;
493 tgttgt = GETJUMPTGT(codestr, tgt);
494 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
495 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000496 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000497 tgttgt -= i + 3; /* Calc relative jump addr */
498 if (tgttgt < 0) /* No backward relative jumps */
499 continue;
500 codestr[i] = opcode;
501 SETARG(codestr, i, tgttgt);
502 break;
503
504 case EXTENDED_ARG:
505 PyMem_Free(codestr);
506 goto exitUnchanged;
507 }
508 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000509 code = PyString_FromStringAndSize((char *)codestr, codelen);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000510 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000511 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000512 return code;
513
514exitUnchanged:
515 Py_INCREF(code);
516 return code;
517}
518
Guido van Rossum79f25d91997-04-29 20:08:16 +0000519PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000520PyCode_New(int argcount, int nlocals, int stacksize, int flags,
521 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000522 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
523 PyObject *filename, PyObject *name, int firstlineno,
524 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000525{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000526 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000527 int i;
528 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000529 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000530 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000531 consts == NULL || !PyTuple_Check(consts) ||
532 names == NULL || !PyTuple_Check(names) ||
533 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000534 freevars == NULL || !PyTuple_Check(freevars) ||
535 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000536 name == NULL || !PyString_Check(name) ||
537 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000538 lnotab == NULL || !PyString_Check(lnotab) ||
539 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000540 PyErr_BadInternalCall();
541 return NULL;
542 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000543 intern_strings(names);
544 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000545 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000546 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000547 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000548 for (i = PyTuple_Size(consts); --i >= 0; ) {
549 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000550 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000551 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000552 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000553 continue;
554 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000555 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000556 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000557 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000558 co->co_argcount = argcount;
559 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000560 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000561 co->co_flags = flags;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000562 co->co_code = optimize_code(code, consts, names);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000563 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000564 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000565 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000566 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000567 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000568 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000569 Py_INCREF(freevars);
570 co->co_freevars = freevars;
571 Py_INCREF(cellvars);
572 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000573 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000574 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000575 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000576 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000577 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000578 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000579 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000580 if (PyTuple_GET_SIZE(freevars) == 0 &&
581 PyTuple_GET_SIZE(cellvars) == 0)
582 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000583 }
584 return co;
585}
586
587
588/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000589
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000590/* The compiler uses two passes to generate bytecodes. The first pass
591 builds the symbol table. The second pass generates the bytecode.
592
593 The first pass uses a single symtable struct. The second pass uses
594 a compiling struct for each code block. The compiling structs
595 share a reference to the symtable.
596
597 The two passes communicate via symtable_load_symbols() and via
598 is_local() and is_global(). The former initializes several slots
599 in the compiling struct: c_varnames, c_locals, c_nlocals,
600 c_argcount, c_globals, and c_flags.
601*/
602
Tim Peters2a7f3842001-06-09 09:26:21 +0000603/* All about c_lnotab.
604
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000605c_lnotab is an array of unsigned bytes disguised as a Python string. Since
606version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
607mapped to source code line #s via c_lnotab instead.
608
Tim Peters2a7f3842001-06-09 09:26:21 +0000609The array is conceptually a list of
610 (bytecode offset increment, line number increment)
611pairs. The details are important and delicate, best illustrated by example:
612
613 byte code offset source code line number
614 0 1
615 6 2
616 50 7
617 350 307
618 361 308
619
620The first trick is that these numbers aren't stored, only the increments
621from one row to the next (this doesn't really work, but it's a start):
622
623 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
624
625The second trick is that an unsigned byte can't hold negative values, or
626values larger than 255, so (a) there's a deep assumption that byte code
627offsets and their corresponding line #s both increase monotonically, and (b)
628if at least one column jumps by more than 255 from one row to the next, more
629than one pair is written to the table. In case #b, there's no way to know
630from looking at the table later how many were written. That's the delicate
631part. A user of c_lnotab desiring to find the source line number
632corresponding to a bytecode address A should do something like this
633
634 lineno = addr = 0
635 for addr_incr, line_incr in c_lnotab:
636 addr += addr_incr
637 if addr > A:
638 return lineno
639 lineno += line_incr
640
641In order for this to work, when the addr field increments by more than 255,
642the line # increment in each pair generated must be 0 until the remaining addr
643increment is < 256. So, in the example above, com_set_lineno should not (as
644was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
645255, 0, 45, 255, 0, 45.
646*/
647
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000648struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000649 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000650 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000651 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000652 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000653 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +0000654 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000655 PyObject *c_locals; /* dictionary (value=localID) */
656 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000657 PyObject *c_freevars; /* dictionary (value=None) */
658 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000659 int c_nlocals; /* index of next local */
660 int c_argcount; /* number of top-level arguments */
661 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000662 int c_nexti; /* index into c_code */
663 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000664 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000665 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000666 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000667 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000668 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000669 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +0000670 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000671 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000672 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000673 int c_stacklevel; /* Current stack level */
674 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000675 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000676 PyObject *c_lnotab; /* Table mapping address to line number */
Armin Rigo80d937e2004-03-22 17:52:53 +0000677 int c_last_addr; /* last op addr seen and recorded in lnotab */
678 int c_last_line; /* last line seen and recorded in lnotab */
679 int c_lnotab_next; /* current length of lnotab */
680 int c_lnotab_last; /* start of last lnotab record added */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000681 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000682 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000683 int c_nested; /* Is block nested funcdef or lamdef? */
684 int c_closure; /* Is nested w/freevars? */
685 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000686 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000687 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000688};
689
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000690static int
691is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000692{
693 if ((v & (USE | DEF_FREE))
694 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
695 return 1;
696 if (v & DEF_FREE_CLASS)
697 return 1;
698 return 0;
699}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000700
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000701static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000702com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000703{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000704 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
705
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000706 if (c == NULL) {
707 /* Error occurred via symtable call to
708 is_constant_false */
709 PyErr_SetString(exc, msg);
710 return;
711 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000712 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000713 if (c->c_lineno < 1 || c->c_interactive) {
714 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000715 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000716 return;
717 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000718 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000719 if (v == NULL)
720 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000721
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000722 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000723 if (line == NULL) {
724 Py_INCREF(Py_None);
725 line = Py_None;
726 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000727 if (exc == PyExc_SyntaxError) {
728 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
729 Py_None, line);
730 if (t == NULL)
731 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000732 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000733 if (w == NULL)
734 goto exit;
735 PyErr_SetObject(exc, w);
736 } else {
737 /* Make sure additional exceptions are printed with
738 file and line, also. */
739 PyErr_SetObject(exc, v);
740 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
741 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000742 exit:
743 Py_XDECREF(t);
744 Py_XDECREF(v);
745 Py_XDECREF(w);
746 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000747}
748
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000749/* Interface to the block stack */
750
751static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000752block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000753{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000754 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000755 com_error(c, PyExc_SystemError,
756 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000757 }
758 else {
759 c->c_block[c->c_nblocks++] = type;
760 }
761}
762
763static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000764block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000765{
766 if (c->c_nblocks > 0)
767 c->c_nblocks--;
768 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000769 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000770 }
771}
772
Guido van Rossum681d79a1995-07-18 14:51:37 +0000773/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000774
Martin v. Löwis95292d62002-12-11 14:04:59 +0000775static int issue_warning(const char *, const char *, int);
776static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000777static void com_free(struct compiling *);
778static void com_push(struct compiling *, int);
779static void com_pop(struct compiling *, int);
780static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000781static void com_node(struct compiling *, node *);
782static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000783static void com_addbyte(struct compiling *, int);
784static void com_addint(struct compiling *, int);
785static void com_addoparg(struct compiling *, int, int);
786static void com_addfwref(struct compiling *, int, int *);
787static void com_backpatch(struct compiling *, int);
788static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
789static int com_addconst(struct compiling *, PyObject *);
790static int com_addname(struct compiling *, PyObject *);
791static void com_addopname(struct compiling *, int, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000792static void com_test(struct compiling *c, node *n);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000793static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000794static void com_list_iter(struct compiling *, node *, node *, char *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000795static void com_gen_iter(struct compiling *, node *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000796static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000797static void com_assign(struct compiling *, node *, int, node *);
798static void com_assign_name(struct compiling *, node *, int);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000799static int com_make_closure(struct compiling *c, PyCodeObject *co);
800
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000801static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +0000802static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000803 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000804static PyObject *parsestrplus(struct compiling*, node *);
805static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000806static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000807
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000808static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000809
810/* symtable operations */
Raymond Hettinger354433a2004-05-19 08:20:33 +0000811static int symtable_lookup(struct symtable *st, char *name);
Jeremy Hylton1955fcf2003-07-15 20:23:26 +0000812static struct symtable *symtable_build(node *, PyFutureFeatures *,
813 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000814static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000815static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000816static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000817static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000818static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000819static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000820
821static void symtable_node(struct symtable *, node *);
822static void symtable_funcdef(struct symtable *, node *);
823static void symtable_default_args(struct symtable *, node *);
824static void symtable_params(struct symtable *, node *);
825static void symtable_params_fplist(struct symtable *, node *n);
826static void symtable_global(struct symtable *, node *);
827static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000828static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000829static void symtable_list_comprehension(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000830static void symtable_generator_expression(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +0000831static void symtable_list_for(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000832static void symtable_gen_for(struct symtable *, node *, int);
833static void symtable_gen_iter(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000834
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000835static int symtable_update_free_vars(struct symtable *);
836static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
837static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
838
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000839/* helper */
840static void
841do_pad(int pad)
842{
843 int i;
844 for (i = 0; i < pad; ++i)
845 fprintf(stderr, " ");
846}
847
848static void
849dump(node *n, int pad, int depth)
850{
851 int i;
852 if (depth == 0)
853 return;
854 do_pad(pad);
855 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
856 if (depth > 0)
857 depth--;
858 for (i = 0; i < NCH(n); ++i)
859 dump(CHILD(n, i), pad + 1, depth);
860}
861
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000862static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000863com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000864{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000865 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000866 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
867 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000868 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000869 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000870 goto fail;
871 if ((c->c_const_dict = PyDict_New()) == NULL)
872 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000873 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000874 goto fail;
875 if ((c->c_name_dict = PyDict_New()) == NULL)
876 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000877 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000878 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000879 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
880 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000881 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000882 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000883 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000884 c->c_freevars = NULL;
885 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000886 c->c_nlocals = 0;
887 c->c_argcount = 0;
888 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000889 c->c_nexti = 0;
890 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000891 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000892 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000893 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000894 c->c_begin = 0;
895 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000896 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000897 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000898 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000899 c->c_stacklevel = 0;
900 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000901 c->c_firstlineno = 0;
902 c->c_last_addr = 0;
903 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000904 c->c_lnotab_next = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +0000905 c->c_lnotab_last = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000906 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000907 c->c_nested = 0;
908 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000909 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000910 return 1;
911
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000912 fail:
913 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000914 return 0;
915}
916
917static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000918com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000919{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000920 Py_XDECREF(c->c_code);
921 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000922 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000923 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000924 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000925 Py_XDECREF(c->c_globals);
926 Py_XDECREF(c->c_locals);
927 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000928 Py_XDECREF(c->c_freevars);
929 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000930 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000931 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +0000932 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000933}
934
935static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000936com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000937{
938 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000939 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +0000940 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000941 /*
942 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
943 c->c_filename, c->c_name, c->c_lineno,
944 c->c_nexti, c->c_stacklevel, n);
945 */
946 }
Guido van Rossum8b993a91997-01-17 21:04:03 +0000947}
948
949static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000950com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000951{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000952 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000953 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000954 else
955 c->c_stacklevel -= n;
956}
957
958static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000959com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000960{
961 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000962 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000963 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000964 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000965}
966
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000967static int
968com_check_size(PyObject **s, int offset)
969{
970 int len = PyString_GET_SIZE(*s);
971 if (offset >= len)
972 return _PyString_Resize(s, len * 2);
973 return 0;
974}
975
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000976static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000977com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000978{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000979 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000980 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +0000981 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000982 if (com_check_size(&c->c_code, c->c_nexti)) {
983 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000984 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000985 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000986 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000987}
988
989static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000990com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000991{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000992 com_addbyte(c, x & 0xff);
993 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000994}
995
996static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000997com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000998{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000999 char *p;
1000 if (c->c_lnotab == NULL)
1001 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001002 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
1003 c->c_errors++;
1004 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001005 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001006 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001007 *p++ = addr;
1008 *p++ = line;
1009 c->c_lnotab_next += 2;
1010}
1011
1012static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001013com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001014{
1015 c->c_lineno = lineno;
1016 if (c->c_firstlineno == 0) {
1017 c->c_firstlineno = c->c_last_line = lineno;
1018 }
1019 else {
1020 int incr_addr = c->c_nexti - c->c_last_addr;
1021 int incr_line = lineno - c->c_last_line;
Armin Rigo80d937e2004-03-22 17:52:53 +00001022 c->c_lnotab_last = c->c_lnotab_next;
Tim Peters2a7f3842001-06-09 09:26:21 +00001023 while (incr_addr > 255) {
1024 com_add_lnotab(c, 255, 0);
1025 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001026 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001027 while (incr_line > 255) {
1028 com_add_lnotab(c, incr_addr, 255);
1029 incr_line -=255;
1030 incr_addr = 0;
1031 }
1032 if (incr_addr > 0 || incr_line > 0)
1033 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001034 c->c_last_addr = c->c_nexti;
1035 c->c_last_line = lineno;
1036 }
1037}
1038
1039static void
Armin Rigo80d937e2004-03-22 17:52:53 +00001040com_strip_lnotab(struct compiling *c)
1041{
1042 /* strip the last lnotab entry if no opcode were emitted.
1043 * This prevents a line number to be generated on a final
1044 * pass, like in the following example:
1045 *
1046 * if a:
1047 * print 5
1048 * else:
1049 * pass
1050 *
1051 * Without the fix, a line trace event would be generated
1052 * on the pass even if a is true (because of the implicit
1053 * return).
1054 */
1055 if (c->c_nexti == c->c_last_addr && c->c_lnotab_last > 0) {
1056 c->c_lnotab_next = c->c_lnotab_last;
1057 }
1058}
1059
1060static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001061com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001062{
Fred Drakeef8ace32000-08-24 00:32:09 +00001063 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +00001064 if (extended_arg){
1065 com_addbyte(c, EXTENDED_ARG);
1066 com_addint(c, extended_arg);
1067 arg &= 0xffff;
1068 }
Guido van Rossum8e793d91997-03-03 19:13:14 +00001069 com_addbyte(c, op);
1070 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001071}
1072
1073static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001074com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001075{
1076 /* Compile a forward reference for backpatching */
1077 int here;
1078 int anchor;
1079 com_addbyte(c, op);
1080 here = c->c_nexti;
1081 anchor = *p_anchor;
1082 *p_anchor = here;
1083 com_addint(c, anchor == 0 ? 0 : here - anchor);
1084}
1085
1086static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001087com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001088{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001089 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001090 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001091 int dist;
1092 int prev;
1093 for (;;) {
1094 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001095 prev = code[anchor] + (code[anchor+1] << 8);
1096 dist = target - (anchor+2);
1097 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001098 dist >>= 8;
1099 code[anchor+1] = dist;
1100 dist >>= 8;
1101 if (dist) {
1102 com_error(c, PyExc_SystemError,
1103 "com_backpatch: offset too large");
1104 break;
1105 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001106 if (!prev)
1107 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001108 anchor -= prev;
1109 }
1110}
1111
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001112/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001113
1114static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001115com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001116{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001117 PyObject *w, *t, *np=NULL;
1118 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001119
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001120 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001121 if (t == NULL)
1122 goto fail;
1123 w = PyDict_GetItem(dict, t);
1124 if (w != NULL) {
1125 n = PyInt_AsLong(w);
1126 } else {
1127 n = PyList_Size(list);
1128 np = PyInt_FromLong(n);
1129 if (np == NULL)
1130 goto fail;
1131 if (PyList_Append(list, v) != 0)
1132 goto fail;
1133 if (PyDict_SetItem(dict, t, np) != 0)
1134 goto fail;
1135 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001136 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001137 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001138 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001139 fail:
1140 Py_XDECREF(np);
1141 Py_XDECREF(t);
1142 c->c_errors++;
1143 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001144}
1145
1146static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001147com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001148{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001149 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001150}
1151
1152static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001153com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001154{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001155 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001156}
1157
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001158int
1159_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001160{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001161 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001162 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001163 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001164 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1165 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001166 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001167 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001168 return 0; /* Don't mangle __extremely_long_names */
1169 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1170 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001171 /* Strip leading underscores from class name */
1172 while (*p == '_')
1173 p++;
1174 if (*p == '\0')
1175 return 0; /* Don't mangle if class is just underscores */
1176 plen = strlen(p);
1177 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001178 plen = maxlen-nlen-2; /* Truncate class name if too long */
1179 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001180 buffer[0] = '_';
1181 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001182 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001183 return 1;
1184}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001185
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001186static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001187com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001188{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001189 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001190 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001191 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001192
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001193 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001194 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001195 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001196 c->c_errors++;
1197 i = 255;
1198 }
1199 else {
1200 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001201 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001202 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001203 com_addoparg(c, op, i);
1204}
1205
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001206#define NAME_LOCAL 0
1207#define NAME_GLOBAL 1
1208#define NAME_DEFAULT 2
1209#define NAME_CLOSURE 3
1210
1211static int
1212com_lookup_arg(PyObject *dict, PyObject *name)
1213{
1214 PyObject *v = PyDict_GetItem(dict, name);
1215 if (v == NULL)
1216 return -1;
1217 else
1218 return PyInt_AS_LONG(v);
1219}
1220
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001221static int
1222none_assignment_check(struct compiling *c, char *name, int assigning)
1223{
1224 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1225 char *msg;
1226 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001227 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001228 else
1229 msg = "deleting None";
Raymond Hettinger11a70c72004-07-17 21:46:25 +00001230 com_error(c, PyExc_SyntaxError, msg);
1231 return -1;
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001232 }
1233 return 0;
1234}
1235
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001236static void
1237com_addop_varname(struct compiling *c, int kind, char *name)
1238{
1239 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001240 int i, reftype;
1241 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001242 int op = STOP_CODE;
1243 char buffer[MANGLE_LEN];
1244
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001245 if (kind != VAR_LOAD &&
1246 none_assignment_check(c, name, kind == VAR_STORE))
1247 {
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001248 i = 255;
1249 goto done;
1250 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001251 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001252 name = buffer;
1253 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1254 c->c_errors++;
1255 i = 255;
1256 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001257 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001258
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001259 reftype = get_ref_type(c, name);
1260 switch (reftype) {
1261 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001262 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001263 scope = NAME_LOCAL;
1264 break;
1265 case GLOBAL_EXPLICIT:
1266 scope = NAME_GLOBAL;
1267 break;
1268 case GLOBAL_IMPLICIT:
1269 if (c->c_flags & CO_OPTIMIZED)
1270 scope = NAME_GLOBAL;
1271 break;
1272 case FREE:
1273 case CELL:
1274 scope = NAME_CLOSURE;
1275 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001276 }
1277
1278 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001279 if (scope == NAME_LOCAL)
1280 i = com_lookup_arg(c->c_locals, v);
1281 else if (reftype == FREE)
1282 i = com_lookup_arg(c->c_freevars, v);
1283 else if (reftype == CELL)
1284 i = com_lookup_arg(c->c_cellvars, v);
1285 if (i == -1) {
1286 c->c_errors++; /* XXX no exception set */
1287 i = 255;
1288 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001289 }
1290 Py_DECREF(v);
1291
1292 switch (kind) {
1293 case VAR_LOAD:
1294 switch (scope) {
1295 case NAME_LOCAL:
1296 op = LOAD_FAST;
1297 break;
1298 case NAME_GLOBAL:
1299 op = LOAD_GLOBAL;
1300 break;
1301 case NAME_DEFAULT:
1302 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001303 break;
1304 case NAME_CLOSURE:
1305 op = LOAD_DEREF;
1306 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001307 }
1308 break;
1309 case VAR_STORE:
1310 switch (scope) {
1311 case NAME_LOCAL:
1312 op = STORE_FAST;
1313 break;
1314 case NAME_GLOBAL:
1315 op = STORE_GLOBAL;
1316 break;
1317 case NAME_DEFAULT:
1318 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001319 break;
1320 case NAME_CLOSURE:
1321 op = STORE_DEREF;
1322 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001323 }
1324 break;
1325 case VAR_DELETE:
1326 switch (scope) {
1327 case NAME_LOCAL:
1328 op = DELETE_FAST;
1329 break;
1330 case NAME_GLOBAL:
1331 op = DELETE_GLOBAL;
1332 break;
1333 case NAME_DEFAULT:
1334 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001335 break;
1336 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001337 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001338 PyOS_snprintf(buf, sizeof(buf),
1339 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001340 com_error(c, PyExc_SyntaxError, buf);
1341 i = 255;
1342 break;
1343 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001344 }
1345 break;
1346 }
1347done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001348 com_addoparg(c, op, i);
1349}
1350
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001351static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001352com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001353{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001354 char *name;
1355 char buffer[1000];
1356 /* XXX it is possible to write this code without the 1000
1357 chars on the total length of dotted names, I just can't be
1358 bothered right now */
1359 if (TYPE(n) == STAR)
1360 name = "*";
1361 else if (TYPE(n) == dotted_name) {
1362 char *p = buffer;
1363 int i;
1364 name = buffer;
1365 for (i = 0; i < NCH(n); i += 2) {
1366 char *s = STR(CHILD(n, i));
1367 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001368 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001369 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001370 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001371 break;
1372 }
1373 if (p != buffer)
1374 *p++ = '.';
1375 strcpy(p, s);
1376 p = strchr(p, '\0');
1377 }
1378 }
1379 else {
1380 REQ(n, NAME);
1381 name = STR(n);
1382 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001383 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001384}
1385
Guido van Rossum79f25d91997-04-29 20:08:16 +00001386static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001387parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001388{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001389 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001390 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001391 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001392#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001393 int imflag;
1394#endif
1395
Guido van Rossum282914b1991-04-04 10:42:56 +00001396 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001397 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001398#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001399 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001400#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001401 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001402 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001403 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001404 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001405 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001406 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001407 }
1408 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001409 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001410 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001411 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001412 if (errno != 0)
1413 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001414 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001415 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001416 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001417#ifndef WITHOUT_COMPLEX
1418 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001419 Py_complex z;
1420 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001421 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001422 z.imag = PyOS_ascii_atof(s);
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001423 PyFPE_END_PROTECT(z)
1424 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001425 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001426 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001427#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001428 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001429 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001430 dx = PyOS_ascii_atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001431 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001432 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001433 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001434}
1435
Guido van Rossum79f25d91997-04-29 20:08:16 +00001436static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001437decode_utf8(char **sPtr, char *end, char* encoding)
1438{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001439#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001440 Py_FatalError("decode_utf8 should not be called in this build.");
1441 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001442#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001443 PyObject *u, *v;
1444 char *s, *t;
1445 t = s = *sPtr;
1446 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1447 while (s < end && (*s & 0x80)) s++;
1448 *sPtr = s;
1449 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1450 if (u == NULL)
1451 return NULL;
1452 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1453 Py_DECREF(u);
1454 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001455#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001456}
1457
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001458/* compiler.transformer.Transformer.decode_literal depends on what
1459 might seem like minor details of this function -- changes here
1460 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001461static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001462parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001463{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001464 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001465 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001466 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001467 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001468 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001469 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001470 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001471
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001472 if (isalpha(quote) || quote == '_') {
1473 if (quote == 'u' || quote == 'U') {
1474 quote = *++s;
1475 unicode = 1;
1476 }
1477 if (quote == 'r' || quote == 'R') {
1478 quote = *++s;
1479 rawmode = 1;
1480 }
1481 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001482 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001483 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001484 return NULL;
1485 }
1486 s++;
1487 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001488 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001489 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001490 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001491 return NULL;
1492 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001493 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001494 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001495 return NULL;
1496 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001497 if (len >= 4 && s[0] == quote && s[1] == quote) {
1498 s += 2;
1499 len -= 2;
1500 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001501 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001502 return NULL;
1503 }
1504 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001505#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001506 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001507 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001508 char *buf;
1509 char *p;
1510 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001511 if (encoding == NULL) {
1512 buf = s;
1513 u = NULL;
1514 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1515 buf = s;
1516 u = NULL;
1517 } else {
1518 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1519 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1520 if (u == NULL)
1521 return NULL;
1522 p = buf = PyString_AsString(u);
1523 end = s + len;
1524 while (s < end) {
1525 if (*s == '\\') {
1526 *p++ = *s++;
1527 if (*s & 0x80) {
1528 strcpy(p, "u005c");
1529 p += 5;
1530 }
1531 }
1532 if (*s & 0x80) { /* XXX inefficient */
1533 char *r;
1534 int rn, i;
1535 w = decode_utf8(&s, end, "utf-16-be");
1536 if (w == NULL) {
1537 Py_DECREF(u);
1538 return NULL;
1539 }
1540 r = PyString_AsString(w);
1541 rn = PyString_Size(w);
1542 assert(rn % 2 == 0);
1543 for (i = 0; i < rn; i += 2) {
1544 sprintf(p, "\\u%02x%02x",
1545 r[i + 0] & 0xFF,
1546 r[i + 1] & 0xFF);
1547 p += 6;
1548 }
1549 Py_DECREF(w);
1550 } else {
1551 *p++ = *s++;
1552 }
1553 }
1554 len = p - buf;
1555 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001556 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001557 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001558 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001559 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1560 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001561 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001562 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001563 return v;
1564
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001565 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001566#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001567 need_encoding = (encoding != NULL &&
1568 strcmp(encoding, "utf-8") != 0 &&
1569 strcmp(encoding, "iso-8859-1") != 0);
1570 if (rawmode || strchr(s, '\\') == NULL) {
1571 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001572#ifndef Py_USING_UNICODE
1573 /* This should not happen - we never see any other
1574 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001575 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001576#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001577 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1578 if (u == NULL)
1579 return NULL;
1580 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1581 Py_DECREF(u);
1582 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001583#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001584 } else {
1585 return PyString_FromStringAndSize(s, len);
1586 }
1587 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001588
1589 v = PyString_DecodeEscape(s, len, NULL, unicode,
1590 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001591 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001592 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001593 return v;
1594}
1595
Guido van Rossum79f25d91997-04-29 20:08:16 +00001596static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001597parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001598{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001599 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001600 int i;
1601 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001602 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001603 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001604 for (i = 1; i < NCH(n); i++) {
1605 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001606 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001607 if (s == NULL)
1608 goto onError;
1609 if (PyString_Check(v) && PyString_Check(s)) {
1610 PyString_ConcatAndDel(&v, s);
1611 if (v == NULL)
1612 goto onError;
1613 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001614#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001615 else {
1616 PyObject *temp;
1617 temp = PyUnicode_Concat(v, s);
1618 Py_DECREF(s);
1619 if (temp == NULL)
1620 goto onError;
1621 Py_DECREF(v);
1622 v = temp;
1623 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001624#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001625 }
1626 }
1627 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001628
1629 onError:
1630 Py_XDECREF(v);
1631 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001632}
1633
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001634static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001635com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001636{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001637 int anchor = 0;
1638 int save_begin = c->c_begin;
1639
Raymond Hettinger354433a2004-05-19 08:20:33 +00001640 /* list_for: for v in expr [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001641 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001642 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001643 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001644 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001645 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001646 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001647 c->c_loops++;
1648 com_list_iter(c, n, e, t);
1649 c->c_loops--;
1650 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1651 c->c_begin = save_begin;
1652 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001653 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001654}
1655
1656static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001657com_gen_for(struct compiling *c, node *n, node *t, int is_outmost)
1658{
1659 int break_anchor = 0;
1660 int anchor = 0;
1661 int save_begin = c->c_begin;
1662
1663 REQ(n, gen_for);
1664 /* gen_for: for v in test [gen_iter] */
1665
1666 com_addfwref(c, SETUP_LOOP, &break_anchor);
1667 block_push(c, SETUP_LOOP);
1668
1669 if (is_outmost) {
1670 com_addop_varname(c, VAR_LOAD, "[outmost-iterable]");
1671 com_push(c, 1);
1672 }
1673 else {
1674 com_node(c, CHILD(n, 3));
1675 com_addbyte(c, GET_ITER);
1676 }
1677
1678 c->c_begin = c->c_nexti;
1679 com_set_lineno(c, c->c_last_line);
1680 com_addfwref(c, FOR_ITER, &anchor);
1681 com_push(c, 1);
1682 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
1683
1684 if (NCH(n) == 5)
1685 com_gen_iter(c, CHILD(n, 4), t);
1686 else {
1687 com_test(c, t);
1688 com_addbyte(c, YIELD_VALUE);
1689 com_pop(c, 1);
1690 }
1691
1692 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1693 c->c_begin = save_begin;
1694
1695 com_backpatch(c, anchor);
1696 com_pop(c, 1); /* FOR_ITER has popped this */
1697 com_addbyte(c, POP_BLOCK);
1698 block_pop(c, SETUP_LOOP);
1699 com_backpatch(c, break_anchor);
1700}
1701
1702static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001703com_list_if(struct compiling *c, node *n, node *e, char *t)
1704{
1705 int anchor = 0;
1706 int a = 0;
1707 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001708 com_node(c, CHILD(n, 1));
1709 com_addfwref(c, JUMP_IF_FALSE, &a);
1710 com_addbyte(c, POP_TOP);
1711 com_pop(c, 1);
1712 com_list_iter(c, n, e, t);
1713 com_addfwref(c, JUMP_FORWARD, &anchor);
1714 com_backpatch(c, a);
1715 /* We jump here with an extra entry which we now pop */
1716 com_addbyte(c, POP_TOP);
1717 com_backpatch(c, anchor);
1718}
1719
1720static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001721com_gen_if(struct compiling *c, node *n, node *t)
1722{
1723 /* gen_if: 'if' test [gen_iter] */
1724 int anchor = 0;
1725 int a=0;
1726
1727 com_node(c, CHILD(n, 1));
1728 com_addfwref(c, JUMP_IF_FALSE, &a);
1729 com_addbyte(c, POP_TOP);
1730 com_pop(c, 1);
1731
1732 if (NCH(n) == 3)
1733 com_gen_iter(c, CHILD(n, 2), t);
1734 else {
1735 com_test(c, t);
1736 com_addbyte(c, YIELD_VALUE);
1737 com_pop(c, 1);
1738 }
1739 com_addfwref(c, JUMP_FORWARD, &anchor);
1740 com_backpatch(c, a);
1741 /* We jump here with an extra entry which we now pop */
1742 com_addbyte(c, POP_TOP);
1743 com_backpatch(c, anchor);
1744}
1745
1746static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001747com_list_iter(struct compiling *c,
1748 node *p, /* parent of list_iter node */
1749 node *e, /* element expression node */
1750 char *t /* name of result list temp local */)
1751{
1752 /* list_iter is the last child in a listmaker, list_for, or list_if */
1753 node *n = CHILD(p, NCH(p)-1);
1754 if (TYPE(n) == list_iter) {
1755 n = CHILD(n, 0);
1756 switch (TYPE(n)) {
1757 case list_for:
1758 com_list_for(c, n, e, t);
1759 break;
1760 case list_if:
1761 com_list_if(c, n, e, t);
1762 break;
1763 default:
1764 com_error(c, PyExc_SystemError,
1765 "invalid list_iter node type");
1766 }
1767 }
1768 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001769 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001770 com_push(c, 1);
1771 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001772 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001773 com_pop(c, 2);
1774 }
1775}
1776
1777static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001778com_gen_iter(struct compiling *c, node *n, node *t)
1779{
1780 /* gen_iter: gen_for | gen_if */
1781 node *ch;
1782 REQ(n, gen_iter);
1783
1784 ch = CHILD(n, 0);
1785
1786 switch (TYPE(ch)) {
1787 case gen_for:
1788 com_gen_for(c, ch, t, 0);
1789 break;
1790 case gen_if:
1791 com_gen_if(c, ch, t);
1792 break;
1793 default:
1794 com_error(c, PyExc_SystemError,
1795 "invalid gen_iter node type");
1796 }
1797}
1798
1799static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001800com_list_comprehension(struct compiling *c, node *n)
1801{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001802 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001803 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001804
1805 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001806 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001807 com_addoparg(c, BUILD_LIST, 0);
1808 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1809 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001810 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001811 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001812 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001813 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001814 --c->c_tmpname;
1815}
1816
1817static void
1818com_listmaker(struct compiling *c, node *n)
1819{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001820 /* listmaker: test ( list_for | (',' test)* [','] ) */
1821 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001822 com_list_comprehension(c, n);
1823 else {
1824 int len = 0;
1825 int i;
1826 for (i = 0; i < NCH(n); i += 2, len++)
1827 com_node(c, CHILD(n, i));
1828 com_addoparg(c, BUILD_LIST, len);
1829 com_pop(c, len-1);
1830 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001831}
1832
1833static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001834com_generator_expression(struct compiling *c, node *n)
1835{
1836 /* testlist_gexp: test gen_for */
1837 /* argument: test gen_for */
1838 PyCodeObject *co;
1839
1840 REQ(CHILD(n, 0), test);
1841 REQ(CHILD(n, 1), gen_for);
1842
1843 symtable_enter_scope(c->c_symtable, "<genexpr>", TYPE(n),
1844 n->n_lineno);
1845 co = icompile(n, c);
1846 symtable_exit_scope(c->c_symtable);
1847
1848 if (co == NULL)
1849 c->c_errors++;
1850 else {
1851 int closure = com_make_closure(c, co);
1852 int i = com_addconst(c, (PyObject *)co);
1853
1854 com_addoparg(c, LOAD_CONST, i);
1855 com_push(c, 1);
1856 if (closure)
1857 com_addoparg(c, MAKE_CLOSURE, 0);
1858 else
1859 com_addoparg(c, MAKE_FUNCTION, 0);
1860
1861 com_test(c, CHILD(CHILD(n, 1), 3));
1862 com_addbyte(c, GET_ITER);
1863 com_addoparg(c, CALL_FUNCTION, 1);
1864 com_pop(c, 1);
1865
1866 Py_DECREF(co);
1867 }
1868}
1869
1870static void
1871com_testlist_gexp(struct compiling *c, node *n)
1872{
1873 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
1874 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
1875 com_generator_expression(c, n);
1876 else com_list(c, n, 0);
1877}
1878
Anthony Baxterc2a5a632004-08-02 06:10:11 +00001879
Raymond Hettinger354433a2004-05-19 08:20:33 +00001880static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001881com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001882{
1883 int i;
1884 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1885 for (i = 0; i+2 < NCH(n); i += 4) {
1886 /* We must arrange things just right for STORE_SUBSCR.
1887 It wants the stack to look like (value) (dict) (key) */
1888 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001889 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001890 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00001891 com_node(c, CHILD(n, i+2)); /* value */
1892 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001893 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001894 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001895 }
1896}
1897
1898static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001899com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001900{
1901 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001902 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001903 int i;
1904 REQ(n, atom);
1905 ch = CHILD(n, 0);
1906 switch (TYPE(ch)) {
1907 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001908 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001909 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001910 com_push(c, 1);
1911 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001912 else
Raymond Hettinger354433a2004-05-19 08:20:33 +00001913 com_testlist_gexp(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001914 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001915 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001916 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001917 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001918 com_push(c, 1);
1919 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001920 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001921 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001922 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001923 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001924 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001925 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001926 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001927 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001928 break;
1929 case BACKQUOTE:
1930 com_node(c, CHILD(n, 1));
1931 com_addbyte(c, UNARY_CONVERT);
1932 break;
1933 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001934 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001935 i = 255;
1936 }
1937 else {
1938 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001939 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001940 }
1941 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001942 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001943 break;
1944 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001945 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001946 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001947 c->c_errors++;
1948 i = 255;
1949 }
1950 else {
1951 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001952 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001953 }
1954 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001955 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001956 break;
1957 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001958 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001959 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001960 break;
1961 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001962 com_error(c, PyExc_SystemError,
1963 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001964 }
1965}
1966
1967static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001968com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001969{
1970 if (NCH(n) == 1) {
1971 com_addbyte(c, op);
1972 }
1973 else if (NCH(n) == 2) {
1974 if (TYPE(CHILD(n, 0)) != COLON) {
1975 com_node(c, CHILD(n, 0));
1976 com_addbyte(c, op+1);
1977 }
1978 else {
1979 com_node(c, CHILD(n, 1));
1980 com_addbyte(c, op+2);
1981 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001982 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001983 }
1984 else {
1985 com_node(c, CHILD(n, 0));
1986 com_node(c, CHILD(n, 2));
1987 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001988 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001989 }
1990}
1991
Guido van Rossum635abd21997-01-06 22:56:52 +00001992static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001993com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1994{
1995 if (NCH(n) == 1) {
1996 com_addbyte(c, DUP_TOP);
1997 com_push(c, 1);
1998 com_addbyte(c, SLICE);
1999 com_node(c, augn);
2000 com_addbyte(c, opcode);
2001 com_pop(c, 1);
2002 com_addbyte(c, ROT_TWO);
2003 com_addbyte(c, STORE_SLICE);
2004 com_pop(c, 2);
2005 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
2006 com_node(c, CHILD(n, 0));
2007 com_addoparg(c, DUP_TOPX, 2);
2008 com_push(c, 2);
2009 com_addbyte(c, SLICE+1);
2010 com_pop(c, 1);
2011 com_node(c, augn);
2012 com_addbyte(c, opcode);
2013 com_pop(c, 1);
2014 com_addbyte(c, ROT_THREE);
2015 com_addbyte(c, STORE_SLICE+1);
2016 com_pop(c, 3);
2017 } else if (NCH(n) == 2) {
2018 com_node(c, CHILD(n, 1));
2019 com_addoparg(c, DUP_TOPX, 2);
2020 com_push(c, 2);
2021 com_addbyte(c, SLICE+2);
2022 com_pop(c, 1);
2023 com_node(c, augn);
2024 com_addbyte(c, opcode);
2025 com_pop(c, 1);
2026 com_addbyte(c, ROT_THREE);
2027 com_addbyte(c, STORE_SLICE+2);
2028 com_pop(c, 3);
2029 } else {
2030 com_node(c, CHILD(n, 0));
2031 com_node(c, CHILD(n, 2));
2032 com_addoparg(c, DUP_TOPX, 3);
2033 com_push(c, 3);
2034 com_addbyte(c, SLICE+3);
2035 com_pop(c, 2);
2036 com_node(c, augn);
2037 com_addbyte(c, opcode);
2038 com_pop(c, 1);
2039 com_addbyte(c, ROT_FOUR);
2040 com_addbyte(c, STORE_SLICE+3);
2041 com_pop(c, 4);
2042 }
2043}
2044
2045static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002046com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002047{
2048 node *m;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002049 REQ(n, argument); /* [test '='] test [gen_for]; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00002050 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00002051 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002052 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00002053 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002054 }
2055 else {
2056 com_node(c, CHILD(n, 0));
2057 }
Guido van Rossum635abd21997-01-06 22:56:52 +00002058 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002059 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00002060 if (NCH(n) == 2) {
2061 com_generator_expression(c, n);
2062 return;
2063 }
2064
Guido van Rossumf10570b1995-07-07 22:53:21 +00002065 m = n;
2066 do {
2067 m = CHILD(m, 0);
2068 } while (NCH(m) == 1);
2069 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00002070 /* f(lambda x: x[0] = 3) ends up getting parsed with
2071 * LHS test = lambda x: x[0], and RHS test = 3.
2072 * SF bug 132313 points out that complaining about a keyword
2073 * then is very confusing.
2074 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002075 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00002076 TYPE(m) == lambdef ?
2077 "lambda cannot contain assignment" :
2078 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002079 }
2080 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002081 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00002082 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00002083 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002084 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002085 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002086 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002087 else if (*pkeywords == NULL) {
2088 c->c_errors++;
2089 Py_DECREF(v);
2090 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002091 if (PyDict_GetItem(*pkeywords, v) != NULL)
2092 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00002093 "duplicate keyword argument");
2094 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002095 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00002096 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002097 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002098 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002099 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002100 }
2101 }
2102 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002103}
2104
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002105static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002106com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002107{
2108 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00002109 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002110 }
2111 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002112 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00002113 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00002114 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00002115 int star_flag = 0;
2116 int starstar_flag = 0;
2117 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002118 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002119 na = 0;
2120 nk = 0;
2121 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00002122 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00002123 if (TYPE(ch) == STAR ||
2124 TYPE(ch) == DOUBLESTAR)
2125 break;
Guido van Rossumca906051998-12-10 16:56:22 +00002126 if (ch->n_lineno != lineno) {
2127 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002128 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00002129 }
2130 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00002131 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002132 na++;
2133 else
2134 nk++;
2135 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002136 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00002137 while (i < NCH(n)) {
2138 node *tok = CHILD(n, i);
2139 node *ch = CHILD(n, i+1);
2140 i += 3;
2141 switch (TYPE(tok)) {
2142 case STAR: star_flag = 1; break;
2143 case DOUBLESTAR: starstar_flag = 1; break;
2144 }
2145 com_node(c, ch);
2146 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002147 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002148 com_error(c, PyExc_SyntaxError,
2149 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002150 }
Jeremy Hylton76901512000-03-28 23:49:17 +00002151 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00002152 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00002153 star_flag + (starstar_flag << 1);
2154 else
2155 opcode = CALL_FUNCTION;
2156 com_addoparg(c, opcode, na | (nk << 8));
2157 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002158 }
2159}
2160
2161static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002162com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002163{
2164 com_addopname(c, LOAD_ATTR, n);
2165}
2166
2167static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002168com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002169{
2170 int i=0;
2171 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00002172 node *ch;
2173
2174 /* first argument */
2175 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002176 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002177 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002178 i++;
2179 }
2180 else {
2181 com_node(c, CHILD(n,i));
2182 i++;
2183 REQ(CHILD(n,i),COLON);
2184 i++;
2185 }
2186 /* second argument */
2187 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
2188 com_node(c, CHILD(n,i));
2189 i++;
2190 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002191 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002192 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002193 com_push(c, 1);
2194 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002195 /* remaining arguments */
2196 for (; i < NCH(n); i++) {
2197 ns++;
2198 ch=CHILD(n,i);
2199 REQ(ch, sliceop);
2200 if (NCH(ch) == 1) {
2201 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002202 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002203 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002204 }
2205 else
2206 com_node(c, CHILD(ch,1));
2207 }
2208 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002209 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002210}
2211
2212static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002213com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002214{
2215 node *ch;
2216 REQ(n, subscript);
2217 ch = CHILD(n,0);
2218 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002219 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002220 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002221 com_push(c, 1);
2222 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002223 else {
2224 /* check for slice */
2225 if ((TYPE(ch) == COLON || NCH(n) > 1))
2226 com_sliceobj(c, n);
2227 else {
2228 REQ(ch, test);
2229 com_node(c, ch);
2230 }
2231 }
2232}
2233
2234static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002235com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002236{
2237 int i, op;
2238 REQ(n, subscriptlist);
2239 /* Check to make backward compatible slice behavior for '[i:j]' */
2240 if (NCH(n) == 1) {
2241 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002242 /* 'Basic' slice, should have exactly one colon. */
2243 if ((TYPE(CHILD(sub, 0)) == COLON
2244 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2245 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2246 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002247 switch (assigning) {
2248 case OP_DELETE:
2249 op = DELETE_SLICE;
2250 break;
2251 case OP_ASSIGN:
2252 op = STORE_SLICE;
2253 break;
2254 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002255 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002256 break;
2257 default:
2258 com_augassign_slice(c, sub, assigning, augn);
2259 return;
2260 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002261 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002262 if (op == STORE_SLICE)
2263 com_pop(c, 2);
2264 else if (op == DELETE_SLICE)
2265 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002266 return;
2267 }
2268 }
2269 /* Else normal subscriptlist. Compile each subscript. */
2270 for (i = 0; i < NCH(n); i += 2)
2271 com_subscript(c, CHILD(n, i));
2272 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002273 if (NCH(n) > 1) {
2274 i = (NCH(n)+1) / 2;
2275 com_addoparg(c, BUILD_TUPLE, i);
2276 com_pop(c, i-1);
2277 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002278 switch (assigning) {
2279 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002280 op = DELETE_SUBSCR;
2281 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002282 break;
2283 default:
2284 case OP_ASSIGN:
2285 op = STORE_SUBSCR;
2286 i = 3;
2287 break;
2288 case OP_APPLY:
2289 op = BINARY_SUBSCR;
2290 i = 1;
2291 break;
2292 }
2293 if (assigning > OP_APPLY) {
2294 com_addoparg(c, DUP_TOPX, 2);
2295 com_push(c, 2);
2296 com_addbyte(c, BINARY_SUBSCR);
2297 com_pop(c, 1);
2298 com_node(c, augn);
2299 com_addbyte(c, assigning);
2300 com_pop(c, 1);
2301 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002302 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002303 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002304 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002305}
2306
2307static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002308com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002309{
2310 REQ(n, trailer);
2311 switch (TYPE(CHILD(n, 0))) {
2312 case LPAR:
2313 com_call_function(c, CHILD(n, 1));
2314 break;
2315 case DOT:
2316 com_select_member(c, CHILD(n, 1));
2317 break;
2318 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002319 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002320 break;
2321 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002322 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002323 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002324 }
2325}
2326
2327static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002328com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002329{
2330 int i;
2331 REQ(n, power);
2332 com_atom(c, CHILD(n, 0));
2333 for (i = 1; i < NCH(n); i++) {
2334 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2335 com_factor(c, CHILD(n, i+1));
2336 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002337 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002338 break;
2339 }
2340 else
2341 com_apply_trailer(c, CHILD(n, i));
2342 }
2343}
2344
2345static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002346com_invert_constant(struct compiling *c, node *n)
2347{
2348 /* Compute the inverse of int and longs and use them directly,
2349 but be prepared to generate code for all other
2350 possibilities (invalid numbers, floats, complex).
2351 */
2352 PyObject *num, *inv = NULL;
2353 int i;
2354
2355 REQ(n, NUMBER);
2356 num = parsenumber(c, STR(n));
2357 if (num == NULL)
2358 i = 255;
2359 else {
2360 inv = PyNumber_Invert(num);
2361 if (inv == NULL) {
2362 PyErr_Clear();
2363 i = com_addconst(c, num);
2364 } else {
2365 i = com_addconst(c, inv);
2366 Py_DECREF(inv);
2367 }
2368 Py_DECREF(num);
2369 }
2370 com_addoparg(c, LOAD_CONST, i);
2371 com_push(c, 1);
2372 if (num != NULL && inv == NULL)
2373 com_addbyte(c, UNARY_INVERT);
2374}
2375
Tim Peters51e26512001-09-07 08:45:55 +00002376static int
2377is_float_zero(const char *p)
2378{
2379 int found_radix_point = 0;
2380 int ch;
2381 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2382 switch (ch) {
2383 case '0':
2384 /* no reason to believe it's not 0 -- continue */
2385 break;
2386
2387 case 'e': case 'E': case 'j': case 'J':
2388 /* If this was a hex constant, we already would have
2389 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2390 must be an exponent marker, and we haven't yet
2391 seen a non-zero digit, and it doesn't matter what
2392 the exponent is then. For 'j' or 'J' similarly,
2393 except that this is an imaginary 0 then. */
2394 return 1;
2395
2396 case '.':
2397 found_radix_point = 1;
2398 break;
2399
2400 default:
2401 return 0;
2402 }
2403 }
2404 return found_radix_point;
2405}
2406
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002407static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002408com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002409{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002410 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002411 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002412 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002413 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002414 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002415 approriate value as a constant. If the value is negative,
2416 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002417 negative in the 0th position -- unless we're doing unary minus
2418 of a floating zero! In that case the sign is significant, but
2419 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002420 */
2421 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002422 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002423 && TYPE((pfactor = CHILD(n, 1))) == factor
2424 && NCH(pfactor) == 1
2425 && TYPE((ppower = CHILD(pfactor, 0))) == power
2426 && NCH(ppower) == 1
2427 && TYPE((patom = CHILD(ppower, 0))) == atom
2428 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002429 && !(childtype == MINUS &&
2430 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002431 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002432 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002433 return;
2434 }
2435 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002436 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002437 if (s == NULL) {
2438 com_error(c, PyExc_MemoryError, "");
2439 com_addbyte(c, 255);
2440 return;
2441 }
2442 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002443 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002444 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002445 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002446 }
Tim Peters51e26512001-09-07 08:45:55 +00002447 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002448 }
2449 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002450 com_factor(c, CHILD(n, 1));
2451 com_addbyte(c, UNARY_POSITIVE);
2452 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002453 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002454 com_factor(c, CHILD(n, 1));
2455 com_addbyte(c, UNARY_NEGATIVE);
2456 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002457 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002458 com_factor(c, CHILD(n, 1));
2459 com_addbyte(c, UNARY_INVERT);
2460 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002461 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002462 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002463 }
2464}
2465
2466static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002467com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002468{
2469 int i;
2470 int op;
2471 REQ(n, term);
2472 com_factor(c, CHILD(n, 0));
2473 for (i = 2; i < NCH(n); i += 2) {
2474 com_factor(c, CHILD(n, i));
2475 switch (TYPE(CHILD(n, i-1))) {
2476 case STAR:
2477 op = BINARY_MULTIPLY;
2478 break;
2479 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002480 if (c->c_flags & CO_FUTURE_DIVISION)
2481 op = BINARY_TRUE_DIVIDE;
2482 else
2483 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002484 break;
2485 case PERCENT:
2486 op = BINARY_MODULO;
2487 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002488 case DOUBLESLASH:
2489 op = BINARY_FLOOR_DIVIDE;
2490 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002491 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002492 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002493 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002494 op = 255;
2495 }
2496 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002497 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002498 }
2499}
2500
2501static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002502com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002503{
2504 int i;
2505 int op;
2506 REQ(n, arith_expr);
2507 com_term(c, CHILD(n, 0));
2508 for (i = 2; i < NCH(n); i += 2) {
2509 com_term(c, CHILD(n, i));
2510 switch (TYPE(CHILD(n, i-1))) {
2511 case PLUS:
2512 op = BINARY_ADD;
2513 break;
2514 case MINUS:
2515 op = BINARY_SUBTRACT;
2516 break;
2517 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002518 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002519 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002520 op = 255;
2521 }
2522 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002523 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002524 }
2525}
2526
2527static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002528com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002529{
2530 int i;
2531 int op;
2532 REQ(n, shift_expr);
2533 com_arith_expr(c, CHILD(n, 0));
2534 for (i = 2; i < NCH(n); i += 2) {
2535 com_arith_expr(c, CHILD(n, i));
2536 switch (TYPE(CHILD(n, i-1))) {
2537 case LEFTSHIFT:
2538 op = BINARY_LSHIFT;
2539 break;
2540 case RIGHTSHIFT:
2541 op = BINARY_RSHIFT;
2542 break;
2543 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002544 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002545 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002546 op = 255;
2547 }
2548 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002549 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002550 }
2551}
2552
2553static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002554com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002555{
2556 int i;
2557 int op;
2558 REQ(n, and_expr);
2559 com_shift_expr(c, CHILD(n, 0));
2560 for (i = 2; i < NCH(n); i += 2) {
2561 com_shift_expr(c, CHILD(n, i));
2562 if (TYPE(CHILD(n, i-1)) == AMPER) {
2563 op = BINARY_AND;
2564 }
2565 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002566 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002567 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002568 op = 255;
2569 }
2570 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002571 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002572 }
2573}
2574
2575static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002576com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002577{
2578 int i;
2579 int op;
2580 REQ(n, xor_expr);
2581 com_and_expr(c, CHILD(n, 0));
2582 for (i = 2; i < NCH(n); i += 2) {
2583 com_and_expr(c, CHILD(n, i));
2584 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2585 op = BINARY_XOR;
2586 }
2587 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002588 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002589 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002590 op = 255;
2591 }
2592 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002593 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002594 }
2595}
2596
2597static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002598com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002599{
2600 int i;
2601 int op;
2602 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002603 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002604 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002605 com_xor_expr(c, CHILD(n, i));
2606 if (TYPE(CHILD(n, i-1)) == VBAR) {
2607 op = BINARY_OR;
2608 }
2609 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002610 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002611 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002612 op = 255;
2613 }
2614 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002615 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002616 }
2617}
2618
2619static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002620cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002621{
2622 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00002623 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002624 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2625 if (NCH(n) == 1) {
2626 n = CHILD(n, 0);
2627 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002628 case LESS: return PyCmp_LT;
2629 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00002630 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00002631 case LESSEQUAL: return PyCmp_LE;
2632 case GREATEREQUAL: return PyCmp_GE;
2633 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2634 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2635 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002636 }
2637 }
2638 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002639 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002640 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002641 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002642 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002643 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002644 }
2645 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002646 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002647}
2648
2649static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002650com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002651{
2652 int i;
2653 enum cmp_op op;
2654 int anchor;
2655 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2656 com_expr(c, CHILD(n, 0));
2657 if (NCH(n) == 1)
2658 return;
2659
2660 /****************************************************************
2661 The following code is generated for all but the last
2662 comparison in a chain:
2663
2664 label: on stack: opcode: jump to:
2665
2666 a <code to load b>
2667 a, b DUP_TOP
2668 a, b, b ROT_THREE
2669 b, a, b COMPARE_OP
2670 b, 0-or-1 JUMP_IF_FALSE L1
2671 b, 1 POP_TOP
2672 b
2673
2674 We are now ready to repeat this sequence for the next
2675 comparison in the chain.
2676
2677 For the last we generate:
2678
2679 b <code to load c>
2680 b, c COMPARE_OP
2681 0-or-1
2682
2683 If there were any jumps to L1 (i.e., there was more than one
2684 comparison), we generate:
2685
2686 0-or-1 JUMP_FORWARD L2
2687 L1: b, 0 ROT_TWO
2688 0, b POP_TOP
2689 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002690 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002691 ****************************************************************/
2692
2693 anchor = 0;
2694
2695 for (i = 2; i < NCH(n); i += 2) {
2696 com_expr(c, CHILD(n, i));
2697 if (i+2 < NCH(n)) {
2698 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002699 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002700 com_addbyte(c, ROT_THREE);
2701 }
2702 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002703 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002704 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002705 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002706 }
2707 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002708 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002709 if (i+2 < NCH(n)) {
2710 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2711 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002712 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002713 }
2714 }
2715
2716 if (anchor) {
2717 int anchor2 = 0;
2718 com_addfwref(c, JUMP_FORWARD, &anchor2);
2719 com_backpatch(c, anchor);
2720 com_addbyte(c, ROT_TWO);
2721 com_addbyte(c, POP_TOP);
2722 com_backpatch(c, anchor2);
2723 }
2724}
2725
2726static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002727com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002728{
2729 REQ(n, not_test); /* 'not' not_test | comparison */
2730 if (NCH(n) == 1) {
2731 com_comparison(c, CHILD(n, 0));
2732 }
2733 else {
2734 com_not_test(c, CHILD(n, 1));
2735 com_addbyte(c, UNARY_NOT);
2736 }
2737}
2738
2739static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002740com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002741{
2742 int i;
2743 int anchor;
2744 REQ(n, and_test); /* not_test ('and' not_test)* */
2745 anchor = 0;
2746 i = 0;
2747 for (;;) {
2748 com_not_test(c, CHILD(n, i));
2749 if ((i += 2) >= NCH(n))
2750 break;
2751 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2752 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002753 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002754 }
2755 if (anchor)
2756 com_backpatch(c, anchor);
2757}
2758
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002759static int
2760com_make_closure(struct compiling *c, PyCodeObject *co)
2761{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002762 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002763 if (free == 0)
2764 return 0;
2765 for (i = 0; i < free; ++i) {
2766 /* Bypass com_addop_varname because it will generate
2767 LOAD_DEREF but LOAD_CLOSURE is needed.
2768 */
2769 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2770 int arg, reftype;
2771
2772 /* Special case: If a class contains a method with a
2773 free variable that has the same name as a method,
2774 the name will be considered free *and* local in the
2775 class. It should be handled by the closure, as
2776 well as by the normal name loookup logic.
2777 */
2778 reftype = get_ref_type(c, PyString_AS_STRING(name));
2779 if (reftype == CELL)
2780 arg = com_lookup_arg(c->c_cellvars, name);
2781 else /* (reftype == FREE) */
2782 arg = com_lookup_arg(c->c_freevars, name);
2783 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002784 fprintf(stderr, "lookup %s in %s %d %d\n"
2785 "freevars of %s: %s\n",
2786 PyObject_REPR(name),
2787 c->c_name,
2788 reftype, arg,
2789 PyString_AS_STRING(co->co_name),
2790 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002791 Py_FatalError("com_make_closure()");
2792 }
2793 com_addoparg(c, LOAD_CLOSURE, arg);
2794
2795 }
2796 com_push(c, free);
2797 return 1;
2798}
2799
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002800static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002801com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002802{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002803 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002804 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002805 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002806 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002807 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002808 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2809 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002810 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002811 if (co == NULL) {
2812 c->c_errors++;
2813 return;
2814 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002815 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002816 i = com_addconst(c, (PyObject *)co);
2817 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002818 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002819 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002820 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002821 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002822 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002823 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002824 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002825 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002826 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002827 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002828 else {
2829 int anchor = 0;
2830 int i = 0;
2831 for (;;) {
2832 com_and_test(c, CHILD(n, i));
2833 if ((i += 2) >= NCH(n))
2834 break;
2835 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2836 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002837 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002838 }
2839 if (anchor)
2840 com_backpatch(c, anchor);
2841 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002842}
2843
2844static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002845com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002846{
2847 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002848 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002849 com_node(c, CHILD(n, 0));
2850 }
2851 else {
2852 int i;
2853 int len;
2854 len = (NCH(n) + 1) / 2;
2855 for (i = 0; i < NCH(n); i += 2)
2856 com_node(c, CHILD(n, i));
2857 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002858 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002859 }
2860}
2861
2862
2863/* Begin of assignment compilation */
2864
Thomas Wouters434d0822000-08-24 20:11:32 +00002865
2866static void
2867com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2868{
2869 com_addbyte(c, DUP_TOP);
2870 com_push(c, 1);
2871 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002872 com_node(c, augn);
2873 com_addbyte(c, opcode);
2874 com_pop(c, 1);
2875 com_addbyte(c, ROT_TWO);
2876 com_addopname(c, STORE_ATTR, n);
2877 com_pop(c, 2);
2878}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002879
2880static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002881com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002882{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00002883 if (none_assignment_check(c, STR(n), assigning))
2884 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002885 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002886 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002887}
2888
2889static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002890com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002891{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002892 REQ(n, trailer);
2893 switch (TYPE(CHILD(n, 0))) {
2894 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002895 if (assigning == OP_DELETE)
2896 com_error(c, PyExc_SyntaxError,
2897 "can't delete function call");
2898 else
2899 com_error(c, PyExc_SyntaxError,
2900 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002901 break;
2902 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002903 if (assigning > OP_APPLY)
2904 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2905 else
2906 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002907 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002908 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002909 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002910 break;
2911 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002912 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002913 }
2914}
2915
2916static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002917com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002918{
2919 int i;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002920 if (TYPE(n) != testlist && TYPE(n) != testlist_gexp &&
2921 TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002922 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002923 if (assigning) {
2924 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002925 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002926 com_push(c, i-1);
2927 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002928 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002929 com_assign(c, CHILD(n, i), assigning, NULL);
2930}
2931
2932static void
2933com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2934{
2935 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002936 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002937 com_push(c, 1);
2938 com_node(c, augn);
2939 com_addbyte(c, opcode);
2940 com_pop(c, 1);
2941 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002942}
2943
2944static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002945com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002946{
2947 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002948 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002949 if (assigning)
2950 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002951}
2952
2953static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002954com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002955{
2956 /* Loop to avoid trivial recursion */
2957 for (;;) {
2958 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002959
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002960 case exprlist:
2961 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002962 case testlist1:
Raymond Hettinger354433a2004-05-19 08:20:33 +00002963 case testlist_gexp:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002964 if (NCH(n) > 1) {
Raymond Hettinger354433a2004-05-19 08:20:33 +00002965 if (TYPE(CHILD(n, 1)) == gen_for) {
2966 com_error(c, PyExc_SystemError,
2967 "assign to generator expression not possible");
2968 return;
2969 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002970 if (assigning > OP_APPLY) {
2971 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002972 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002973 return;
2974 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002975 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002976 return;
2977 }
2978 n = CHILD(n, 0);
2979 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002980
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002981 case test:
2982 case and_test:
2983 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002984 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002985 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002986 case xor_expr:
2987 case and_expr:
2988 case shift_expr:
2989 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002990 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002991 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002992 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002993 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002994 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002995 return;
2996 }
2997 n = CHILD(n, 0);
2998 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002999
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003000 case power: /* atom trailer* ('**' power)*
3001 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00003002 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003003 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003004 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003005 return;
3006 }
Guido van Rossum50564e81996-01-12 01:13:16 +00003007 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003008 int i;
3009 com_node(c, CHILD(n, 0));
3010 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003011 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003012 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003013 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00003014 return;
3015 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003016 com_apply_trailer(c, CHILD(n, i));
3017 } /* NB i is still alive */
3018 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00003019 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003020 return;
3021 }
3022 n = CHILD(n, 0);
3023 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003024
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003025 case atom:
3026 switch (TYPE(CHILD(n, 0))) {
3027 case LPAR:
3028 n = CHILD(n, 1);
3029 if (TYPE(n) == RPAR) {
3030 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003031 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003032 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003033 return;
3034 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003035 if (assigning > OP_APPLY) {
3036 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003037 "augmented assign to tuple literal not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003038 return;
3039 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003040 break;
3041 case LSQB:
3042 n = CHILD(n, 1);
3043 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003044 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003045 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003046 return;
3047 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003048 if (assigning > OP_APPLY) {
3049 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003050 "augmented assign to list literal not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003051 return;
3052 }
3053 if (NCH(n) > 1
3054 && TYPE(CHILD(n, 1)) == list_for) {
3055 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003056 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00003057 return;
3058 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003059 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003060 return;
3061 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00003062 if (assigning > OP_APPLY)
3063 com_augassign_name(c, CHILD(n, 0),
3064 assigning, augn);
3065 else
3066 com_assign_name(c, CHILD(n, 0),
3067 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003068 return;
3069 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003070 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003071 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003072 return;
3073 }
3074 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003075
3076 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003077 com_error(c, PyExc_SyntaxError,
3078 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003079 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003080
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003081 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003082 com_error(c, PyExc_SystemError,
3083 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003084 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003085
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003086 }
3087 }
3088}
Guido van Rossum7c531111997-03-11 18:42:21 +00003089
Thomas Wouters434d0822000-08-24 20:11:32 +00003090static void
3091com_augassign(struct compiling *c, node *n)
3092{
3093 int opcode;
3094
3095 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
3096 case '+': opcode = INPLACE_ADD; break;
3097 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00003098 case '/':
3099 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
3100 opcode = INPLACE_FLOOR_DIVIDE;
3101 else if (c->c_flags & CO_FUTURE_DIVISION)
3102 opcode = INPLACE_TRUE_DIVIDE;
3103 else
3104 opcode = INPLACE_DIVIDE;
3105 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00003106 case '%': opcode = INPLACE_MODULO; break;
3107 case '<': opcode = INPLACE_LSHIFT; break;
3108 case '>': opcode = INPLACE_RSHIFT; break;
3109 case '&': opcode = INPLACE_AND; break;
3110 case '^': opcode = INPLACE_XOR; break;
3111 case '|': opcode = INPLACE_OR; break;
3112 case '*':
3113 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
3114 opcode = INPLACE_POWER;
3115 else
3116 opcode = INPLACE_MULTIPLY;
3117 break;
3118 default:
3119 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
3120 return;
3121 }
3122 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
3123}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003124
3125static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003126com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003127{
Thomas Wouters434d0822000-08-24 20:11:32 +00003128 REQ(n, expr_stmt);
3129 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003130 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00003131 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003132 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00003133 if (NCH(n) == 1) {
3134 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003135 if (c->c_interactive)
3136 com_addbyte(c, PRINT_EXPR);
3137 else
3138 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003139 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003140 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003141 else if (TYPE(CHILD(n,1)) == augassign)
3142 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003143 else {
3144 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00003145 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003146 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003147 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003148 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003149 com_push(c, 1);
3150 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003151 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003152 }
3153 }
3154}
3155
3156static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003157com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00003158{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003159 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003160 int i;
3161 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003162 if (Py_OptimizeFlag)
3163 return;
3164 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00003165
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003166 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00003167 raise AssertionError [, <message>]
3168
3169 where <message> is the second test, if present.
3170 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003171 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003172 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003173 com_addbyte(c, POP_TOP);
3174 com_pop(c, 1);
3175 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003176 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00003177 com_push(c, 1);
3178 i = NCH(n)/2; /* Either 2 or 4 */
3179 if (i > 1)
3180 com_node(c, CHILD(n, 3));
3181 com_addoparg(c, RAISE_VARARGS, i);
3182 com_pop(c, i);
3183 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003184 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003185 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003186 com_addbyte(c, POP_TOP);
3187}
3188
3189static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003190com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003191{
Barry Warsaw29c574e2000-08-21 15:38:56 +00003192 int i = 1;
3193 node* stream = NULL;
3194
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003195 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003196
3197 /* are we using the extended print form? */
3198 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
3199 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00003200 com_node(c, stream);
3201 /* stack: [...] => [... stream] */
3202 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003203 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3204 i = 4;
3205 else
3206 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003207 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003208 for (; i < NCH(n); i += 2) {
3209 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003210 com_addbyte(c, DUP_TOP);
3211 /* stack: [stream] => [stream stream] */
3212 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003213 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003214 /* stack: [stream stream] => [stream stream obj] */
3215 com_addbyte(c, ROT_TWO);
3216 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003217 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003218 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003219 com_pop(c, 2);
3220 }
3221 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003222 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003223 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003224 com_addbyte(c, PRINT_ITEM);
3225 com_pop(c, 1);
3226 }
3227 }
3228 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003229 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003230 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003231 /* must pop the extra stream object off the stack */
3232 com_addbyte(c, POP_TOP);
3233 /* stack: [... stream] => [...] */
3234 com_pop(c, 1);
3235 }
3236 }
3237 else {
3238 if (stream != NULL) {
3239 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003240 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003241 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003242 com_pop(c, 1);
3243 }
3244 else
3245 com_addbyte(c, PRINT_NEWLINE);
3246 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003247}
3248
3249static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003250com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003251{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003252 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003253 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003254 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003255 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003256 if (c->c_flags & CO_GENERATOR) {
3257 if (NCH(n) > 1) {
3258 com_error(c, PyExc_SyntaxError,
3259 "'return' with argument inside generator");
3260 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003261 }
3262 if (NCH(n) < 2) {
3263 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003264 com_push(c, 1);
3265 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003266 else
3267 com_node(c, CHILD(n, 1));
3268 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003269 com_pop(c, 1);
3270}
3271
3272static void
3273com_yield_stmt(struct compiling *c, node *n)
3274{
Tim Peters95c80f82001-06-23 02:07:08 +00003275 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003276 REQ(n, yield_stmt); /* 'yield' testlist */
3277 if (!c->c_infunction) {
3278 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3279 }
Tim Peters95c80f82001-06-23 02:07:08 +00003280
3281 for (i = 0; i < c->c_nblocks; ++i) {
3282 if (c->c_block[i] == SETUP_FINALLY) {
3283 com_error(c, PyExc_SyntaxError,
3284 "'yield' not allowed in a 'try' block "
3285 "with a 'finally' clause");
3286 return;
3287 }
3288 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003289 com_node(c, CHILD(n, 1));
3290 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003291 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003292}
3293
3294static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003295com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003296{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003297 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003298 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3299 if (NCH(n) > 1) {
3300 com_node(c, CHILD(n, 1));
3301 if (NCH(n) > 3) {
3302 com_node(c, CHILD(n, 3));
3303 if (NCH(n) > 5)
3304 com_node(c, CHILD(n, 5));
3305 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003306 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003307 i = NCH(n)/2;
3308 com_addoparg(c, RAISE_VARARGS, i);
3309 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003310}
3311
3312static void
Thomas Wouters52152252000-08-17 22:55:00 +00003313com_from_import(struct compiling *c, node *n)
3314{
3315 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3316 com_push(c, 1);
3317 if (NCH(n) > 1) {
3318 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3319 com_error(c, PyExc_SyntaxError, "invalid syntax");
3320 return;
3321 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003322 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003323 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003324 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003325 com_pop(c, 1);
3326}
3327
3328static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003329com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003330{
3331 int i;
3332 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003333 /* 'import' dotted_name (',' dotted_name)* |
3334 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003335 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00003336 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003337 /* 'from' dotted_name 'import' ... */
3338 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003339
3340 if (TYPE(CHILD(n, 3)) == STAR) {
3341 tup = Py_BuildValue("(s)", "*");
3342 } else {
3343 tup = PyTuple_New((NCH(n) - 2)/2);
3344 for (i = 3; i < NCH(n); i += 2) {
3345 PyTuple_SET_ITEM(tup, (i-3)/2,
Guido van Rossum633d90c2002-12-23 16:51:42 +00003346 PyString_FromString(STR(
3347 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003348 }
3349 }
3350 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003351 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003352 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003353 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00003354 if (TYPE(CHILD(n, 3)) == STAR)
3355 com_addbyte(c, IMPORT_STAR);
3356 else {
3357 for (i = 3; i < NCH(n); i += 2)
3358 com_from_import(c, CHILD(n, i));
3359 com_addbyte(c, POP_TOP);
3360 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003361 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003362 }
3363 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003364 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003365 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003366 node *subn = CHILD(n, i);
3367 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003368 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003369 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003370 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003371 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003372 int j;
3373 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003374 com_error(c, PyExc_SyntaxError,
3375 "invalid syntax");
3376 return;
3377 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003378 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3379 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003380 CHILD(CHILD(subn, 0),
3381 j));
3382 com_addop_varname(c, VAR_STORE,
3383 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003384 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003385 com_addop_varname(c, VAR_STORE,
3386 STR(CHILD(CHILD(subn, 0),
3387 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003388 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003389 }
3390 }
3391}
3392
3393static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003394com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003395{
3396 REQ(n, exec_stmt);
3397 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3398 com_node(c, CHILD(n, 1));
3399 if (NCH(n) >= 4)
3400 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003401 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003402 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003403 com_push(c, 1);
3404 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003405 if (NCH(n) >= 6)
3406 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003407 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003408 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003409 com_push(c, 1);
3410 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003411 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003412 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003413}
3414
Guido van Rossum7c531111997-03-11 18:42:21 +00003415static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003416is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003417{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003418 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003419 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003420 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003421
3422 /* Label to avoid tail recursion */
3423 next:
3424 switch (TYPE(n)) {
3425
3426 case suite:
3427 if (NCH(n) == 1) {
3428 n = CHILD(n, 0);
3429 goto next;
3430 }
3431 /* Fall through */
3432 case file_input:
3433 for (i = 0; i < NCH(n); i++) {
3434 node *ch = CHILD(n, i);
3435 if (TYPE(ch) == stmt) {
3436 n = ch;
3437 goto next;
3438 }
3439 }
3440 break;
3441
3442 case stmt:
3443 case simple_stmt:
3444 case small_stmt:
3445 n = CHILD(n, 0);
3446 goto next;
3447
3448 case expr_stmt:
3449 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003450 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003451 case test:
3452 case and_test:
3453 case not_test:
3454 case comparison:
3455 case expr:
3456 case xor_expr:
3457 case and_expr:
3458 case shift_expr:
3459 case arith_expr:
3460 case term:
3461 case factor:
3462 case power:
3463 case atom:
3464 if (NCH(n) == 1) {
3465 n = CHILD(n, 0);
3466 goto next;
3467 }
3468 break;
3469
3470 case NAME:
3471 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3472 return 1;
3473 break;
3474
3475 case NUMBER:
3476 v = parsenumber(c, STR(n));
3477 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003478 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003479 break;
3480 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003481 i = PyObject_IsTrue(v);
3482 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003483 return i == 0;
3484
3485 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003486 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003487 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003488 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003489 break;
3490 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003491 i = PyObject_IsTrue(v);
3492 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003493 return i == 0;
3494
3495 }
3496 return 0;
3497}
3498
Tim Peters08a898f2001-06-28 01:52:22 +00003499
3500/* Look under n for a return stmt with an expression.
3501 * This hack is used to find illegal returns under "if 0:" blocks in
3502 * functions already known to be generators (as determined by the symtable
3503 * pass).
3504 * Return the offending return node if found, else NULL.
3505 */
3506static node *
3507look_for_offending_return(node *n)
3508{
3509 int i;
3510
3511 for (i = 0; i < NCH(n); ++i) {
3512 node *kid = CHILD(n, i);
3513
3514 switch (TYPE(kid)) {
3515 case classdef:
3516 case funcdef:
3517 case lambdef:
3518 /* Stuff in nested functions & classes doesn't
3519 affect the code block we started in. */
3520 return NULL;
3521
3522 case return_stmt:
3523 if (NCH(kid) > 1)
3524 return kid;
3525 break;
3526
3527 default: {
3528 node *bad = look_for_offending_return(kid);
3529 if (bad != NULL)
3530 return bad;
3531 }
3532 }
3533 }
3534
3535 return NULL;
3536}
3537
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003538static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003539com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003540{
3541 int i;
3542 int anchor = 0;
3543 REQ(n, if_stmt);
3544 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3545 for (i = 0; i+3 < NCH(n); i+=4) {
3546 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003547 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003548 if (is_constant_false(c, ch)) {
3549 /* We're going to skip this block. However, if this
3550 is a generator, we have to check the dead code
3551 anyway to make sure there aren't any return stmts
3552 with expressions, in the same scope. */
3553 if (c->c_flags & CO_GENERATOR) {
3554 node *p = look_for_offending_return(n);
3555 if (p != NULL) {
3556 int savelineno = c->c_lineno;
3557 c->c_lineno = p->n_lineno;
3558 com_error(c, PyExc_SyntaxError,
3559 "'return' with argument "
3560 "inside generator");
3561 c->c_lineno = savelineno;
3562 }
3563 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003564 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003565 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003566 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003567 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003568 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003569 com_addfwref(c, JUMP_IF_FALSE, &a);
3570 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003571 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003572 com_node(c, CHILD(n, i+3));
3573 com_addfwref(c, JUMP_FORWARD, &anchor);
3574 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003575 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003576 com_addbyte(c, POP_TOP);
3577 }
3578 if (i+2 < NCH(n))
3579 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003580 if (anchor)
3581 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003582}
3583
3584static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003585com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003586{
3587 int break_anchor = 0;
3588 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003589 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003590 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3591 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003592 block_push(c, SETUP_LOOP);
3593 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003594 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003595 com_node(c, CHILD(n, 1));
3596 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3597 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003598 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003599 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003600 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003601 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003602 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3603 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003604 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003605 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003606 com_addbyte(c, POP_TOP);
3607 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003608 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003609 if (NCH(n) > 4)
3610 com_node(c, CHILD(n, 6));
3611 com_backpatch(c, break_anchor);
3612}
3613
3614static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003615com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003616{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003617 int break_anchor = 0;
3618 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003619 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003620 REQ(n, for_stmt);
3621 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3622 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003623 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003624 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003625 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003626 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00003627 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003628 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003629 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003630 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003631 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003632 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003633 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003634 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3635 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003636 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003637 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003638 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003639 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003640 if (NCH(n) > 8)
3641 com_node(c, CHILD(n, 8));
3642 com_backpatch(c, break_anchor);
3643}
3644
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003645/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003646
3647 SETUP_FINALLY L
3648 <code for S>
3649 POP_BLOCK
3650 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003651 L: <code for Sf>
3652 END_FINALLY
3653
3654 The special instructions use the block stack. Each block
3655 stack entry contains the instruction that created it (here
3656 SETUP_FINALLY), the level of the value stack at the time the
3657 block stack entry was created, and a label (here L).
3658
3659 SETUP_FINALLY:
3660 Pushes the current value stack level and the label
3661 onto the block stack.
3662 POP_BLOCK:
3663 Pops en entry from the block stack, and pops the value
3664 stack until its level is the same as indicated on the
3665 block stack. (The label is ignored.)
3666 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003667 Pops a variable number of entries from the *value* stack
3668 and re-raises the exception they specify. The number of
3669 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003670
3671 The block stack is unwound when an exception is raised:
3672 when a SETUP_FINALLY entry is found, the exception is pushed
3673 onto the value stack (and the exception condition is cleared),
3674 and the interpreter jumps to the label gotten from the block
3675 stack.
3676
3677 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003678 (The contents of the value stack is shown in [], with the top
3679 at the right; 'tb' is trace-back info, 'val' the exception's
3680 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003681
3682 Value stack Label Instruction Argument
3683 [] SETUP_EXCEPT L1
3684 [] <code for S>
3685 [] POP_BLOCK
3686 [] JUMP_FORWARD L0
3687
Guido van Rossum3f5da241990-12-20 15:06:42 +00003688 [tb, val, exc] L1: DUP )
3689 [tb, val, exc, exc] <evaluate E1> )
3690 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3691 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3692 [tb, val, exc, 1] POP )
3693 [tb, val, exc] POP
3694 [tb, val] <assign to V1> (or POP if no V1)
3695 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003696 [] <code for S1>
3697 JUMP_FORWARD L0
3698
Guido van Rossum3f5da241990-12-20 15:06:42 +00003699 [tb, val, exc, 0] L2: POP
3700 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003701 .............................etc.......................
3702
Guido van Rossum3f5da241990-12-20 15:06:42 +00003703 [tb, val, exc, 0] Ln+1: POP
3704 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003705
3706 [] L0: <next statement>
3707
3708 Of course, parts are not generated if Vi or Ei is not present.
3709*/
3710
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003711static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003712com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003713{
3714 int except_anchor = 0;
3715 int end_anchor = 0;
3716 int else_anchor = 0;
3717 int i;
3718 node *ch;
3719
3720 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3721 block_push(c, SETUP_EXCEPT);
3722 com_node(c, CHILD(n, 2));
3723 com_addbyte(c, POP_BLOCK);
3724 block_pop(c, SETUP_EXCEPT);
3725 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3726 com_backpatch(c, except_anchor);
3727 for (i = 3;
3728 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3729 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003730 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003731 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003732 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003733 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003734 break;
3735 }
3736 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003737 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003738 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003739 if (NCH(ch) > 1) {
3740 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003741 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003742 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003743 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003744 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003745 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3746 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003747 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003748 }
3749 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003750 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003751 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003752 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003753 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003754 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003755 com_pop(c, 1);
3756 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003757 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003758 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003759 com_node(c, CHILD(n, i+2));
3760 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3761 if (except_anchor) {
3762 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003763 /* We come in with [tb, val, exc, 0] on the
3764 stack; one pop and it's the same as
3765 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003766 com_addbyte(c, POP_TOP);
3767 }
3768 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003769 /* We actually come in here with [tb, val, exc] but the
3770 END_FINALLY will zap those and jump around.
3771 The c_stacklevel does not reflect them so we need not pop
3772 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003773 com_addbyte(c, END_FINALLY);
3774 com_backpatch(c, else_anchor);
3775 if (i < NCH(n))
3776 com_node(c, CHILD(n, i+2));
3777 com_backpatch(c, end_anchor);
3778}
3779
3780static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003781com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003782{
3783 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003784 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003785
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003786 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3787 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003788 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003789 com_addbyte(c, POP_BLOCK);
3790 block_pop(c, SETUP_FINALLY);
3791 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003792 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003793 /* While the generated code pushes only one item,
3794 the try-finally handling can enter here with
3795 up to three items. OK, here are the details:
3796 3 for an exception, 2 for RETURN, 1 for BREAK. */
3797 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003798 com_backpatch(c, finally_anchor);
3799 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003800 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003801 com_node(c, ch);
3802 com_addbyte(c, END_FINALLY);
3803 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003804 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003805}
3806
3807static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003808com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003809{
3810 REQ(n, try_stmt);
3811 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3812 | 'try' ':' suite 'finally' ':' suite */
3813 if (TYPE(CHILD(n, 3)) != except_clause)
3814 com_try_finally(c, n);
3815 else
3816 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003817}
3818
Guido van Rossum8b993a91997-01-17 21:04:03 +00003819static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003820get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003821{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003822 int i;
3823
Guido van Rossum8b993a91997-01-17 21:04:03 +00003824 /* Label to avoid tail recursion */
3825 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003826 switch (TYPE(n)) {
3827
3828 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003829 if (NCH(n) == 1) {
3830 n = CHILD(n, 0);
3831 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003832 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003833 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003834 case file_input:
3835 for (i = 0; i < NCH(n); i++) {
3836 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003837 if (TYPE(ch) == stmt) {
3838 n = ch;
3839 goto next;
3840 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003841 }
3842 break;
3843
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003844 case stmt:
3845 case simple_stmt:
3846 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003847 n = CHILD(n, 0);
3848 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003849
3850 case expr_stmt:
3851 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003852 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003853 case test:
3854 case and_test:
3855 case not_test:
3856 case comparison:
3857 case expr:
3858 case xor_expr:
3859 case and_expr:
3860 case shift_expr:
3861 case arith_expr:
3862 case term:
3863 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003864 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003865 if (NCH(n) == 1) {
3866 n = CHILD(n, 0);
3867 goto next;
3868 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003869 break;
3870
3871 case atom:
3872 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003873 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003874 break;
3875
3876 }
3877 return NULL;
3878}
3879
Guido van Rossum79f25d91997-04-29 20:08:16 +00003880static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003881get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003882{
Guido van Rossum541563e1999-01-28 15:08:09 +00003883 /* Don't generate doc-strings if run with -OO */
3884 if (Py_OptimizeFlag > 1)
3885 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003886 n = get_rawdocstring(n);
3887 if (n == NULL)
3888 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003889 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003890}
3891
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003892static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003893com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003894{
3895 REQ(n, suite);
3896 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3897 if (NCH(n) == 1) {
3898 com_node(c, CHILD(n, 0));
3899 }
3900 else {
3901 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003902 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003903 node *ch = CHILD(n, i);
3904 if (TYPE(ch) == stmt)
3905 com_node(c, ch);
3906 }
3907 }
3908}
3909
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003910/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003911static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003912com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003913{
3914 int i = c->c_nblocks;
3915 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3916 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3917 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003918 else if (i <= 0) {
3919 /* at the outer level */
3920 com_error(c, PyExc_SyntaxError,
3921 "'continue' not properly in loop");
3922 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003923 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003924 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003925 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003926 if (c->c_block[j] == SETUP_LOOP)
3927 break;
3928 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003929 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003930 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003931 for (; i > j; --i) {
3932 if (c->c_block[i] == SETUP_EXCEPT ||
3933 c->c_block[i] == SETUP_FINALLY) {
3934 com_addoparg(c, CONTINUE_LOOP,
3935 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003936 return;
3937 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003938 if (c->c_block[i] == END_FINALLY) {
3939 com_error(c, PyExc_SyntaxError,
3940 "'continue' not supported inside 'finally' clause");
3941 return;
3942 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003943 }
3944 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003945 com_error(c, PyExc_SyntaxError,
3946 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003947 }
3948 /* XXX Could allow it inside a 'finally' clause
3949 XXX if we could pop the exception still on the stack */
3950}
3951
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003952/* Return the number of default values in the argument list.
3953
3954 If a non-default argument follows a default argument, set an
3955 exception and return -1.
3956*/
3957
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003958static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003959com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003960{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003961 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003962 if (TYPE(n) == lambdef) {
3963 /* lambdef: 'lambda' [varargslist] ':' test */
3964 n = CHILD(n, 1);
3965 }
3966 else {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003967 REQ(n, funcdef);
3968 /* funcdef: [decorators] 'def' NAME parameters ':' suite */
3969 n = RCHILD(n, -3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003970 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3971 n = CHILD(n, 1);
3972 }
3973 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003974 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003975 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003976 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003977 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3978 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003979 ndefs = 0;
3980 for (i = 0; i < nch; i++) {
3981 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003982 if (TYPE(CHILD(n, i)) == STAR ||
3983 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003984 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003985 i++;
3986 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003987 t = RPAR; /* Anything except EQUAL or COMMA */
3988 else
3989 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003990 if (t == EQUAL) {
3991 i++;
3992 ndefs++;
3993 com_node(c, CHILD(n, i));
3994 i++;
3995 if (i >= nch)
3996 break;
3997 t = TYPE(CHILD(n, i));
3998 }
3999 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004000 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004001 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004002 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00004003 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004004 return -1;
4005 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004006 }
4007 if (t != COMMA)
4008 break;
4009 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004010 return ndefs;
4011}
4012
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004013static void
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004014com_decorator_name(struct compiling *c, node *n)
4015{
4016 /* dotted_name: NAME ('.' NAME)* */
4017
4018 int i, nch;
4019 node *varname;
4020
4021 REQ(n, dotted_name);
4022 nch = NCH(n);
4023 assert(nch >= 1 && nch % 2 == 1);
4024
4025 varname = CHILD(n, 0);
4026 REQ(varname, NAME);
4027 com_addop_varname(c, VAR_LOAD, STR(varname));
4028
4029 for (i = 1; i < nch; i += 2) {
4030 node *attrname;
4031
4032 REQ(CHILD(n, i), DOT);
4033
4034 attrname = CHILD(n, i + 1);
4035 REQ(attrname, NAME);
4036 com_addop_name(c, LOAD_ATTR, STR(attrname));
4037 }
4038}
4039
4040static void
4041com_decorator(struct compiling *c, node *n)
4042{
4043 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
4044 int nch = NCH(n);
4045 assert(nch >= 2);
4046 REQ(CHILD(n, 0), AT);
4047 com_decorator_name(c, CHILD(n, 1));
4048
4049 if (nch > 2) {
4050 assert(nch == 4 || nch == 5);
4051 REQ(CHILD(n, 2), LPAR);
4052 REQ(CHILD(n, nch - 1), RPAR);
4053 com_call_function(c, CHILD(n, 3));
4054 }
4055}
4056
4057static int
4058com_decorators(struct compiling *c, node *n)
4059{
4060 int i, nch, ndecorators;
4061
4062 /* decorator ([NEWLINE] decorator)* NEWLINE */
4063 nch = NCH(n);
4064 assert(nch >= 2);
4065 REQ(CHILD(n, nch - 1), NEWLINE);
4066
4067 ndecorators = 0;
4068 for (i = NCH(n) - 1; i >= 0; --i) {
4069 node *ch = CHILD(n, i);
4070 if (TYPE(ch) != NEWLINE) {
4071 com_decorator(c, ch);
4072 ++ndecorators;
4073 }
4074 }
4075
4076 return ndecorators;
4077}
4078
4079static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004080com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004081{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004082 PyObject *co;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004083 int ndefs, ndecorators;
4084 REQ(n, funcdef);
4085 /* -6 -5 -4 -3 -2 -1
4086 funcdef: [decorators] 'def' NAME parameters ':' suite */
4087
4088 if (NCH(n) == 6)
4089 ndecorators = com_decorators(c, CHILD(n, 0));
4090 else
4091 ndecorators = 0;
4092
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004093 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004094 if (ndefs < 0)
4095 return;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004096 symtable_enter_scope(c->c_symtable, STR(RCHILD(n, -4)), TYPE(n),
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004097 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004098 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004099 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004100 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004101 c->c_errors++;
4102 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004103 int closure = com_make_closure(c, (PyCodeObject *)co);
4104 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004105 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004106 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004107 if (closure)
4108 com_addoparg(c, MAKE_CLOSURE, ndefs);
4109 else
4110 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004111 com_pop(c, ndefs);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004112 while (ndecorators > 0) {
4113 com_addoparg(c, CALL_FUNCTION, 1);
4114 com_pop(c, 1);
4115 ndecorators--;
4116 }
4117 com_addop_varname(c, VAR_STORE, STR(RCHILD(n, -4)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004118 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004119 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004120 }
4121}
4122
4123static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004124com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004125{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004126 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004127 REQ(n, testlist);
4128 /* testlist: test (',' test)* [','] */
4129 for (i = 0; i < NCH(n); i += 2)
4130 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004131 i = (NCH(n)+1) / 2;
4132 com_addoparg(c, BUILD_TUPLE, i);
4133 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004134}
4135
4136static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004137com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004138{
Guido van Rossum25831651993-05-19 14:50:45 +00004139 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004140 PyObject *v;
4141 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004142 char *name;
4143
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004144 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004145 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004146 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004147 c->c_errors++;
4148 return;
4149 }
4150 /* Push the class name on the stack */
4151 i = com_addconst(c, v);
4152 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004153 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004154 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004155 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004156 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004157 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004158 com_push(c, 1);
4159 }
Guido van Rossum25831651993-05-19 14:50:45 +00004160 else
4161 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004162 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004163 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004164 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004165 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004166 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004167 c->c_errors++;
4168 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004169 int closure = com_make_closure(c, co);
4170 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004171 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004172 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004173 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004174 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004175 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004176 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004177 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004178 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004179 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004180 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004181 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004182 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004183 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004184 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004185}
4186
4187static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004188com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004189{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004190 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004191 if (c->c_errors)
4192 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004193 switch (TYPE(n)) {
4194
4195 /* Definition nodes */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004196
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004197 case funcdef:
4198 com_funcdef(c, n);
4199 break;
4200 case classdef:
4201 com_classdef(c, n);
4202 break;
4203
4204 /* Trivial parse tree nodes */
4205
4206 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004207 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004208 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004209 n = CHILD(n, 0);
4210 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004211
4212 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004213 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004214 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004215 {
4216 int i;
4217 for (i = 0; i < NCH(n)-1; i += 2)
4218 com_node(c, CHILD(n, i));
4219 }
4220 break;
4221
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004222 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004223 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004224 n = CHILD(n, 0);
4225 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004226
4227 /* Statement nodes */
4228
4229 case expr_stmt:
4230 com_expr_stmt(c, n);
4231 break;
4232 case print_stmt:
4233 com_print_stmt(c, n);
4234 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004235 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004236 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004237 break;
4238 case pass_stmt:
4239 break;
4240 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004241 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004242 com_error(c, PyExc_SyntaxError,
4243 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004244 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004245 com_addbyte(c, BREAK_LOOP);
4246 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004247 case continue_stmt:
4248 com_continue_stmt(c, n);
4249 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004250 case return_stmt:
4251 com_return_stmt(c, n);
4252 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004253 case yield_stmt:
4254 com_yield_stmt(c, n);
4255 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004256 case raise_stmt:
4257 com_raise_stmt(c, n);
4258 break;
4259 case import_stmt:
4260 com_import_stmt(c, n);
4261 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004262 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004263 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004264 case exec_stmt:
4265 com_exec_stmt(c, n);
4266 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004267 case assert_stmt:
4268 com_assert_stmt(c, n);
4269 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004270 case if_stmt:
4271 com_if_stmt(c, n);
4272 break;
4273 case while_stmt:
4274 com_while_stmt(c, n);
4275 break;
4276 case for_stmt:
4277 com_for_stmt(c, n);
4278 break;
4279 case try_stmt:
4280 com_try_stmt(c, n);
4281 break;
4282 case suite:
4283 com_suite(c, n);
4284 break;
4285
4286 /* Expression nodes */
4287
4288 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004289 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004290 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004291 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004292 break;
4293 case test:
4294 com_test(c, n);
4295 break;
4296 case and_test:
4297 com_and_test(c, n);
4298 break;
4299 case not_test:
4300 com_not_test(c, n);
4301 break;
4302 case comparison:
4303 com_comparison(c, n);
4304 break;
4305 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004306 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004307 break;
4308 case expr:
4309 com_expr(c, n);
4310 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004311 case xor_expr:
4312 com_xor_expr(c, n);
4313 break;
4314 case and_expr:
4315 com_and_expr(c, n);
4316 break;
4317 case shift_expr:
4318 com_shift_expr(c, n);
4319 break;
4320 case arith_expr:
4321 com_arith_expr(c, n);
4322 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004323 case term:
4324 com_term(c, n);
4325 break;
4326 case factor:
4327 com_factor(c, n);
4328 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004329 case power:
4330 com_power(c, n);
4331 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004332 case atom:
4333 com_atom(c, n);
4334 break;
4335
4336 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004337 com_error(c, PyExc_SystemError,
4338 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004339 }
4340}
4341
Tim Petersdbd9ba62000-07-09 03:09:57 +00004342static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004343
4344static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004345com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004346{
4347 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4348 if (TYPE(CHILD(n, 0)) == LPAR)
4349 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004350 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004351 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004352 com_pop(c, 1);
4353 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004354}
4355
4356static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004357com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004358{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004359 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004360 if (NCH(n) == 1) {
4361 com_fpdef(c, CHILD(n, 0));
4362 }
4363 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004364 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004365 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004366 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004367 for (i = 0; i < NCH(n); i += 2)
4368 com_fpdef(c, CHILD(n, i));
4369 }
4370}
4371
4372static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004373com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004374{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004375 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004376 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004377 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004378 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004379 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004380 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004381 nch = NCH(n);
4382 /* Enter all arguments in table of locals */
4383 for (i = 0, narg = 0; i < nch; i++) {
4384 node *ch = CHILD(n, i);
4385 node *fp;
4386 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004387 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004388 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4389 fp = CHILD(ch, 0);
4390 if (TYPE(fp) != NAME) {
4391 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4392 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004393 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004394 narg++;
4395 /* all name updates handled by symtable */
4396 if (++i >= nch)
4397 break;
4398 ch = CHILD(n, i);
4399 if (TYPE(ch) == EQUAL)
4400 i += 2;
4401 else
4402 REQ(ch, COMMA);
4403 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004404 if (complex) {
4405 /* Generate code for complex arguments only after
4406 having counted the simple arguments */
4407 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004408 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004409 node *ch = CHILD(n, i);
4410 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004411 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004412 break;
4413 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4414 fp = CHILD(ch, 0);
4415 if (TYPE(fp) != NAME) {
4416 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004417 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004418 com_fpdef(c, ch);
4419 }
4420 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004421 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004422 break;
4423 ch = CHILD(n, i);
4424 if (TYPE(ch) == EQUAL)
4425 i += 2;
4426 else
4427 REQ(ch, COMMA);
4428 }
4429 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004430}
4431
4432static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004433com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004434{
4435 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004436 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004437 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004438 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004439 if (doc != NULL) {
4440 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004441 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004442 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004443 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004444 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004445 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004446 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004447 for (i = 0; i < NCH(n); i++) {
4448 node *ch = CHILD(n, i);
4449 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4450 com_node(c, ch);
4451 }
4452}
4453
4454/* Top-level compile-node interface */
4455
4456static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004457compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004458{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004459 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004460 node *ch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004461 REQ(n, funcdef);
4462 /* -6 -5 -4 -3 -2 -1
4463 funcdef: [decorators] 'def' NAME parameters ':' suite */
4464 c->c_name = STR(RCHILD(n, -4));
4465 doc = get_docstring(c, RCHILD(n, -1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004466 if (doc != NULL) {
4467 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004468 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004469 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004470 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004471 (void) com_addconst(c, Py_None); /* No docstring */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004472 ch = RCHILD(n, -3); /* parameters: '(' [varargslist] ')' */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004473 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004474 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004475 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004476 c->c_infunction = 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004477 com_node(c, RCHILD(n, -1));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004478 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004479 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004480 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4481 com_push(c, 1);
4482 com_addbyte(c, RETURN_VALUE);
4483 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004484}
4485
4486static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004487compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004488{
Guido van Rossum590baa41993-11-30 13:40:46 +00004489 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004490 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004491 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004492
4493 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004494 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004495 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004496 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004497 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004498 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004499 else
4500 ch = CHILD(n, 2);
4501 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004502 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004503 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004504}
4505
4506static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004507compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004508{
4509 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004510 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004511 REQ(n, classdef);
4512 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4513 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004514 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004515 /* Initialize local __module__ from global __name__ */
4516 com_addop_name(c, LOAD_GLOBAL, "__name__");
4517 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004518 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004519 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004520 if (doc != NULL) {
4521 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004522 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004523 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004524 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004525 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004526 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004527 }
4528 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004529 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004530 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00004531 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004532 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004533 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004534 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004535 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004536}
4537
4538static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00004539compile_generator_expression(struct compiling *c, node *n)
4540{
4541 /* testlist_gexp: test gen_for */
4542 /* argument: test gen_for */
4543 REQ(CHILD(n, 0), test);
4544 REQ(CHILD(n, 1), gen_for);
4545
4546 c->c_name = "<generator expression>";
4547 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
4548
4549 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4550 com_push(c, 1);
4551 com_addbyte(c, RETURN_VALUE);
4552 com_pop(c, 1);
4553}
4554
4555static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004556compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004557{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004558 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004559
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004560 switch (TYPE(n)) {
4561
Guido van Rossum4c417781991-01-21 16:09:22 +00004562 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004563 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004564 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004565 n = CHILD(n, 0);
4566 if (TYPE(n) != NEWLINE)
4567 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004568 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004569 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4570 com_push(c, 1);
4571 com_addbyte(c, RETURN_VALUE);
4572 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004573 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004574 break;
4575
Guido van Rossum4c417781991-01-21 16:09:22 +00004576 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004577 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004578 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004579 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4580 com_push(c, 1);
4581 com_addbyte(c, RETURN_VALUE);
4582 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004583 break;
4584
Guido van Rossum590baa41993-11-30 13:40:46 +00004585 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004586 com_node(c, CHILD(n, 0));
4587 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004588 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004589 break;
4590
Guido van Rossum590baa41993-11-30 13:40:46 +00004591 case lambdef: /* anonymous function definition */
4592 compile_lambdef(c, n);
4593 break;
4594
Guido van Rossum4c417781991-01-21 16:09:22 +00004595 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004596 compile_funcdef(c, n);
4597 break;
4598
Guido van Rossum4c417781991-01-21 16:09:22 +00004599 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004600 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004601 break;
4602
Raymond Hettinger354433a2004-05-19 08:20:33 +00004603 case testlist_gexp: /* A generator expression */
4604 case argument: /* A generator expression */
4605 compile_generator_expression(c, n);
4606 break;
4607
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004608 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004609 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004610 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004611 }
4612}
4613
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004614static PyObject *
4615dict_keys_inorder(PyObject *dict, int offset)
4616{
4617 PyObject *tuple, *k, *v;
4618 int i, pos = 0, size = PyDict_Size(dict);
4619
4620 tuple = PyTuple_New(size);
4621 if (tuple == NULL)
4622 return NULL;
4623 while (PyDict_Next(dict, &pos, &k, &v)) {
4624 i = PyInt_AS_LONG(v);
4625 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004626 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004627 PyTuple_SET_ITEM(tuple, i - offset, k);
4628 }
4629 return tuple;
4630}
4631
Guido van Rossum79f25d91997-04-29 20:08:16 +00004632PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004633PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004634{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004635 return PyNode_CompileFlags(n, filename, NULL);
4636}
4637
4638PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004639PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004640{
4641 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004642}
4643
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004644struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004645PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004646{
4647 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004648 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004649
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004650 ff = PyNode_Future(n, filename);
4651 if (ff == NULL)
4652 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004653 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00004654 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004655 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004656 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004657 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004658 return st;
4659}
4660
Guido van Rossum79f25d91997-04-29 20:08:16 +00004661static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004662icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004663{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004664 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004665}
4666
Guido van Rossum79f25d91997-04-29 20:08:16 +00004667static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004668jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004669 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004670{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004671 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004672 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004673 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004674 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004675 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4676 sc.c_encoding = "utf-8";
4677 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004678 sc.c_encoding = STR(n);
4679 n = CHILD(n, 0);
4680 } else {
4681 sc.c_encoding = NULL;
4682 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004683 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004684 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004685 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004686 /* c_symtable still points to parent's symbols */
4687 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004688 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004689 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004690 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004691 if (base->c_encoding != NULL) {
4692 assert(sc.c_encoding == NULL);
4693 sc.c_encoding = base->c_encoding;
4694 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004695 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004696 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004697 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004698 if (sc.c_future == NULL) {
4699 com_free(&sc);
4700 return NULL;
4701 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004702 if (flags) {
4703 int merged = sc.c_future->ff_features |
4704 flags->cf_flags;
4705 sc.c_future->ff_features = merged;
4706 flags->cf_flags = merged;
4707 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004708 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
4709 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004710 com_free(&sc);
4711 return NULL;
4712 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004713 /* reset symbol table for second pass */
4714 sc.c_symtable->st_nscopes = 1;
4715 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004716 }
4717 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004718 if (symtable_load_symbols(&sc) < 0) {
4719 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004720 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004721 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004722 compile_node(&sc, n);
4723 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004724 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004725 PyObject *consts, *names, *varnames, *filename, *name,
4726 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004727 consts = PyList_AsTuple(sc.c_consts);
4728 names = PyList_AsTuple(sc.c_names);
4729 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004730 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4731 freevars = dict_keys_inorder(sc.c_freevars,
4732 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004733 filename = PyString_InternFromString(sc.c_filename);
4734 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004735 if (!PyErr_Occurred())
4736 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004737 sc.c_nlocals,
4738 sc.c_maxstacklevel,
4739 sc.c_flags,
4740 sc.c_code,
4741 consts,
4742 names,
4743 varnames,
4744 freevars,
4745 cellvars,
4746 filename,
4747 name,
4748 sc.c_firstlineno,
4749 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004750 Py_XDECREF(consts);
4751 Py_XDECREF(names);
4752 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004753 Py_XDECREF(freevars);
4754 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004755 Py_XDECREF(filename);
4756 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004757 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004758 else if (!PyErr_Occurred()) {
4759 /* This could happen if someone called PyErr_Clear() after an
4760 error was reported above. That's not supposed to happen,
4761 but I just plugged one case and I'm not sure there can't be
4762 others. In that case, raise SystemError so that at least
4763 it gets reported instead dumping core. */
4764 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4765 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004766 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004767 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004768 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004769 sc.c_symtable = NULL;
4770 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004771 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004772 return co;
4773}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004774
4775int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004776PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004777{
4778 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004779 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004780 int line = co->co_firstlineno;
4781 int addr = 0;
4782 while (--size >= 0) {
4783 addr += *p++;
4784 if (addr > addrq)
4785 break;
4786 line += *p++;
4787 }
4788 return line;
4789}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004790
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004791/* The test for LOCAL must come before the test for FREE in order to
4792 handle classes where name is both local and free. The local var is
4793 a method and the free var is a free var referenced within a method.
4794*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004795
4796static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004797get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004798{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004799 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004800 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004801
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004802 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4803 return CELL;
4804 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4805 return LOCAL;
4806 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4807 return FREE;
4808 v = PyDict_GetItemString(c->c_globals, name);
4809 if (v) {
4810 if (v == Py_None)
4811 return GLOBAL_EXPLICIT;
4812 else {
4813 return GLOBAL_IMPLICIT;
4814 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004815 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004816 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004817 "unknown scope for %.100s in %.100s(%s) "
4818 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4819 name, c->c_name,
4820 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4821 c->c_filename,
4822 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4823 PyObject_REPR(c->c_locals),
4824 PyObject_REPR(c->c_globals)
4825 );
4826
4827 Py_FatalError(buf);
4828 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004829}
4830
Guido van Rossum207fda62001-03-02 03:30:41 +00004831/* Helper functions to issue warnings */
4832
4833static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004834issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004835{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004836 if (PyErr_Occurred()) {
4837 /* This can happen because symtable_node continues
4838 processing even after raising a SyntaxError.
4839 Calling PyErr_WarnExplicit now would clobber the
4840 pending exception; instead we fail and let that
4841 exception propagate.
4842 */
4843 return -1;
4844 }
Guido van Rossum207fda62001-03-02 03:30:41 +00004845 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4846 lineno, NULL, NULL) < 0) {
4847 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4848 PyErr_SetString(PyExc_SyntaxError, msg);
4849 PyErr_SyntaxLocation(filename, lineno);
4850 }
4851 return -1;
4852 }
4853 return 0;
4854}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004855
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004856static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004857symtable_warn(struct symtable *st, char *msg)
4858{
Guido van Rossum207fda62001-03-02 03:30:41 +00004859 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004860 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004861 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004862 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004863 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004864}
4865
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004866/* Helper function for setting lineno and filename */
4867
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004868static struct symtable *
4869symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004870{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004871 struct symtable *st;
4872
4873 st = symtable_init();
4874 if (st == NULL)
4875 return NULL;
4876 st->st_future = ff;
4877 st->st_filename = filename;
4878 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
4879 if (st->st_errors > 0)
4880 goto fail;
4881 symtable_node(st, n);
4882 if (st->st_errors > 0)
4883 goto fail;
4884 return st;
4885 fail:
4886 if (!PyErr_Occurred()) {
4887 /* This could happen because after a syntax error is
4888 detected, the symbol-table-building continues for
4889 a while, and PyErr_Clear() might erroneously be
4890 called during that process. One such case has been
4891 fixed, but there might be more (now or later).
4892 */
4893 PyErr_SetString(PyExc_SystemError, "lost exception");
4894 }
4895 st->st_future = NULL;
4896 st->st_filename = NULL;
4897 PySymtable_Free(st);
4898 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004899}
4900
4901static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004902symtable_init_compiling_symbols(struct compiling *c)
4903{
4904 PyObject *varnames;
4905
4906 varnames = c->c_symtable->st_cur->ste_varnames;
4907 if (varnames == NULL) {
4908 varnames = PyList_New(0);
4909 if (varnames == NULL)
4910 return -1;
4911 c->c_symtable->st_cur->ste_varnames = varnames;
4912 Py_INCREF(varnames);
4913 } else
4914 Py_INCREF(varnames);
4915 c->c_varnames = varnames;
4916
4917 c->c_globals = PyDict_New();
4918 if (c->c_globals == NULL)
4919 return -1;
4920 c->c_freevars = PyDict_New();
4921 if (c->c_freevars == NULL)
4922 return -1;
4923 c->c_cellvars = PyDict_New();
4924 if (c->c_cellvars == NULL)
4925 return -1;
4926 return 0;
4927}
4928
4929struct symbol_info {
4930 int si_nlocals;
4931 int si_ncells;
4932 int si_nfrees;
4933 int si_nimplicit;
4934};
4935
4936static void
4937symtable_init_info(struct symbol_info *si)
4938{
4939 si->si_nlocals = 0;
4940 si->si_ncells = 0;
4941 si->si_nfrees = 0;
4942 si->si_nimplicit = 0;
4943}
4944
4945static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004946symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004947 struct symbol_info *si)
4948{
4949 PyObject *dict, *v;
4950
4951 /* Seperate logic for DEF_FREE. If it occurs in a function,
4952 it indicates a local that we must allocate storage for (a
4953 cell var). If it occurs in a class, then the class has a
4954 method and a free variable with the same name.
4955 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004956 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004957 /* If it isn't declared locally, it can't be a cell. */
4958 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4959 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004960 v = PyInt_FromLong(si->si_ncells++);
4961 dict = c->c_cellvars;
4962 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004963 /* If it is free anyway, then there is no need to do
4964 anything here.
4965 */
4966 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004967 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004968 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004969 v = PyInt_FromLong(si->si_nfrees++);
4970 dict = c->c_freevars;
4971 }
4972 if (v == NULL)
4973 return -1;
4974 if (PyDict_SetItem(dict, name, v) < 0) {
4975 Py_DECREF(v);
4976 return -1;
4977 }
4978 Py_DECREF(v);
4979 return 0;
4980}
4981
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004982/* If a variable is a cell and an argument, make sure that appears in
4983 co_cellvars before any variable to its right in varnames.
4984*/
4985
4986
4987static int
4988symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4989 PyObject *varnames, int flags)
4990{
Tim Petersb39903b2003-03-24 17:22:24 +00004991 PyObject *v = NULL;
4992 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004993 int i, pos;
4994
4995 if (flags & CO_VARARGS)
4996 argcount++;
4997 if (flags & CO_VARKEYWORDS)
4998 argcount++;
4999 for (i = argcount; --i >= 0; ) {
5000 v = PyList_GET_ITEM(varnames, i);
5001 if (PyDict_GetItem(*cellvars, v)) {
5002 if (list == NULL) {
5003 list = PyList_New(1);
5004 if (list == NULL)
5005 return -1;
5006 PyList_SET_ITEM(list, 0, v);
5007 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005008 } else {
5009 if (PyList_Insert(list, 0, v) < 0) {
5010 Py_DECREF(list);
5011 return -1;
5012 }
5013 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005014 }
5015 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00005016 if (list == NULL)
5017 return 0;
5018
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005019 /* There are cellvars that are also arguments. Create a dict
5020 to replace cellvars and put the args at the front.
5021 */
5022 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005023 if (d == NULL)
5024 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005025 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
5026 v = PyInt_FromLong(i);
5027 if (v == NULL)
5028 goto fail;
5029 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
5030 goto fail;
5031 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
5032 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00005033 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005034 }
5035 pos = 0;
5036 i = PyList_GET_SIZE(list);
5037 Py_DECREF(list);
5038 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
5039 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005040 if (w == NULL)
5041 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005042 if (PyDict_SetItem(d, v, w) < 0) {
5043 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00005044 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005045 goto fail;
5046 }
5047 Py_DECREF(w);
5048 }
5049 Py_DECREF(*cellvars);
5050 *cellvars = d;
5051 return 1;
5052 fail:
5053 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00005054 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005055 return -1;
5056}
5057
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005058static int
5059symtable_freevar_offsets(PyObject *freevars, int offset)
5060{
5061 PyObject *name, *v;
5062 int pos;
5063
5064 /* The cell vars are the first elements of the closure,
5065 followed by the free vars. Update the offsets in
5066 c_freevars to account for number of cellvars. */
5067 pos = 0;
5068 while (PyDict_Next(freevars, &pos, &name, &v)) {
5069 int i = PyInt_AS_LONG(v) + offset;
5070 PyObject *o = PyInt_FromLong(i);
5071 if (o == NULL)
5072 return -1;
5073 if (PyDict_SetItem(freevars, name, o) < 0) {
5074 Py_DECREF(o);
5075 return -1;
5076 }
5077 Py_DECREF(o);
5078 }
5079 return 0;
5080}
5081
5082static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005083symtable_check_unoptimized(struct compiling *c,
5084 PySymtableEntryObject *ste,
5085 struct symbol_info *si)
5086{
5087 char buf[300];
5088
5089 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
5090 || (ste->ste_nested && si->si_nimplicit)))
5091 return 0;
5092
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005093#define ILLEGAL_CONTAINS "contains a nested function with free variables"
5094
5095#define ILLEGAL_IS "is a nested function"
5096
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005097#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005098"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005099
5100#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005101"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005102
5103#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005104"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005105"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005106
5107 /* XXX perhaps the linenos for these opt-breaking statements
5108 should be stored so the exception can point to them. */
5109
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005110 if (ste->ste_child_free) {
5111 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005112 PyOS_snprintf(buf, sizeof(buf),
5113 ILLEGAL_IMPORT_STAR,
5114 PyString_AS_STRING(ste->ste_name),
5115 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005116 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005117 PyOS_snprintf(buf, sizeof(buf),
5118 ILLEGAL_BARE_EXEC,
5119 PyString_AS_STRING(ste->ste_name),
5120 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005121 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005122 PyOS_snprintf(buf, sizeof(buf),
5123 ILLEGAL_EXEC_AND_IMPORT_STAR,
5124 PyString_AS_STRING(ste->ste_name),
5125 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005126 }
5127 } else {
5128 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005129 PyOS_snprintf(buf, sizeof(buf),
5130 ILLEGAL_IMPORT_STAR,
5131 PyString_AS_STRING(ste->ste_name),
5132 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005133 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005134 PyOS_snprintf(buf, sizeof(buf),
5135 ILLEGAL_BARE_EXEC,
5136 PyString_AS_STRING(ste->ste_name),
5137 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005138 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005139 PyOS_snprintf(buf, sizeof(buf),
5140 ILLEGAL_EXEC_AND_IMPORT_STAR,
5141 PyString_AS_STRING(ste->ste_name),
5142 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005143 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005144 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005145
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005146 PyErr_SetString(PyExc_SyntaxError, buf);
5147 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5148 ste->ste_opt_lineno);
5149 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005150}
5151
5152static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005153symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5154 struct symbol_info *si)
5155{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005156 if (c->c_future)
5157 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005158 if (ste->ste_generator)
5159 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005160 if (ste->ste_type != TYPE_MODULE)
5161 c->c_flags |= CO_NEWLOCALS;
5162 if (ste->ste_type == TYPE_FUNCTION) {
5163 c->c_nlocals = si->si_nlocals;
5164 if (ste->ste_optimized == 0)
5165 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005166 else if (ste->ste_optimized != OPT_EXEC)
5167 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005168 }
5169 return 0;
5170}
5171
5172static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005173symtable_error(struct symtable *st, int lineno)
5174{
5175 if (lineno == 0)
5176 lineno = st->st_cur->ste_lineno;
5177 PyErr_SyntaxLocation(st->st_filename, lineno);
5178 st->st_errors++;
5179 return -1;
5180}
5181
5182static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005183symtable_load_symbols(struct compiling *c)
5184{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005185 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005186 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005187 PyObject *name, *varnames, *v;
5188 int i, flags, pos;
5189 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005190
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005191 v = NULL;
5192
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005193 if (symtable_init_compiling_symbols(c) < 0)
5194 goto fail;
5195 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005196 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005197 si.si_nlocals = PyList_GET_SIZE(varnames);
5198 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005199
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005200 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005201 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005202 if (v == NULL)
5203 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005204 if (PyDict_SetItem(c->c_locals,
5205 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005206 goto fail;
5207 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005208 }
5209
5210 /* XXX The cases below define the rules for whether a name is
5211 local or global. The logic could probably be clearer. */
5212 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005213 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5214 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005215
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005216 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005217 /* undo the original DEF_FREE */
5218 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005219
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005220 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005221 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005222 2. Free variables in methods that are also class
5223 variables or declared global.
5224 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005225 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005226 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005227
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005228 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005229 c->c_argcount--;
5230 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005231 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005232 c->c_argcount--;
5233 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005234 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005235 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005236 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005237 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005238 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005239 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005240 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005241 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005242 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005243 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5244 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005245 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005246 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005247 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005248 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005249 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005250 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005251 if (v == NULL)
5252 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005253 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005254 goto fail;
5255 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005256 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005257 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005258 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005259 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005260 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005261 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005262 if (v == NULL)
5263 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005264 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005265 goto fail;
5266 Py_DECREF(v);
5267 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005268 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005269 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005270 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005271 goto fail;
5272 if (st->st_nscopes != 1) {
5273 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005274 if (v == NULL)
5275 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005276 if (PyDict_SetItem(st->st_global,
5277 name, v))
5278 goto fail;
5279 Py_DECREF(v);
5280 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005281 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005282 }
5283 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005284 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5285
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005286 if (si.si_ncells > 1) { /* one cell is always in order */
5287 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5288 c->c_varnames, c->c_flags) < 0)
5289 return -1;
5290 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005291 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5292 return -1;
5293 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005294 fail:
5295 /* is this always the right thing to do? */
5296 Py_XDECREF(v);
5297 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005298}
5299
5300static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005301symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005302{
5303 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005304
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005305 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005306 if (st == NULL)
5307 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005308 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005309
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005310 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005311 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005312 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005313 goto fail;
5314 if ((st->st_symbols = PyDict_New()) == NULL)
5315 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005316 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005317 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005318 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005319 st->st_private = NULL;
5320 return st;
5321 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005322 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005323 return NULL;
5324}
5325
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005326void
5327PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005328{
5329 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005330 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005331 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005332 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005333}
5334
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005335/* When the compiler exits a scope, it must should update the scope's
5336 free variable information with the list of free variables in its
5337 children.
5338
5339 Variables that are free in children and defined in the current
5340 scope are cellvars.
5341
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005342 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005343 false), free variables in children that are not defined here are
5344 implicit globals.
5345
5346*/
5347
5348static int
5349symtable_update_free_vars(struct symtable *st)
5350{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005351 int i, j, def;
5352 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005353 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005354
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005355 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005356 def = DEF_FREE_CLASS;
5357 else
5358 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005359 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005360 int pos = 0;
5361
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005362 if (list && PyList_SetSlice(list, 0,
5363 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005364 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005365 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005366 PyList_GET_ITEM(ste->ste_children, i);
5367 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005368 int flags = PyInt_AS_LONG(o);
5369 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005370 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005371 if (list == NULL) {
5372 list = PyList_New(0);
5373 if (list == NULL)
5374 return -1;
5375 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005376 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005377 if (PyList_Append(list, name) < 0) {
5378 Py_DECREF(list);
5379 return -1;
5380 }
5381 }
5382 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005383 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005384 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005385 v = PyDict_GetItem(ste->ste_symbols, name);
5386 /* If a name N is declared global in scope A and
5387 referenced in scope B contained (perhaps
5388 indirectly) in A and there are no scopes
5389 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005390 is global in B. Unless A is a class scope,
5391 because class scopes are not considered for
5392 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005393 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005394 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005395 int flags = PyInt_AS_LONG(v);
5396 if (flags & DEF_GLOBAL) {
5397 symtable_undo_free(st, child->ste_id,
5398 name);
5399 continue;
5400 }
5401 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005402 if (ste->ste_nested) {
5403 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005404 name, def) < 0) {
5405 Py_DECREF(list);
5406 return -1;
5407 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005408 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005409 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005410 name) < 0) {
5411 Py_DECREF(list);
5412 return -1;
5413 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005414 }
5415 }
5416 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005417
5418 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005419 return 0;
5420}
5421
5422/* If the current scope is a non-nested class or if name is not
5423 defined in the current, non-nested scope, then it is an implicit
5424 global in all nested scopes.
5425*/
5426
5427static int
5428symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5429{
5430 PyObject *o;
5431 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005432 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005433
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005434 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005435 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005436 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005437 if (o == NULL)
5438 return symtable_undo_free(st, child, name);
5439 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005440
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005441 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005442 return symtable_undo_free(st, child, name);
5443 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005444 return symtable_add_def_o(st, ste->ste_symbols,
5445 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005446}
5447
5448static int
5449symtable_undo_free(struct symtable *st, PyObject *id,
5450 PyObject *name)
5451{
5452 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005453 PyObject *info;
5454 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005455
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005456 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5457 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005458 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005459
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005460 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005461 if (info == NULL)
5462 return 0;
5463 v = PyInt_AS_LONG(info);
5464 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005465 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005466 DEF_FREE_GLOBAL) < 0)
5467 return -1;
5468 } else
5469 /* If the name is defined here or declared global,
5470 then the recursion stops. */
5471 return 0;
5472
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005473 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5474 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005475 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005476 PyList_GET_ITEM(ste->ste_children, i);
5477 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005478 if (x < 0)
5479 return x;
5480 }
5481 return 0;
5482}
5483
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005484/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5485 This reference is released when the scope is exited, via the DECREF
5486 in symtable_exit_scope().
5487*/
5488
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005489static int
5490symtable_exit_scope(struct symtable *st)
5491{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005492 int end;
5493
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005494 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005495 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005496 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005497 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005498 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5499 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005500 if (PySequence_DelItem(st->st_stack, end) < 0)
5501 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005502 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005503}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005504
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005505static void
5506symtable_enter_scope(struct symtable *st, char *name, int type,
5507 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005508{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005509 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005510
5511 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005512 prev = st->st_cur;
5513 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005514 st->st_errors++;
5515 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005516 }
5517 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005518 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005519 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005520 if (st->st_cur == NULL) {
5521 st->st_errors++;
5522 return;
5523 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005524 if (strcmp(name, TOP) == 0)
5525 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005526 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005527 if (PyList_Append(prev->ste_children,
5528 (PyObject *)st->st_cur) < 0)
5529 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005530 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005531}
5532
5533static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005534symtable_lookup(struct symtable *st, char *name)
5535{
5536 char buffer[MANGLE_LEN];
5537 PyObject *v;
5538 int flags;
5539
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005540 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005541 name = buffer;
5542 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5543 if (v == NULL) {
5544 if (PyErr_Occurred())
5545 return -1;
5546 else
5547 return 0;
5548 }
5549
5550 flags = PyInt_AS_LONG(v);
5551 return flags;
5552}
5553
5554static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005555symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005556{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005557 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005558 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005559 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005560
Guido van Rossumb7164622002-08-16 02:48:11 +00005561 /* Warn about None, except inside a tuple (where the assignment
5562 code already issues a warning). */
5563 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5564 *name == 'N' && strcmp(name, "None") == 0)
5565 {
Raymond Hettinger11a70c72004-07-17 21:46:25 +00005566 PyErr_SetString(PyExc_SyntaxError,
5567 "Invalid syntax. Assignment to None.");
5568 symtable_error(st, 0);
5569 return -1;
Guido van Rossumb7164622002-08-16 02:48:11 +00005570 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005571 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005572 name = buffer;
5573 if ((s = PyString_InternFromString(name)) == NULL)
5574 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005575 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5576 Py_DECREF(s);
5577 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005578}
5579
5580/* Must only be called with mangled names */
5581
5582static int
5583symtable_add_def_o(struct symtable *st, PyObject *dict,
5584 PyObject *name, int flag)
5585{
5586 PyObject *o;
5587 int val;
5588
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005589 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005590 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005591 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005592 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005593 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005594 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005595 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005596 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005597 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005598 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005599 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005600 if (o == NULL)
5601 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005602 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005603 Py_DECREF(o);
5604 return -1;
5605 }
5606 Py_DECREF(o);
5607
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005608 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005609 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005610 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005611 } else if (flag & DEF_GLOBAL) {
5612 /* XXX need to update DEF_GLOBAL for other flags too;
5613 perhaps only DEF_FREE_GLOBAL */
5614 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005615 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005616 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005617 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005618 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005619 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005620 if (o == NULL)
5621 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005622 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005623 Py_DECREF(o);
5624 return -1;
5625 }
5626 Py_DECREF(o);
5627 }
5628 return 0;
5629}
5630
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005631#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005632
Tim Peters08a898f2001-06-28 01:52:22 +00005633/* Look for a yield stmt under n. Return 1 if found, else 0.
5634 This hack is used to look inside "if 0:" blocks (which are normally
5635 ignored) in case those are the only places a yield occurs (so that this
5636 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005637static int
5638look_for_yield(node *n)
5639{
5640 int i;
5641
5642 for (i = 0; i < NCH(n); ++i) {
5643 node *kid = CHILD(n, i);
5644
5645 switch (TYPE(kid)) {
5646
5647 case classdef:
5648 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005649 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005650 /* Stuff in nested functions and classes can't make
5651 the parent a generator. */
5652 return 0;
5653
5654 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00005655 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005656
5657 default:
5658 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00005659 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005660 }
5661 }
5662 return 0;
5663}
5664
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005665static void
5666symtable_node(struct symtable *st, node *n)
5667{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005668 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005669
5670 loop:
5671 switch (TYPE(n)) {
5672 case funcdef: {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005673 char *func_name;
5674 if (NCH(n) == 6)
5675 symtable_node(st, CHILD(n, 0));
5676 func_name = STR(RCHILD(n, -4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005677 symtable_add_def(st, func_name, DEF_LOCAL);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005678 symtable_default_args(st, RCHILD(n, -3));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005679 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005680 symtable_funcdef(st, n);
5681 symtable_exit_scope(st);
5682 break;
5683 }
5684 case lambdef:
5685 if (NCH(n) == 4)
5686 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005687 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005688 symtable_funcdef(st, n);
5689 symtable_exit_scope(st);
5690 break;
5691 case classdef: {
5692 char *tmp, *class_name = STR(CHILD(n, 1));
5693 symtable_add_def(st, class_name, DEF_LOCAL);
5694 if (TYPE(CHILD(n, 2)) == LPAR) {
5695 node *bases = CHILD(n, 3);
5696 int i;
5697 for (i = 0; i < NCH(bases); i += 2) {
5698 symtable_node(st, CHILD(bases, i));
5699 }
5700 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005701 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005702 tmp = st->st_private;
5703 st->st_private = class_name;
5704 symtable_node(st, CHILD(n, NCH(n) - 1));
5705 st->st_private = tmp;
5706 symtable_exit_scope(st);
5707 break;
5708 }
5709 case if_stmt:
5710 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005711 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5712 if (st->st_cur->ste_generator == 0)
5713 st->st_cur->ste_generator =
5714 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005715 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005716 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005717 symtable_node(st, CHILD(n, i + 1));
5718 symtable_node(st, CHILD(n, i + 3));
5719 }
5720 if (i + 2 < NCH(n))
5721 symtable_node(st, CHILD(n, i + 2));
5722 break;
5723 case global_stmt:
5724 symtable_global(st, n);
5725 break;
5726 case import_stmt:
5727 symtable_import(st, n);
5728 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005729 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005730 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005731 symtable_node(st, CHILD(n, 1));
5732 if (NCH(n) > 2)
5733 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005734 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005735 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005736 st->st_cur->ste_opt_lineno = n->n_lineno;
5737 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005738 if (NCH(n) > 4)
5739 symtable_node(st, CHILD(n, 5));
5740 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005741
5742 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005743 case assert_stmt:
5744 if (Py_OptimizeFlag)
5745 return;
5746 if (NCH(n) == 2) {
5747 n = CHILD(n, 1);
5748 goto loop;
5749 } else {
5750 symtable_node(st, CHILD(n, 1));
5751 n = CHILD(n, 3);
5752 goto loop;
5753 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005754 case except_clause:
5755 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005756 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005757 if (NCH(n) > 1) {
5758 n = CHILD(n, 1);
5759 goto loop;
5760 }
5761 break;
5762 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005763 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005764 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005765 case yield_stmt:
5766 st->st_cur->ste_generator = 1;
5767 n = CHILD(n, 1);
5768 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005769 case expr_stmt:
5770 if (NCH(n) == 1)
5771 n = CHILD(n, 0);
5772 else {
5773 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005774 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005775 symtable_node(st, CHILD(n, 2));
5776 break;
5777 } else {
5778 int i;
5779 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005780 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005781 n = CHILD(n, NCH(n) - 1);
5782 }
5783 }
5784 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005785 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005786 /* only occurs when there are multiple for loops
5787 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005788 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005789 if (TYPE(n) == list_for)
5790 symtable_list_for(st, n);
5791 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005792 REQ(n, list_if);
5793 symtable_node(st, CHILD(n, 1));
5794 if (NCH(n) == 3) {
5795 n = CHILD(n, 2);
5796 goto loop;
5797 }
5798 }
5799 break;
5800 case for_stmt:
5801 symtable_assign(st, CHILD(n, 1), 0);
5802 for (i = 3; i < NCH(n); ++i)
5803 if (TYPE(CHILD(n, i)) >= single_input)
5804 symtable_node(st, CHILD(n, i));
5805 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00005806 case arglist:
5807 if (NCH(n) > 1)
5808 for (i = 0; i < NCH(n); ++i) {
5809 node *ch = CHILD(n, i);
5810 if (TYPE(ch) == argument && NCH(ch) == 2 &&
5811 TYPE(CHILD(ch, 1)) == gen_for) {
5812 PyErr_SetString(PyExc_SyntaxError,
5813 "invalid syntax");
5814 symtable_error(st, n->n_lineno);
5815 return;
5816 }
5817 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005818 /* The remaining cases fall through to default except in
5819 special circumstances. This requires the individual cases
5820 to be coded with great care, even though they look like
5821 rather innocuous. Each case must double-check TYPE(n).
5822 */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005823 case decorator:
5824 if (TYPE(n) == decorator) {
5825 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
5826 node *name, *varname;
5827 name = CHILD(n, 1);
5828 REQ(name, dotted_name);
5829 varname = CHILD(name, 0);
5830 REQ(varname, NAME);
5831 symtable_add_use(st, STR(varname));
5832 }
5833 /* fall through */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005834 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005835 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005836 n = CHILD(n, 2);
5837 goto loop;
5838 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00005839 else if (TYPE(n) == argument && NCH(n) == 2 &&
5840 TYPE(CHILD(n, 1)) == gen_for) {
5841 symtable_generator_expression(st, n);
5842 break;
5843 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005844 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005845 case listmaker:
5846 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005847 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005848 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005849 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005850 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00005851 case testlist_gexp:
5852 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
5853 symtable_generator_expression(st, n);
5854 break;
5855 }
5856 /* fall through */
5857
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005858 case atom:
5859 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5860 symtable_add_use(st, STR(CHILD(n, 0)));
5861 break;
5862 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005863 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005864 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005865 /* Walk over every non-token child with a special case
5866 for one child.
5867 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005868 if (NCH(n) == 1) {
5869 n = CHILD(n, 0);
5870 goto loop;
5871 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005872 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005873 if (TYPE(CHILD(n, i)) >= single_input)
5874 symtable_node(st, CHILD(n, i));
5875 }
5876}
5877
5878static void
5879symtable_funcdef(struct symtable *st, node *n)
5880{
5881 node *body;
5882
5883 if (TYPE(n) == lambdef) {
5884 if (NCH(n) == 4)
5885 symtable_params(st, CHILD(n, 1));
5886 } else
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005887 symtable_params(st, RCHILD(n, -3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005888 body = CHILD(n, NCH(n) - 1);
5889 symtable_node(st, body);
5890}
5891
5892/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00005893 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005894 which are references in the defining scope. symtable_params()
5895 parses the parameter names, which are defined in the function's
5896 body.
5897
5898 varargslist:
5899 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5900 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5901*/
5902
5903static void
5904symtable_default_args(struct symtable *st, node *n)
5905{
5906 node *c;
5907 int i;
5908
5909 if (TYPE(n) == parameters) {
5910 n = CHILD(n, 1);
5911 if (TYPE(n) == RPAR)
5912 return;
5913 }
5914 REQ(n, varargslist);
5915 for (i = 0; i < NCH(n); i += 2) {
5916 c = CHILD(n, i);
5917 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5918 break;
5919 }
5920 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5921 symtable_node(st, CHILD(n, i));
5922 }
5923}
5924
5925static void
5926symtable_params(struct symtable *st, node *n)
5927{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005928 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00005929 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005930
5931 if (TYPE(n) == parameters) {
5932 n = CHILD(n, 1);
5933 if (TYPE(n) == RPAR)
5934 return;
5935 }
5936 REQ(n, varargslist);
5937 for (i = 0; i < NCH(n); i += 2) {
5938 c = CHILD(n, i);
5939 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5940 ext = 1;
5941 break;
5942 }
5943 if (TYPE(c) == test) {
5944 continue;
5945 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00005946 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005947 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00005948 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005949 char nbuf[30];
5950 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005951 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005952 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005953 }
5954 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005955 if (ext) {
5956 c = CHILD(n, i);
5957 if (TYPE(c) == STAR) {
5958 i++;
5959 symtable_add_def(st, STR(CHILD(n, i)),
5960 DEF_PARAM | DEF_STAR);
5961 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005962 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005963 c = NULL;
5964 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005965 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005966 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005967 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005968 i++;
5969 symtable_add_def(st, STR(CHILD(n, i)),
5970 DEF_PARAM | DEF_DOUBLESTAR);
5971 }
5972 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005973 if (complex >= 0) {
5974 int j;
5975 for (j = 0; j <= complex; j++) {
5976 c = CHILD(n, j);
5977 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005978 c = CHILD(n, ++j);
5979 else if (TYPE(c) == EQUAL)
5980 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005981 if (TYPE(CHILD(c, 0)) == LPAR)
5982 symtable_params_fplist(st, CHILD(c, 1));
5983 }
5984 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005985}
5986
5987static void
5988symtable_params_fplist(struct symtable *st, node *n)
5989{
5990 int i;
5991 node *c;
5992
5993 REQ(n, fplist);
5994 for (i = 0; i < NCH(n); i += 2) {
5995 c = CHILD(n, i);
5996 REQ(c, fpdef);
5997 if (NCH(c) == 1)
5998 symtable_add_def(st, STR(CHILD(c, 0)),
5999 DEF_PARAM | DEF_INTUPLE);
6000 else
6001 symtable_params_fplist(st, CHILD(c, 1));
6002 }
6003
6004}
6005
6006static void
6007symtable_global(struct symtable *st, node *n)
6008{
6009 int i;
6010
Jeremy Hylton9f324e92001-03-01 22:59:14 +00006011 /* XXX It might be helpful to warn about module-level global
6012 statements, but it's hard to tell the difference between
6013 module-level and a string passed to exec.
6014 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00006015
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006016 for (i = 1; i < NCH(n); i += 2) {
6017 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006018 int flags;
6019
6020 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006021 if (flags < 0)
6022 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006023 if (flags && flags != DEF_GLOBAL) {
6024 char buf[500];
6025 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00006026 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006027 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00006028 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006029 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006030 }
6031 else {
6032 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006033 PyOS_snprintf(buf, sizeof(buf),
6034 GLOBAL_AFTER_ASSIGN,
6035 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006036 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006037 PyOS_snprintf(buf, sizeof(buf),
6038 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00006039 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006040 }
6041 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006042 symtable_add_def(st, name, DEF_GLOBAL);
6043 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006044}
6045
6046static void
6047symtable_list_comprehension(struct symtable *st, node *n)
6048{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006049 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006050 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006051
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006052 REQ(n, listmaker);
6053 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
6054 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006055 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006056 symtable_list_for(st, CHILD(n, 1));
6057 symtable_node(st, CHILD(n, 0));
6058 --st->st_cur->ste_tmpname;
6059}
6060
6061static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006062symtable_generator_expression(struct symtable *st, node *n)
6063{
6064 /* testlist_gexp: test gen_for */
6065 REQ(CHILD(n, 0), test);
6066 REQ(CHILD(n, 1), gen_for);
6067
6068 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
6069 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
6070
6071 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
6072
6073 symtable_gen_for(st, CHILD(n, 1), 1);
6074 symtable_node(st, CHILD(n, 0));
6075 symtable_exit_scope(st);
6076
6077 /* for outmost iterable precomputation */
6078 symtable_node(st, CHILD(CHILD(n, 1), 3));
6079}
6080
6081static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006082symtable_list_for(struct symtable *st, node *n)
6083{
6084 REQ(n, list_for);
6085 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006086 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006087 symtable_node(st, CHILD(n, 3));
6088 if (NCH(n) == 5)
6089 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006090}
6091
6092static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006093symtable_gen_for(struct symtable *st, node *n, int is_outmost)
6094{
6095 REQ(n, gen_for);
6096
6097 /* gen_for: for v in test [gen_iter] */
6098 symtable_assign(st, CHILD(n, 1), 0);
6099 if (is_outmost)
6100 symtable_add_use(st, "[outmost-iterable]");
6101 else
6102 symtable_node(st, CHILD(n, 3));
6103
6104 if (NCH(n) == 5)
6105 symtable_gen_iter(st, CHILD(n, 4));
6106}
6107
6108static void
6109symtable_gen_iter(struct symtable *st, node *n)
6110{
6111 REQ(n, gen_iter);
6112
6113 n = CHILD(n, 0);
6114 if (TYPE(n) == gen_for)
6115 symtable_gen_for(st, n, 0);
6116 else {
6117 REQ(n, gen_if);
6118 symtable_node(st, CHILD(n, 1));
6119
6120 if (NCH(n) == 3)
6121 symtable_gen_iter(st, CHILD(n, 2));
6122 }
6123}
6124
6125static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006126symtable_import(struct symtable *st, node *n)
6127{
6128 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006129 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006130 | 'from' dotted_name 'import'
6131 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00006132 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006133 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006134 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006135 node *dotname = CHILD(n, 1);
6136 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6137 /* check for bogus imports */
6138 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6139 PyErr_SetString(PyExc_SyntaxError,
6140 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006141 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006142 return;
6143 }
6144 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006145 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006146 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006147 if (symtable_warn(st,
6148 "import * only allowed at module level") < 0)
6149 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006150 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006151 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006152 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006153 } else {
6154 for (i = 3; i < NCH(n); i += 2) {
6155 node *c = CHILD(n, i);
6156 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006157 symtable_assign(st, CHILD(c, 2),
6158 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006159 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006160 symtable_assign(st, CHILD(c, 0),
6161 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006162 }
6163 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006164 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006165 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006166 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006167 }
6168 }
6169}
6170
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006171/* The third argument to symatble_assign() is a flag to be passed to
6172 symtable_add_def() if it is eventually called. The flag is useful
6173 to specify the particular type of assignment that should be
6174 recorded, e.g. an assignment caused by import.
6175 */
6176
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006177static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006178symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006179{
6180 node *tmp;
6181 int i;
6182
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006183 loop:
6184 switch (TYPE(n)) {
6185 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006186 /* invalid assignment, e.g. lambda x:x=2. The next
6187 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006188 return;
6189 case power:
6190 if (NCH(n) > 2) {
6191 for (i = 2; i < NCH(n); ++i)
6192 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6193 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006194 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006195 if (NCH(n) > 1) {
6196 symtable_node(st, CHILD(n, 0));
6197 symtable_node(st, CHILD(n, 1));
6198 } else {
6199 n = CHILD(n, 0);
6200 goto loop;
6201 }
6202 return;
6203 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006204 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6205 /* XXX This is an error, but the next pass
6206 will catch it. */
6207 return;
6208 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006209 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006210 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006211 }
6212 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006213 case testlist_gexp:
6214 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6215 /* XXX This is an error, but the next pass
6216 will catch it. */
6217 return;
6218 } else {
6219 for (i = 0; i < NCH(n); i += 2)
6220 symtable_assign(st, CHILD(n, i), def_flag);
6221 }
6222 return;
6223
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006224 case exprlist:
6225 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006226 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006227 if (NCH(n) == 1) {
6228 n = CHILD(n, 0);
6229 goto loop;
6230 }
6231 else {
6232 int i;
6233 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006234 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006235 return;
6236 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006237 case atom:
6238 tmp = CHILD(n, 0);
6239 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6240 n = CHILD(n, 1);
6241 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006242 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006243 if (strcmp(STR(tmp), "__debug__") == 0) {
6244 PyErr_SetString(PyExc_SyntaxError,
6245 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006246 symtable_error(st, n->n_lineno);
6247 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006248 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006249 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006250 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006251 return;
6252 case dotted_as_name:
6253 if (NCH(n) == 3)
6254 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006255 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006256 else
6257 symtable_add_def(st,
6258 STR(CHILD(CHILD(n,
6259 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006260 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006261 return;
6262 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006263 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006264 return;
6265 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006266 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006267 return;
6268 default:
6269 if (NCH(n) == 0)
6270 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006271 if (NCH(n) == 1) {
6272 n = CHILD(n, 0);
6273 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006274 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006275 /* Should only occur for errors like x + 1 = 1,
6276 which will be caught in the next pass. */
6277 for (i = 0; i < NCH(n); ++i)
6278 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006279 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006280 }
6281}