blob: 5c67987a9a9ce2800866f60b3f6d537045a26409 [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 Hettinger98bd1812004-08-06 19:46:34 +0000382
383 /* Avoid situations where jump retargeting could overflow */
384 if (codelen > 65000)
385 goto exitUnchanged;
386
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000387 blocks = markblocks(codestr, codelen);
388 if (blocks == NULL) {
389 PyMem_Free(codestr);
390 goto exitUnchanged;
391 }
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000392 assert(PyTuple_Check(consts));
393
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000394 for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000395 opcode = codestr[i];
396 switch (opcode) {
397
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000398 /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with
399 with JUMP_IF_TRUE POP_TOP NOP */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000400 case UNARY_NOT:
401 if (codestr[i+1] != JUMP_IF_FALSE ||
402 codestr[i+4] != POP_TOP ||
403 !ISBASICBLOCK(blocks,i,5))
404 continue;
405 tgt = GETJUMPTGT(codestr, (i+1));
406 if (codestr[tgt] != POP_TOP)
407 continue;
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000408 j = GETARG(codestr, i+1) + 1;
409 codestr[i] = JUMP_IF_TRUE;
410 SETARG(codestr, i, j);
411 codestr[i+3] = POP_TOP;
412 codestr[i+4] = NOP;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000413 break;
414
415 /* not a is b --> a is not b
416 not a in b --> a not in b
417 not a is not b --> a is b
418 not a not in b --> a in b */
419 case COMPARE_OP:
420 j = GETARG(codestr, i);
421 if (j < 6 || j > 9 ||
422 codestr[i+3] != UNARY_NOT ||
423 !ISBASICBLOCK(blocks,i,4))
424 continue;
425 SETARG(codestr, i, (j^1));
426 codestr[i+3] = NOP;
Tim Petersdb5860b2004-07-17 05:00:52 +0000427 break;
428
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000429 /* Replace LOAD_GLOBAL/LOAD_NAME None with LOAD_CONST None */
430 case LOAD_NAME:
431 case LOAD_GLOBAL:
432 j = GETARG(codestr, i);
433 name = PyString_AsString(PyTuple_GET_ITEM(names, j));
434 if (name == NULL || strcmp(name, "None") != 0)
435 continue;
436 for (j=0 ; j < PyTuple_GET_SIZE(consts) ; j++) {
437 if (PyTuple_GET_ITEM(consts, j) == Py_None) {
438 codestr[i] = LOAD_CONST;
439 SETARG(codestr, i, j);
440 break;
441 }
442 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000443 break;
444
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000445 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP.
446 Note, only the first opcode is changed, the others still
447 perform normally if they happen to be jump targets. */
448 case LOAD_CONST:
449 j = GETARG(codestr, i);
450 if (codestr[i+3] != JUMP_IF_FALSE ||
451 codestr[i+6] != POP_TOP ||
452 !PyObject_IsTrue(PyTuple_GET_ITEM(consts, j)))
453 continue;
454 codestr[i] = JUMP_FORWARD;
455 SETARG(codestr, i, 4);
456 break;
457
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000458 /* Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2 JMP+2 NOP NOP.
459 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2 JMP+1 NOP. */
460 case BUILD_TUPLE:
461 case BUILD_LIST:
462 if (codestr[i+3] != UNPACK_SEQUENCE)
463 continue;
464 if (!ISBASICBLOCK(blocks,i,6))
465 continue;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000466 if (GETARG(codestr, i) == 2 &&
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000467 GETARG(codestr, i+3) == 2) {
468 codestr[i] = ROT_TWO;
469 codestr[i+1] = JUMP_FORWARD;
470 SETARG(codestr, i+1, 2);
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000471 codestr[i+4] = NOP;
472 codestr[i+5] = NOP;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000473 continue;
474 }
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000475 if (GETARG(codestr, i) == 3 &&
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000476 GETARG(codestr, i+3) == 3) {
477 codestr[i] = ROT_THREE;
478 codestr[i+1] = ROT_TWO;
479 codestr[i+2] = JUMP_FORWARD;
480 SETARG(codestr, i+2, 1);
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000481 codestr[i+5] = NOP;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000482 }
483 break;
484
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000485 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000486 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000487 case JUMP_FORWARD:
488 case JUMP_IF_FALSE:
489 case JUMP_IF_TRUE:
490 case JUMP_ABSOLUTE:
491 case CONTINUE_LOOP:
492 case SETUP_LOOP:
493 case SETUP_EXCEPT:
494 case SETUP_FINALLY:
495 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000496 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000497 continue;
498 tgttgt = GETJUMPTGT(codestr, tgt);
499 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
500 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000501 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000502 tgttgt -= i + 3; /* Calc relative jump addr */
503 if (tgttgt < 0) /* No backward relative jumps */
504 continue;
505 codestr[i] = opcode;
506 SETARG(codestr, i, tgttgt);
507 break;
508
509 case EXTENDED_ARG:
510 PyMem_Free(codestr);
511 goto exitUnchanged;
512 }
513 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000514 code = PyString_FromStringAndSize((char *)codestr, codelen);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000515 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000516 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000517 return code;
518
519exitUnchanged:
520 Py_INCREF(code);
521 return code;
522}
523
Guido van Rossum79f25d91997-04-29 20:08:16 +0000524PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000525PyCode_New(int argcount, int nlocals, int stacksize, int flags,
526 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000527 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
528 PyObject *filename, PyObject *name, int firstlineno,
529 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000530{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000531 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000532 int i;
533 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000534 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000535 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000536 consts == NULL || !PyTuple_Check(consts) ||
537 names == NULL || !PyTuple_Check(names) ||
538 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000539 freevars == NULL || !PyTuple_Check(freevars) ||
540 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000541 name == NULL || !PyString_Check(name) ||
542 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000543 lnotab == NULL || !PyString_Check(lnotab) ||
544 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000545 PyErr_BadInternalCall();
546 return NULL;
547 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000548 intern_strings(names);
549 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000550 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000551 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000552 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000553 for (i = PyTuple_Size(consts); --i >= 0; ) {
554 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000555 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000556 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000557 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000558 continue;
559 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000560 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000561 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000562 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000563 co->co_argcount = argcount;
564 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000565 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000566 co->co_flags = flags;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000567 co->co_code = optimize_code(code, consts, names);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000568 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000569 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000570 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000571 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000572 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000573 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000574 Py_INCREF(freevars);
575 co->co_freevars = freevars;
576 Py_INCREF(cellvars);
577 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000578 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000579 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000580 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000581 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000582 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000583 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000584 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000585 if (PyTuple_GET_SIZE(freevars) == 0 &&
586 PyTuple_GET_SIZE(cellvars) == 0)
587 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000588 }
589 return co;
590}
591
592
593/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000594
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000595/* The compiler uses two passes to generate bytecodes. The first pass
596 builds the symbol table. The second pass generates the bytecode.
597
598 The first pass uses a single symtable struct. The second pass uses
599 a compiling struct for each code block. The compiling structs
600 share a reference to the symtable.
601
602 The two passes communicate via symtable_load_symbols() and via
603 is_local() and is_global(). The former initializes several slots
604 in the compiling struct: c_varnames, c_locals, c_nlocals,
605 c_argcount, c_globals, and c_flags.
606*/
607
Tim Peters2a7f3842001-06-09 09:26:21 +0000608/* All about c_lnotab.
609
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000610c_lnotab is an array of unsigned bytes disguised as a Python string. Since
611version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
612mapped to source code line #s via c_lnotab instead.
613
Tim Peters2a7f3842001-06-09 09:26:21 +0000614The array is conceptually a list of
615 (bytecode offset increment, line number increment)
616pairs. The details are important and delicate, best illustrated by example:
617
618 byte code offset source code line number
619 0 1
620 6 2
621 50 7
622 350 307
623 361 308
624
625The first trick is that these numbers aren't stored, only the increments
626from one row to the next (this doesn't really work, but it's a start):
627
628 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
629
630The second trick is that an unsigned byte can't hold negative values, or
631values larger than 255, so (a) there's a deep assumption that byte code
632offsets and their corresponding line #s both increase monotonically, and (b)
633if at least one column jumps by more than 255 from one row to the next, more
634than one pair is written to the table. In case #b, there's no way to know
635from looking at the table later how many were written. That's the delicate
636part. A user of c_lnotab desiring to find the source line number
637corresponding to a bytecode address A should do something like this
638
639 lineno = addr = 0
640 for addr_incr, line_incr in c_lnotab:
641 addr += addr_incr
642 if addr > A:
643 return lineno
644 lineno += line_incr
645
646In order for this to work, when the addr field increments by more than 255,
647the line # increment in each pair generated must be 0 until the remaining addr
648increment is < 256. So, in the example above, com_set_lineno should not (as
649was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
650255, 0, 45, 255, 0, 45.
651*/
652
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000653struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000654 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000655 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000656 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000657 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000658 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +0000659 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000660 PyObject *c_locals; /* dictionary (value=localID) */
661 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000662 PyObject *c_freevars; /* dictionary (value=None) */
663 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000664 int c_nlocals; /* index of next local */
665 int c_argcount; /* number of top-level arguments */
666 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000667 int c_nexti; /* index into c_code */
668 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000669 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000670 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000671 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000672 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000673 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000674 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +0000675 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000676 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000677 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000678 int c_stacklevel; /* Current stack level */
679 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000680 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000681 PyObject *c_lnotab; /* Table mapping address to line number */
Armin Rigo80d937e2004-03-22 17:52:53 +0000682 int c_last_addr; /* last op addr seen and recorded in lnotab */
683 int c_last_line; /* last line seen and recorded in lnotab */
684 int c_lnotab_next; /* current length of lnotab */
685 int c_lnotab_last; /* start of last lnotab record added */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000686 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000687 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000688 int c_nested; /* Is block nested funcdef or lamdef? */
689 int c_closure; /* Is nested w/freevars? */
690 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000691 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000692 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000693};
694
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000695static int
696is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000697{
698 if ((v & (USE | DEF_FREE))
699 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
700 return 1;
701 if (v & DEF_FREE_CLASS)
702 return 1;
703 return 0;
704}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000705
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000706static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000707com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000708{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000709 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
710
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000711 if (c == NULL) {
712 /* Error occurred via symtable call to
713 is_constant_false */
714 PyErr_SetString(exc, msg);
715 return;
716 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000717 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000718 if (c->c_lineno < 1 || c->c_interactive) {
719 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000720 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000721 return;
722 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000723 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000724 if (v == NULL)
725 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000726
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000727 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000728 if (line == NULL) {
729 Py_INCREF(Py_None);
730 line = Py_None;
731 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000732 if (exc == PyExc_SyntaxError) {
733 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
734 Py_None, line);
735 if (t == NULL)
736 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000737 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000738 if (w == NULL)
739 goto exit;
740 PyErr_SetObject(exc, w);
741 } else {
742 /* Make sure additional exceptions are printed with
743 file and line, also. */
744 PyErr_SetObject(exc, v);
745 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
746 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000747 exit:
748 Py_XDECREF(t);
749 Py_XDECREF(v);
750 Py_XDECREF(w);
751 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000752}
753
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000754/* Interface to the block stack */
755
756static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000757block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000758{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000759 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000760 com_error(c, PyExc_SystemError,
761 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000762 }
763 else {
764 c->c_block[c->c_nblocks++] = type;
765 }
766}
767
768static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000769block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000770{
771 if (c->c_nblocks > 0)
772 c->c_nblocks--;
773 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000774 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000775 }
776}
777
Guido van Rossum681d79a1995-07-18 14:51:37 +0000778/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000779
Martin v. Löwis95292d62002-12-11 14:04:59 +0000780static int issue_warning(const char *, const char *, int);
781static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000782static void com_free(struct compiling *);
783static void com_push(struct compiling *, int);
784static void com_pop(struct compiling *, int);
785static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000786static void com_node(struct compiling *, node *);
787static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000788static void com_addbyte(struct compiling *, int);
789static void com_addint(struct compiling *, int);
790static void com_addoparg(struct compiling *, int, int);
791static void com_addfwref(struct compiling *, int, int *);
792static void com_backpatch(struct compiling *, int);
793static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
794static int com_addconst(struct compiling *, PyObject *);
795static int com_addname(struct compiling *, PyObject *);
796static void com_addopname(struct compiling *, int, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000797static void com_test(struct compiling *c, node *n);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000798static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000799static void com_list_iter(struct compiling *, node *, node *, char *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000800static void com_gen_iter(struct compiling *, node *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000801static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000802static void com_assign(struct compiling *, node *, int, node *);
803static void com_assign_name(struct compiling *, node *, int);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000804static int com_make_closure(struct compiling *c, PyCodeObject *co);
805
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000806static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +0000807static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000808 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000809static PyObject *parsestrplus(struct compiling*, node *);
810static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000811static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000812
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000813static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000814
815/* symtable operations */
Raymond Hettinger354433a2004-05-19 08:20:33 +0000816static int symtable_lookup(struct symtable *st, char *name);
Jeremy Hylton1955fcf2003-07-15 20:23:26 +0000817static struct symtable *symtable_build(node *, PyFutureFeatures *,
818 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000819static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000820static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000821static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000822static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000823static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000824static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000825
826static void symtable_node(struct symtable *, node *);
827static void symtable_funcdef(struct symtable *, node *);
828static void symtable_default_args(struct symtable *, node *);
829static void symtable_params(struct symtable *, node *);
830static void symtable_params_fplist(struct symtable *, node *n);
831static void symtable_global(struct symtable *, node *);
832static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000833static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000834static void symtable_list_comprehension(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000835static void symtable_generator_expression(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +0000836static void symtable_list_for(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000837static void symtable_gen_for(struct symtable *, node *, int);
838static void symtable_gen_iter(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000839
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000840static int symtable_update_free_vars(struct symtable *);
841static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
842static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
843
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000844/* helper */
845static void
846do_pad(int pad)
847{
848 int i;
849 for (i = 0; i < pad; ++i)
850 fprintf(stderr, " ");
851}
852
853static void
854dump(node *n, int pad, int depth)
855{
856 int i;
857 if (depth == 0)
858 return;
859 do_pad(pad);
860 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
861 if (depth > 0)
862 depth--;
863 for (i = 0; i < NCH(n); ++i)
864 dump(CHILD(n, i), pad + 1, depth);
865}
866
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000867static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000868com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000869{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000870 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000871 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
872 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000873 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000874 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000875 goto fail;
876 if ((c->c_const_dict = PyDict_New()) == NULL)
877 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000878 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000879 goto fail;
880 if ((c->c_name_dict = PyDict_New()) == NULL)
881 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000882 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000883 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000884 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
885 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000886 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000887 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000888 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000889 c->c_freevars = NULL;
890 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000891 c->c_nlocals = 0;
892 c->c_argcount = 0;
893 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000894 c->c_nexti = 0;
895 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000896 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000897 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000898 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000899 c->c_begin = 0;
900 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000901 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000902 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000903 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000904 c->c_stacklevel = 0;
905 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000906 c->c_firstlineno = 0;
907 c->c_last_addr = 0;
908 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000909 c->c_lnotab_next = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +0000910 c->c_lnotab_last = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000911 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000912 c->c_nested = 0;
913 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000914 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000915 return 1;
916
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000917 fail:
918 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000919 return 0;
920}
921
922static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000923com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000924{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000925 Py_XDECREF(c->c_code);
926 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000927 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000928 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000929 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000930 Py_XDECREF(c->c_globals);
931 Py_XDECREF(c->c_locals);
932 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000933 Py_XDECREF(c->c_freevars);
934 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000935 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000936 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +0000937 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000938}
939
940static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000941com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000942{
943 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000944 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +0000945 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000946 /*
947 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
948 c->c_filename, c->c_name, c->c_lineno,
949 c->c_nexti, c->c_stacklevel, n);
950 */
951 }
Guido van Rossum8b993a91997-01-17 21:04:03 +0000952}
953
954static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000955com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000956{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000957 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000958 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000959 else
960 c->c_stacklevel -= n;
961}
962
963static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000964com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000965{
966 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000967 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000968 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000969 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000970}
971
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000972static int
973com_check_size(PyObject **s, int offset)
974{
975 int len = PyString_GET_SIZE(*s);
976 if (offset >= len)
977 return _PyString_Resize(s, len * 2);
978 return 0;
979}
980
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000981static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000982com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000983{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000984 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000985 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +0000986 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000987 if (com_check_size(&c->c_code, c->c_nexti)) {
988 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000989 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000990 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000991 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000992}
993
994static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000995com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000996{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000997 com_addbyte(c, x & 0xff);
998 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000999}
1000
1001static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001002com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001003{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001004 char *p;
1005 if (c->c_lnotab == NULL)
1006 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001007 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
1008 c->c_errors++;
1009 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001010 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001011 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001012 *p++ = addr;
1013 *p++ = line;
1014 c->c_lnotab_next += 2;
1015}
1016
1017static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001018com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001019{
1020 c->c_lineno = lineno;
1021 if (c->c_firstlineno == 0) {
1022 c->c_firstlineno = c->c_last_line = lineno;
1023 }
1024 else {
1025 int incr_addr = c->c_nexti - c->c_last_addr;
1026 int incr_line = lineno - c->c_last_line;
Armin Rigo80d937e2004-03-22 17:52:53 +00001027 c->c_lnotab_last = c->c_lnotab_next;
Tim Peters2a7f3842001-06-09 09:26:21 +00001028 while (incr_addr > 255) {
1029 com_add_lnotab(c, 255, 0);
1030 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001031 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001032 while (incr_line > 255) {
1033 com_add_lnotab(c, incr_addr, 255);
1034 incr_line -=255;
1035 incr_addr = 0;
1036 }
1037 if (incr_addr > 0 || incr_line > 0)
1038 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001039 c->c_last_addr = c->c_nexti;
1040 c->c_last_line = lineno;
1041 }
1042}
1043
1044static void
Armin Rigo80d937e2004-03-22 17:52:53 +00001045com_strip_lnotab(struct compiling *c)
1046{
1047 /* strip the last lnotab entry if no opcode were emitted.
1048 * This prevents a line number to be generated on a final
1049 * pass, like in the following example:
1050 *
1051 * if a:
1052 * print 5
1053 * else:
1054 * pass
1055 *
1056 * Without the fix, a line trace event would be generated
1057 * on the pass even if a is true (because of the implicit
1058 * return).
1059 */
1060 if (c->c_nexti == c->c_last_addr && c->c_lnotab_last > 0) {
1061 c->c_lnotab_next = c->c_lnotab_last;
1062 }
1063}
1064
1065static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001066com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001067{
Fred Drakeef8ace32000-08-24 00:32:09 +00001068 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +00001069 if (extended_arg){
1070 com_addbyte(c, EXTENDED_ARG);
1071 com_addint(c, extended_arg);
1072 arg &= 0xffff;
1073 }
Guido van Rossum8e793d91997-03-03 19:13:14 +00001074 com_addbyte(c, op);
1075 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001076}
1077
1078static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001079com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001080{
1081 /* Compile a forward reference for backpatching */
1082 int here;
1083 int anchor;
1084 com_addbyte(c, op);
1085 here = c->c_nexti;
1086 anchor = *p_anchor;
1087 *p_anchor = here;
1088 com_addint(c, anchor == 0 ? 0 : here - anchor);
1089}
1090
1091static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001092com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001093{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001094 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001095 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001096 int dist;
1097 int prev;
1098 for (;;) {
1099 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001100 prev = code[anchor] + (code[anchor+1] << 8);
1101 dist = target - (anchor+2);
1102 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001103 dist >>= 8;
1104 code[anchor+1] = dist;
1105 dist >>= 8;
1106 if (dist) {
1107 com_error(c, PyExc_SystemError,
1108 "com_backpatch: offset too large");
1109 break;
1110 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001111 if (!prev)
1112 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001113 anchor -= prev;
1114 }
1115}
1116
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001117/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001118
1119static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001120com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001121{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001122 PyObject *w, *t, *np=NULL;
1123 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001124
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001125 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001126 if (t == NULL)
1127 goto fail;
1128 w = PyDict_GetItem(dict, t);
1129 if (w != NULL) {
1130 n = PyInt_AsLong(w);
1131 } else {
1132 n = PyList_Size(list);
1133 np = PyInt_FromLong(n);
1134 if (np == NULL)
1135 goto fail;
1136 if (PyList_Append(list, v) != 0)
1137 goto fail;
1138 if (PyDict_SetItem(dict, t, np) != 0)
1139 goto fail;
1140 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001141 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001142 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001143 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001144 fail:
1145 Py_XDECREF(np);
1146 Py_XDECREF(t);
1147 c->c_errors++;
1148 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001149}
1150
1151static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001152com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001153{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001154 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001155}
1156
1157static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001158com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001159{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001160 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001161}
1162
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001163int
1164_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001165{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001166 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001167 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001168 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001169 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1170 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001171 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001172 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001173 return 0; /* Don't mangle __extremely_long_names */
1174 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1175 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001176 /* Strip leading underscores from class name */
1177 while (*p == '_')
1178 p++;
1179 if (*p == '\0')
1180 return 0; /* Don't mangle if class is just underscores */
1181 plen = strlen(p);
1182 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001183 plen = maxlen-nlen-2; /* Truncate class name if too long */
1184 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001185 buffer[0] = '_';
1186 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001187 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001188 return 1;
1189}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001190
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001191static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001192com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001193{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001194 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001195 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001196 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001197
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001198 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001199 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001200 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001201 c->c_errors++;
1202 i = 255;
1203 }
1204 else {
1205 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001206 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001207 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001208 com_addoparg(c, op, i);
1209}
1210
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001211#define NAME_LOCAL 0
1212#define NAME_GLOBAL 1
1213#define NAME_DEFAULT 2
1214#define NAME_CLOSURE 3
1215
1216static int
1217com_lookup_arg(PyObject *dict, PyObject *name)
1218{
1219 PyObject *v = PyDict_GetItem(dict, name);
1220 if (v == NULL)
1221 return -1;
1222 else
1223 return PyInt_AS_LONG(v);
1224}
1225
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001226static int
1227none_assignment_check(struct compiling *c, char *name, int assigning)
1228{
1229 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1230 char *msg;
1231 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001232 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001233 else
1234 msg = "deleting None";
Raymond Hettinger11a70c72004-07-17 21:46:25 +00001235 com_error(c, PyExc_SyntaxError, msg);
1236 return -1;
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001237 }
1238 return 0;
1239}
1240
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001241static void
1242com_addop_varname(struct compiling *c, int kind, char *name)
1243{
1244 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001245 int i, reftype;
1246 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001247 int op = STOP_CODE;
1248 char buffer[MANGLE_LEN];
1249
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001250 if (kind != VAR_LOAD &&
1251 none_assignment_check(c, name, kind == VAR_STORE))
1252 {
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001253 i = 255;
1254 goto done;
1255 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001256 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001257 name = buffer;
1258 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1259 c->c_errors++;
1260 i = 255;
1261 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001262 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001263
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001264 reftype = get_ref_type(c, name);
1265 switch (reftype) {
1266 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001267 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001268 scope = NAME_LOCAL;
1269 break;
1270 case GLOBAL_EXPLICIT:
1271 scope = NAME_GLOBAL;
1272 break;
1273 case GLOBAL_IMPLICIT:
1274 if (c->c_flags & CO_OPTIMIZED)
1275 scope = NAME_GLOBAL;
1276 break;
1277 case FREE:
1278 case CELL:
1279 scope = NAME_CLOSURE;
1280 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001281 }
1282
1283 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001284 if (scope == NAME_LOCAL)
1285 i = com_lookup_arg(c->c_locals, v);
1286 else if (reftype == FREE)
1287 i = com_lookup_arg(c->c_freevars, v);
1288 else if (reftype == CELL)
1289 i = com_lookup_arg(c->c_cellvars, v);
1290 if (i == -1) {
1291 c->c_errors++; /* XXX no exception set */
1292 i = 255;
1293 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001294 }
1295 Py_DECREF(v);
1296
1297 switch (kind) {
1298 case VAR_LOAD:
1299 switch (scope) {
1300 case NAME_LOCAL:
1301 op = LOAD_FAST;
1302 break;
1303 case NAME_GLOBAL:
1304 op = LOAD_GLOBAL;
1305 break;
1306 case NAME_DEFAULT:
1307 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001308 break;
1309 case NAME_CLOSURE:
1310 op = LOAD_DEREF;
1311 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001312 }
1313 break;
1314 case VAR_STORE:
1315 switch (scope) {
1316 case NAME_LOCAL:
1317 op = STORE_FAST;
1318 break;
1319 case NAME_GLOBAL:
1320 op = STORE_GLOBAL;
1321 break;
1322 case NAME_DEFAULT:
1323 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001324 break;
1325 case NAME_CLOSURE:
1326 op = STORE_DEREF;
1327 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001328 }
1329 break;
1330 case VAR_DELETE:
1331 switch (scope) {
1332 case NAME_LOCAL:
1333 op = DELETE_FAST;
1334 break;
1335 case NAME_GLOBAL:
1336 op = DELETE_GLOBAL;
1337 break;
1338 case NAME_DEFAULT:
1339 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001340 break;
1341 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001342 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001343 PyOS_snprintf(buf, sizeof(buf),
1344 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001345 com_error(c, PyExc_SyntaxError, buf);
1346 i = 255;
1347 break;
1348 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001349 }
1350 break;
1351 }
1352done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001353 com_addoparg(c, op, i);
1354}
1355
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001356static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001357com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001358{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001359 char *name;
1360 char buffer[1000];
1361 /* XXX it is possible to write this code without the 1000
1362 chars on the total length of dotted names, I just can't be
1363 bothered right now */
1364 if (TYPE(n) == STAR)
1365 name = "*";
1366 else if (TYPE(n) == dotted_name) {
1367 char *p = buffer;
1368 int i;
1369 name = buffer;
1370 for (i = 0; i < NCH(n); i += 2) {
1371 char *s = STR(CHILD(n, i));
1372 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001373 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001374 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001375 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001376 break;
1377 }
1378 if (p != buffer)
1379 *p++ = '.';
1380 strcpy(p, s);
1381 p = strchr(p, '\0');
1382 }
1383 }
1384 else {
1385 REQ(n, NAME);
1386 name = STR(n);
1387 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001388 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001389}
1390
Guido van Rossum79f25d91997-04-29 20:08:16 +00001391static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001392parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001393{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001394 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001395 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001396 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001397#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001398 int imflag;
1399#endif
1400
Guido van Rossum282914b1991-04-04 10:42:56 +00001401 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001402 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001403#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001404 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001405#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001406 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001407 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001408 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001409 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001410 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001411 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001412 }
1413 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001414 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001415 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001416 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001417 if (errno != 0)
1418 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001419 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001420 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001421 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001422#ifndef WITHOUT_COMPLEX
1423 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001424 Py_complex z;
1425 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001426 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001427 z.imag = PyOS_ascii_atof(s);
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001428 PyFPE_END_PROTECT(z)
1429 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001430 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001431 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001432#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001433 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001434 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001435 dx = PyOS_ascii_atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001436 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001437 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001438 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001439}
1440
Guido van Rossum79f25d91997-04-29 20:08:16 +00001441static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001442decode_utf8(char **sPtr, char *end, char* encoding)
1443{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001444#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001445 Py_FatalError("decode_utf8 should not be called in this build.");
1446 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001447#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001448 PyObject *u, *v;
1449 char *s, *t;
1450 t = s = *sPtr;
1451 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1452 while (s < end && (*s & 0x80)) s++;
1453 *sPtr = s;
1454 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1455 if (u == NULL)
1456 return NULL;
1457 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1458 Py_DECREF(u);
1459 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001460#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001461}
1462
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001463/* compiler.transformer.Transformer.decode_literal depends on what
1464 might seem like minor details of this function -- changes here
1465 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001466static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001467parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001468{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001469 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001470 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001471 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001472 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001473 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001474 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001475 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001476
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001477 if (isalpha(quote) || quote == '_') {
1478 if (quote == 'u' || quote == 'U') {
1479 quote = *++s;
1480 unicode = 1;
1481 }
1482 if (quote == 'r' || quote == 'R') {
1483 quote = *++s;
1484 rawmode = 1;
1485 }
1486 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001487 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001488 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001489 return NULL;
1490 }
1491 s++;
1492 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001493 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001494 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001495 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001496 return NULL;
1497 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001498 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001499 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001500 return NULL;
1501 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001502 if (len >= 4 && s[0] == quote && s[1] == quote) {
1503 s += 2;
1504 len -= 2;
1505 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001506 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001507 return NULL;
1508 }
1509 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001510#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001511 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001512 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001513 char *buf;
1514 char *p;
1515 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001516 if (encoding == NULL) {
1517 buf = s;
1518 u = NULL;
1519 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1520 buf = s;
1521 u = NULL;
1522 } else {
1523 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1524 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1525 if (u == NULL)
1526 return NULL;
1527 p = buf = PyString_AsString(u);
1528 end = s + len;
1529 while (s < end) {
1530 if (*s == '\\') {
1531 *p++ = *s++;
1532 if (*s & 0x80) {
1533 strcpy(p, "u005c");
1534 p += 5;
1535 }
1536 }
1537 if (*s & 0x80) { /* XXX inefficient */
1538 char *r;
1539 int rn, i;
1540 w = decode_utf8(&s, end, "utf-16-be");
1541 if (w == NULL) {
1542 Py_DECREF(u);
1543 return NULL;
1544 }
1545 r = PyString_AsString(w);
1546 rn = PyString_Size(w);
1547 assert(rn % 2 == 0);
1548 for (i = 0; i < rn; i += 2) {
1549 sprintf(p, "\\u%02x%02x",
1550 r[i + 0] & 0xFF,
1551 r[i + 1] & 0xFF);
1552 p += 6;
1553 }
1554 Py_DECREF(w);
1555 } else {
1556 *p++ = *s++;
1557 }
1558 }
1559 len = p - buf;
1560 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001561 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001562 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001563 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001564 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1565 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001566 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001567 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001568 return v;
1569
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001570 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001571#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001572 need_encoding = (encoding != NULL &&
1573 strcmp(encoding, "utf-8") != 0 &&
1574 strcmp(encoding, "iso-8859-1") != 0);
1575 if (rawmode || strchr(s, '\\') == NULL) {
1576 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001577#ifndef Py_USING_UNICODE
1578 /* This should not happen - we never see any other
1579 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001580 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001581#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001582 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1583 if (u == NULL)
1584 return NULL;
1585 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1586 Py_DECREF(u);
1587 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001588#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001589 } else {
1590 return PyString_FromStringAndSize(s, len);
1591 }
1592 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001593
1594 v = PyString_DecodeEscape(s, len, NULL, unicode,
1595 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001596 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001597 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001598 return v;
1599}
1600
Guido van Rossum79f25d91997-04-29 20:08:16 +00001601static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001602parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001603{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001604 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001605 int i;
1606 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001607 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001608 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001609 for (i = 1; i < NCH(n); i++) {
1610 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001611 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001612 if (s == NULL)
1613 goto onError;
1614 if (PyString_Check(v) && PyString_Check(s)) {
1615 PyString_ConcatAndDel(&v, s);
1616 if (v == NULL)
1617 goto onError;
1618 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001619#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001620 else {
1621 PyObject *temp;
1622 temp = PyUnicode_Concat(v, s);
1623 Py_DECREF(s);
1624 if (temp == NULL)
1625 goto onError;
1626 Py_DECREF(v);
1627 v = temp;
1628 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001629#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001630 }
1631 }
1632 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001633
1634 onError:
1635 Py_XDECREF(v);
1636 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001637}
1638
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001639static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001640com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001641{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001642 int anchor = 0;
1643 int save_begin = c->c_begin;
1644
Raymond Hettinger354433a2004-05-19 08:20:33 +00001645 /* list_for: for v in expr [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001646 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001647 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001648 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001649 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001650 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001651 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001652 c->c_loops++;
1653 com_list_iter(c, n, e, t);
1654 c->c_loops--;
1655 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1656 c->c_begin = save_begin;
1657 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001658 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001659}
1660
1661static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001662com_gen_for(struct compiling *c, node *n, node *t, int is_outmost)
1663{
1664 int break_anchor = 0;
1665 int anchor = 0;
1666 int save_begin = c->c_begin;
1667
1668 REQ(n, gen_for);
1669 /* gen_for: for v in test [gen_iter] */
1670
1671 com_addfwref(c, SETUP_LOOP, &break_anchor);
1672 block_push(c, SETUP_LOOP);
1673
1674 if (is_outmost) {
1675 com_addop_varname(c, VAR_LOAD, "[outmost-iterable]");
1676 com_push(c, 1);
1677 }
1678 else {
1679 com_node(c, CHILD(n, 3));
1680 com_addbyte(c, GET_ITER);
1681 }
1682
1683 c->c_begin = c->c_nexti;
1684 com_set_lineno(c, c->c_last_line);
1685 com_addfwref(c, FOR_ITER, &anchor);
1686 com_push(c, 1);
1687 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
1688
1689 if (NCH(n) == 5)
1690 com_gen_iter(c, CHILD(n, 4), t);
1691 else {
1692 com_test(c, t);
1693 com_addbyte(c, YIELD_VALUE);
1694 com_pop(c, 1);
1695 }
1696
1697 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1698 c->c_begin = save_begin;
1699
1700 com_backpatch(c, anchor);
1701 com_pop(c, 1); /* FOR_ITER has popped this */
1702 com_addbyte(c, POP_BLOCK);
1703 block_pop(c, SETUP_LOOP);
1704 com_backpatch(c, break_anchor);
1705}
1706
1707static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001708com_list_if(struct compiling *c, node *n, node *e, char *t)
1709{
1710 int anchor = 0;
1711 int a = 0;
1712 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001713 com_node(c, CHILD(n, 1));
1714 com_addfwref(c, JUMP_IF_FALSE, &a);
1715 com_addbyte(c, POP_TOP);
1716 com_pop(c, 1);
1717 com_list_iter(c, n, e, t);
1718 com_addfwref(c, JUMP_FORWARD, &anchor);
1719 com_backpatch(c, a);
1720 /* We jump here with an extra entry which we now pop */
1721 com_addbyte(c, POP_TOP);
1722 com_backpatch(c, anchor);
1723}
1724
1725static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001726com_gen_if(struct compiling *c, node *n, node *t)
1727{
1728 /* gen_if: 'if' test [gen_iter] */
1729 int anchor = 0;
1730 int a=0;
1731
1732 com_node(c, CHILD(n, 1));
1733 com_addfwref(c, JUMP_IF_FALSE, &a);
1734 com_addbyte(c, POP_TOP);
1735 com_pop(c, 1);
1736
1737 if (NCH(n) == 3)
1738 com_gen_iter(c, CHILD(n, 2), t);
1739 else {
1740 com_test(c, t);
1741 com_addbyte(c, YIELD_VALUE);
1742 com_pop(c, 1);
1743 }
1744 com_addfwref(c, JUMP_FORWARD, &anchor);
1745 com_backpatch(c, a);
1746 /* We jump here with an extra entry which we now pop */
1747 com_addbyte(c, POP_TOP);
1748 com_backpatch(c, anchor);
1749}
1750
1751static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001752com_list_iter(struct compiling *c,
1753 node *p, /* parent of list_iter node */
1754 node *e, /* element expression node */
1755 char *t /* name of result list temp local */)
1756{
1757 /* list_iter is the last child in a listmaker, list_for, or list_if */
1758 node *n = CHILD(p, NCH(p)-1);
1759 if (TYPE(n) == list_iter) {
1760 n = CHILD(n, 0);
1761 switch (TYPE(n)) {
1762 case list_for:
1763 com_list_for(c, n, e, t);
1764 break;
1765 case list_if:
1766 com_list_if(c, n, e, t);
1767 break;
1768 default:
1769 com_error(c, PyExc_SystemError,
1770 "invalid list_iter node type");
1771 }
1772 }
1773 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001774 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001775 com_push(c, 1);
1776 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001777 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001778 com_pop(c, 2);
1779 }
1780}
1781
1782static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001783com_gen_iter(struct compiling *c, node *n, node *t)
1784{
1785 /* gen_iter: gen_for | gen_if */
1786 node *ch;
1787 REQ(n, gen_iter);
1788
1789 ch = CHILD(n, 0);
1790
1791 switch (TYPE(ch)) {
1792 case gen_for:
1793 com_gen_for(c, ch, t, 0);
1794 break;
1795 case gen_if:
1796 com_gen_if(c, ch, t);
1797 break;
1798 default:
1799 com_error(c, PyExc_SystemError,
1800 "invalid gen_iter node type");
1801 }
1802}
1803
1804static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001805com_list_comprehension(struct compiling *c, node *n)
1806{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001807 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001808 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001809
1810 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001811 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001812 com_addoparg(c, BUILD_LIST, 0);
1813 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1814 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001815 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001816 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001817 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001818 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001819 --c->c_tmpname;
1820}
1821
1822static void
1823com_listmaker(struct compiling *c, node *n)
1824{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001825 /* listmaker: test ( list_for | (',' test)* [','] ) */
1826 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001827 com_list_comprehension(c, n);
1828 else {
1829 int len = 0;
1830 int i;
1831 for (i = 0; i < NCH(n); i += 2, len++)
1832 com_node(c, CHILD(n, i));
1833 com_addoparg(c, BUILD_LIST, len);
1834 com_pop(c, len-1);
1835 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001836}
1837
1838static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001839com_generator_expression(struct compiling *c, node *n)
1840{
1841 /* testlist_gexp: test gen_for */
1842 /* argument: test gen_for */
1843 PyCodeObject *co;
1844
1845 REQ(CHILD(n, 0), test);
1846 REQ(CHILD(n, 1), gen_for);
1847
1848 symtable_enter_scope(c->c_symtable, "<genexpr>", TYPE(n),
1849 n->n_lineno);
1850 co = icompile(n, c);
1851 symtable_exit_scope(c->c_symtable);
1852
1853 if (co == NULL)
1854 c->c_errors++;
1855 else {
1856 int closure = com_make_closure(c, co);
1857 int i = com_addconst(c, (PyObject *)co);
1858
1859 com_addoparg(c, LOAD_CONST, i);
1860 com_push(c, 1);
1861 if (closure)
1862 com_addoparg(c, MAKE_CLOSURE, 0);
1863 else
1864 com_addoparg(c, MAKE_FUNCTION, 0);
1865
1866 com_test(c, CHILD(CHILD(n, 1), 3));
1867 com_addbyte(c, GET_ITER);
1868 com_addoparg(c, CALL_FUNCTION, 1);
1869 com_pop(c, 1);
1870
1871 Py_DECREF(co);
1872 }
1873}
1874
1875static void
1876com_testlist_gexp(struct compiling *c, node *n)
1877{
1878 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
1879 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
1880 com_generator_expression(c, n);
1881 else com_list(c, n, 0);
1882}
1883
Anthony Baxterc2a5a632004-08-02 06:10:11 +00001884
Raymond Hettinger354433a2004-05-19 08:20:33 +00001885static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001886com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001887{
1888 int i;
1889 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1890 for (i = 0; i+2 < NCH(n); i += 4) {
1891 /* We must arrange things just right for STORE_SUBSCR.
1892 It wants the stack to look like (value) (dict) (key) */
1893 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001894 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001895 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00001896 com_node(c, CHILD(n, i+2)); /* value */
1897 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001898 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001899 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001900 }
1901}
1902
1903static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001904com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001905{
1906 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001907 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001908 int i;
1909 REQ(n, atom);
1910 ch = CHILD(n, 0);
1911 switch (TYPE(ch)) {
1912 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001913 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001914 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001915 com_push(c, 1);
1916 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001917 else
Raymond Hettinger354433a2004-05-19 08:20:33 +00001918 com_testlist_gexp(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001919 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001920 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001921 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001922 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001923 com_push(c, 1);
1924 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001925 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001926 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001927 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001928 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001929 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001930 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001931 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001932 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001933 break;
1934 case BACKQUOTE:
1935 com_node(c, CHILD(n, 1));
1936 com_addbyte(c, UNARY_CONVERT);
1937 break;
1938 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001939 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001940 i = 255;
1941 }
1942 else {
1943 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001944 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001945 }
1946 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001947 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001948 break;
1949 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001950 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001951 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001952 c->c_errors++;
1953 i = 255;
1954 }
1955 else {
1956 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001957 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001958 }
1959 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001960 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001961 break;
1962 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001963 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001964 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001965 break;
1966 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001967 com_error(c, PyExc_SystemError,
1968 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001969 }
1970}
1971
1972static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001973com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001974{
1975 if (NCH(n) == 1) {
1976 com_addbyte(c, op);
1977 }
1978 else if (NCH(n) == 2) {
1979 if (TYPE(CHILD(n, 0)) != COLON) {
1980 com_node(c, CHILD(n, 0));
1981 com_addbyte(c, op+1);
1982 }
1983 else {
1984 com_node(c, CHILD(n, 1));
1985 com_addbyte(c, op+2);
1986 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001987 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001988 }
1989 else {
1990 com_node(c, CHILD(n, 0));
1991 com_node(c, CHILD(n, 2));
1992 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001993 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001994 }
1995}
1996
Guido van Rossum635abd21997-01-06 22:56:52 +00001997static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001998com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1999{
2000 if (NCH(n) == 1) {
2001 com_addbyte(c, DUP_TOP);
2002 com_push(c, 1);
2003 com_addbyte(c, SLICE);
2004 com_node(c, augn);
2005 com_addbyte(c, opcode);
2006 com_pop(c, 1);
2007 com_addbyte(c, ROT_TWO);
2008 com_addbyte(c, STORE_SLICE);
2009 com_pop(c, 2);
2010 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
2011 com_node(c, CHILD(n, 0));
2012 com_addoparg(c, DUP_TOPX, 2);
2013 com_push(c, 2);
2014 com_addbyte(c, SLICE+1);
2015 com_pop(c, 1);
2016 com_node(c, augn);
2017 com_addbyte(c, opcode);
2018 com_pop(c, 1);
2019 com_addbyte(c, ROT_THREE);
2020 com_addbyte(c, STORE_SLICE+1);
2021 com_pop(c, 3);
2022 } else if (NCH(n) == 2) {
2023 com_node(c, CHILD(n, 1));
2024 com_addoparg(c, DUP_TOPX, 2);
2025 com_push(c, 2);
2026 com_addbyte(c, SLICE+2);
2027 com_pop(c, 1);
2028 com_node(c, augn);
2029 com_addbyte(c, opcode);
2030 com_pop(c, 1);
2031 com_addbyte(c, ROT_THREE);
2032 com_addbyte(c, STORE_SLICE+2);
2033 com_pop(c, 3);
2034 } else {
2035 com_node(c, CHILD(n, 0));
2036 com_node(c, CHILD(n, 2));
2037 com_addoparg(c, DUP_TOPX, 3);
2038 com_push(c, 3);
2039 com_addbyte(c, SLICE+3);
2040 com_pop(c, 2);
2041 com_node(c, augn);
2042 com_addbyte(c, opcode);
2043 com_pop(c, 1);
2044 com_addbyte(c, ROT_FOUR);
2045 com_addbyte(c, STORE_SLICE+3);
2046 com_pop(c, 4);
2047 }
2048}
2049
2050static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002051com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002052{
2053 node *m;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002054 REQ(n, argument); /* [test '='] test [gen_for]; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00002055 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00002056 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002057 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00002058 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002059 }
2060 else {
2061 com_node(c, CHILD(n, 0));
2062 }
Guido van Rossum635abd21997-01-06 22:56:52 +00002063 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002064 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00002065 if (NCH(n) == 2) {
2066 com_generator_expression(c, n);
2067 return;
2068 }
2069
Guido van Rossumf10570b1995-07-07 22:53:21 +00002070 m = n;
2071 do {
2072 m = CHILD(m, 0);
2073 } while (NCH(m) == 1);
2074 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00002075 /* f(lambda x: x[0] = 3) ends up getting parsed with
2076 * LHS test = lambda x: x[0], and RHS test = 3.
2077 * SF bug 132313 points out that complaining about a keyword
2078 * then is very confusing.
2079 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002080 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00002081 TYPE(m) == lambdef ?
2082 "lambda cannot contain assignment" :
2083 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002084 }
2085 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002086 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00002087 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00002088 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002089 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002090 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002091 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002092 else if (*pkeywords == NULL) {
2093 c->c_errors++;
2094 Py_DECREF(v);
2095 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002096 if (PyDict_GetItem(*pkeywords, v) != NULL)
2097 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00002098 "duplicate keyword argument");
2099 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002100 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00002101 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002102 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002103 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002104 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002105 }
2106 }
2107 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002108}
2109
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002110static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002111com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002112{
2113 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00002114 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002115 }
2116 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002117 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00002118 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00002119 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00002120 int star_flag = 0;
2121 int starstar_flag = 0;
2122 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002123 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002124 na = 0;
2125 nk = 0;
2126 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00002127 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00002128 if (TYPE(ch) == STAR ||
2129 TYPE(ch) == DOUBLESTAR)
2130 break;
Guido van Rossumca906051998-12-10 16:56:22 +00002131 if (ch->n_lineno != lineno) {
2132 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002133 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00002134 }
2135 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00002136 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002137 na++;
2138 else
2139 nk++;
2140 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002141 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00002142 while (i < NCH(n)) {
2143 node *tok = CHILD(n, i);
2144 node *ch = CHILD(n, i+1);
2145 i += 3;
2146 switch (TYPE(tok)) {
2147 case STAR: star_flag = 1; break;
2148 case DOUBLESTAR: starstar_flag = 1; break;
2149 }
2150 com_node(c, ch);
2151 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002152 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002153 com_error(c, PyExc_SyntaxError,
2154 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002155 }
Jeremy Hylton76901512000-03-28 23:49:17 +00002156 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00002157 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00002158 star_flag + (starstar_flag << 1);
2159 else
2160 opcode = CALL_FUNCTION;
2161 com_addoparg(c, opcode, na | (nk << 8));
2162 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002163 }
2164}
2165
2166static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002167com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002168{
2169 com_addopname(c, LOAD_ATTR, n);
2170}
2171
2172static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002173com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002174{
2175 int i=0;
2176 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00002177 node *ch;
2178
2179 /* first argument */
2180 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002181 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002182 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002183 i++;
2184 }
2185 else {
2186 com_node(c, CHILD(n,i));
2187 i++;
2188 REQ(CHILD(n,i),COLON);
2189 i++;
2190 }
2191 /* second argument */
2192 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
2193 com_node(c, CHILD(n,i));
2194 i++;
2195 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002196 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002197 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002198 com_push(c, 1);
2199 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002200 /* remaining arguments */
2201 for (; i < NCH(n); i++) {
2202 ns++;
2203 ch=CHILD(n,i);
2204 REQ(ch, sliceop);
2205 if (NCH(ch) == 1) {
2206 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002207 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002208 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002209 }
2210 else
2211 com_node(c, CHILD(ch,1));
2212 }
2213 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002214 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002215}
2216
2217static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002218com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002219{
2220 node *ch;
2221 REQ(n, subscript);
2222 ch = CHILD(n,0);
2223 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002224 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002225 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002226 com_push(c, 1);
2227 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002228 else {
2229 /* check for slice */
2230 if ((TYPE(ch) == COLON || NCH(n) > 1))
2231 com_sliceobj(c, n);
2232 else {
2233 REQ(ch, test);
2234 com_node(c, ch);
2235 }
2236 }
2237}
2238
2239static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002240com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002241{
2242 int i, op;
2243 REQ(n, subscriptlist);
2244 /* Check to make backward compatible slice behavior for '[i:j]' */
2245 if (NCH(n) == 1) {
2246 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002247 /* 'Basic' slice, should have exactly one colon. */
2248 if ((TYPE(CHILD(sub, 0)) == COLON
2249 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2250 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2251 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002252 switch (assigning) {
2253 case OP_DELETE:
2254 op = DELETE_SLICE;
2255 break;
2256 case OP_ASSIGN:
2257 op = STORE_SLICE;
2258 break;
2259 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002260 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002261 break;
2262 default:
2263 com_augassign_slice(c, sub, assigning, augn);
2264 return;
2265 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002266 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002267 if (op == STORE_SLICE)
2268 com_pop(c, 2);
2269 else if (op == DELETE_SLICE)
2270 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002271 return;
2272 }
2273 }
2274 /* Else normal subscriptlist. Compile each subscript. */
2275 for (i = 0; i < NCH(n); i += 2)
2276 com_subscript(c, CHILD(n, i));
2277 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002278 if (NCH(n) > 1) {
2279 i = (NCH(n)+1) / 2;
2280 com_addoparg(c, BUILD_TUPLE, i);
2281 com_pop(c, i-1);
2282 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002283 switch (assigning) {
2284 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002285 op = DELETE_SUBSCR;
2286 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002287 break;
2288 default:
2289 case OP_ASSIGN:
2290 op = STORE_SUBSCR;
2291 i = 3;
2292 break;
2293 case OP_APPLY:
2294 op = BINARY_SUBSCR;
2295 i = 1;
2296 break;
2297 }
2298 if (assigning > OP_APPLY) {
2299 com_addoparg(c, DUP_TOPX, 2);
2300 com_push(c, 2);
2301 com_addbyte(c, BINARY_SUBSCR);
2302 com_pop(c, 1);
2303 com_node(c, augn);
2304 com_addbyte(c, assigning);
2305 com_pop(c, 1);
2306 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002307 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002308 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002309 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002310}
2311
2312static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002313com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002314{
2315 REQ(n, trailer);
2316 switch (TYPE(CHILD(n, 0))) {
2317 case LPAR:
2318 com_call_function(c, CHILD(n, 1));
2319 break;
2320 case DOT:
2321 com_select_member(c, CHILD(n, 1));
2322 break;
2323 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002324 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002325 break;
2326 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002327 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002328 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002329 }
2330}
2331
2332static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002333com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002334{
2335 int i;
2336 REQ(n, power);
2337 com_atom(c, CHILD(n, 0));
2338 for (i = 1; i < NCH(n); i++) {
2339 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2340 com_factor(c, CHILD(n, i+1));
2341 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002342 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002343 break;
2344 }
2345 else
2346 com_apply_trailer(c, CHILD(n, i));
2347 }
2348}
2349
2350static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002351com_invert_constant(struct compiling *c, node *n)
2352{
2353 /* Compute the inverse of int and longs and use them directly,
2354 but be prepared to generate code for all other
2355 possibilities (invalid numbers, floats, complex).
2356 */
2357 PyObject *num, *inv = NULL;
2358 int i;
2359
2360 REQ(n, NUMBER);
2361 num = parsenumber(c, STR(n));
2362 if (num == NULL)
2363 i = 255;
2364 else {
2365 inv = PyNumber_Invert(num);
2366 if (inv == NULL) {
2367 PyErr_Clear();
2368 i = com_addconst(c, num);
2369 } else {
2370 i = com_addconst(c, inv);
2371 Py_DECREF(inv);
2372 }
2373 Py_DECREF(num);
2374 }
2375 com_addoparg(c, LOAD_CONST, i);
2376 com_push(c, 1);
2377 if (num != NULL && inv == NULL)
2378 com_addbyte(c, UNARY_INVERT);
2379}
2380
Tim Peters51e26512001-09-07 08:45:55 +00002381static int
2382is_float_zero(const char *p)
2383{
2384 int found_radix_point = 0;
2385 int ch;
2386 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2387 switch (ch) {
2388 case '0':
2389 /* no reason to believe it's not 0 -- continue */
2390 break;
2391
2392 case 'e': case 'E': case 'j': case 'J':
2393 /* If this was a hex constant, we already would have
2394 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2395 must be an exponent marker, and we haven't yet
2396 seen a non-zero digit, and it doesn't matter what
2397 the exponent is then. For 'j' or 'J' similarly,
2398 except that this is an imaginary 0 then. */
2399 return 1;
2400
2401 case '.':
2402 found_radix_point = 1;
2403 break;
2404
2405 default:
2406 return 0;
2407 }
2408 }
2409 return found_radix_point;
2410}
2411
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002412static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002413com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002414{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002415 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002416 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002417 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002418 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002419 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002420 approriate value as a constant. If the value is negative,
2421 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002422 negative in the 0th position -- unless we're doing unary minus
2423 of a floating zero! In that case the sign is significant, but
2424 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002425 */
2426 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002427 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002428 && TYPE((pfactor = CHILD(n, 1))) == factor
2429 && NCH(pfactor) == 1
2430 && TYPE((ppower = CHILD(pfactor, 0))) == power
2431 && NCH(ppower) == 1
2432 && TYPE((patom = CHILD(ppower, 0))) == atom
2433 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002434 && !(childtype == MINUS &&
2435 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002436 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002437 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002438 return;
2439 }
2440 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002441 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002442 if (s == NULL) {
2443 com_error(c, PyExc_MemoryError, "");
2444 com_addbyte(c, 255);
2445 return;
2446 }
2447 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002448 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002449 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002450 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002451 }
Tim Peters51e26512001-09-07 08:45:55 +00002452 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002453 }
2454 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002455 com_factor(c, CHILD(n, 1));
2456 com_addbyte(c, UNARY_POSITIVE);
2457 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002458 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002459 com_factor(c, CHILD(n, 1));
2460 com_addbyte(c, UNARY_NEGATIVE);
2461 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002462 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002463 com_factor(c, CHILD(n, 1));
2464 com_addbyte(c, UNARY_INVERT);
2465 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002466 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002467 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002468 }
2469}
2470
2471static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002472com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002473{
2474 int i;
2475 int op;
2476 REQ(n, term);
2477 com_factor(c, CHILD(n, 0));
2478 for (i = 2; i < NCH(n); i += 2) {
2479 com_factor(c, CHILD(n, i));
2480 switch (TYPE(CHILD(n, i-1))) {
2481 case STAR:
2482 op = BINARY_MULTIPLY;
2483 break;
2484 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002485 if (c->c_flags & CO_FUTURE_DIVISION)
2486 op = BINARY_TRUE_DIVIDE;
2487 else
2488 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002489 break;
2490 case PERCENT:
2491 op = BINARY_MODULO;
2492 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002493 case DOUBLESLASH:
2494 op = BINARY_FLOOR_DIVIDE;
2495 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002496 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002497 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002498 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002499 op = 255;
2500 }
2501 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002502 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002503 }
2504}
2505
2506static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002507com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002508{
2509 int i;
2510 int op;
2511 REQ(n, arith_expr);
2512 com_term(c, CHILD(n, 0));
2513 for (i = 2; i < NCH(n); i += 2) {
2514 com_term(c, CHILD(n, i));
2515 switch (TYPE(CHILD(n, i-1))) {
2516 case PLUS:
2517 op = BINARY_ADD;
2518 break;
2519 case MINUS:
2520 op = BINARY_SUBTRACT;
2521 break;
2522 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002523 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002524 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002525 op = 255;
2526 }
2527 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002528 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002529 }
2530}
2531
2532static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002533com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002534{
2535 int i;
2536 int op;
2537 REQ(n, shift_expr);
2538 com_arith_expr(c, CHILD(n, 0));
2539 for (i = 2; i < NCH(n); i += 2) {
2540 com_arith_expr(c, CHILD(n, i));
2541 switch (TYPE(CHILD(n, i-1))) {
2542 case LEFTSHIFT:
2543 op = BINARY_LSHIFT;
2544 break;
2545 case RIGHTSHIFT:
2546 op = BINARY_RSHIFT;
2547 break;
2548 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002549 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002550 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002551 op = 255;
2552 }
2553 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002554 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002555 }
2556}
2557
2558static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002559com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002560{
2561 int i;
2562 int op;
2563 REQ(n, and_expr);
2564 com_shift_expr(c, CHILD(n, 0));
2565 for (i = 2; i < NCH(n); i += 2) {
2566 com_shift_expr(c, CHILD(n, i));
2567 if (TYPE(CHILD(n, i-1)) == AMPER) {
2568 op = BINARY_AND;
2569 }
2570 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002571 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002572 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002573 op = 255;
2574 }
2575 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002576 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002577 }
2578}
2579
2580static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002581com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002582{
2583 int i;
2584 int op;
2585 REQ(n, xor_expr);
2586 com_and_expr(c, CHILD(n, 0));
2587 for (i = 2; i < NCH(n); i += 2) {
2588 com_and_expr(c, CHILD(n, i));
2589 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2590 op = BINARY_XOR;
2591 }
2592 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002593 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002594 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002595 op = 255;
2596 }
2597 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002598 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002599 }
2600}
2601
2602static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002603com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002604{
2605 int i;
2606 int op;
2607 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002608 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002609 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002610 com_xor_expr(c, CHILD(n, i));
2611 if (TYPE(CHILD(n, i-1)) == VBAR) {
2612 op = BINARY_OR;
2613 }
2614 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002615 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002616 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002617 op = 255;
2618 }
2619 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002620 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002621 }
2622}
2623
2624static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002625cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002626{
2627 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00002628 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002629 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2630 if (NCH(n) == 1) {
2631 n = CHILD(n, 0);
2632 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002633 case LESS: return PyCmp_LT;
2634 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00002635 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00002636 case LESSEQUAL: return PyCmp_LE;
2637 case GREATEREQUAL: return PyCmp_GE;
2638 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2639 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2640 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002641 }
2642 }
2643 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002644 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002645 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002646 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002647 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002648 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002649 }
2650 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002651 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002652}
2653
2654static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002655com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002656{
2657 int i;
2658 enum cmp_op op;
2659 int anchor;
2660 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2661 com_expr(c, CHILD(n, 0));
2662 if (NCH(n) == 1)
2663 return;
2664
2665 /****************************************************************
2666 The following code is generated for all but the last
2667 comparison in a chain:
2668
2669 label: on stack: opcode: jump to:
2670
2671 a <code to load b>
2672 a, b DUP_TOP
2673 a, b, b ROT_THREE
2674 b, a, b COMPARE_OP
2675 b, 0-or-1 JUMP_IF_FALSE L1
2676 b, 1 POP_TOP
2677 b
2678
2679 We are now ready to repeat this sequence for the next
2680 comparison in the chain.
2681
2682 For the last we generate:
2683
2684 b <code to load c>
2685 b, c COMPARE_OP
2686 0-or-1
2687
2688 If there were any jumps to L1 (i.e., there was more than one
2689 comparison), we generate:
2690
2691 0-or-1 JUMP_FORWARD L2
2692 L1: b, 0 ROT_TWO
2693 0, b POP_TOP
2694 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002695 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002696 ****************************************************************/
2697
2698 anchor = 0;
2699
2700 for (i = 2; i < NCH(n); i += 2) {
2701 com_expr(c, CHILD(n, i));
2702 if (i+2 < NCH(n)) {
2703 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002704 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002705 com_addbyte(c, ROT_THREE);
2706 }
2707 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002708 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002709 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002710 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002711 }
2712 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002713 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002714 if (i+2 < NCH(n)) {
2715 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2716 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002717 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002718 }
2719 }
2720
2721 if (anchor) {
2722 int anchor2 = 0;
2723 com_addfwref(c, JUMP_FORWARD, &anchor2);
2724 com_backpatch(c, anchor);
2725 com_addbyte(c, ROT_TWO);
2726 com_addbyte(c, POP_TOP);
2727 com_backpatch(c, anchor2);
2728 }
2729}
2730
2731static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002732com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002733{
2734 REQ(n, not_test); /* 'not' not_test | comparison */
2735 if (NCH(n) == 1) {
2736 com_comparison(c, CHILD(n, 0));
2737 }
2738 else {
2739 com_not_test(c, CHILD(n, 1));
2740 com_addbyte(c, UNARY_NOT);
2741 }
2742}
2743
2744static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002745com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002746{
2747 int i;
2748 int anchor;
2749 REQ(n, and_test); /* not_test ('and' not_test)* */
2750 anchor = 0;
2751 i = 0;
2752 for (;;) {
2753 com_not_test(c, CHILD(n, i));
2754 if ((i += 2) >= NCH(n))
2755 break;
2756 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2757 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002758 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002759 }
2760 if (anchor)
2761 com_backpatch(c, anchor);
2762}
2763
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002764static int
2765com_make_closure(struct compiling *c, PyCodeObject *co)
2766{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002767 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002768 if (free == 0)
2769 return 0;
2770 for (i = 0; i < free; ++i) {
2771 /* Bypass com_addop_varname because it will generate
2772 LOAD_DEREF but LOAD_CLOSURE is needed.
2773 */
2774 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2775 int arg, reftype;
2776
2777 /* Special case: If a class contains a method with a
2778 free variable that has the same name as a method,
2779 the name will be considered free *and* local in the
2780 class. It should be handled by the closure, as
2781 well as by the normal name loookup logic.
2782 */
2783 reftype = get_ref_type(c, PyString_AS_STRING(name));
2784 if (reftype == CELL)
2785 arg = com_lookup_arg(c->c_cellvars, name);
2786 else /* (reftype == FREE) */
2787 arg = com_lookup_arg(c->c_freevars, name);
2788 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002789 fprintf(stderr, "lookup %s in %s %d %d\n"
2790 "freevars of %s: %s\n",
2791 PyObject_REPR(name),
2792 c->c_name,
2793 reftype, arg,
2794 PyString_AS_STRING(co->co_name),
2795 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002796 Py_FatalError("com_make_closure()");
2797 }
2798 com_addoparg(c, LOAD_CLOSURE, arg);
2799
2800 }
2801 com_push(c, free);
2802 return 1;
2803}
2804
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002805static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002806com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002807{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002808 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002809 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002810 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002811 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002812 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002813 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2814 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002815 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002816 if (co == NULL) {
2817 c->c_errors++;
2818 return;
2819 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002820 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002821 i = com_addconst(c, (PyObject *)co);
2822 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002823 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002824 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002825 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002826 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002827 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002828 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002829 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002830 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002831 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002832 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002833 else {
2834 int anchor = 0;
2835 int i = 0;
2836 for (;;) {
2837 com_and_test(c, CHILD(n, i));
2838 if ((i += 2) >= NCH(n))
2839 break;
2840 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2841 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002842 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002843 }
2844 if (anchor)
2845 com_backpatch(c, anchor);
2846 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002847}
2848
2849static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002850com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002851{
2852 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002853 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002854 com_node(c, CHILD(n, 0));
2855 }
2856 else {
2857 int i;
2858 int len;
2859 len = (NCH(n) + 1) / 2;
2860 for (i = 0; i < NCH(n); i += 2)
2861 com_node(c, CHILD(n, i));
2862 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002863 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002864 }
2865}
2866
2867
2868/* Begin of assignment compilation */
2869
Thomas Wouters434d0822000-08-24 20:11:32 +00002870
2871static void
2872com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2873{
2874 com_addbyte(c, DUP_TOP);
2875 com_push(c, 1);
2876 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002877 com_node(c, augn);
2878 com_addbyte(c, opcode);
2879 com_pop(c, 1);
2880 com_addbyte(c, ROT_TWO);
2881 com_addopname(c, STORE_ATTR, n);
2882 com_pop(c, 2);
2883}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002884
2885static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002886com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002887{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00002888 if (none_assignment_check(c, STR(n), assigning))
2889 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002890 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002891 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002892}
2893
2894static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002895com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002896{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002897 REQ(n, trailer);
2898 switch (TYPE(CHILD(n, 0))) {
2899 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002900 if (assigning == OP_DELETE)
2901 com_error(c, PyExc_SyntaxError,
2902 "can't delete function call");
2903 else
2904 com_error(c, PyExc_SyntaxError,
2905 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002906 break;
2907 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002908 if (assigning > OP_APPLY)
2909 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2910 else
2911 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002912 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002913 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002914 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002915 break;
2916 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002917 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002918 }
2919}
2920
2921static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002922com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002923{
2924 int i;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002925 if (TYPE(n) != testlist && TYPE(n) != testlist_gexp &&
2926 TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002927 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002928 if (assigning) {
2929 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002930 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002931 com_push(c, i-1);
2932 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002933 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002934 com_assign(c, CHILD(n, i), assigning, NULL);
2935}
2936
2937static void
2938com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2939{
2940 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002941 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002942 com_push(c, 1);
2943 com_node(c, augn);
2944 com_addbyte(c, opcode);
2945 com_pop(c, 1);
2946 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002947}
2948
2949static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002950com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002951{
2952 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002953 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002954 if (assigning)
2955 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002956}
2957
2958static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002959com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002960{
2961 /* Loop to avoid trivial recursion */
2962 for (;;) {
2963 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002964
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002965 case exprlist:
2966 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002967 case testlist1:
Raymond Hettinger354433a2004-05-19 08:20:33 +00002968 case testlist_gexp:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002969 if (NCH(n) > 1) {
Raymond Hettinger354433a2004-05-19 08:20:33 +00002970 if (TYPE(CHILD(n, 1)) == gen_for) {
2971 com_error(c, PyExc_SystemError,
2972 "assign to generator expression not possible");
2973 return;
2974 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002975 if (assigning > OP_APPLY) {
2976 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002977 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002978 return;
2979 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002980 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002981 return;
2982 }
2983 n = CHILD(n, 0);
2984 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002985
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002986 case test:
2987 case and_test:
2988 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002989 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002990 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002991 case xor_expr:
2992 case and_expr:
2993 case shift_expr:
2994 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002995 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002996 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002997 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002998 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002999 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003000 return;
3001 }
3002 n = CHILD(n, 0);
3003 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003004
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003005 case power: /* atom trailer* ('**' power)*
3006 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00003007 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003008 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003009 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003010 return;
3011 }
Guido van Rossum50564e81996-01-12 01:13:16 +00003012 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003013 int i;
3014 com_node(c, CHILD(n, 0));
3015 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003016 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003017 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003018 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00003019 return;
3020 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003021 com_apply_trailer(c, CHILD(n, i));
3022 } /* NB i is still alive */
3023 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00003024 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003025 return;
3026 }
3027 n = CHILD(n, 0);
3028 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003029
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003030 case atom:
3031 switch (TYPE(CHILD(n, 0))) {
3032 case LPAR:
3033 n = CHILD(n, 1);
3034 if (TYPE(n) == RPAR) {
3035 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003036 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003037 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003038 return;
3039 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003040 if (assigning > OP_APPLY) {
3041 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003042 "augmented assign to tuple literal not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003043 return;
3044 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003045 break;
3046 case LSQB:
3047 n = CHILD(n, 1);
3048 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003049 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003050 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003051 return;
3052 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003053 if (assigning > OP_APPLY) {
3054 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003055 "augmented assign to list literal not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003056 return;
3057 }
3058 if (NCH(n) > 1
3059 && TYPE(CHILD(n, 1)) == list_for) {
3060 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003061 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00003062 return;
3063 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003064 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003065 return;
3066 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00003067 if (assigning > OP_APPLY)
3068 com_augassign_name(c, CHILD(n, 0),
3069 assigning, augn);
3070 else
3071 com_assign_name(c, CHILD(n, 0),
3072 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003073 return;
3074 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003075 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003076 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003077 return;
3078 }
3079 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003080
3081 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003082 com_error(c, PyExc_SyntaxError,
3083 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003084 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003085
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003086 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003087 com_error(c, PyExc_SystemError,
3088 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003089 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003090
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003091 }
3092 }
3093}
Guido van Rossum7c531111997-03-11 18:42:21 +00003094
Thomas Wouters434d0822000-08-24 20:11:32 +00003095static void
3096com_augassign(struct compiling *c, node *n)
3097{
3098 int opcode;
3099
3100 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
3101 case '+': opcode = INPLACE_ADD; break;
3102 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00003103 case '/':
3104 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
3105 opcode = INPLACE_FLOOR_DIVIDE;
3106 else if (c->c_flags & CO_FUTURE_DIVISION)
3107 opcode = INPLACE_TRUE_DIVIDE;
3108 else
3109 opcode = INPLACE_DIVIDE;
3110 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00003111 case '%': opcode = INPLACE_MODULO; break;
3112 case '<': opcode = INPLACE_LSHIFT; break;
3113 case '>': opcode = INPLACE_RSHIFT; break;
3114 case '&': opcode = INPLACE_AND; break;
3115 case '^': opcode = INPLACE_XOR; break;
3116 case '|': opcode = INPLACE_OR; break;
3117 case '*':
3118 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
3119 opcode = INPLACE_POWER;
3120 else
3121 opcode = INPLACE_MULTIPLY;
3122 break;
3123 default:
3124 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
3125 return;
3126 }
3127 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
3128}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003129
3130static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003131com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003132{
Thomas Wouters434d0822000-08-24 20:11:32 +00003133 REQ(n, expr_stmt);
3134 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003135 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00003136 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003137 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00003138 if (NCH(n) == 1) {
3139 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003140 if (c->c_interactive)
3141 com_addbyte(c, PRINT_EXPR);
3142 else
3143 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003144 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003145 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003146 else if (TYPE(CHILD(n,1)) == augassign)
3147 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003148 else {
3149 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00003150 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003151 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003152 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003153 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003154 com_push(c, 1);
3155 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003156 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003157 }
3158 }
3159}
3160
3161static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003162com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00003163{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003164 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003165 int i;
3166 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003167 if (Py_OptimizeFlag)
3168 return;
3169 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00003170
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003171 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00003172 raise AssertionError [, <message>]
3173
3174 where <message> is the second test, if present.
3175 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003176 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003177 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003178 com_addbyte(c, POP_TOP);
3179 com_pop(c, 1);
3180 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003181 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00003182 com_push(c, 1);
3183 i = NCH(n)/2; /* Either 2 or 4 */
3184 if (i > 1)
3185 com_node(c, CHILD(n, 3));
3186 com_addoparg(c, RAISE_VARARGS, i);
3187 com_pop(c, i);
3188 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003189 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003190 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003191 com_addbyte(c, POP_TOP);
3192}
3193
3194static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003195com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003196{
Barry Warsaw29c574e2000-08-21 15:38:56 +00003197 int i = 1;
3198 node* stream = NULL;
3199
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003200 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003201
3202 /* are we using the extended print form? */
3203 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
3204 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00003205 com_node(c, stream);
3206 /* stack: [...] => [... stream] */
3207 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003208 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3209 i = 4;
3210 else
3211 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003212 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003213 for (; i < NCH(n); i += 2) {
3214 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003215 com_addbyte(c, DUP_TOP);
3216 /* stack: [stream] => [stream stream] */
3217 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003218 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003219 /* stack: [stream stream] => [stream stream obj] */
3220 com_addbyte(c, ROT_TWO);
3221 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003222 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003223 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003224 com_pop(c, 2);
3225 }
3226 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003227 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003228 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003229 com_addbyte(c, PRINT_ITEM);
3230 com_pop(c, 1);
3231 }
3232 }
3233 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003234 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003235 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003236 /* must pop the extra stream object off the stack */
3237 com_addbyte(c, POP_TOP);
3238 /* stack: [... stream] => [...] */
3239 com_pop(c, 1);
3240 }
3241 }
3242 else {
3243 if (stream != NULL) {
3244 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003245 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003246 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003247 com_pop(c, 1);
3248 }
3249 else
3250 com_addbyte(c, PRINT_NEWLINE);
3251 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003252}
3253
3254static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003255com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003256{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003257 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003258 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003259 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003260 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003261 if (c->c_flags & CO_GENERATOR) {
3262 if (NCH(n) > 1) {
3263 com_error(c, PyExc_SyntaxError,
3264 "'return' with argument inside generator");
3265 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003266 }
3267 if (NCH(n) < 2) {
3268 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003269 com_push(c, 1);
3270 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003271 else
3272 com_node(c, CHILD(n, 1));
3273 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003274 com_pop(c, 1);
3275}
3276
3277static void
3278com_yield_stmt(struct compiling *c, node *n)
3279{
Tim Peters95c80f82001-06-23 02:07:08 +00003280 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003281 REQ(n, yield_stmt); /* 'yield' testlist */
3282 if (!c->c_infunction) {
3283 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3284 }
Tim Peters95c80f82001-06-23 02:07:08 +00003285
3286 for (i = 0; i < c->c_nblocks; ++i) {
3287 if (c->c_block[i] == SETUP_FINALLY) {
3288 com_error(c, PyExc_SyntaxError,
3289 "'yield' not allowed in a 'try' block "
3290 "with a 'finally' clause");
3291 return;
3292 }
3293 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003294 com_node(c, CHILD(n, 1));
3295 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003296 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003297}
3298
3299static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003300com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003301{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003302 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003303 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3304 if (NCH(n) > 1) {
3305 com_node(c, CHILD(n, 1));
3306 if (NCH(n) > 3) {
3307 com_node(c, CHILD(n, 3));
3308 if (NCH(n) > 5)
3309 com_node(c, CHILD(n, 5));
3310 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003311 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003312 i = NCH(n)/2;
3313 com_addoparg(c, RAISE_VARARGS, i);
3314 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003315}
3316
3317static void
Thomas Wouters52152252000-08-17 22:55:00 +00003318com_from_import(struct compiling *c, node *n)
3319{
3320 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3321 com_push(c, 1);
3322 if (NCH(n) > 1) {
3323 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3324 com_error(c, PyExc_SyntaxError, "invalid syntax");
3325 return;
3326 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003327 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003328 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003329 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003330 com_pop(c, 1);
3331}
3332
3333static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003334com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003335{
3336 int i;
3337 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003338 /* 'import' dotted_name (',' dotted_name)* |
3339 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003340 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00003341 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003342 /* 'from' dotted_name 'import' ... */
3343 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003344
3345 if (TYPE(CHILD(n, 3)) == STAR) {
3346 tup = Py_BuildValue("(s)", "*");
3347 } else {
3348 tup = PyTuple_New((NCH(n) - 2)/2);
3349 for (i = 3; i < NCH(n); i += 2) {
3350 PyTuple_SET_ITEM(tup, (i-3)/2,
Guido van Rossum633d90c2002-12-23 16:51:42 +00003351 PyString_FromString(STR(
3352 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003353 }
3354 }
3355 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003356 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003357 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003358 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00003359 if (TYPE(CHILD(n, 3)) == STAR)
3360 com_addbyte(c, IMPORT_STAR);
3361 else {
3362 for (i = 3; i < NCH(n); i += 2)
3363 com_from_import(c, CHILD(n, i));
3364 com_addbyte(c, POP_TOP);
3365 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003366 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003367 }
3368 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003369 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003370 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003371 node *subn = CHILD(n, i);
3372 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003373 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003374 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003375 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003376 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003377 int j;
3378 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003379 com_error(c, PyExc_SyntaxError,
3380 "invalid syntax");
3381 return;
3382 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003383 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3384 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003385 CHILD(CHILD(subn, 0),
3386 j));
3387 com_addop_varname(c, VAR_STORE,
3388 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003389 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003390 com_addop_varname(c, VAR_STORE,
3391 STR(CHILD(CHILD(subn, 0),
3392 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003393 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003394 }
3395 }
3396}
3397
3398static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003399com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003400{
3401 REQ(n, exec_stmt);
3402 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3403 com_node(c, CHILD(n, 1));
3404 if (NCH(n) >= 4)
3405 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003406 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003407 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003408 com_push(c, 1);
3409 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003410 if (NCH(n) >= 6)
3411 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003412 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003413 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003414 com_push(c, 1);
3415 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003416 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003417 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003418}
3419
Guido van Rossum7c531111997-03-11 18:42:21 +00003420static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003421is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003422{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003423 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003424 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003425 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003426
3427 /* Label to avoid tail recursion */
3428 next:
3429 switch (TYPE(n)) {
3430
3431 case suite:
3432 if (NCH(n) == 1) {
3433 n = CHILD(n, 0);
3434 goto next;
3435 }
3436 /* Fall through */
3437 case file_input:
3438 for (i = 0; i < NCH(n); i++) {
3439 node *ch = CHILD(n, i);
3440 if (TYPE(ch) == stmt) {
3441 n = ch;
3442 goto next;
3443 }
3444 }
3445 break;
3446
3447 case stmt:
3448 case simple_stmt:
3449 case small_stmt:
3450 n = CHILD(n, 0);
3451 goto next;
3452
3453 case expr_stmt:
3454 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003455 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003456 case test:
3457 case and_test:
3458 case not_test:
3459 case comparison:
3460 case expr:
3461 case xor_expr:
3462 case and_expr:
3463 case shift_expr:
3464 case arith_expr:
3465 case term:
3466 case factor:
3467 case power:
3468 case atom:
3469 if (NCH(n) == 1) {
3470 n = CHILD(n, 0);
3471 goto next;
3472 }
3473 break;
3474
3475 case NAME:
3476 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3477 return 1;
3478 break;
3479
3480 case NUMBER:
3481 v = parsenumber(c, STR(n));
3482 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003483 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003484 break;
3485 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003486 i = PyObject_IsTrue(v);
3487 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003488 return i == 0;
3489
3490 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003491 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003492 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003493 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003494 break;
3495 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003496 i = PyObject_IsTrue(v);
3497 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003498 return i == 0;
3499
3500 }
3501 return 0;
3502}
3503
Tim Peters08a898f2001-06-28 01:52:22 +00003504
3505/* Look under n for a return stmt with an expression.
3506 * This hack is used to find illegal returns under "if 0:" blocks in
3507 * functions already known to be generators (as determined by the symtable
3508 * pass).
3509 * Return the offending return node if found, else NULL.
3510 */
3511static node *
3512look_for_offending_return(node *n)
3513{
3514 int i;
3515
3516 for (i = 0; i < NCH(n); ++i) {
3517 node *kid = CHILD(n, i);
3518
3519 switch (TYPE(kid)) {
3520 case classdef:
3521 case funcdef:
3522 case lambdef:
3523 /* Stuff in nested functions & classes doesn't
3524 affect the code block we started in. */
3525 return NULL;
3526
3527 case return_stmt:
3528 if (NCH(kid) > 1)
3529 return kid;
3530 break;
3531
3532 default: {
3533 node *bad = look_for_offending_return(kid);
3534 if (bad != NULL)
3535 return bad;
3536 }
3537 }
3538 }
3539
3540 return NULL;
3541}
3542
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003543static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003544com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003545{
3546 int i;
3547 int anchor = 0;
3548 REQ(n, if_stmt);
3549 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3550 for (i = 0; i+3 < NCH(n); i+=4) {
3551 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003552 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003553 if (is_constant_false(c, ch)) {
3554 /* We're going to skip this block. However, if this
3555 is a generator, we have to check the dead code
3556 anyway to make sure there aren't any return stmts
3557 with expressions, in the same scope. */
3558 if (c->c_flags & CO_GENERATOR) {
3559 node *p = look_for_offending_return(n);
3560 if (p != NULL) {
3561 int savelineno = c->c_lineno;
3562 c->c_lineno = p->n_lineno;
3563 com_error(c, PyExc_SyntaxError,
3564 "'return' with argument "
3565 "inside generator");
3566 c->c_lineno = savelineno;
3567 }
3568 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003569 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003570 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003571 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003572 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003573 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003574 com_addfwref(c, JUMP_IF_FALSE, &a);
3575 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003576 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003577 com_node(c, CHILD(n, i+3));
3578 com_addfwref(c, JUMP_FORWARD, &anchor);
3579 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003580 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003581 com_addbyte(c, POP_TOP);
3582 }
3583 if (i+2 < NCH(n))
3584 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003585 if (anchor)
3586 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003587}
3588
3589static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003590com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003591{
3592 int break_anchor = 0;
3593 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003594 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003595 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3596 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003597 block_push(c, SETUP_LOOP);
3598 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003599 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003600 com_node(c, CHILD(n, 1));
3601 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3602 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003603 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003604 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003605 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003606 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003607 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3608 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003609 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003610 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003611 com_addbyte(c, POP_TOP);
3612 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003613 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003614 if (NCH(n) > 4)
3615 com_node(c, CHILD(n, 6));
3616 com_backpatch(c, break_anchor);
3617}
3618
3619static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003620com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003621{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003622 int break_anchor = 0;
3623 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003624 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003625 REQ(n, for_stmt);
3626 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3627 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003628 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003629 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003630 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003631 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00003632 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003633 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003634 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003635 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003636 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003637 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003638 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003639 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3640 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003641 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003642 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003643 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003644 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003645 if (NCH(n) > 8)
3646 com_node(c, CHILD(n, 8));
3647 com_backpatch(c, break_anchor);
3648}
3649
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003650/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003651
3652 SETUP_FINALLY L
3653 <code for S>
3654 POP_BLOCK
3655 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003656 L: <code for Sf>
3657 END_FINALLY
3658
3659 The special instructions use the block stack. Each block
3660 stack entry contains the instruction that created it (here
3661 SETUP_FINALLY), the level of the value stack at the time the
3662 block stack entry was created, and a label (here L).
3663
3664 SETUP_FINALLY:
3665 Pushes the current value stack level and the label
3666 onto the block stack.
3667 POP_BLOCK:
3668 Pops en entry from the block stack, and pops the value
3669 stack until its level is the same as indicated on the
3670 block stack. (The label is ignored.)
3671 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003672 Pops a variable number of entries from the *value* stack
3673 and re-raises the exception they specify. The number of
3674 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003675
3676 The block stack is unwound when an exception is raised:
3677 when a SETUP_FINALLY entry is found, the exception is pushed
3678 onto the value stack (and the exception condition is cleared),
3679 and the interpreter jumps to the label gotten from the block
3680 stack.
3681
3682 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003683 (The contents of the value stack is shown in [], with the top
3684 at the right; 'tb' is trace-back info, 'val' the exception's
3685 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003686
3687 Value stack Label Instruction Argument
3688 [] SETUP_EXCEPT L1
3689 [] <code for S>
3690 [] POP_BLOCK
3691 [] JUMP_FORWARD L0
3692
Guido van Rossum3f5da241990-12-20 15:06:42 +00003693 [tb, val, exc] L1: DUP )
3694 [tb, val, exc, exc] <evaluate E1> )
3695 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3696 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3697 [tb, val, exc, 1] POP )
3698 [tb, val, exc] POP
3699 [tb, val] <assign to V1> (or POP if no V1)
3700 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003701 [] <code for S1>
3702 JUMP_FORWARD L0
3703
Guido van Rossum3f5da241990-12-20 15:06:42 +00003704 [tb, val, exc, 0] L2: POP
3705 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003706 .............................etc.......................
3707
Guido van Rossum3f5da241990-12-20 15:06:42 +00003708 [tb, val, exc, 0] Ln+1: POP
3709 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003710
3711 [] L0: <next statement>
3712
3713 Of course, parts are not generated if Vi or Ei is not present.
3714*/
3715
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003716static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003717com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003718{
3719 int except_anchor = 0;
3720 int end_anchor = 0;
3721 int else_anchor = 0;
3722 int i;
3723 node *ch;
3724
3725 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3726 block_push(c, SETUP_EXCEPT);
3727 com_node(c, CHILD(n, 2));
3728 com_addbyte(c, POP_BLOCK);
3729 block_pop(c, SETUP_EXCEPT);
3730 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3731 com_backpatch(c, except_anchor);
3732 for (i = 3;
3733 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3734 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003735 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003736 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003737 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003738 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003739 break;
3740 }
3741 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003742 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003743 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003744 if (NCH(ch) > 1) {
3745 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003746 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003747 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003748 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003749 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003750 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3751 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003752 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003753 }
3754 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003755 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003756 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003757 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003758 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003759 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003760 com_pop(c, 1);
3761 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003762 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003763 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003764 com_node(c, CHILD(n, i+2));
3765 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3766 if (except_anchor) {
3767 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003768 /* We come in with [tb, val, exc, 0] on the
3769 stack; one pop and it's the same as
3770 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003771 com_addbyte(c, POP_TOP);
3772 }
3773 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003774 /* We actually come in here with [tb, val, exc] but the
3775 END_FINALLY will zap those and jump around.
3776 The c_stacklevel does not reflect them so we need not pop
3777 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003778 com_addbyte(c, END_FINALLY);
3779 com_backpatch(c, else_anchor);
3780 if (i < NCH(n))
3781 com_node(c, CHILD(n, i+2));
3782 com_backpatch(c, end_anchor);
3783}
3784
3785static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003786com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003787{
3788 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003789 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003790
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003791 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3792 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003793 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003794 com_addbyte(c, POP_BLOCK);
3795 block_pop(c, SETUP_FINALLY);
3796 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003797 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003798 /* While the generated code pushes only one item,
3799 the try-finally handling can enter here with
3800 up to three items. OK, here are the details:
3801 3 for an exception, 2 for RETURN, 1 for BREAK. */
3802 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003803 com_backpatch(c, finally_anchor);
3804 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003805 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003806 com_node(c, ch);
3807 com_addbyte(c, END_FINALLY);
3808 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003809 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003810}
3811
3812static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003813com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003814{
3815 REQ(n, try_stmt);
3816 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3817 | 'try' ':' suite 'finally' ':' suite */
3818 if (TYPE(CHILD(n, 3)) != except_clause)
3819 com_try_finally(c, n);
3820 else
3821 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003822}
3823
Guido van Rossum8b993a91997-01-17 21:04:03 +00003824static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003825get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003826{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003827 int i;
3828
Guido van Rossum8b993a91997-01-17 21:04:03 +00003829 /* Label to avoid tail recursion */
3830 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003831 switch (TYPE(n)) {
3832
3833 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003834 if (NCH(n) == 1) {
3835 n = CHILD(n, 0);
3836 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003837 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003838 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003839 case file_input:
3840 for (i = 0; i < NCH(n); i++) {
3841 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003842 if (TYPE(ch) == stmt) {
3843 n = ch;
3844 goto next;
3845 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003846 }
3847 break;
3848
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003849 case stmt:
3850 case simple_stmt:
3851 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003852 n = CHILD(n, 0);
3853 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003854
3855 case expr_stmt:
3856 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003857 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003858 case test:
3859 case and_test:
3860 case not_test:
3861 case comparison:
3862 case expr:
3863 case xor_expr:
3864 case and_expr:
3865 case shift_expr:
3866 case arith_expr:
3867 case term:
3868 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003869 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003870 if (NCH(n) == 1) {
3871 n = CHILD(n, 0);
3872 goto next;
3873 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003874 break;
3875
3876 case atom:
3877 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003878 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003879 break;
3880
3881 }
3882 return NULL;
3883}
3884
Guido van Rossum79f25d91997-04-29 20:08:16 +00003885static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003886get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003887{
Guido van Rossum541563e1999-01-28 15:08:09 +00003888 /* Don't generate doc-strings if run with -OO */
3889 if (Py_OptimizeFlag > 1)
3890 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003891 n = get_rawdocstring(n);
3892 if (n == NULL)
3893 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003894 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003895}
3896
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003897static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003898com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003899{
3900 REQ(n, suite);
3901 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3902 if (NCH(n) == 1) {
3903 com_node(c, CHILD(n, 0));
3904 }
3905 else {
3906 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003907 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003908 node *ch = CHILD(n, i);
3909 if (TYPE(ch) == stmt)
3910 com_node(c, ch);
3911 }
3912 }
3913}
3914
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003915/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003916static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003917com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003918{
3919 int i = c->c_nblocks;
3920 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3921 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3922 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003923 else if (i <= 0) {
3924 /* at the outer level */
3925 com_error(c, PyExc_SyntaxError,
3926 "'continue' not properly in loop");
3927 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003928 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003929 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003930 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003931 if (c->c_block[j] == SETUP_LOOP)
3932 break;
3933 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003934 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003935 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003936 for (; i > j; --i) {
3937 if (c->c_block[i] == SETUP_EXCEPT ||
3938 c->c_block[i] == SETUP_FINALLY) {
3939 com_addoparg(c, CONTINUE_LOOP,
3940 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003941 return;
3942 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003943 if (c->c_block[i] == END_FINALLY) {
3944 com_error(c, PyExc_SyntaxError,
3945 "'continue' not supported inside 'finally' clause");
3946 return;
3947 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003948 }
3949 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003950 com_error(c, PyExc_SyntaxError,
3951 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003952 }
3953 /* XXX Could allow it inside a 'finally' clause
3954 XXX if we could pop the exception still on the stack */
3955}
3956
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003957/* Return the number of default values in the argument list.
3958
3959 If a non-default argument follows a default argument, set an
3960 exception and return -1.
3961*/
3962
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003963static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003964com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003965{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003966 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003967 if (TYPE(n) == lambdef) {
3968 /* lambdef: 'lambda' [varargslist] ':' test */
3969 n = CHILD(n, 1);
3970 }
3971 else {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003972 REQ(n, funcdef);
3973 /* funcdef: [decorators] 'def' NAME parameters ':' suite */
3974 n = RCHILD(n, -3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003975 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3976 n = CHILD(n, 1);
3977 }
3978 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003979 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003980 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003981 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003982 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3983 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003984 ndefs = 0;
3985 for (i = 0; i < nch; i++) {
3986 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003987 if (TYPE(CHILD(n, i)) == STAR ||
3988 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003989 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003990 i++;
3991 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003992 t = RPAR; /* Anything except EQUAL or COMMA */
3993 else
3994 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003995 if (t == EQUAL) {
3996 i++;
3997 ndefs++;
3998 com_node(c, CHILD(n, i));
3999 i++;
4000 if (i >= nch)
4001 break;
4002 t = TYPE(CHILD(n, i));
4003 }
4004 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004005 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004006 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004007 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00004008 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004009 return -1;
4010 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004011 }
4012 if (t != COMMA)
4013 break;
4014 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004015 return ndefs;
4016}
4017
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004018static void
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004019com_decorator_name(struct compiling *c, node *n)
4020{
4021 /* dotted_name: NAME ('.' NAME)* */
4022
4023 int i, nch;
4024 node *varname;
4025
4026 REQ(n, dotted_name);
4027 nch = NCH(n);
4028 assert(nch >= 1 && nch % 2 == 1);
4029
4030 varname = CHILD(n, 0);
4031 REQ(varname, NAME);
4032 com_addop_varname(c, VAR_LOAD, STR(varname));
Anthony Baxter4e7785a2004-08-02 11:08:15 +00004033 com_push(c, 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004034
4035 for (i = 1; i < nch; i += 2) {
4036 node *attrname;
4037
4038 REQ(CHILD(n, i), DOT);
4039
4040 attrname = CHILD(n, i + 1);
4041 REQ(attrname, NAME);
4042 com_addop_name(c, LOAD_ATTR, STR(attrname));
4043 }
4044}
4045
4046static void
4047com_decorator(struct compiling *c, node *n)
4048{
4049 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
4050 int nch = NCH(n);
4051 assert(nch >= 2);
4052 REQ(CHILD(n, 0), AT);
4053 com_decorator_name(c, CHILD(n, 1));
4054
4055 if (nch > 2) {
4056 assert(nch == 4 || nch == 5);
4057 REQ(CHILD(n, 2), LPAR);
4058 REQ(CHILD(n, nch - 1), RPAR);
4059 com_call_function(c, CHILD(n, 3));
4060 }
4061}
4062
4063static int
4064com_decorators(struct compiling *c, node *n)
4065{
4066 int i, nch, ndecorators;
4067
4068 /* decorator ([NEWLINE] decorator)* NEWLINE */
4069 nch = NCH(n);
4070 assert(nch >= 2);
4071 REQ(CHILD(n, nch - 1), NEWLINE);
4072
4073 ndecorators = 0;
4074 for (i = NCH(n) - 1; i >= 0; --i) {
4075 node *ch = CHILD(n, i);
4076 if (TYPE(ch) != NEWLINE) {
4077 com_decorator(c, ch);
4078 ++ndecorators;
4079 }
4080 }
4081
4082 return ndecorators;
4083}
4084
4085static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004086com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004087{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004088 PyObject *co;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004089 int ndefs, ndecorators;
4090 REQ(n, funcdef);
4091 /* -6 -5 -4 -3 -2 -1
4092 funcdef: [decorators] 'def' NAME parameters ':' suite */
4093
4094 if (NCH(n) == 6)
4095 ndecorators = com_decorators(c, CHILD(n, 0));
4096 else
4097 ndecorators = 0;
4098
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004099 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004100 if (ndefs < 0)
4101 return;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004102 symtable_enter_scope(c->c_symtable, STR(RCHILD(n, -4)), TYPE(n),
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004103 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004104 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004105 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004106 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004107 c->c_errors++;
4108 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004109 int closure = com_make_closure(c, (PyCodeObject *)co);
4110 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004111 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004112 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004113 if (closure)
4114 com_addoparg(c, MAKE_CLOSURE, ndefs);
4115 else
4116 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004117 com_pop(c, ndefs);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004118 while (ndecorators > 0) {
4119 com_addoparg(c, CALL_FUNCTION, 1);
4120 com_pop(c, 1);
4121 ndecorators--;
4122 }
4123 com_addop_varname(c, VAR_STORE, STR(RCHILD(n, -4)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004124 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004125 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004126 }
4127}
4128
4129static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004130com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004131{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004132 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004133 REQ(n, testlist);
4134 /* testlist: test (',' test)* [','] */
4135 for (i = 0; i < NCH(n); i += 2)
4136 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004137 i = (NCH(n)+1) / 2;
4138 com_addoparg(c, BUILD_TUPLE, i);
4139 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004140}
4141
4142static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004143com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004144{
Guido van Rossum25831651993-05-19 14:50:45 +00004145 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004146 PyObject *v;
4147 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004148 char *name;
4149
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004150 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004151 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004152 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004153 c->c_errors++;
4154 return;
4155 }
4156 /* Push the class name on the stack */
4157 i = com_addconst(c, v);
4158 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004159 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004160 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004161 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004162 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004163 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004164 com_push(c, 1);
4165 }
Guido van Rossum25831651993-05-19 14:50:45 +00004166 else
4167 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004168 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004169 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004170 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004171 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004172 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004173 c->c_errors++;
4174 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004175 int closure = com_make_closure(c, co);
4176 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004177 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004178 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004179 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004180 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004181 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004182 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004183 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004184 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004185 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004186 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004187 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004188 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004189 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004190 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004191}
4192
4193static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004194com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004195{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004196 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004197 if (c->c_errors)
4198 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004199 switch (TYPE(n)) {
4200
4201 /* Definition nodes */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004202
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004203 case funcdef:
4204 com_funcdef(c, n);
4205 break;
4206 case classdef:
4207 com_classdef(c, n);
4208 break;
4209
4210 /* Trivial parse tree nodes */
4211
4212 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004213 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004214 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004215 n = CHILD(n, 0);
4216 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004217
4218 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004219 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004220 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004221 {
4222 int i;
4223 for (i = 0; i < NCH(n)-1; i += 2)
4224 com_node(c, CHILD(n, i));
4225 }
4226 break;
4227
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004228 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004229 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004230 n = CHILD(n, 0);
4231 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004232
4233 /* Statement nodes */
4234
4235 case expr_stmt:
4236 com_expr_stmt(c, n);
4237 break;
4238 case print_stmt:
4239 com_print_stmt(c, n);
4240 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004241 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004242 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004243 break;
4244 case pass_stmt:
4245 break;
4246 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004247 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004248 com_error(c, PyExc_SyntaxError,
4249 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004250 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004251 com_addbyte(c, BREAK_LOOP);
4252 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004253 case continue_stmt:
4254 com_continue_stmt(c, n);
4255 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004256 case return_stmt:
4257 com_return_stmt(c, n);
4258 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004259 case yield_stmt:
4260 com_yield_stmt(c, n);
4261 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004262 case raise_stmt:
4263 com_raise_stmt(c, n);
4264 break;
4265 case import_stmt:
4266 com_import_stmt(c, n);
4267 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004268 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004269 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004270 case exec_stmt:
4271 com_exec_stmt(c, n);
4272 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004273 case assert_stmt:
4274 com_assert_stmt(c, n);
4275 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004276 case if_stmt:
4277 com_if_stmt(c, n);
4278 break;
4279 case while_stmt:
4280 com_while_stmt(c, n);
4281 break;
4282 case for_stmt:
4283 com_for_stmt(c, n);
4284 break;
4285 case try_stmt:
4286 com_try_stmt(c, n);
4287 break;
4288 case suite:
4289 com_suite(c, n);
4290 break;
4291
4292 /* Expression nodes */
4293
4294 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004295 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004296 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004297 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004298 break;
4299 case test:
4300 com_test(c, n);
4301 break;
4302 case and_test:
4303 com_and_test(c, n);
4304 break;
4305 case not_test:
4306 com_not_test(c, n);
4307 break;
4308 case comparison:
4309 com_comparison(c, n);
4310 break;
4311 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004312 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004313 break;
4314 case expr:
4315 com_expr(c, n);
4316 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004317 case xor_expr:
4318 com_xor_expr(c, n);
4319 break;
4320 case and_expr:
4321 com_and_expr(c, n);
4322 break;
4323 case shift_expr:
4324 com_shift_expr(c, n);
4325 break;
4326 case arith_expr:
4327 com_arith_expr(c, n);
4328 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004329 case term:
4330 com_term(c, n);
4331 break;
4332 case factor:
4333 com_factor(c, n);
4334 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004335 case power:
4336 com_power(c, n);
4337 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004338 case atom:
4339 com_atom(c, n);
4340 break;
4341
4342 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004343 com_error(c, PyExc_SystemError,
4344 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004345 }
4346}
4347
Tim Petersdbd9ba62000-07-09 03:09:57 +00004348static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004349
4350static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004351com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004352{
4353 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4354 if (TYPE(CHILD(n, 0)) == LPAR)
4355 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004356 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004357 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004358 com_pop(c, 1);
4359 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004360}
4361
4362static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004363com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004364{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004365 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004366 if (NCH(n) == 1) {
4367 com_fpdef(c, CHILD(n, 0));
4368 }
4369 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004370 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004371 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004372 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004373 for (i = 0; i < NCH(n); i += 2)
4374 com_fpdef(c, CHILD(n, i));
4375 }
4376}
4377
4378static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004379com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004380{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004381 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004382 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004383 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004384 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004385 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004386 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004387 nch = NCH(n);
4388 /* Enter all arguments in table of locals */
4389 for (i = 0, narg = 0; i < nch; i++) {
4390 node *ch = CHILD(n, i);
4391 node *fp;
4392 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004393 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004394 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4395 fp = CHILD(ch, 0);
4396 if (TYPE(fp) != NAME) {
4397 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4398 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004399 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004400 narg++;
4401 /* all name updates handled by symtable */
4402 if (++i >= nch)
4403 break;
4404 ch = CHILD(n, i);
4405 if (TYPE(ch) == EQUAL)
4406 i += 2;
4407 else
4408 REQ(ch, COMMA);
4409 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004410 if (complex) {
4411 /* Generate code for complex arguments only after
4412 having counted the simple arguments */
4413 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004414 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004415 node *ch = CHILD(n, i);
4416 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004417 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004418 break;
4419 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4420 fp = CHILD(ch, 0);
4421 if (TYPE(fp) != NAME) {
4422 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004423 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004424 com_fpdef(c, ch);
4425 }
4426 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004427 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004428 break;
4429 ch = CHILD(n, i);
4430 if (TYPE(ch) == EQUAL)
4431 i += 2;
4432 else
4433 REQ(ch, COMMA);
4434 }
4435 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004436}
4437
4438static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004439com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004440{
4441 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004442 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004443 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004444 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004445 if (doc != NULL) {
4446 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004447 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004448 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004449 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004450 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004451 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004452 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004453 for (i = 0; i < NCH(n); i++) {
4454 node *ch = CHILD(n, i);
4455 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4456 com_node(c, ch);
4457 }
4458}
4459
4460/* Top-level compile-node interface */
4461
4462static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004463compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004464{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004465 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004466 node *ch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004467 REQ(n, funcdef);
4468 /* -6 -5 -4 -3 -2 -1
4469 funcdef: [decorators] 'def' NAME parameters ':' suite */
4470 c->c_name = STR(RCHILD(n, -4));
4471 doc = get_docstring(c, RCHILD(n, -1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004472 if (doc != NULL) {
4473 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004474 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004475 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004476 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004477 (void) com_addconst(c, Py_None); /* No docstring */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004478 ch = RCHILD(n, -3); /* parameters: '(' [varargslist] ')' */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004479 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004480 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004481 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004482 c->c_infunction = 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004483 com_node(c, RCHILD(n, -1));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004484 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004485 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004486 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4487 com_push(c, 1);
4488 com_addbyte(c, RETURN_VALUE);
4489 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004490}
4491
4492static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004493compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004494{
Guido van Rossum590baa41993-11-30 13:40:46 +00004495 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004496 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004497 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004498
4499 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004500 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004501 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004502 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004503 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004504 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004505 else
4506 ch = CHILD(n, 2);
4507 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004508 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004509 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004510}
4511
4512static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004513compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004514{
4515 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004516 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004517 REQ(n, classdef);
4518 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4519 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004520 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004521 /* Initialize local __module__ from global __name__ */
4522 com_addop_name(c, LOAD_GLOBAL, "__name__");
4523 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004524 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004525 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004526 if (doc != NULL) {
4527 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004528 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004529 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004530 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004531 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004532 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004533 }
4534 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004535 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004536 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00004537 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004538 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004539 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004540 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004541 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004542}
4543
4544static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00004545compile_generator_expression(struct compiling *c, node *n)
4546{
4547 /* testlist_gexp: test gen_for */
4548 /* argument: test gen_for */
4549 REQ(CHILD(n, 0), test);
4550 REQ(CHILD(n, 1), gen_for);
4551
4552 c->c_name = "<generator expression>";
4553 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
4554
4555 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4556 com_push(c, 1);
4557 com_addbyte(c, RETURN_VALUE);
4558 com_pop(c, 1);
4559}
4560
4561static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004562compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004563{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004564 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004565
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004566 switch (TYPE(n)) {
4567
Guido van Rossum4c417781991-01-21 16:09:22 +00004568 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004569 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004570 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004571 n = CHILD(n, 0);
4572 if (TYPE(n) != NEWLINE)
4573 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004574 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004575 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4576 com_push(c, 1);
4577 com_addbyte(c, RETURN_VALUE);
4578 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004579 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004580 break;
4581
Guido van Rossum4c417781991-01-21 16:09:22 +00004582 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004583 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004584 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004585 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4586 com_push(c, 1);
4587 com_addbyte(c, RETURN_VALUE);
4588 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004589 break;
4590
Guido van Rossum590baa41993-11-30 13:40:46 +00004591 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004592 com_node(c, CHILD(n, 0));
4593 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004594 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004595 break;
4596
Guido van Rossum590baa41993-11-30 13:40:46 +00004597 case lambdef: /* anonymous function definition */
4598 compile_lambdef(c, n);
4599 break;
4600
Guido van Rossum4c417781991-01-21 16:09:22 +00004601 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004602 compile_funcdef(c, n);
4603 break;
4604
Guido van Rossum4c417781991-01-21 16:09:22 +00004605 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004606 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004607 break;
4608
Raymond Hettinger354433a2004-05-19 08:20:33 +00004609 case testlist_gexp: /* A generator expression */
4610 case argument: /* A generator expression */
4611 compile_generator_expression(c, n);
4612 break;
4613
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004614 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004615 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004616 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004617 }
4618}
4619
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004620static PyObject *
4621dict_keys_inorder(PyObject *dict, int offset)
4622{
4623 PyObject *tuple, *k, *v;
4624 int i, pos = 0, size = PyDict_Size(dict);
4625
4626 tuple = PyTuple_New(size);
4627 if (tuple == NULL)
4628 return NULL;
4629 while (PyDict_Next(dict, &pos, &k, &v)) {
4630 i = PyInt_AS_LONG(v);
4631 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004632 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004633 PyTuple_SET_ITEM(tuple, i - offset, k);
4634 }
4635 return tuple;
4636}
4637
Guido van Rossum79f25d91997-04-29 20:08:16 +00004638PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004639PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004640{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004641 return PyNode_CompileFlags(n, filename, NULL);
4642}
4643
4644PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004645PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004646{
4647 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004648}
4649
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004650struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004651PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004652{
4653 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004654 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004655
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004656 ff = PyNode_Future(n, filename);
4657 if (ff == NULL)
4658 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004659 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00004660 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004661 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004662 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004663 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004664 return st;
4665}
4666
Guido van Rossum79f25d91997-04-29 20:08:16 +00004667static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004668icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004669{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004670 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004671}
4672
Guido van Rossum79f25d91997-04-29 20:08:16 +00004673static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004674jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004675 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004676{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004677 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004678 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004679 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004680 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004681 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4682 sc.c_encoding = "utf-8";
4683 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004684 sc.c_encoding = STR(n);
4685 n = CHILD(n, 0);
4686 } else {
4687 sc.c_encoding = NULL;
4688 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004689 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004690 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004691 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004692 /* c_symtable still points to parent's symbols */
4693 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004694 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004695 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004696 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004697 if (base->c_encoding != NULL) {
4698 assert(sc.c_encoding == NULL);
4699 sc.c_encoding = base->c_encoding;
4700 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004701 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004702 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004703 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004704 if (sc.c_future == NULL) {
4705 com_free(&sc);
4706 return NULL;
4707 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004708 if (flags) {
4709 int merged = sc.c_future->ff_features |
4710 flags->cf_flags;
4711 sc.c_future->ff_features = merged;
4712 flags->cf_flags = merged;
4713 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004714 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
4715 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004716 com_free(&sc);
4717 return NULL;
4718 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004719 /* reset symbol table for second pass */
4720 sc.c_symtable->st_nscopes = 1;
4721 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004722 }
4723 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004724 if (symtable_load_symbols(&sc) < 0) {
4725 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004726 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004727 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004728 compile_node(&sc, n);
4729 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004730 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004731 PyObject *consts, *names, *varnames, *filename, *name,
4732 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004733 consts = PyList_AsTuple(sc.c_consts);
4734 names = PyList_AsTuple(sc.c_names);
4735 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004736 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4737 freevars = dict_keys_inorder(sc.c_freevars,
4738 PyTuple_GET_SIZE(cellvars));
Michael W. Hudsone51c4f92004-08-04 10:26:08 +00004739 filename = PyString_InternFromString(sc.c_filename);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004740 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004741 if (!PyErr_Occurred())
4742 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004743 sc.c_nlocals,
4744 sc.c_maxstacklevel,
4745 sc.c_flags,
4746 sc.c_code,
4747 consts,
4748 names,
4749 varnames,
4750 freevars,
4751 cellvars,
4752 filename,
4753 name,
4754 sc.c_firstlineno,
4755 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004756 Py_XDECREF(consts);
4757 Py_XDECREF(names);
4758 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004759 Py_XDECREF(freevars);
4760 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004761 Py_XDECREF(filename);
4762 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004763 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004764 else if (!PyErr_Occurred()) {
4765 /* This could happen if someone called PyErr_Clear() after an
4766 error was reported above. That's not supposed to happen,
4767 but I just plugged one case and I'm not sure there can't be
4768 others. In that case, raise SystemError so that at least
4769 it gets reported instead dumping core. */
4770 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4771 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004772 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004773 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004774 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004775 sc.c_symtable = NULL;
4776 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004777 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004778 return co;
4779}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004780
4781int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004782PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004783{
4784 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004785 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004786 int line = co->co_firstlineno;
4787 int addr = 0;
4788 while (--size >= 0) {
4789 addr += *p++;
4790 if (addr > addrq)
4791 break;
4792 line += *p++;
4793 }
4794 return line;
4795}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004796
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004797/* The test for LOCAL must come before the test for FREE in order to
4798 handle classes where name is both local and free. The local var is
4799 a method and the free var is a free var referenced within a method.
4800*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004801
4802static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004803get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004804{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004805 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004806 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004807
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004808 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4809 return CELL;
4810 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4811 return LOCAL;
4812 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4813 return FREE;
4814 v = PyDict_GetItemString(c->c_globals, name);
4815 if (v) {
4816 if (v == Py_None)
4817 return GLOBAL_EXPLICIT;
4818 else {
4819 return GLOBAL_IMPLICIT;
4820 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004821 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004822 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004823 "unknown scope for %.100s in %.100s(%s) "
4824 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4825 name, c->c_name,
4826 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4827 c->c_filename,
4828 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4829 PyObject_REPR(c->c_locals),
4830 PyObject_REPR(c->c_globals)
4831 );
4832
4833 Py_FatalError(buf);
4834 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004835}
4836
Guido van Rossum207fda62001-03-02 03:30:41 +00004837/* Helper functions to issue warnings */
4838
4839static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004840issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004841{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004842 if (PyErr_Occurred()) {
4843 /* This can happen because symtable_node continues
4844 processing even after raising a SyntaxError.
4845 Calling PyErr_WarnExplicit now would clobber the
4846 pending exception; instead we fail and let that
4847 exception propagate.
4848 */
4849 return -1;
4850 }
Guido van Rossum207fda62001-03-02 03:30:41 +00004851 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4852 lineno, NULL, NULL) < 0) {
4853 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4854 PyErr_SetString(PyExc_SyntaxError, msg);
4855 PyErr_SyntaxLocation(filename, lineno);
4856 }
4857 return -1;
4858 }
4859 return 0;
4860}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004861
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004862static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004863symtable_warn(struct symtable *st, char *msg)
4864{
Guido van Rossum207fda62001-03-02 03:30:41 +00004865 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004866 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004867 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004868 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004869 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004870}
4871
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004872/* Helper function for setting lineno and filename */
4873
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004874static struct symtable *
4875symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004876{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004877 struct symtable *st;
4878
4879 st = symtable_init();
4880 if (st == NULL)
4881 return NULL;
4882 st->st_future = ff;
4883 st->st_filename = filename;
4884 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
4885 if (st->st_errors > 0)
4886 goto fail;
4887 symtable_node(st, n);
4888 if (st->st_errors > 0)
4889 goto fail;
4890 return st;
4891 fail:
4892 if (!PyErr_Occurred()) {
4893 /* This could happen because after a syntax error is
4894 detected, the symbol-table-building continues for
4895 a while, and PyErr_Clear() might erroneously be
4896 called during that process. One such case has been
4897 fixed, but there might be more (now or later).
4898 */
4899 PyErr_SetString(PyExc_SystemError, "lost exception");
4900 }
4901 st->st_future = NULL;
4902 st->st_filename = NULL;
4903 PySymtable_Free(st);
4904 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004905}
4906
4907static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004908symtable_init_compiling_symbols(struct compiling *c)
4909{
4910 PyObject *varnames;
4911
4912 varnames = c->c_symtable->st_cur->ste_varnames;
4913 if (varnames == NULL) {
4914 varnames = PyList_New(0);
4915 if (varnames == NULL)
4916 return -1;
4917 c->c_symtable->st_cur->ste_varnames = varnames;
4918 Py_INCREF(varnames);
4919 } else
4920 Py_INCREF(varnames);
4921 c->c_varnames = varnames;
4922
4923 c->c_globals = PyDict_New();
4924 if (c->c_globals == NULL)
4925 return -1;
4926 c->c_freevars = PyDict_New();
4927 if (c->c_freevars == NULL)
4928 return -1;
4929 c->c_cellvars = PyDict_New();
4930 if (c->c_cellvars == NULL)
4931 return -1;
4932 return 0;
4933}
4934
4935struct symbol_info {
4936 int si_nlocals;
4937 int si_ncells;
4938 int si_nfrees;
4939 int si_nimplicit;
4940};
4941
4942static void
4943symtable_init_info(struct symbol_info *si)
4944{
4945 si->si_nlocals = 0;
4946 si->si_ncells = 0;
4947 si->si_nfrees = 0;
4948 si->si_nimplicit = 0;
4949}
4950
4951static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004952symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004953 struct symbol_info *si)
4954{
4955 PyObject *dict, *v;
4956
4957 /* Seperate logic for DEF_FREE. If it occurs in a function,
4958 it indicates a local that we must allocate storage for (a
4959 cell var). If it occurs in a class, then the class has a
4960 method and a free variable with the same name.
4961 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004962 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004963 /* If it isn't declared locally, it can't be a cell. */
4964 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4965 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004966 v = PyInt_FromLong(si->si_ncells++);
4967 dict = c->c_cellvars;
4968 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004969 /* If it is free anyway, then there is no need to do
4970 anything here.
4971 */
4972 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004973 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004974 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004975 v = PyInt_FromLong(si->si_nfrees++);
4976 dict = c->c_freevars;
4977 }
4978 if (v == NULL)
4979 return -1;
4980 if (PyDict_SetItem(dict, name, v) < 0) {
4981 Py_DECREF(v);
4982 return -1;
4983 }
4984 Py_DECREF(v);
4985 return 0;
4986}
4987
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004988/* If a variable is a cell and an argument, make sure that appears in
4989 co_cellvars before any variable to its right in varnames.
4990*/
4991
4992
4993static int
4994symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4995 PyObject *varnames, int flags)
4996{
Tim Petersb39903b2003-03-24 17:22:24 +00004997 PyObject *v = NULL;
4998 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004999 int i, pos;
5000
5001 if (flags & CO_VARARGS)
5002 argcount++;
5003 if (flags & CO_VARKEYWORDS)
5004 argcount++;
5005 for (i = argcount; --i >= 0; ) {
5006 v = PyList_GET_ITEM(varnames, i);
5007 if (PyDict_GetItem(*cellvars, v)) {
5008 if (list == NULL) {
5009 list = PyList_New(1);
5010 if (list == NULL)
5011 return -1;
5012 PyList_SET_ITEM(list, 0, v);
5013 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005014 } else {
5015 if (PyList_Insert(list, 0, v) < 0) {
5016 Py_DECREF(list);
5017 return -1;
5018 }
5019 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005020 }
5021 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00005022 if (list == NULL)
5023 return 0;
5024
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005025 /* There are cellvars that are also arguments. Create a dict
5026 to replace cellvars and put the args at the front.
5027 */
5028 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005029 if (d == NULL)
5030 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005031 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
5032 v = PyInt_FromLong(i);
5033 if (v == NULL)
5034 goto fail;
5035 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
5036 goto fail;
5037 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
5038 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00005039 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005040 }
5041 pos = 0;
5042 i = PyList_GET_SIZE(list);
5043 Py_DECREF(list);
5044 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
5045 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005046 if (w == NULL)
5047 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005048 if (PyDict_SetItem(d, v, w) < 0) {
5049 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00005050 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005051 goto fail;
5052 }
5053 Py_DECREF(w);
5054 }
5055 Py_DECREF(*cellvars);
5056 *cellvars = d;
5057 return 1;
5058 fail:
5059 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00005060 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005061 return -1;
5062}
5063
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005064static int
5065symtable_freevar_offsets(PyObject *freevars, int offset)
5066{
5067 PyObject *name, *v;
5068 int pos;
5069
5070 /* The cell vars are the first elements of the closure,
5071 followed by the free vars. Update the offsets in
5072 c_freevars to account for number of cellvars. */
5073 pos = 0;
5074 while (PyDict_Next(freevars, &pos, &name, &v)) {
5075 int i = PyInt_AS_LONG(v) + offset;
5076 PyObject *o = PyInt_FromLong(i);
5077 if (o == NULL)
5078 return -1;
5079 if (PyDict_SetItem(freevars, name, o) < 0) {
5080 Py_DECREF(o);
5081 return -1;
5082 }
5083 Py_DECREF(o);
5084 }
5085 return 0;
5086}
5087
5088static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005089symtable_check_unoptimized(struct compiling *c,
5090 PySymtableEntryObject *ste,
5091 struct symbol_info *si)
5092{
5093 char buf[300];
5094
5095 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
5096 || (ste->ste_nested && si->si_nimplicit)))
5097 return 0;
5098
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005099#define ILLEGAL_CONTAINS "contains a nested function with free variables"
5100
5101#define ILLEGAL_IS "is a nested function"
5102
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005103#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005104"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005105
5106#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005107"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005108
5109#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005110"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005111"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005112
5113 /* XXX perhaps the linenos for these opt-breaking statements
5114 should be stored so the exception can point to them. */
5115
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005116 if (ste->ste_child_free) {
5117 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005118 PyOS_snprintf(buf, sizeof(buf),
5119 ILLEGAL_IMPORT_STAR,
5120 PyString_AS_STRING(ste->ste_name),
5121 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005122 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005123 PyOS_snprintf(buf, sizeof(buf),
5124 ILLEGAL_BARE_EXEC,
5125 PyString_AS_STRING(ste->ste_name),
5126 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005127 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005128 PyOS_snprintf(buf, sizeof(buf),
5129 ILLEGAL_EXEC_AND_IMPORT_STAR,
5130 PyString_AS_STRING(ste->ste_name),
5131 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005132 }
5133 } else {
5134 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005135 PyOS_snprintf(buf, sizeof(buf),
5136 ILLEGAL_IMPORT_STAR,
5137 PyString_AS_STRING(ste->ste_name),
5138 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005139 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005140 PyOS_snprintf(buf, sizeof(buf),
5141 ILLEGAL_BARE_EXEC,
5142 PyString_AS_STRING(ste->ste_name),
5143 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005144 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005145 PyOS_snprintf(buf, sizeof(buf),
5146 ILLEGAL_EXEC_AND_IMPORT_STAR,
5147 PyString_AS_STRING(ste->ste_name),
5148 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005149 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005150 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005151
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005152 PyErr_SetString(PyExc_SyntaxError, buf);
5153 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5154 ste->ste_opt_lineno);
5155 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005156}
5157
5158static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005159symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5160 struct symbol_info *si)
5161{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005162 if (c->c_future)
5163 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005164 if (ste->ste_generator)
5165 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005166 if (ste->ste_type != TYPE_MODULE)
5167 c->c_flags |= CO_NEWLOCALS;
5168 if (ste->ste_type == TYPE_FUNCTION) {
5169 c->c_nlocals = si->si_nlocals;
5170 if (ste->ste_optimized == 0)
5171 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005172 else if (ste->ste_optimized != OPT_EXEC)
5173 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005174 }
5175 return 0;
5176}
5177
5178static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005179symtable_error(struct symtable *st, int lineno)
5180{
5181 if (lineno == 0)
5182 lineno = st->st_cur->ste_lineno;
5183 PyErr_SyntaxLocation(st->st_filename, lineno);
5184 st->st_errors++;
5185 return -1;
5186}
5187
5188static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005189symtable_load_symbols(struct compiling *c)
5190{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005191 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005192 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005193 PyObject *name, *varnames, *v;
5194 int i, flags, pos;
5195 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005196
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005197 v = NULL;
5198
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005199 if (symtable_init_compiling_symbols(c) < 0)
5200 goto fail;
5201 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005202 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005203 si.si_nlocals = PyList_GET_SIZE(varnames);
5204 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005205
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005206 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005207 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005208 if (v == NULL)
5209 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005210 if (PyDict_SetItem(c->c_locals,
5211 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005212 goto fail;
5213 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005214 }
5215
5216 /* XXX The cases below define the rules for whether a name is
5217 local or global. The logic could probably be clearer. */
5218 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005219 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5220 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005221
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005222 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005223 /* undo the original DEF_FREE */
5224 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005225
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005226 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005227 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005228 2. Free variables in methods that are also class
5229 variables or declared global.
5230 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005231 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005232 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005233
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005234 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005235 c->c_argcount--;
5236 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005237 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005238 c->c_argcount--;
5239 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005240 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005241 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005242 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005243 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005244 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005245 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005246 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005247 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005248 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005249 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5250 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005251 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005252 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005253 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005254 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005255 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005256 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005257 if (v == NULL)
5258 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005259 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005260 goto fail;
5261 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005262 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005263 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005264 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005265 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005266 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005267 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005268 if (v == NULL)
5269 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005270 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005271 goto fail;
5272 Py_DECREF(v);
5273 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005274 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005275 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005276 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005277 goto fail;
5278 if (st->st_nscopes != 1) {
5279 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005280 if (v == NULL)
5281 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005282 if (PyDict_SetItem(st->st_global,
5283 name, v))
5284 goto fail;
5285 Py_DECREF(v);
5286 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005287 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005288 }
5289 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005290 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5291
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005292 if (si.si_ncells > 1) { /* one cell is always in order */
5293 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5294 c->c_varnames, c->c_flags) < 0)
5295 return -1;
5296 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005297 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5298 return -1;
5299 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005300 fail:
5301 /* is this always the right thing to do? */
5302 Py_XDECREF(v);
5303 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005304}
5305
5306static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005307symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005308{
5309 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005310
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005311 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005312 if (st == NULL)
5313 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005314 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005315
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005316 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005317 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005318 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005319 goto fail;
5320 if ((st->st_symbols = PyDict_New()) == NULL)
5321 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005322 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005323 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005324 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005325 st->st_private = NULL;
5326 return st;
5327 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005328 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005329 return NULL;
5330}
5331
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005332void
5333PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005334{
5335 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005336 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005337 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005338 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005339}
5340
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005341/* When the compiler exits a scope, it must should update the scope's
5342 free variable information with the list of free variables in its
5343 children.
5344
5345 Variables that are free in children and defined in the current
5346 scope are cellvars.
5347
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005348 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005349 false), free variables in children that are not defined here are
5350 implicit globals.
5351
5352*/
5353
5354static int
5355symtable_update_free_vars(struct symtable *st)
5356{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005357 int i, j, def;
5358 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005359 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005360
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005361 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005362 def = DEF_FREE_CLASS;
5363 else
5364 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005365 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005366 int pos = 0;
5367
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005368 if (list && PyList_SetSlice(list, 0,
5369 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005370 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005371 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005372 PyList_GET_ITEM(ste->ste_children, i);
5373 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005374 int flags = PyInt_AS_LONG(o);
5375 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005376 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005377 if (list == NULL) {
5378 list = PyList_New(0);
5379 if (list == NULL)
5380 return -1;
5381 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005382 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005383 if (PyList_Append(list, name) < 0) {
5384 Py_DECREF(list);
5385 return -1;
5386 }
5387 }
5388 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005389 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005390 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005391 v = PyDict_GetItem(ste->ste_symbols, name);
5392 /* If a name N is declared global in scope A and
5393 referenced in scope B contained (perhaps
5394 indirectly) in A and there are no scopes
5395 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005396 is global in B. Unless A is a class scope,
5397 because class scopes are not considered for
5398 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005399 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005400 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005401 int flags = PyInt_AS_LONG(v);
5402 if (flags & DEF_GLOBAL) {
5403 symtable_undo_free(st, child->ste_id,
5404 name);
5405 continue;
5406 }
5407 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005408 if (ste->ste_nested) {
5409 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005410 name, def) < 0) {
5411 Py_DECREF(list);
5412 return -1;
5413 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005414 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005415 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005416 name) < 0) {
5417 Py_DECREF(list);
5418 return -1;
5419 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005420 }
5421 }
5422 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005423
5424 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005425 return 0;
5426}
5427
5428/* If the current scope is a non-nested class or if name is not
5429 defined in the current, non-nested scope, then it is an implicit
5430 global in all nested scopes.
5431*/
5432
5433static int
5434symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5435{
5436 PyObject *o;
5437 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005438 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005439
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005440 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005441 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005442 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005443 if (o == NULL)
5444 return symtable_undo_free(st, child, name);
5445 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005446
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005447 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005448 return symtable_undo_free(st, child, name);
5449 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005450 return symtable_add_def_o(st, ste->ste_symbols,
5451 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005452}
5453
5454static int
5455symtable_undo_free(struct symtable *st, PyObject *id,
5456 PyObject *name)
5457{
5458 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005459 PyObject *info;
5460 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005461
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005462 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5463 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005464 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005465
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005466 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005467 if (info == NULL)
5468 return 0;
5469 v = PyInt_AS_LONG(info);
5470 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005471 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005472 DEF_FREE_GLOBAL) < 0)
5473 return -1;
5474 } else
5475 /* If the name is defined here or declared global,
5476 then the recursion stops. */
5477 return 0;
5478
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005479 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5480 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005481 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005482 PyList_GET_ITEM(ste->ste_children, i);
5483 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005484 if (x < 0)
5485 return x;
5486 }
5487 return 0;
5488}
5489
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005490/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5491 This reference is released when the scope is exited, via the DECREF
5492 in symtable_exit_scope().
5493*/
5494
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005495static int
5496symtable_exit_scope(struct symtable *st)
5497{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005498 int end;
5499
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005500 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005501 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005502 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005503 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005504 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5505 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005506 if (PySequence_DelItem(st->st_stack, end) < 0)
5507 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005508 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005509}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005510
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005511static void
5512symtable_enter_scope(struct symtable *st, char *name, int type,
5513 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005514{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005515 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005516
5517 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005518 prev = st->st_cur;
5519 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005520 st->st_errors++;
5521 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005522 }
5523 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005524 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005525 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005526 if (st->st_cur == NULL) {
5527 st->st_errors++;
5528 return;
5529 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005530 if (strcmp(name, TOP) == 0)
5531 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005532 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005533 if (PyList_Append(prev->ste_children,
5534 (PyObject *)st->st_cur) < 0)
5535 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005536 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005537}
5538
5539static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005540symtable_lookup(struct symtable *st, char *name)
5541{
5542 char buffer[MANGLE_LEN];
5543 PyObject *v;
5544 int flags;
5545
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005546 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005547 name = buffer;
5548 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5549 if (v == NULL) {
5550 if (PyErr_Occurred())
5551 return -1;
5552 else
5553 return 0;
5554 }
5555
5556 flags = PyInt_AS_LONG(v);
5557 return flags;
5558}
5559
5560static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005561symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005562{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005563 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005564 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005565 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005566
Guido van Rossumb7164622002-08-16 02:48:11 +00005567 /* Warn about None, except inside a tuple (where the assignment
5568 code already issues a warning). */
5569 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5570 *name == 'N' && strcmp(name, "None") == 0)
5571 {
Raymond Hettinger11a70c72004-07-17 21:46:25 +00005572 PyErr_SetString(PyExc_SyntaxError,
5573 "Invalid syntax. Assignment to None.");
5574 symtable_error(st, 0);
5575 return -1;
Guido van Rossumb7164622002-08-16 02:48:11 +00005576 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005577 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005578 name = buffer;
5579 if ((s = PyString_InternFromString(name)) == NULL)
5580 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005581 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5582 Py_DECREF(s);
5583 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005584}
5585
5586/* Must only be called with mangled names */
5587
5588static int
5589symtable_add_def_o(struct symtable *st, PyObject *dict,
5590 PyObject *name, int flag)
5591{
5592 PyObject *o;
5593 int val;
5594
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005595 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005596 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005597 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005598 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005599 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005600 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005601 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005602 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005603 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005604 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005605 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005606 if (o == NULL)
5607 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005608 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005609 Py_DECREF(o);
5610 return -1;
5611 }
5612 Py_DECREF(o);
5613
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005614 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005615 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005616 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005617 } else if (flag & DEF_GLOBAL) {
5618 /* XXX need to update DEF_GLOBAL for other flags too;
5619 perhaps only DEF_FREE_GLOBAL */
5620 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005621 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005622 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005623 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005624 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005625 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005626 if (o == NULL)
5627 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005628 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005629 Py_DECREF(o);
5630 return -1;
5631 }
5632 Py_DECREF(o);
5633 }
5634 return 0;
5635}
5636
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005637#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005638
Tim Peters08a898f2001-06-28 01:52:22 +00005639/* Look for a yield stmt under n. Return 1 if found, else 0.
5640 This hack is used to look inside "if 0:" blocks (which are normally
5641 ignored) in case those are the only places a yield occurs (so that this
5642 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005643static int
5644look_for_yield(node *n)
5645{
5646 int i;
5647
5648 for (i = 0; i < NCH(n); ++i) {
5649 node *kid = CHILD(n, i);
5650
5651 switch (TYPE(kid)) {
5652
5653 case classdef:
5654 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005655 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005656 /* Stuff in nested functions and classes can't make
5657 the parent a generator. */
5658 return 0;
5659
5660 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00005661 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005662
5663 default:
5664 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00005665 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005666 }
5667 }
5668 return 0;
5669}
5670
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005671static void
5672symtable_node(struct symtable *st, node *n)
5673{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005674 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005675
5676 loop:
5677 switch (TYPE(n)) {
5678 case funcdef: {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005679 char *func_name;
5680 if (NCH(n) == 6)
5681 symtable_node(st, CHILD(n, 0));
5682 func_name = STR(RCHILD(n, -4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005683 symtable_add_def(st, func_name, DEF_LOCAL);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005684 symtable_default_args(st, RCHILD(n, -3));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005685 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005686 symtable_funcdef(st, n);
5687 symtable_exit_scope(st);
5688 break;
5689 }
5690 case lambdef:
5691 if (NCH(n) == 4)
5692 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005693 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005694 symtable_funcdef(st, n);
5695 symtable_exit_scope(st);
5696 break;
5697 case classdef: {
5698 char *tmp, *class_name = STR(CHILD(n, 1));
5699 symtable_add_def(st, class_name, DEF_LOCAL);
5700 if (TYPE(CHILD(n, 2)) == LPAR) {
5701 node *bases = CHILD(n, 3);
5702 int i;
5703 for (i = 0; i < NCH(bases); i += 2) {
5704 symtable_node(st, CHILD(bases, i));
5705 }
5706 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005707 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005708 tmp = st->st_private;
5709 st->st_private = class_name;
5710 symtable_node(st, CHILD(n, NCH(n) - 1));
5711 st->st_private = tmp;
5712 symtable_exit_scope(st);
5713 break;
5714 }
5715 case if_stmt:
5716 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005717 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5718 if (st->st_cur->ste_generator == 0)
5719 st->st_cur->ste_generator =
5720 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005721 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005722 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005723 symtable_node(st, CHILD(n, i + 1));
5724 symtable_node(st, CHILD(n, i + 3));
5725 }
5726 if (i + 2 < NCH(n))
5727 symtable_node(st, CHILD(n, i + 2));
5728 break;
5729 case global_stmt:
5730 symtable_global(st, n);
5731 break;
5732 case import_stmt:
5733 symtable_import(st, n);
5734 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005735 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005736 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005737 symtable_node(st, CHILD(n, 1));
5738 if (NCH(n) > 2)
5739 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005740 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005741 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005742 st->st_cur->ste_opt_lineno = n->n_lineno;
5743 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005744 if (NCH(n) > 4)
5745 symtable_node(st, CHILD(n, 5));
5746 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005747
5748 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005749 case assert_stmt:
5750 if (Py_OptimizeFlag)
5751 return;
5752 if (NCH(n) == 2) {
5753 n = CHILD(n, 1);
5754 goto loop;
5755 } else {
5756 symtable_node(st, CHILD(n, 1));
5757 n = CHILD(n, 3);
5758 goto loop;
5759 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005760 case except_clause:
5761 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005762 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005763 if (NCH(n) > 1) {
5764 n = CHILD(n, 1);
5765 goto loop;
5766 }
5767 break;
5768 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005769 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005770 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005771 case yield_stmt:
5772 st->st_cur->ste_generator = 1;
5773 n = CHILD(n, 1);
5774 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005775 case expr_stmt:
5776 if (NCH(n) == 1)
5777 n = CHILD(n, 0);
5778 else {
5779 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005780 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005781 symtable_node(st, CHILD(n, 2));
5782 break;
5783 } else {
5784 int i;
5785 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005786 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005787 n = CHILD(n, NCH(n) - 1);
5788 }
5789 }
5790 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005791 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005792 /* only occurs when there are multiple for loops
5793 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005794 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005795 if (TYPE(n) == list_for)
5796 symtable_list_for(st, n);
5797 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005798 REQ(n, list_if);
5799 symtable_node(st, CHILD(n, 1));
5800 if (NCH(n) == 3) {
5801 n = CHILD(n, 2);
5802 goto loop;
5803 }
5804 }
5805 break;
5806 case for_stmt:
5807 symtable_assign(st, CHILD(n, 1), 0);
5808 for (i = 3; i < NCH(n); ++i)
5809 if (TYPE(CHILD(n, i)) >= single_input)
5810 symtable_node(st, CHILD(n, i));
5811 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00005812 case arglist:
5813 if (NCH(n) > 1)
5814 for (i = 0; i < NCH(n); ++i) {
5815 node *ch = CHILD(n, i);
5816 if (TYPE(ch) == argument && NCH(ch) == 2 &&
5817 TYPE(CHILD(ch, 1)) == gen_for) {
5818 PyErr_SetString(PyExc_SyntaxError,
5819 "invalid syntax");
5820 symtable_error(st, n->n_lineno);
5821 return;
5822 }
5823 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005824 /* The remaining cases fall through to default except in
5825 special circumstances. This requires the individual cases
5826 to be coded with great care, even though they look like
5827 rather innocuous. Each case must double-check TYPE(n).
5828 */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005829 case decorator:
5830 if (TYPE(n) == decorator) {
5831 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
5832 node *name, *varname;
5833 name = CHILD(n, 1);
5834 REQ(name, dotted_name);
5835 varname = CHILD(name, 0);
5836 REQ(varname, NAME);
5837 symtable_add_use(st, STR(varname));
5838 }
5839 /* fall through */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005840 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005841 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005842 n = CHILD(n, 2);
5843 goto loop;
5844 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00005845 else if (TYPE(n) == argument && NCH(n) == 2 &&
5846 TYPE(CHILD(n, 1)) == gen_for) {
5847 symtable_generator_expression(st, n);
5848 break;
5849 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005850 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005851 case listmaker:
5852 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005853 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005854 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005855 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005856 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00005857 case testlist_gexp:
5858 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
5859 symtable_generator_expression(st, n);
5860 break;
5861 }
5862 /* fall through */
5863
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005864 case atom:
5865 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5866 symtable_add_use(st, STR(CHILD(n, 0)));
5867 break;
5868 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005869 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005870 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005871 /* Walk over every non-token child with a special case
5872 for one child.
5873 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005874 if (NCH(n) == 1) {
5875 n = CHILD(n, 0);
5876 goto loop;
5877 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005878 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005879 if (TYPE(CHILD(n, i)) >= single_input)
5880 symtable_node(st, CHILD(n, i));
5881 }
5882}
5883
5884static void
5885symtable_funcdef(struct symtable *st, node *n)
5886{
5887 node *body;
5888
5889 if (TYPE(n) == lambdef) {
5890 if (NCH(n) == 4)
5891 symtable_params(st, CHILD(n, 1));
5892 } else
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005893 symtable_params(st, RCHILD(n, -3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005894 body = CHILD(n, NCH(n) - 1);
5895 symtable_node(st, body);
5896}
5897
5898/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00005899 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005900 which are references in the defining scope. symtable_params()
5901 parses the parameter names, which are defined in the function's
5902 body.
5903
5904 varargslist:
5905 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5906 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5907*/
5908
5909static void
5910symtable_default_args(struct symtable *st, node *n)
5911{
5912 node *c;
5913 int i;
5914
5915 if (TYPE(n) == parameters) {
5916 n = CHILD(n, 1);
5917 if (TYPE(n) == RPAR)
5918 return;
5919 }
5920 REQ(n, varargslist);
5921 for (i = 0; i < NCH(n); i += 2) {
5922 c = CHILD(n, i);
5923 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5924 break;
5925 }
5926 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5927 symtable_node(st, CHILD(n, i));
5928 }
5929}
5930
5931static void
5932symtable_params(struct symtable *st, node *n)
5933{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005934 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00005935 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005936
5937 if (TYPE(n) == parameters) {
5938 n = CHILD(n, 1);
5939 if (TYPE(n) == RPAR)
5940 return;
5941 }
5942 REQ(n, varargslist);
5943 for (i = 0; i < NCH(n); i += 2) {
5944 c = CHILD(n, i);
5945 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5946 ext = 1;
5947 break;
5948 }
5949 if (TYPE(c) == test) {
5950 continue;
5951 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00005952 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005953 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00005954 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005955 char nbuf[30];
5956 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005957 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005958 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005959 }
5960 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005961 if (ext) {
5962 c = CHILD(n, i);
5963 if (TYPE(c) == STAR) {
5964 i++;
5965 symtable_add_def(st, STR(CHILD(n, i)),
5966 DEF_PARAM | DEF_STAR);
5967 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005968 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005969 c = NULL;
5970 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005971 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005972 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005973 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005974 i++;
5975 symtable_add_def(st, STR(CHILD(n, i)),
5976 DEF_PARAM | DEF_DOUBLESTAR);
5977 }
5978 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005979 if (complex >= 0) {
5980 int j;
5981 for (j = 0; j <= complex; j++) {
5982 c = CHILD(n, j);
5983 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005984 c = CHILD(n, ++j);
5985 else if (TYPE(c) == EQUAL)
5986 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005987 if (TYPE(CHILD(c, 0)) == LPAR)
5988 symtable_params_fplist(st, CHILD(c, 1));
5989 }
5990 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005991}
5992
5993static void
5994symtable_params_fplist(struct symtable *st, node *n)
5995{
5996 int i;
5997 node *c;
5998
5999 REQ(n, fplist);
6000 for (i = 0; i < NCH(n); i += 2) {
6001 c = CHILD(n, i);
6002 REQ(c, fpdef);
6003 if (NCH(c) == 1)
6004 symtable_add_def(st, STR(CHILD(c, 0)),
6005 DEF_PARAM | DEF_INTUPLE);
6006 else
6007 symtable_params_fplist(st, CHILD(c, 1));
6008 }
6009
6010}
6011
6012static void
6013symtable_global(struct symtable *st, node *n)
6014{
6015 int i;
6016
Jeremy Hylton9f324e92001-03-01 22:59:14 +00006017 /* XXX It might be helpful to warn about module-level global
6018 statements, but it's hard to tell the difference between
6019 module-level and a string passed to exec.
6020 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00006021
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006022 for (i = 1; i < NCH(n); i += 2) {
6023 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006024 int flags;
6025
6026 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006027 if (flags < 0)
6028 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006029 if (flags && flags != DEF_GLOBAL) {
6030 char buf[500];
6031 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00006032 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006033 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00006034 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006035 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006036 }
6037 else {
6038 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006039 PyOS_snprintf(buf, sizeof(buf),
6040 GLOBAL_AFTER_ASSIGN,
6041 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006042 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006043 PyOS_snprintf(buf, sizeof(buf),
6044 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00006045 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006046 }
6047 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006048 symtable_add_def(st, name, DEF_GLOBAL);
6049 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006050}
6051
6052static void
6053symtable_list_comprehension(struct symtable *st, node *n)
6054{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006055 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006056 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006057
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006058 REQ(n, listmaker);
6059 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
6060 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006061 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006062 symtable_list_for(st, CHILD(n, 1));
6063 symtable_node(st, CHILD(n, 0));
6064 --st->st_cur->ste_tmpname;
6065}
6066
6067static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006068symtable_generator_expression(struct symtable *st, node *n)
6069{
6070 /* testlist_gexp: test gen_for */
6071 REQ(CHILD(n, 0), test);
6072 REQ(CHILD(n, 1), gen_for);
6073
6074 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
6075 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
6076
6077 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
6078
6079 symtable_gen_for(st, CHILD(n, 1), 1);
6080 symtable_node(st, CHILD(n, 0));
6081 symtable_exit_scope(st);
6082
6083 /* for outmost iterable precomputation */
6084 symtable_node(st, CHILD(CHILD(n, 1), 3));
6085}
6086
6087static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006088symtable_list_for(struct symtable *st, node *n)
6089{
6090 REQ(n, list_for);
6091 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006092 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006093 symtable_node(st, CHILD(n, 3));
6094 if (NCH(n) == 5)
6095 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006096}
6097
6098static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006099symtable_gen_for(struct symtable *st, node *n, int is_outmost)
6100{
6101 REQ(n, gen_for);
6102
6103 /* gen_for: for v in test [gen_iter] */
6104 symtable_assign(st, CHILD(n, 1), 0);
6105 if (is_outmost)
6106 symtable_add_use(st, "[outmost-iterable]");
6107 else
6108 symtable_node(st, CHILD(n, 3));
6109
6110 if (NCH(n) == 5)
6111 symtable_gen_iter(st, CHILD(n, 4));
6112}
6113
6114static void
6115symtable_gen_iter(struct symtable *st, node *n)
6116{
6117 REQ(n, gen_iter);
6118
6119 n = CHILD(n, 0);
6120 if (TYPE(n) == gen_for)
6121 symtable_gen_for(st, n, 0);
6122 else {
6123 REQ(n, gen_if);
6124 symtable_node(st, CHILD(n, 1));
6125
6126 if (NCH(n) == 3)
6127 symtable_gen_iter(st, CHILD(n, 2));
6128 }
6129}
6130
6131static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006132symtable_import(struct symtable *st, node *n)
6133{
6134 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006135 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006136 | 'from' dotted_name 'import'
6137 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00006138 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006139 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006140 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006141 node *dotname = CHILD(n, 1);
6142 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6143 /* check for bogus imports */
6144 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6145 PyErr_SetString(PyExc_SyntaxError,
6146 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006147 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006148 return;
6149 }
6150 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006151 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006152 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006153 if (symtable_warn(st,
6154 "import * only allowed at module level") < 0)
6155 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006156 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006157 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006158 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006159 } else {
6160 for (i = 3; i < NCH(n); i += 2) {
6161 node *c = CHILD(n, i);
6162 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006163 symtable_assign(st, CHILD(c, 2),
6164 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006165 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006166 symtable_assign(st, CHILD(c, 0),
6167 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006168 }
6169 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006170 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006171 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006172 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006173 }
6174 }
6175}
6176
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006177/* The third argument to symatble_assign() is a flag to be passed to
6178 symtable_add_def() if it is eventually called. The flag is useful
6179 to specify the particular type of assignment that should be
6180 recorded, e.g. an assignment caused by import.
6181 */
6182
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006183static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006184symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006185{
6186 node *tmp;
6187 int i;
6188
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006189 loop:
6190 switch (TYPE(n)) {
6191 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006192 /* invalid assignment, e.g. lambda x:x=2. The next
6193 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006194 return;
6195 case power:
6196 if (NCH(n) > 2) {
6197 for (i = 2; i < NCH(n); ++i)
6198 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6199 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006200 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006201 if (NCH(n) > 1) {
6202 symtable_node(st, CHILD(n, 0));
6203 symtable_node(st, CHILD(n, 1));
6204 } else {
6205 n = CHILD(n, 0);
6206 goto loop;
6207 }
6208 return;
6209 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006210 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6211 /* XXX This is an error, but the next pass
6212 will catch it. */
6213 return;
6214 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006215 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006216 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006217 }
6218 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006219 case testlist_gexp:
6220 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6221 /* XXX This is an error, but the next pass
6222 will catch it. */
6223 return;
6224 } else {
6225 for (i = 0; i < NCH(n); i += 2)
6226 symtable_assign(st, CHILD(n, i), def_flag);
6227 }
6228 return;
6229
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006230 case exprlist:
6231 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006232 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006233 if (NCH(n) == 1) {
6234 n = CHILD(n, 0);
6235 goto loop;
6236 }
6237 else {
6238 int i;
6239 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006240 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006241 return;
6242 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006243 case atom:
6244 tmp = CHILD(n, 0);
6245 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6246 n = CHILD(n, 1);
6247 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006248 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006249 if (strcmp(STR(tmp), "__debug__") == 0) {
6250 PyErr_SetString(PyExc_SyntaxError,
6251 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006252 symtable_error(st, n->n_lineno);
6253 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006254 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006255 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006256 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006257 return;
6258 case dotted_as_name:
6259 if (NCH(n) == 3)
6260 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006261 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006262 else
6263 symtable_add_def(st,
6264 STR(CHILD(CHILD(n,
6265 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006266 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006267 return;
6268 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006269 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006270 return;
6271 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006272 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006273 return;
6274 default:
6275 if (NCH(n) == 0)
6276 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006277 if (NCH(n) == 1) {
6278 n = CHILD(n, 0);
6279 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006280 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006281 /* Should only occur for errors like x + 1 = 1,
6282 which will be caught in the next pass. */
6283 for (i = 0; i < NCH(n); ++i)
6284 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006285 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006286 }
6287}