blob: 0b5ba6cd3814723a49d6151ea9a1c5243bfe6607 [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));
Anthony Baxter4e7785a2004-08-02 11:08:15 +00004028 com_push(c, 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004029
4030 for (i = 1; i < nch; i += 2) {
4031 node *attrname;
4032
4033 REQ(CHILD(n, i), DOT);
4034
4035 attrname = CHILD(n, i + 1);
4036 REQ(attrname, NAME);
4037 com_addop_name(c, LOAD_ATTR, STR(attrname));
4038 }
4039}
4040
4041static void
4042com_decorator(struct compiling *c, node *n)
4043{
4044 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
4045 int nch = NCH(n);
4046 assert(nch >= 2);
4047 REQ(CHILD(n, 0), AT);
4048 com_decorator_name(c, CHILD(n, 1));
4049
4050 if (nch > 2) {
4051 assert(nch == 4 || nch == 5);
4052 REQ(CHILD(n, 2), LPAR);
4053 REQ(CHILD(n, nch - 1), RPAR);
4054 com_call_function(c, CHILD(n, 3));
4055 }
4056}
4057
4058static int
4059com_decorators(struct compiling *c, node *n)
4060{
4061 int i, nch, ndecorators;
4062
4063 /* decorator ([NEWLINE] decorator)* NEWLINE */
4064 nch = NCH(n);
4065 assert(nch >= 2);
4066 REQ(CHILD(n, nch - 1), NEWLINE);
4067
4068 ndecorators = 0;
4069 for (i = NCH(n) - 1; i >= 0; --i) {
4070 node *ch = CHILD(n, i);
4071 if (TYPE(ch) != NEWLINE) {
4072 com_decorator(c, ch);
4073 ++ndecorators;
4074 }
4075 }
4076
4077 return ndecorators;
4078}
4079
4080static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004081com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004082{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004083 PyObject *co;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004084 int ndefs, ndecorators;
4085 REQ(n, funcdef);
4086 /* -6 -5 -4 -3 -2 -1
4087 funcdef: [decorators] 'def' NAME parameters ':' suite */
4088
4089 if (NCH(n) == 6)
4090 ndecorators = com_decorators(c, CHILD(n, 0));
4091 else
4092 ndecorators = 0;
4093
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004094 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004095 if (ndefs < 0)
4096 return;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004097 symtable_enter_scope(c->c_symtable, STR(RCHILD(n, -4)), TYPE(n),
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004098 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004099 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004100 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004101 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004102 c->c_errors++;
4103 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004104 int closure = com_make_closure(c, (PyCodeObject *)co);
4105 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004106 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004107 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004108 if (closure)
4109 com_addoparg(c, MAKE_CLOSURE, ndefs);
4110 else
4111 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004112 com_pop(c, ndefs);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004113 while (ndecorators > 0) {
4114 com_addoparg(c, CALL_FUNCTION, 1);
4115 com_pop(c, 1);
4116 ndecorators--;
4117 }
4118 com_addop_varname(c, VAR_STORE, STR(RCHILD(n, -4)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004119 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004120 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004121 }
4122}
4123
4124static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004125com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004126{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004127 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004128 REQ(n, testlist);
4129 /* testlist: test (',' test)* [','] */
4130 for (i = 0; i < NCH(n); i += 2)
4131 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004132 i = (NCH(n)+1) / 2;
4133 com_addoparg(c, BUILD_TUPLE, i);
4134 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004135}
4136
4137static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004138com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004139{
Guido van Rossum25831651993-05-19 14:50:45 +00004140 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004141 PyObject *v;
4142 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004143 char *name;
4144
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004145 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004146 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004147 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004148 c->c_errors++;
4149 return;
4150 }
4151 /* Push the class name on the stack */
4152 i = com_addconst(c, v);
4153 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004154 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004155 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004156 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004157 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004158 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004159 com_push(c, 1);
4160 }
Guido van Rossum25831651993-05-19 14:50:45 +00004161 else
4162 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004163 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004164 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004165 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004166 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004167 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004168 c->c_errors++;
4169 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004170 int closure = com_make_closure(c, co);
4171 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004172 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004173 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004174 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004175 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004176 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004177 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004178 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004179 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004180 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004181 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004182 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004183 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004184 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004185 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004186}
4187
4188static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004189com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004190{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004191 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004192 if (c->c_errors)
4193 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004194 switch (TYPE(n)) {
4195
4196 /* Definition nodes */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004197
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004198 case funcdef:
4199 com_funcdef(c, n);
4200 break;
4201 case classdef:
4202 com_classdef(c, n);
4203 break;
4204
4205 /* Trivial parse tree nodes */
4206
4207 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004208 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004209 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004210 n = CHILD(n, 0);
4211 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004212
4213 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004214 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004215 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004216 {
4217 int i;
4218 for (i = 0; i < NCH(n)-1; i += 2)
4219 com_node(c, CHILD(n, i));
4220 }
4221 break;
4222
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004223 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004224 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004225 n = CHILD(n, 0);
4226 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004227
4228 /* Statement nodes */
4229
4230 case expr_stmt:
4231 com_expr_stmt(c, n);
4232 break;
4233 case print_stmt:
4234 com_print_stmt(c, n);
4235 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004236 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004237 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004238 break;
4239 case pass_stmt:
4240 break;
4241 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004242 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004243 com_error(c, PyExc_SyntaxError,
4244 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004245 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004246 com_addbyte(c, BREAK_LOOP);
4247 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004248 case continue_stmt:
4249 com_continue_stmt(c, n);
4250 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004251 case return_stmt:
4252 com_return_stmt(c, n);
4253 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004254 case yield_stmt:
4255 com_yield_stmt(c, n);
4256 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004257 case raise_stmt:
4258 com_raise_stmt(c, n);
4259 break;
4260 case import_stmt:
4261 com_import_stmt(c, n);
4262 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004263 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004264 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004265 case exec_stmt:
4266 com_exec_stmt(c, n);
4267 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004268 case assert_stmt:
4269 com_assert_stmt(c, n);
4270 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004271 case if_stmt:
4272 com_if_stmt(c, n);
4273 break;
4274 case while_stmt:
4275 com_while_stmt(c, n);
4276 break;
4277 case for_stmt:
4278 com_for_stmt(c, n);
4279 break;
4280 case try_stmt:
4281 com_try_stmt(c, n);
4282 break;
4283 case suite:
4284 com_suite(c, n);
4285 break;
4286
4287 /* Expression nodes */
4288
4289 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004290 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004291 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004292 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004293 break;
4294 case test:
4295 com_test(c, n);
4296 break;
4297 case and_test:
4298 com_and_test(c, n);
4299 break;
4300 case not_test:
4301 com_not_test(c, n);
4302 break;
4303 case comparison:
4304 com_comparison(c, n);
4305 break;
4306 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004307 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004308 break;
4309 case expr:
4310 com_expr(c, n);
4311 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004312 case xor_expr:
4313 com_xor_expr(c, n);
4314 break;
4315 case and_expr:
4316 com_and_expr(c, n);
4317 break;
4318 case shift_expr:
4319 com_shift_expr(c, n);
4320 break;
4321 case arith_expr:
4322 com_arith_expr(c, n);
4323 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004324 case term:
4325 com_term(c, n);
4326 break;
4327 case factor:
4328 com_factor(c, n);
4329 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004330 case power:
4331 com_power(c, n);
4332 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004333 case atom:
4334 com_atom(c, n);
4335 break;
4336
4337 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004338 com_error(c, PyExc_SystemError,
4339 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004340 }
4341}
4342
Tim Petersdbd9ba62000-07-09 03:09:57 +00004343static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004344
4345static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004346com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004347{
4348 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4349 if (TYPE(CHILD(n, 0)) == LPAR)
4350 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004351 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004352 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004353 com_pop(c, 1);
4354 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004355}
4356
4357static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004358com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004359{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004360 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004361 if (NCH(n) == 1) {
4362 com_fpdef(c, CHILD(n, 0));
4363 }
4364 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004365 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004366 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004367 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004368 for (i = 0; i < NCH(n); i += 2)
4369 com_fpdef(c, CHILD(n, i));
4370 }
4371}
4372
4373static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004374com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004375{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004376 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004377 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004378 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004379 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004380 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004381 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004382 nch = NCH(n);
4383 /* Enter all arguments in table of locals */
4384 for (i = 0, narg = 0; i < nch; i++) {
4385 node *ch = CHILD(n, i);
4386 node *fp;
4387 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004388 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004389 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4390 fp = CHILD(ch, 0);
4391 if (TYPE(fp) != NAME) {
4392 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4393 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004394 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004395 narg++;
4396 /* all name updates handled by symtable */
4397 if (++i >= nch)
4398 break;
4399 ch = CHILD(n, i);
4400 if (TYPE(ch) == EQUAL)
4401 i += 2;
4402 else
4403 REQ(ch, COMMA);
4404 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004405 if (complex) {
4406 /* Generate code for complex arguments only after
4407 having counted the simple arguments */
4408 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004409 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004410 node *ch = CHILD(n, i);
4411 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004412 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004413 break;
4414 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4415 fp = CHILD(ch, 0);
4416 if (TYPE(fp) != NAME) {
4417 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004418 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004419 com_fpdef(c, ch);
4420 }
4421 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004422 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004423 break;
4424 ch = CHILD(n, i);
4425 if (TYPE(ch) == EQUAL)
4426 i += 2;
4427 else
4428 REQ(ch, COMMA);
4429 }
4430 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004431}
4432
4433static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004434com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004435{
4436 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004437 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004438 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004439 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004440 if (doc != NULL) {
4441 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004442 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004443 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004444 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004445 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004446 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004447 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004448 for (i = 0; i < NCH(n); i++) {
4449 node *ch = CHILD(n, i);
4450 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4451 com_node(c, ch);
4452 }
4453}
4454
4455/* Top-level compile-node interface */
4456
4457static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004458compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004459{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004460 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004461 node *ch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004462 REQ(n, funcdef);
4463 /* -6 -5 -4 -3 -2 -1
4464 funcdef: [decorators] 'def' NAME parameters ':' suite */
4465 c->c_name = STR(RCHILD(n, -4));
4466 doc = get_docstring(c, RCHILD(n, -1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004467 if (doc != NULL) {
4468 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004469 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004470 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004471 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004472 (void) com_addconst(c, Py_None); /* No docstring */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004473 ch = RCHILD(n, -3); /* parameters: '(' [varargslist] ')' */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004474 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004475 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004476 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004477 c->c_infunction = 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004478 com_node(c, RCHILD(n, -1));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004479 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004480 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004481 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4482 com_push(c, 1);
4483 com_addbyte(c, RETURN_VALUE);
4484 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004485}
4486
4487static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004488compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004489{
Guido van Rossum590baa41993-11-30 13:40:46 +00004490 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004491 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004492 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004493
4494 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004495 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004496 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004497 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004498 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004499 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004500 else
4501 ch = CHILD(n, 2);
4502 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004503 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004504 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004505}
4506
4507static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004508compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004509{
4510 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004511 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004512 REQ(n, classdef);
4513 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4514 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004515 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004516 /* Initialize local __module__ from global __name__ */
4517 com_addop_name(c, LOAD_GLOBAL, "__name__");
4518 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004519 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004520 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004521 if (doc != NULL) {
4522 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004523 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004524 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004525 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004526 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004527 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004528 }
4529 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004530 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004531 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00004532 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004533 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004534 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004535 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004536 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004537}
4538
4539static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00004540compile_generator_expression(struct compiling *c, node *n)
4541{
4542 /* testlist_gexp: test gen_for */
4543 /* argument: test gen_for */
4544 REQ(CHILD(n, 0), test);
4545 REQ(CHILD(n, 1), gen_for);
4546
4547 c->c_name = "<generator expression>";
4548 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
4549
4550 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4551 com_push(c, 1);
4552 com_addbyte(c, RETURN_VALUE);
4553 com_pop(c, 1);
4554}
4555
4556static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004557compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004558{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004559 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004560
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004561 switch (TYPE(n)) {
4562
Guido van Rossum4c417781991-01-21 16:09:22 +00004563 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004564 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004565 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004566 n = CHILD(n, 0);
4567 if (TYPE(n) != NEWLINE)
4568 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004569 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004570 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4571 com_push(c, 1);
4572 com_addbyte(c, RETURN_VALUE);
4573 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004574 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004575 break;
4576
Guido van Rossum4c417781991-01-21 16:09:22 +00004577 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004578 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004579 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004580 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4581 com_push(c, 1);
4582 com_addbyte(c, RETURN_VALUE);
4583 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004584 break;
4585
Guido van Rossum590baa41993-11-30 13:40:46 +00004586 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004587 com_node(c, CHILD(n, 0));
4588 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004589 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004590 break;
4591
Guido van Rossum590baa41993-11-30 13:40:46 +00004592 case lambdef: /* anonymous function definition */
4593 compile_lambdef(c, n);
4594 break;
4595
Guido van Rossum4c417781991-01-21 16:09:22 +00004596 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004597 compile_funcdef(c, n);
4598 break;
4599
Guido van Rossum4c417781991-01-21 16:09:22 +00004600 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004601 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004602 break;
4603
Raymond Hettinger354433a2004-05-19 08:20:33 +00004604 case testlist_gexp: /* A generator expression */
4605 case argument: /* A generator expression */
4606 compile_generator_expression(c, n);
4607 break;
4608
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004609 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004610 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004611 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004612 }
4613}
4614
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004615static PyObject *
4616dict_keys_inorder(PyObject *dict, int offset)
4617{
4618 PyObject *tuple, *k, *v;
4619 int i, pos = 0, size = PyDict_Size(dict);
4620
4621 tuple = PyTuple_New(size);
4622 if (tuple == NULL)
4623 return NULL;
4624 while (PyDict_Next(dict, &pos, &k, &v)) {
4625 i = PyInt_AS_LONG(v);
4626 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004627 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004628 PyTuple_SET_ITEM(tuple, i - offset, k);
4629 }
4630 return tuple;
4631}
4632
Guido van Rossum79f25d91997-04-29 20:08:16 +00004633PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004634PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004635{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004636 return PyNode_CompileFlags(n, filename, NULL);
4637}
4638
4639PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004640PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004641{
4642 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004643}
4644
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004645struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004646PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004647{
4648 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004649 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004650
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004651 ff = PyNode_Future(n, filename);
4652 if (ff == NULL)
4653 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004654 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00004655 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004656 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004657 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004658 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004659 return st;
4660}
4661
Guido van Rossum79f25d91997-04-29 20:08:16 +00004662static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004663icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004664{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004665 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004666}
4667
Guido van Rossum79f25d91997-04-29 20:08:16 +00004668static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004669jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004670 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004671{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004672 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004673 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004674 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004675 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004676 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4677 sc.c_encoding = "utf-8";
4678 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004679 sc.c_encoding = STR(n);
4680 n = CHILD(n, 0);
4681 } else {
4682 sc.c_encoding = NULL;
4683 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004684 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004685 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004686 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004687 /* c_symtable still points to parent's symbols */
4688 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004689 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004690 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004691 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004692 if (base->c_encoding != NULL) {
4693 assert(sc.c_encoding == NULL);
4694 sc.c_encoding = base->c_encoding;
4695 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004696 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004697 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004698 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004699 if (sc.c_future == NULL) {
4700 com_free(&sc);
4701 return NULL;
4702 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004703 if (flags) {
4704 int merged = sc.c_future->ff_features |
4705 flags->cf_flags;
4706 sc.c_future->ff_features = merged;
4707 flags->cf_flags = merged;
4708 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004709 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
4710 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004711 com_free(&sc);
4712 return NULL;
4713 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004714 /* reset symbol table for second pass */
4715 sc.c_symtable->st_nscopes = 1;
4716 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004717 }
4718 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004719 if (symtable_load_symbols(&sc) < 0) {
4720 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004721 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004722 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004723 compile_node(&sc, n);
4724 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004725 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004726 PyObject *consts, *names, *varnames, *filename, *name,
4727 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004728 consts = PyList_AsTuple(sc.c_consts);
4729 names = PyList_AsTuple(sc.c_names);
4730 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004731 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4732 freevars = dict_keys_inorder(sc.c_freevars,
4733 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004734 filename = PyString_InternFromString(sc.c_filename);
4735 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004736 if (!PyErr_Occurred())
4737 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004738 sc.c_nlocals,
4739 sc.c_maxstacklevel,
4740 sc.c_flags,
4741 sc.c_code,
4742 consts,
4743 names,
4744 varnames,
4745 freevars,
4746 cellvars,
4747 filename,
4748 name,
4749 sc.c_firstlineno,
4750 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004751 Py_XDECREF(consts);
4752 Py_XDECREF(names);
4753 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004754 Py_XDECREF(freevars);
4755 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004756 Py_XDECREF(filename);
4757 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004758 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004759 else if (!PyErr_Occurred()) {
4760 /* This could happen if someone called PyErr_Clear() after an
4761 error was reported above. That's not supposed to happen,
4762 but I just plugged one case and I'm not sure there can't be
4763 others. In that case, raise SystemError so that at least
4764 it gets reported instead dumping core. */
4765 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4766 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004767 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004768 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004769 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004770 sc.c_symtable = NULL;
4771 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004772 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004773 return co;
4774}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004775
4776int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004777PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004778{
4779 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004780 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004781 int line = co->co_firstlineno;
4782 int addr = 0;
4783 while (--size >= 0) {
4784 addr += *p++;
4785 if (addr > addrq)
4786 break;
4787 line += *p++;
4788 }
4789 return line;
4790}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004791
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004792/* The test for LOCAL must come before the test for FREE in order to
4793 handle classes where name is both local and free. The local var is
4794 a method and the free var is a free var referenced within a method.
4795*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004796
4797static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004798get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004799{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004800 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004801 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004802
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004803 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4804 return CELL;
4805 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4806 return LOCAL;
4807 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4808 return FREE;
4809 v = PyDict_GetItemString(c->c_globals, name);
4810 if (v) {
4811 if (v == Py_None)
4812 return GLOBAL_EXPLICIT;
4813 else {
4814 return GLOBAL_IMPLICIT;
4815 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004816 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004817 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004818 "unknown scope for %.100s in %.100s(%s) "
4819 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4820 name, c->c_name,
4821 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4822 c->c_filename,
4823 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4824 PyObject_REPR(c->c_locals),
4825 PyObject_REPR(c->c_globals)
4826 );
4827
4828 Py_FatalError(buf);
4829 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004830}
4831
Guido van Rossum207fda62001-03-02 03:30:41 +00004832/* Helper functions to issue warnings */
4833
4834static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004835issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004836{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004837 if (PyErr_Occurred()) {
4838 /* This can happen because symtable_node continues
4839 processing even after raising a SyntaxError.
4840 Calling PyErr_WarnExplicit now would clobber the
4841 pending exception; instead we fail and let that
4842 exception propagate.
4843 */
4844 return -1;
4845 }
Guido van Rossum207fda62001-03-02 03:30:41 +00004846 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4847 lineno, NULL, NULL) < 0) {
4848 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4849 PyErr_SetString(PyExc_SyntaxError, msg);
4850 PyErr_SyntaxLocation(filename, lineno);
4851 }
4852 return -1;
4853 }
4854 return 0;
4855}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004856
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004857static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004858symtable_warn(struct symtable *st, char *msg)
4859{
Guido van Rossum207fda62001-03-02 03:30:41 +00004860 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004861 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004862 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004863 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004864 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004865}
4866
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004867/* Helper function for setting lineno and filename */
4868
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004869static struct symtable *
4870symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004871{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004872 struct symtable *st;
4873
4874 st = symtable_init();
4875 if (st == NULL)
4876 return NULL;
4877 st->st_future = ff;
4878 st->st_filename = filename;
4879 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
4880 if (st->st_errors > 0)
4881 goto fail;
4882 symtable_node(st, n);
4883 if (st->st_errors > 0)
4884 goto fail;
4885 return st;
4886 fail:
4887 if (!PyErr_Occurred()) {
4888 /* This could happen because after a syntax error is
4889 detected, the symbol-table-building continues for
4890 a while, and PyErr_Clear() might erroneously be
4891 called during that process. One such case has been
4892 fixed, but there might be more (now or later).
4893 */
4894 PyErr_SetString(PyExc_SystemError, "lost exception");
4895 }
4896 st->st_future = NULL;
4897 st->st_filename = NULL;
4898 PySymtable_Free(st);
4899 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004900}
4901
4902static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004903symtable_init_compiling_symbols(struct compiling *c)
4904{
4905 PyObject *varnames;
4906
4907 varnames = c->c_symtable->st_cur->ste_varnames;
4908 if (varnames == NULL) {
4909 varnames = PyList_New(0);
4910 if (varnames == NULL)
4911 return -1;
4912 c->c_symtable->st_cur->ste_varnames = varnames;
4913 Py_INCREF(varnames);
4914 } else
4915 Py_INCREF(varnames);
4916 c->c_varnames = varnames;
4917
4918 c->c_globals = PyDict_New();
4919 if (c->c_globals == NULL)
4920 return -1;
4921 c->c_freevars = PyDict_New();
4922 if (c->c_freevars == NULL)
4923 return -1;
4924 c->c_cellvars = PyDict_New();
4925 if (c->c_cellvars == NULL)
4926 return -1;
4927 return 0;
4928}
4929
4930struct symbol_info {
4931 int si_nlocals;
4932 int si_ncells;
4933 int si_nfrees;
4934 int si_nimplicit;
4935};
4936
4937static void
4938symtable_init_info(struct symbol_info *si)
4939{
4940 si->si_nlocals = 0;
4941 si->si_ncells = 0;
4942 si->si_nfrees = 0;
4943 si->si_nimplicit = 0;
4944}
4945
4946static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004947symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004948 struct symbol_info *si)
4949{
4950 PyObject *dict, *v;
4951
4952 /* Seperate logic for DEF_FREE. If it occurs in a function,
4953 it indicates a local that we must allocate storage for (a
4954 cell var). If it occurs in a class, then the class has a
4955 method and a free variable with the same name.
4956 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004957 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004958 /* If it isn't declared locally, it can't be a cell. */
4959 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4960 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004961 v = PyInt_FromLong(si->si_ncells++);
4962 dict = c->c_cellvars;
4963 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004964 /* If it is free anyway, then there is no need to do
4965 anything here.
4966 */
4967 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004968 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004969 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004970 v = PyInt_FromLong(si->si_nfrees++);
4971 dict = c->c_freevars;
4972 }
4973 if (v == NULL)
4974 return -1;
4975 if (PyDict_SetItem(dict, name, v) < 0) {
4976 Py_DECREF(v);
4977 return -1;
4978 }
4979 Py_DECREF(v);
4980 return 0;
4981}
4982
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004983/* If a variable is a cell and an argument, make sure that appears in
4984 co_cellvars before any variable to its right in varnames.
4985*/
4986
4987
4988static int
4989symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4990 PyObject *varnames, int flags)
4991{
Tim Petersb39903b2003-03-24 17:22:24 +00004992 PyObject *v = NULL;
4993 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004994 int i, pos;
4995
4996 if (flags & CO_VARARGS)
4997 argcount++;
4998 if (flags & CO_VARKEYWORDS)
4999 argcount++;
5000 for (i = argcount; --i >= 0; ) {
5001 v = PyList_GET_ITEM(varnames, i);
5002 if (PyDict_GetItem(*cellvars, v)) {
5003 if (list == NULL) {
5004 list = PyList_New(1);
5005 if (list == NULL)
5006 return -1;
5007 PyList_SET_ITEM(list, 0, v);
5008 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005009 } else {
5010 if (PyList_Insert(list, 0, v) < 0) {
5011 Py_DECREF(list);
5012 return -1;
5013 }
5014 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005015 }
5016 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00005017 if (list == NULL)
5018 return 0;
5019
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005020 /* There are cellvars that are also arguments. Create a dict
5021 to replace cellvars and put the args at the front.
5022 */
5023 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005024 if (d == NULL)
5025 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005026 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
5027 v = PyInt_FromLong(i);
5028 if (v == NULL)
5029 goto fail;
5030 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
5031 goto fail;
5032 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
5033 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00005034 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005035 }
5036 pos = 0;
5037 i = PyList_GET_SIZE(list);
5038 Py_DECREF(list);
5039 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
5040 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005041 if (w == NULL)
5042 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005043 if (PyDict_SetItem(d, v, w) < 0) {
5044 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00005045 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005046 goto fail;
5047 }
5048 Py_DECREF(w);
5049 }
5050 Py_DECREF(*cellvars);
5051 *cellvars = d;
5052 return 1;
5053 fail:
5054 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00005055 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005056 return -1;
5057}
5058
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005059static int
5060symtable_freevar_offsets(PyObject *freevars, int offset)
5061{
5062 PyObject *name, *v;
5063 int pos;
5064
5065 /* The cell vars are the first elements of the closure,
5066 followed by the free vars. Update the offsets in
5067 c_freevars to account for number of cellvars. */
5068 pos = 0;
5069 while (PyDict_Next(freevars, &pos, &name, &v)) {
5070 int i = PyInt_AS_LONG(v) + offset;
5071 PyObject *o = PyInt_FromLong(i);
5072 if (o == NULL)
5073 return -1;
5074 if (PyDict_SetItem(freevars, name, o) < 0) {
5075 Py_DECREF(o);
5076 return -1;
5077 }
5078 Py_DECREF(o);
5079 }
5080 return 0;
5081}
5082
5083static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005084symtable_check_unoptimized(struct compiling *c,
5085 PySymtableEntryObject *ste,
5086 struct symbol_info *si)
5087{
5088 char buf[300];
5089
5090 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
5091 || (ste->ste_nested && si->si_nimplicit)))
5092 return 0;
5093
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005094#define ILLEGAL_CONTAINS "contains a nested function with free variables"
5095
5096#define ILLEGAL_IS "is a nested function"
5097
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005098#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005099"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005100
5101#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005102"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005103
5104#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005105"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005106"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005107
5108 /* XXX perhaps the linenos for these opt-breaking statements
5109 should be stored so the exception can point to them. */
5110
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005111 if (ste->ste_child_free) {
5112 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005113 PyOS_snprintf(buf, sizeof(buf),
5114 ILLEGAL_IMPORT_STAR,
5115 PyString_AS_STRING(ste->ste_name),
5116 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005117 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005118 PyOS_snprintf(buf, sizeof(buf),
5119 ILLEGAL_BARE_EXEC,
5120 PyString_AS_STRING(ste->ste_name),
5121 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005122 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005123 PyOS_snprintf(buf, sizeof(buf),
5124 ILLEGAL_EXEC_AND_IMPORT_STAR,
5125 PyString_AS_STRING(ste->ste_name),
5126 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005127 }
5128 } else {
5129 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005130 PyOS_snprintf(buf, sizeof(buf),
5131 ILLEGAL_IMPORT_STAR,
5132 PyString_AS_STRING(ste->ste_name),
5133 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005134 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005135 PyOS_snprintf(buf, sizeof(buf),
5136 ILLEGAL_BARE_EXEC,
5137 PyString_AS_STRING(ste->ste_name),
5138 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005139 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005140 PyOS_snprintf(buf, sizeof(buf),
5141 ILLEGAL_EXEC_AND_IMPORT_STAR,
5142 PyString_AS_STRING(ste->ste_name),
5143 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005144 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005145 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005146
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005147 PyErr_SetString(PyExc_SyntaxError, buf);
5148 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5149 ste->ste_opt_lineno);
5150 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005151}
5152
5153static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005154symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5155 struct symbol_info *si)
5156{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005157 if (c->c_future)
5158 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005159 if (ste->ste_generator)
5160 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005161 if (ste->ste_type != TYPE_MODULE)
5162 c->c_flags |= CO_NEWLOCALS;
5163 if (ste->ste_type == TYPE_FUNCTION) {
5164 c->c_nlocals = si->si_nlocals;
5165 if (ste->ste_optimized == 0)
5166 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005167 else if (ste->ste_optimized != OPT_EXEC)
5168 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005169 }
5170 return 0;
5171}
5172
5173static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005174symtable_error(struct symtable *st, int lineno)
5175{
5176 if (lineno == 0)
5177 lineno = st->st_cur->ste_lineno;
5178 PyErr_SyntaxLocation(st->st_filename, lineno);
5179 st->st_errors++;
5180 return -1;
5181}
5182
5183static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005184symtable_load_symbols(struct compiling *c)
5185{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005186 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005187 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005188 PyObject *name, *varnames, *v;
5189 int i, flags, pos;
5190 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005191
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005192 v = NULL;
5193
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005194 if (symtable_init_compiling_symbols(c) < 0)
5195 goto fail;
5196 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005197 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005198 si.si_nlocals = PyList_GET_SIZE(varnames);
5199 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005200
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005201 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005202 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005203 if (v == NULL)
5204 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005205 if (PyDict_SetItem(c->c_locals,
5206 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005207 goto fail;
5208 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005209 }
5210
5211 /* XXX The cases below define the rules for whether a name is
5212 local or global. The logic could probably be clearer. */
5213 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005214 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5215 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005216
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005217 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005218 /* undo the original DEF_FREE */
5219 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005220
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005221 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005222 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005223 2. Free variables in methods that are also class
5224 variables or declared global.
5225 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005226 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005227 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005228
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005229 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005230 c->c_argcount--;
5231 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005232 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005233 c->c_argcount--;
5234 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005235 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005236 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005237 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005238 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005239 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005240 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005241 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005242 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005243 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005244 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5245 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005246 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005247 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005248 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005249 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005250 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005251 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005252 if (v == NULL)
5253 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005254 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005255 goto fail;
5256 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005257 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005258 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005259 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005260 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005261 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005262 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005263 if (v == NULL)
5264 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005265 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005266 goto fail;
5267 Py_DECREF(v);
5268 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005269 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005270 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005271 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005272 goto fail;
5273 if (st->st_nscopes != 1) {
5274 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005275 if (v == NULL)
5276 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005277 if (PyDict_SetItem(st->st_global,
5278 name, v))
5279 goto fail;
5280 Py_DECREF(v);
5281 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005282 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005283 }
5284 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005285 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5286
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005287 if (si.si_ncells > 1) { /* one cell is always in order */
5288 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5289 c->c_varnames, c->c_flags) < 0)
5290 return -1;
5291 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005292 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5293 return -1;
5294 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005295 fail:
5296 /* is this always the right thing to do? */
5297 Py_XDECREF(v);
5298 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005299}
5300
5301static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005302symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005303{
5304 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005305
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005306 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005307 if (st == NULL)
5308 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005309 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005310
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005311 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005312 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005313 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005314 goto fail;
5315 if ((st->st_symbols = PyDict_New()) == NULL)
5316 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005317 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005318 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005319 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005320 st->st_private = NULL;
5321 return st;
5322 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005323 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005324 return NULL;
5325}
5326
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005327void
5328PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005329{
5330 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005331 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005332 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005333 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005334}
5335
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005336/* When the compiler exits a scope, it must should update the scope's
5337 free variable information with the list of free variables in its
5338 children.
5339
5340 Variables that are free in children and defined in the current
5341 scope are cellvars.
5342
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005343 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005344 false), free variables in children that are not defined here are
5345 implicit globals.
5346
5347*/
5348
5349static int
5350symtable_update_free_vars(struct symtable *st)
5351{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005352 int i, j, def;
5353 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005354 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005355
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005356 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005357 def = DEF_FREE_CLASS;
5358 else
5359 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005360 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005361 int pos = 0;
5362
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005363 if (list && PyList_SetSlice(list, 0,
5364 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005365 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005366 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005367 PyList_GET_ITEM(ste->ste_children, i);
5368 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005369 int flags = PyInt_AS_LONG(o);
5370 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005371 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005372 if (list == NULL) {
5373 list = PyList_New(0);
5374 if (list == NULL)
5375 return -1;
5376 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005377 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005378 if (PyList_Append(list, name) < 0) {
5379 Py_DECREF(list);
5380 return -1;
5381 }
5382 }
5383 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005384 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005385 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005386 v = PyDict_GetItem(ste->ste_symbols, name);
5387 /* If a name N is declared global in scope A and
5388 referenced in scope B contained (perhaps
5389 indirectly) in A and there are no scopes
5390 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005391 is global in B. Unless A is a class scope,
5392 because class scopes are not considered for
5393 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005394 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005395 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005396 int flags = PyInt_AS_LONG(v);
5397 if (flags & DEF_GLOBAL) {
5398 symtable_undo_free(st, child->ste_id,
5399 name);
5400 continue;
5401 }
5402 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005403 if (ste->ste_nested) {
5404 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005405 name, def) < 0) {
5406 Py_DECREF(list);
5407 return -1;
5408 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005409 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005410 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005411 name) < 0) {
5412 Py_DECREF(list);
5413 return -1;
5414 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005415 }
5416 }
5417 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005418
5419 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005420 return 0;
5421}
5422
5423/* If the current scope is a non-nested class or if name is not
5424 defined in the current, non-nested scope, then it is an implicit
5425 global in all nested scopes.
5426*/
5427
5428static int
5429symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5430{
5431 PyObject *o;
5432 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005433 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005434
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005435 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005436 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005437 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005438 if (o == NULL)
5439 return symtable_undo_free(st, child, name);
5440 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005441
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005442 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005443 return symtable_undo_free(st, child, name);
5444 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005445 return symtable_add_def_o(st, ste->ste_symbols,
5446 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005447}
5448
5449static int
5450symtable_undo_free(struct symtable *st, PyObject *id,
5451 PyObject *name)
5452{
5453 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005454 PyObject *info;
5455 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005456
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005457 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5458 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005459 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005460
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005461 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005462 if (info == NULL)
5463 return 0;
5464 v = PyInt_AS_LONG(info);
5465 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005466 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005467 DEF_FREE_GLOBAL) < 0)
5468 return -1;
5469 } else
5470 /* If the name is defined here or declared global,
5471 then the recursion stops. */
5472 return 0;
5473
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005474 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5475 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005476 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005477 PyList_GET_ITEM(ste->ste_children, i);
5478 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005479 if (x < 0)
5480 return x;
5481 }
5482 return 0;
5483}
5484
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005485/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5486 This reference is released when the scope is exited, via the DECREF
5487 in symtable_exit_scope().
5488*/
5489
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005490static int
5491symtable_exit_scope(struct symtable *st)
5492{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005493 int end;
5494
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005495 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005496 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005497 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005498 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005499 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5500 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005501 if (PySequence_DelItem(st->st_stack, end) < 0)
5502 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005503 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005504}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005505
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005506static void
5507symtable_enter_scope(struct symtable *st, char *name, int type,
5508 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005509{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005510 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005511
5512 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005513 prev = st->st_cur;
5514 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005515 st->st_errors++;
5516 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005517 }
5518 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005519 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005520 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005521 if (st->st_cur == NULL) {
5522 st->st_errors++;
5523 return;
5524 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005525 if (strcmp(name, TOP) == 0)
5526 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005527 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005528 if (PyList_Append(prev->ste_children,
5529 (PyObject *)st->st_cur) < 0)
5530 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005531 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005532}
5533
5534static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005535symtable_lookup(struct symtable *st, char *name)
5536{
5537 char buffer[MANGLE_LEN];
5538 PyObject *v;
5539 int flags;
5540
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005541 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005542 name = buffer;
5543 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5544 if (v == NULL) {
5545 if (PyErr_Occurred())
5546 return -1;
5547 else
5548 return 0;
5549 }
5550
5551 flags = PyInt_AS_LONG(v);
5552 return flags;
5553}
5554
5555static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005556symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005557{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005558 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005559 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005560 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005561
Guido van Rossumb7164622002-08-16 02:48:11 +00005562 /* Warn about None, except inside a tuple (where the assignment
5563 code already issues a warning). */
5564 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5565 *name == 'N' && strcmp(name, "None") == 0)
5566 {
Raymond Hettinger11a70c72004-07-17 21:46:25 +00005567 PyErr_SetString(PyExc_SyntaxError,
5568 "Invalid syntax. Assignment to None.");
5569 symtable_error(st, 0);
5570 return -1;
Guido van Rossumb7164622002-08-16 02:48:11 +00005571 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005572 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005573 name = buffer;
5574 if ((s = PyString_InternFromString(name)) == NULL)
5575 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005576 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5577 Py_DECREF(s);
5578 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005579}
5580
5581/* Must only be called with mangled names */
5582
5583static int
5584symtable_add_def_o(struct symtable *st, PyObject *dict,
5585 PyObject *name, int flag)
5586{
5587 PyObject *o;
5588 int val;
5589
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005590 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005591 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005592 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005593 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005594 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005595 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005596 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005597 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005598 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005599 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005600 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005601 if (o == NULL)
5602 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005603 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005604 Py_DECREF(o);
5605 return -1;
5606 }
5607 Py_DECREF(o);
5608
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005609 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005610 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005611 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005612 } else if (flag & DEF_GLOBAL) {
5613 /* XXX need to update DEF_GLOBAL for other flags too;
5614 perhaps only DEF_FREE_GLOBAL */
5615 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005616 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005617 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005618 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005619 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005620 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005621 if (o == NULL)
5622 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005623 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005624 Py_DECREF(o);
5625 return -1;
5626 }
5627 Py_DECREF(o);
5628 }
5629 return 0;
5630}
5631
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005632#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005633
Tim Peters08a898f2001-06-28 01:52:22 +00005634/* Look for a yield stmt under n. Return 1 if found, else 0.
5635 This hack is used to look inside "if 0:" blocks (which are normally
5636 ignored) in case those are the only places a yield occurs (so that this
5637 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005638static int
5639look_for_yield(node *n)
5640{
5641 int i;
5642
5643 for (i = 0; i < NCH(n); ++i) {
5644 node *kid = CHILD(n, i);
5645
5646 switch (TYPE(kid)) {
5647
5648 case classdef:
5649 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005650 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005651 /* Stuff in nested functions and classes can't make
5652 the parent a generator. */
5653 return 0;
5654
5655 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00005656 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005657
5658 default:
5659 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00005660 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005661 }
5662 }
5663 return 0;
5664}
5665
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005666static void
5667symtable_node(struct symtable *st, node *n)
5668{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005669 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005670
5671 loop:
5672 switch (TYPE(n)) {
5673 case funcdef: {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005674 char *func_name;
5675 if (NCH(n) == 6)
5676 symtable_node(st, CHILD(n, 0));
5677 func_name = STR(RCHILD(n, -4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005678 symtable_add_def(st, func_name, DEF_LOCAL);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005679 symtable_default_args(st, RCHILD(n, -3));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005680 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005681 symtable_funcdef(st, n);
5682 symtable_exit_scope(st);
5683 break;
5684 }
5685 case lambdef:
5686 if (NCH(n) == 4)
5687 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005688 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005689 symtable_funcdef(st, n);
5690 symtable_exit_scope(st);
5691 break;
5692 case classdef: {
5693 char *tmp, *class_name = STR(CHILD(n, 1));
5694 symtable_add_def(st, class_name, DEF_LOCAL);
5695 if (TYPE(CHILD(n, 2)) == LPAR) {
5696 node *bases = CHILD(n, 3);
5697 int i;
5698 for (i = 0; i < NCH(bases); i += 2) {
5699 symtable_node(st, CHILD(bases, i));
5700 }
5701 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005702 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005703 tmp = st->st_private;
5704 st->st_private = class_name;
5705 symtable_node(st, CHILD(n, NCH(n) - 1));
5706 st->st_private = tmp;
5707 symtable_exit_scope(st);
5708 break;
5709 }
5710 case if_stmt:
5711 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005712 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5713 if (st->st_cur->ste_generator == 0)
5714 st->st_cur->ste_generator =
5715 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005716 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005717 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005718 symtable_node(st, CHILD(n, i + 1));
5719 symtable_node(st, CHILD(n, i + 3));
5720 }
5721 if (i + 2 < NCH(n))
5722 symtable_node(st, CHILD(n, i + 2));
5723 break;
5724 case global_stmt:
5725 symtable_global(st, n);
5726 break;
5727 case import_stmt:
5728 symtable_import(st, n);
5729 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005730 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005731 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005732 symtable_node(st, CHILD(n, 1));
5733 if (NCH(n) > 2)
5734 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005735 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005736 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005737 st->st_cur->ste_opt_lineno = n->n_lineno;
5738 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005739 if (NCH(n) > 4)
5740 symtable_node(st, CHILD(n, 5));
5741 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005742
5743 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005744 case assert_stmt:
5745 if (Py_OptimizeFlag)
5746 return;
5747 if (NCH(n) == 2) {
5748 n = CHILD(n, 1);
5749 goto loop;
5750 } else {
5751 symtable_node(st, CHILD(n, 1));
5752 n = CHILD(n, 3);
5753 goto loop;
5754 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005755 case except_clause:
5756 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005757 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005758 if (NCH(n) > 1) {
5759 n = CHILD(n, 1);
5760 goto loop;
5761 }
5762 break;
5763 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005764 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005765 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005766 case yield_stmt:
5767 st->st_cur->ste_generator = 1;
5768 n = CHILD(n, 1);
5769 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005770 case expr_stmt:
5771 if (NCH(n) == 1)
5772 n = CHILD(n, 0);
5773 else {
5774 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005775 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005776 symtable_node(st, CHILD(n, 2));
5777 break;
5778 } else {
5779 int i;
5780 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005781 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005782 n = CHILD(n, NCH(n) - 1);
5783 }
5784 }
5785 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005786 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005787 /* only occurs when there are multiple for loops
5788 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005789 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005790 if (TYPE(n) == list_for)
5791 symtable_list_for(st, n);
5792 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005793 REQ(n, list_if);
5794 symtable_node(st, CHILD(n, 1));
5795 if (NCH(n) == 3) {
5796 n = CHILD(n, 2);
5797 goto loop;
5798 }
5799 }
5800 break;
5801 case for_stmt:
5802 symtable_assign(st, CHILD(n, 1), 0);
5803 for (i = 3; i < NCH(n); ++i)
5804 if (TYPE(CHILD(n, i)) >= single_input)
5805 symtable_node(st, CHILD(n, i));
5806 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00005807 case arglist:
5808 if (NCH(n) > 1)
5809 for (i = 0; i < NCH(n); ++i) {
5810 node *ch = CHILD(n, i);
5811 if (TYPE(ch) == argument && NCH(ch) == 2 &&
5812 TYPE(CHILD(ch, 1)) == gen_for) {
5813 PyErr_SetString(PyExc_SyntaxError,
5814 "invalid syntax");
5815 symtable_error(st, n->n_lineno);
5816 return;
5817 }
5818 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005819 /* The remaining cases fall through to default except in
5820 special circumstances. This requires the individual cases
5821 to be coded with great care, even though they look like
5822 rather innocuous. Each case must double-check TYPE(n).
5823 */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005824 case decorator:
5825 if (TYPE(n) == decorator) {
5826 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
5827 node *name, *varname;
5828 name = CHILD(n, 1);
5829 REQ(name, dotted_name);
5830 varname = CHILD(name, 0);
5831 REQ(varname, NAME);
5832 symtable_add_use(st, STR(varname));
5833 }
5834 /* fall through */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005835 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005836 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005837 n = CHILD(n, 2);
5838 goto loop;
5839 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00005840 else if (TYPE(n) == argument && NCH(n) == 2 &&
5841 TYPE(CHILD(n, 1)) == gen_for) {
5842 symtable_generator_expression(st, n);
5843 break;
5844 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005845 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005846 case listmaker:
5847 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005848 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005849 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005850 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005851 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00005852 case testlist_gexp:
5853 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
5854 symtable_generator_expression(st, n);
5855 break;
5856 }
5857 /* fall through */
5858
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005859 case atom:
5860 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5861 symtable_add_use(st, STR(CHILD(n, 0)));
5862 break;
5863 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005864 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005865 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005866 /* Walk over every non-token child with a special case
5867 for one child.
5868 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005869 if (NCH(n) == 1) {
5870 n = CHILD(n, 0);
5871 goto loop;
5872 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005873 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005874 if (TYPE(CHILD(n, i)) >= single_input)
5875 symtable_node(st, CHILD(n, i));
5876 }
5877}
5878
5879static void
5880symtable_funcdef(struct symtable *st, node *n)
5881{
5882 node *body;
5883
5884 if (TYPE(n) == lambdef) {
5885 if (NCH(n) == 4)
5886 symtable_params(st, CHILD(n, 1));
5887 } else
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005888 symtable_params(st, RCHILD(n, -3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005889 body = CHILD(n, NCH(n) - 1);
5890 symtable_node(st, body);
5891}
5892
5893/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00005894 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005895 which are references in the defining scope. symtable_params()
5896 parses the parameter names, which are defined in the function's
5897 body.
5898
5899 varargslist:
5900 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5901 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5902*/
5903
5904static void
5905symtable_default_args(struct symtable *st, node *n)
5906{
5907 node *c;
5908 int i;
5909
5910 if (TYPE(n) == parameters) {
5911 n = CHILD(n, 1);
5912 if (TYPE(n) == RPAR)
5913 return;
5914 }
5915 REQ(n, varargslist);
5916 for (i = 0; i < NCH(n); i += 2) {
5917 c = CHILD(n, i);
5918 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5919 break;
5920 }
5921 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5922 symtable_node(st, CHILD(n, i));
5923 }
5924}
5925
5926static void
5927symtable_params(struct symtable *st, node *n)
5928{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005929 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00005930 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005931
5932 if (TYPE(n) == parameters) {
5933 n = CHILD(n, 1);
5934 if (TYPE(n) == RPAR)
5935 return;
5936 }
5937 REQ(n, varargslist);
5938 for (i = 0; i < NCH(n); i += 2) {
5939 c = CHILD(n, i);
5940 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5941 ext = 1;
5942 break;
5943 }
5944 if (TYPE(c) == test) {
5945 continue;
5946 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00005947 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005948 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00005949 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005950 char nbuf[30];
5951 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005952 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005953 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005954 }
5955 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005956 if (ext) {
5957 c = CHILD(n, i);
5958 if (TYPE(c) == STAR) {
5959 i++;
5960 symtable_add_def(st, STR(CHILD(n, i)),
5961 DEF_PARAM | DEF_STAR);
5962 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005963 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005964 c = NULL;
5965 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005966 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005967 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005968 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005969 i++;
5970 symtable_add_def(st, STR(CHILD(n, i)),
5971 DEF_PARAM | DEF_DOUBLESTAR);
5972 }
5973 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005974 if (complex >= 0) {
5975 int j;
5976 for (j = 0; j <= complex; j++) {
5977 c = CHILD(n, j);
5978 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005979 c = CHILD(n, ++j);
5980 else if (TYPE(c) == EQUAL)
5981 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005982 if (TYPE(CHILD(c, 0)) == LPAR)
5983 symtable_params_fplist(st, CHILD(c, 1));
5984 }
5985 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005986}
5987
5988static void
5989symtable_params_fplist(struct symtable *st, node *n)
5990{
5991 int i;
5992 node *c;
5993
5994 REQ(n, fplist);
5995 for (i = 0; i < NCH(n); i += 2) {
5996 c = CHILD(n, i);
5997 REQ(c, fpdef);
5998 if (NCH(c) == 1)
5999 symtable_add_def(st, STR(CHILD(c, 0)),
6000 DEF_PARAM | DEF_INTUPLE);
6001 else
6002 symtable_params_fplist(st, CHILD(c, 1));
6003 }
6004
6005}
6006
6007static void
6008symtable_global(struct symtable *st, node *n)
6009{
6010 int i;
6011
Jeremy Hylton9f324e92001-03-01 22:59:14 +00006012 /* XXX It might be helpful to warn about module-level global
6013 statements, but it's hard to tell the difference between
6014 module-level and a string passed to exec.
6015 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00006016
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006017 for (i = 1; i < NCH(n); i += 2) {
6018 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006019 int flags;
6020
6021 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006022 if (flags < 0)
6023 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006024 if (flags && flags != DEF_GLOBAL) {
6025 char buf[500];
6026 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00006027 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006028 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00006029 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006030 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006031 }
6032 else {
6033 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006034 PyOS_snprintf(buf, sizeof(buf),
6035 GLOBAL_AFTER_ASSIGN,
6036 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006037 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006038 PyOS_snprintf(buf, sizeof(buf),
6039 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00006040 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006041 }
6042 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006043 symtable_add_def(st, name, DEF_GLOBAL);
6044 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006045}
6046
6047static void
6048symtable_list_comprehension(struct symtable *st, node *n)
6049{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006050 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006051 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006052
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006053 REQ(n, listmaker);
6054 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
6055 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006056 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006057 symtable_list_for(st, CHILD(n, 1));
6058 symtable_node(st, CHILD(n, 0));
6059 --st->st_cur->ste_tmpname;
6060}
6061
6062static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006063symtable_generator_expression(struct symtable *st, node *n)
6064{
6065 /* testlist_gexp: test gen_for */
6066 REQ(CHILD(n, 0), test);
6067 REQ(CHILD(n, 1), gen_for);
6068
6069 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
6070 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
6071
6072 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
6073
6074 symtable_gen_for(st, CHILD(n, 1), 1);
6075 symtable_node(st, CHILD(n, 0));
6076 symtable_exit_scope(st);
6077
6078 /* for outmost iterable precomputation */
6079 symtable_node(st, CHILD(CHILD(n, 1), 3));
6080}
6081
6082static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006083symtable_list_for(struct symtable *st, node *n)
6084{
6085 REQ(n, list_for);
6086 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006087 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006088 symtable_node(st, CHILD(n, 3));
6089 if (NCH(n) == 5)
6090 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006091}
6092
6093static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006094symtable_gen_for(struct symtable *st, node *n, int is_outmost)
6095{
6096 REQ(n, gen_for);
6097
6098 /* gen_for: for v in test [gen_iter] */
6099 symtable_assign(st, CHILD(n, 1), 0);
6100 if (is_outmost)
6101 symtable_add_use(st, "[outmost-iterable]");
6102 else
6103 symtable_node(st, CHILD(n, 3));
6104
6105 if (NCH(n) == 5)
6106 symtable_gen_iter(st, CHILD(n, 4));
6107}
6108
6109static void
6110symtable_gen_iter(struct symtable *st, node *n)
6111{
6112 REQ(n, gen_iter);
6113
6114 n = CHILD(n, 0);
6115 if (TYPE(n) == gen_for)
6116 symtable_gen_for(st, n, 0);
6117 else {
6118 REQ(n, gen_if);
6119 symtable_node(st, CHILD(n, 1));
6120
6121 if (NCH(n) == 3)
6122 symtable_gen_iter(st, CHILD(n, 2));
6123 }
6124}
6125
6126static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006127symtable_import(struct symtable *st, node *n)
6128{
6129 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006130 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006131 | 'from' dotted_name 'import'
6132 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00006133 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006134 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006135 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006136 node *dotname = CHILD(n, 1);
6137 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6138 /* check for bogus imports */
6139 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6140 PyErr_SetString(PyExc_SyntaxError,
6141 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006142 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006143 return;
6144 }
6145 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006146 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006147 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006148 if (symtable_warn(st,
6149 "import * only allowed at module level") < 0)
6150 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006151 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006152 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006153 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006154 } else {
6155 for (i = 3; i < NCH(n); i += 2) {
6156 node *c = CHILD(n, i);
6157 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006158 symtable_assign(st, CHILD(c, 2),
6159 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006160 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006161 symtable_assign(st, CHILD(c, 0),
6162 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006163 }
6164 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006165 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006166 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006167 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006168 }
6169 }
6170}
6171
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006172/* The third argument to symatble_assign() is a flag to be passed to
6173 symtable_add_def() if it is eventually called. The flag is useful
6174 to specify the particular type of assignment that should be
6175 recorded, e.g. an assignment caused by import.
6176 */
6177
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006178static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006179symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006180{
6181 node *tmp;
6182 int i;
6183
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006184 loop:
6185 switch (TYPE(n)) {
6186 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006187 /* invalid assignment, e.g. lambda x:x=2. The next
6188 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006189 return;
6190 case power:
6191 if (NCH(n) > 2) {
6192 for (i = 2; i < NCH(n); ++i)
6193 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6194 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006195 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006196 if (NCH(n) > 1) {
6197 symtable_node(st, CHILD(n, 0));
6198 symtable_node(st, CHILD(n, 1));
6199 } else {
6200 n = CHILD(n, 0);
6201 goto loop;
6202 }
6203 return;
6204 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006205 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6206 /* XXX This is an error, but the next pass
6207 will catch it. */
6208 return;
6209 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006210 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006211 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006212 }
6213 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006214 case testlist_gexp:
6215 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6216 /* XXX This is an error, but the next pass
6217 will catch it. */
6218 return;
6219 } else {
6220 for (i = 0; i < NCH(n); i += 2)
6221 symtable_assign(st, CHILD(n, i), def_flag);
6222 }
6223 return;
6224
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006225 case exprlist:
6226 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006227 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006228 if (NCH(n) == 1) {
6229 n = CHILD(n, 0);
6230 goto loop;
6231 }
6232 else {
6233 int i;
6234 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006235 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006236 return;
6237 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006238 case atom:
6239 tmp = CHILD(n, 0);
6240 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6241 n = CHILD(n, 1);
6242 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006243 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006244 if (strcmp(STR(tmp), "__debug__") == 0) {
6245 PyErr_SetString(PyExc_SyntaxError,
6246 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006247 symtable_error(st, n->n_lineno);
6248 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006249 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006250 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006251 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006252 return;
6253 case dotted_as_name:
6254 if (NCH(n) == 3)
6255 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006256 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006257 else
6258 symtable_add_def(st,
6259 STR(CHILD(CHILD(n,
6260 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006261 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006262 return;
6263 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006264 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006265 return;
6266 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006267 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006268 return;
6269 default:
6270 if (NCH(n) == 0)
6271 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006272 if (NCH(n) == 1) {
6273 n = CHILD(n, 0);
6274 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006275 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006276 /* Should only occur for errors like x + 1 = 1,
6277 which will be caught in the next pass. */
6278 for (i = 0; i < NCH(n); ++i)
6279 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006280 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006281 }
6282}