blob: 7bbcd62e745b748f1bcccf8af9daf8901f0080f4 [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 Hyltoncb17ae82001-02-09 22:22:18 +000054#define ILLEGAL_DYNAMIC_SCOPE \
55"%.100s: exec or 'import *' makes names ambiguous in nested scope"
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000056
Jeremy Hylton29906ee2001-02-27 04:23:34 +000057#define GLOBAL_AFTER_ASSIGN \
58"name '%.400s' is assigned to before global declaration"
59
60#define GLOBAL_AFTER_USE \
61"name '%.400s' is used prior to global declaration"
62
Martin v. Löwisdd7eb142003-10-18 22:05:25 +000063#define PARAM_GLOBAL \
Neal Norwitz2a47c0f2002-01-29 00:53:41 +000064"name '%.400s' is a function parameter and declared global"
Jeremy Hylton29906ee2001-02-27 04:23:34 +000065
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +000066#define LATE_FUTURE \
67"from __future__ imports must occur at the beginning of the file"
68
Jeremy Hylton897b8212001-03-23 14:08:38 +000069#define ASSIGN_DEBUG \
70"can not assign to __debug__"
71
Jeremy Hyltone36f7782001-01-19 03:21:30 +000072#define MANGLE_LEN 256
73
Guido van Rossum79f25d91997-04-29 20:08:16 +000074#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000075
Guido van Rossum6f799372001-09-20 20:46:19 +000076static PyMemberDef code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000077 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
78 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000079 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000080 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000081 {"co_code", T_OBJECT, OFF(co_code), READONLY},
82 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
83 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000084 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000085 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
86 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000087 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000088 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000089 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
90 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000091 {NULL} /* Sentinel */
92};
93
Guido van Rossumbea18cc2002-06-14 20:41:17 +000094PyDoc_STRVAR(code_doc,
95"code(argcount, nlocals, stacksize, flags, codestring, constants, names,\n\
96 varnames, filename, name, firstlineno, lnotab[, freevars[, cellvars]])\n\
97\n\
98Create a code object. Not for the faint of heart.");
99
100static PyObject *
101code_new(PyTypeObject *type, PyObject *args, PyObject *kw)
102{
103 int argcount;
104 int nlocals;
105 int stacksize;
106 int flags;
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000107 PyObject *co;
Raymond Hettingercc1798e2003-09-16 04:27:52 +0000108 PyObject *empty = NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000109 PyObject *code;
110 PyObject *consts;
111 PyObject *names;
112 PyObject *varnames;
113 PyObject *freevars = NULL;
114 PyObject *cellvars = NULL;
115 PyObject *filename;
116 PyObject *name;
117 int firstlineno;
118 PyObject *lnotab;
119
120 if (!PyArg_ParseTuple(args, "iiiiSO!O!O!SSiS|O!O!:code",
121 &argcount, &nlocals, &stacksize, &flags,
122 &code,
123 &PyTuple_Type, &consts,
124 &PyTuple_Type, &names,
125 &PyTuple_Type, &varnames,
126 &filename, &name,
127 &firstlineno, &lnotab,
128 &PyTuple_Type, &freevars,
129 &PyTuple_Type, &cellvars))
130 return NULL;
131
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000132 if (!PyObject_CheckReadBuffer(code)) {
133 PyErr_SetString(PyExc_TypeError,
134 "bytecode object must be a single-segment read-only buffer");
135 return NULL;
136 }
137
Raymond Hettingercc1798e2003-09-16 04:27:52 +0000138 if (freevars == NULL || cellvars == NULL) {
139 empty = PyTuple_New(0);
140 if (empty == NULL)
141 return NULL;
142 if (freevars == NULL)
143 freevars = empty;
144 if (cellvars == NULL)
145 cellvars = empty;
146 }
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000147
148 co = (PyObject *) PyCode_New(argcount, nlocals, stacksize, flags,
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000149 code, consts, names, varnames,
150 freevars, cellvars, filename, name,
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000151 firstlineno, lnotab);
Raymond Hettingercc1798e2003-09-16 04:27:52 +0000152 Py_XDECREF(empty);
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000153 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000154}
155
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000156static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000157code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000158{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000159 Py_XDECREF(co->co_code);
160 Py_XDECREF(co->co_consts);
161 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000162 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000163 Py_XDECREF(co->co_freevars);
164 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000165 Py_XDECREF(co->co_filename);
166 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000167 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000168 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000169}
170
Guido van Rossum79f25d91997-04-29 20:08:16 +0000171static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000172code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000173{
174 char buf[500];
175 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000176 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000177 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000178
Guido van Rossuma396a882000-04-07 01:21:36 +0000179 if (co->co_firstlineno != 0)
180 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000181 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000182 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000183 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000184 name = PyString_AS_STRING(co->co_name);
Barry Warsaw8f6d8682001-11-28 21:10:39 +0000185 PyOS_snprintf(buf, sizeof(buf),
186 "<code object %.100s at %p, file \"%.300s\", line %d>",
187 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000188 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000189}
190
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000191static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000192code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000193{
194 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000195 cmp = PyObject_Compare(co->co_name, cp->co_name);
196 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000197 cmp = co->co_argcount - cp->co_argcount;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000198 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000199 cmp = co->co_nlocals - cp->co_nlocals;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000200 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000201 cmp = co->co_flags - cp->co_flags;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000202 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000203 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000204 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000205 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000206 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000207 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000208 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000209 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000210 if (cmp) return cmp;
211 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
212 if (cmp) return cmp;
213 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000214 return cmp;
215}
216
217static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000218code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000219{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000220 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000221 h0 = PyObject_Hash(co->co_name);
222 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000223 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000224 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000225 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000226 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000227 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000228 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000229 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000230 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000231 h5 = PyObject_Hash(co->co_freevars);
232 if (h5 == -1) return -1;
233 h6 = PyObject_Hash(co->co_cellvars);
234 if (h6 == -1) return -1;
235 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000236 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000237 if (h == -1) h = -2;
238 return h;
239}
240
Jeremy Hylton78891072001-03-01 06:09:34 +0000241/* XXX code objects need to participate in GC? */
242
Guido van Rossum79f25d91997-04-29 20:08:16 +0000243PyTypeObject PyCode_Type = {
244 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000245 0,
246 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000247 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000248 0,
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000249 (destructor)code_dealloc, /* tp_dealloc */
250 0, /* tp_print */
251 0, /* tp_getattr */
252 0, /* tp_setattr */
253 (cmpfunc)code_compare, /* tp_compare */
254 (reprfunc)code_repr, /* tp_repr */
255 0, /* tp_as_number */
256 0, /* tp_as_sequence */
257 0, /* tp_as_mapping */
258 (hashfunc)code_hash, /* tp_hash */
259 0, /* tp_call */
260 0, /* tp_str */
261 PyObject_GenericGetAttr, /* tp_getattro */
262 0, /* tp_setattro */
263 0, /* tp_as_buffer */
264 Py_TPFLAGS_DEFAULT, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000265 code_doc, /* tp_doc */
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000266 0, /* tp_traverse */
267 0, /* tp_clear */
268 0, /* tp_richcompare */
269 0, /* tp_weaklistoffset */
270 0, /* tp_iter */
271 0, /* tp_iternext */
272 0, /* tp_methods */
273 code_memberlist, /* tp_members */
274 0, /* tp_getset */
275 0, /* tp_base */
276 0, /* tp_dict */
277 0, /* tp_descr_get */
278 0, /* tp_descr_set */
279 0, /* tp_dictoffset */
280 0, /* tp_init */
281 0, /* tp_alloc */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000282 code_new, /* tp_new */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000283};
284
Guido van Rossum644a12b1997-04-09 19:24:53 +0000285#define NAME_CHARS \
286 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
287
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000288/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
289
290static int
291all_name_chars(unsigned char *s)
292{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000293 static char ok_name_char[256];
294 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000295
Guido van Rossumcd90c202001-02-09 15:06:42 +0000296 if (ok_name_char[*name_chars] == 0) {
297 unsigned char *p;
298 for (p = name_chars; *p; p++)
299 ok_name_char[*p] = 1;
300 }
301 while (*s) {
302 if (ok_name_char[*s++] == 0)
303 return 0;
304 }
305 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000306}
307
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000308static int
309intern_strings(PyObject *tuple)
310{
311 int i;
312
313 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
314 PyObject *v = PyTuple_GET_ITEM(tuple, i);
315 if (v == NULL || !PyString_Check(v)) {
316 Py_FatalError("non-string found in code slot");
317 PyErr_BadInternalCall();
318 return -1;
319 }
320 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
321 }
322 return 0;
323}
324
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000325#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
326#define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD)
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000327#define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE || op==CONTINUE_LOOP)
328#define GETJUMPTGT(arr, i) (GETARG(arr,i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+3))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000329#define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000330#define CODESIZE(op) (HAS_ARG(op) ? 3 : 1)
331#define ISBASICBLOCK(blocks, start, bytes) (blocks[start]==blocks[start+bytes-1])
332
333static unsigned int *
334markblocks(unsigned char *code, int len)
335{
336 unsigned int *blocks = PyMem_Malloc(len*sizeof(int));
337 int i,j, opcode, oldblock, newblock, blockcnt = 0;
338
339 if (blocks == NULL)
340 return NULL;
341 memset(blocks, 0, len*sizeof(int));
342 for (i=0 ; i<len ; i+=CODESIZE(opcode)) {
343 opcode = code[i];
344 switch (opcode) {
345 case FOR_ITER:
346 case JUMP_FORWARD:
347 case JUMP_IF_FALSE:
348 case JUMP_IF_TRUE:
349 case JUMP_ABSOLUTE:
350 case CONTINUE_LOOP:
351 case SETUP_LOOP:
352 case SETUP_EXCEPT:
353 case SETUP_FINALLY:
354 j = GETJUMPTGT(code, i);
355 oldblock = blocks[j];
356 newblock = ++blockcnt;
357 for (; j<len ; j++) {
358 if (blocks[j] != (unsigned)oldblock)
359 break;
360 blocks[j] = newblock;
361 }
362 break;
363 }
364 }
365 return blocks;
366}
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000367
368static PyObject *
369optimize_code(PyObject *code, PyObject* consts)
370{
371 int i, j, codelen;
372 int tgt, tgttgt, opcode;
373 unsigned char *codestr;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000374 unsigned int *blocks;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000375
376 /* Make a modifiable copy of the code string */
377 if (!PyString_Check(code))
378 goto exitUnchanged;
379 codelen = PyString_Size(code);
380 codestr = PyMem_Malloc(codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000381 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000382 goto exitUnchanged;
383 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000384 blocks = markblocks(codestr, codelen);
385 if (blocks == NULL) {
386 PyMem_Free(codestr);
387 goto exitUnchanged;
388 }
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000389 assert(PyTuple_Check(consts));
390
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000391 for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000392 opcode = codestr[i];
393 switch (opcode) {
394
395 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP.
396 Note, only the first opcode is changed, the others still
397 perform normally if they happen to be jump targets. */
398 case LOAD_CONST:
399 j = GETARG(codestr, i);
400 if (codestr[i+3] != JUMP_IF_FALSE ||
401 codestr[i+6] != POP_TOP ||
402 !PyObject_IsTrue(PyTuple_GET_ITEM(consts, j)))
403 continue;
404 codestr[i] = JUMP_FORWARD;
405 SETARG(codestr, i, 4);
406 break;
407
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000408 /* Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2 JMP+2 NOP NOP.
409 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2 JMP+1 NOP. */
410 case BUILD_TUPLE:
411 case BUILD_LIST:
412 if (codestr[i+3] != UNPACK_SEQUENCE)
413 continue;
414 if (!ISBASICBLOCK(blocks,i,6))
415 continue;
416 if (GETARG(codestr, i) == 2 && \
417 GETARG(codestr, i+3) == 2) {
418 codestr[i] = ROT_TWO;
419 codestr[i+1] = JUMP_FORWARD;
420 SETARG(codestr, i+1, 2);
421 codestr[i+4] = DUP_TOP; /* Filler codes used as NOPs */
422 codestr[i+5] = POP_TOP;
423 continue;
424 }
425 if (GETARG(codestr, i) == 3 && \
426 GETARG(codestr, i+3) == 3) {
427 codestr[i] = ROT_THREE;
428 codestr[i+1] = ROT_TWO;
429 codestr[i+2] = JUMP_FORWARD;
430 SETARG(codestr, i+2, 1);
431 codestr[i+5] = DUP_TOP;
432 }
433 break;
434
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000435 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000436 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000437 case JUMP_FORWARD:
438 case JUMP_IF_FALSE:
439 case JUMP_IF_TRUE:
440 case JUMP_ABSOLUTE:
441 case CONTINUE_LOOP:
442 case SETUP_LOOP:
443 case SETUP_EXCEPT:
444 case SETUP_FINALLY:
445 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000446 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000447 continue;
448 tgttgt = GETJUMPTGT(codestr, tgt);
449 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
450 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000451 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000452 tgttgt -= i + 3; /* Calc relative jump addr */
453 if (tgttgt < 0) /* No backward relative jumps */
454 continue;
455 codestr[i] = opcode;
456 SETARG(codestr, i, tgttgt);
457 break;
458
459 case EXTENDED_ARG:
460 PyMem_Free(codestr);
461 goto exitUnchanged;
462 }
463 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000464 code = PyString_FromStringAndSize((char *)codestr, codelen);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000465 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000466 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000467 return code;
468
469exitUnchanged:
470 Py_INCREF(code);
471 return code;
472}
473
Guido van Rossum79f25d91997-04-29 20:08:16 +0000474PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000475PyCode_New(int argcount, int nlocals, int stacksize, int flags,
476 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000477 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
478 PyObject *filename, PyObject *name, int firstlineno,
479 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000480{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000481 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000482 int i;
483 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000484 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000485 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000486 consts == NULL || !PyTuple_Check(consts) ||
487 names == NULL || !PyTuple_Check(names) ||
488 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000489 freevars == NULL || !PyTuple_Check(freevars) ||
490 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000491 name == NULL || !PyString_Check(name) ||
492 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000493 lnotab == NULL || !PyString_Check(lnotab) ||
494 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000495 PyErr_BadInternalCall();
496 return NULL;
497 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000498 intern_strings(names);
499 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000500 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000501 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000502 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000503 for (i = PyTuple_Size(consts); --i >= 0; ) {
504 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000505 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000506 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000507 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000508 continue;
509 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000510 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000511 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000512 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000513 co->co_argcount = argcount;
514 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000515 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000516 co->co_flags = flags;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000517 co->co_code = optimize_code(code, consts);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000518 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000519 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000520 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000521 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000522 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000523 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000524 Py_INCREF(freevars);
525 co->co_freevars = freevars;
526 Py_INCREF(cellvars);
527 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000528 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000529 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000530 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000531 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000532 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000533 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000534 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000535 if (PyTuple_GET_SIZE(freevars) == 0 &&
536 PyTuple_GET_SIZE(cellvars) == 0)
537 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000538 }
539 return co;
540}
541
542
543/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000544
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000545/* The compiler uses two passes to generate bytecodes. The first pass
546 builds the symbol table. The second pass generates the bytecode.
547
548 The first pass uses a single symtable struct. The second pass uses
549 a compiling struct for each code block. The compiling structs
550 share a reference to the symtable.
551
552 The two passes communicate via symtable_load_symbols() and via
553 is_local() and is_global(). The former initializes several slots
554 in the compiling struct: c_varnames, c_locals, c_nlocals,
555 c_argcount, c_globals, and c_flags.
556*/
557
Tim Peters2a7f3842001-06-09 09:26:21 +0000558/* All about c_lnotab.
559
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000560c_lnotab is an array of unsigned bytes disguised as a Python string. Since
561version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
562mapped to source code line #s via c_lnotab instead.
563
Tim Peters2a7f3842001-06-09 09:26:21 +0000564The array is conceptually a list of
565 (bytecode offset increment, line number increment)
566pairs. The details are important and delicate, best illustrated by example:
567
568 byte code offset source code line number
569 0 1
570 6 2
571 50 7
572 350 307
573 361 308
574
575The first trick is that these numbers aren't stored, only the increments
576from one row to the next (this doesn't really work, but it's a start):
577
578 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
579
580The second trick is that an unsigned byte can't hold negative values, or
581values larger than 255, so (a) there's a deep assumption that byte code
582offsets and their corresponding line #s both increase monotonically, and (b)
583if at least one column jumps by more than 255 from one row to the next, more
584than one pair is written to the table. In case #b, there's no way to know
585from looking at the table later how many were written. That's the delicate
586part. A user of c_lnotab desiring to find the source line number
587corresponding to a bytecode address A should do something like this
588
589 lineno = addr = 0
590 for addr_incr, line_incr in c_lnotab:
591 addr += addr_incr
592 if addr > A:
593 return lineno
594 lineno += line_incr
595
596In order for this to work, when the addr field increments by more than 255,
597the line # increment in each pair generated must be 0 until the remaining addr
598increment is < 256. So, in the example above, com_set_lineno should not (as
599was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
600255, 0, 45, 255, 0, 45.
601*/
602
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000603struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000604 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000605 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000606 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000607 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000608 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +0000609 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000610 PyObject *c_locals; /* dictionary (value=localID) */
611 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000612 PyObject *c_freevars; /* dictionary (value=None) */
613 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000614 int c_nlocals; /* index of next local */
615 int c_argcount; /* number of top-level arguments */
616 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000617 int c_nexti; /* index into c_code */
618 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000619 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000620 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000621 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000622 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000623 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000624 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +0000625 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000626 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000627 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000628 int c_stacklevel; /* Current stack level */
629 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000630 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000631 PyObject *c_lnotab; /* Table mapping address to line number */
Armin Rigo80d937e2004-03-22 17:52:53 +0000632 int c_last_addr; /* last op addr seen and recorded in lnotab */
633 int c_last_line; /* last line seen and recorded in lnotab */
634 int c_lnotab_next; /* current length of lnotab */
635 int c_lnotab_last; /* start of last lnotab record added */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000636 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000637 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000638 int c_nested; /* Is block nested funcdef or lamdef? */
639 int c_closure; /* Is nested w/freevars? */
640 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000641 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000642 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000643};
644
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000645static int
646is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000647{
648 if ((v & (USE | DEF_FREE))
649 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
650 return 1;
651 if (v & DEF_FREE_CLASS)
652 return 1;
653 return 0;
654}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000655
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000656static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000657com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000658{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000659 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
660
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000661 if (c == NULL) {
662 /* Error occurred via symtable call to
663 is_constant_false */
664 PyErr_SetString(exc, msg);
665 return;
666 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000667 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000668 if (c->c_lineno < 1 || c->c_interactive) {
669 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000670 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000671 return;
672 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000673 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000674 if (v == NULL)
675 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000676
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000677 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000678 if (line == NULL) {
679 Py_INCREF(Py_None);
680 line = Py_None;
681 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000682 if (exc == PyExc_SyntaxError) {
683 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
684 Py_None, line);
685 if (t == NULL)
686 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000687 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000688 if (w == NULL)
689 goto exit;
690 PyErr_SetObject(exc, w);
691 } else {
692 /* Make sure additional exceptions are printed with
693 file and line, also. */
694 PyErr_SetObject(exc, v);
695 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
696 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000697 exit:
698 Py_XDECREF(t);
699 Py_XDECREF(v);
700 Py_XDECREF(w);
701 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000702}
703
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000704/* Interface to the block stack */
705
706static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000707block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000708{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000709 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000710 com_error(c, PyExc_SystemError,
711 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000712 }
713 else {
714 c->c_block[c->c_nblocks++] = type;
715 }
716}
717
718static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000719block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000720{
721 if (c->c_nblocks > 0)
722 c->c_nblocks--;
723 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000724 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000725 }
726}
727
Guido van Rossum681d79a1995-07-18 14:51:37 +0000728/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000729
Martin v. Löwis95292d62002-12-11 14:04:59 +0000730static int issue_warning(const char *, const char *, int);
731static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000732static void com_free(struct compiling *);
733static void com_push(struct compiling *, int);
734static void com_pop(struct compiling *, int);
735static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000736static void com_node(struct compiling *, node *);
737static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000738static void com_addbyte(struct compiling *, int);
739static void com_addint(struct compiling *, int);
740static void com_addoparg(struct compiling *, int, int);
741static void com_addfwref(struct compiling *, int, int *);
742static void com_backpatch(struct compiling *, int);
743static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
744static int com_addconst(struct compiling *, PyObject *);
745static int com_addname(struct compiling *, PyObject *);
746static void com_addopname(struct compiling *, int, node *);
747static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000748static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000749static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000750static void com_assign(struct compiling *, node *, int, node *);
751static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000752static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +0000753static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000754 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000755static PyObject *parsestrplus(struct compiling*, node *);
756static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000757static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000758
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000759static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000760
761/* symtable operations */
Jeremy Hylton1955fcf2003-07-15 20:23:26 +0000762static struct symtable *symtable_build(node *, PyFutureFeatures *,
763 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000764static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000765static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000766static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000767static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000768static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000769static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000770
771static void symtable_node(struct symtable *, node *);
772static void symtable_funcdef(struct symtable *, node *);
773static void symtable_default_args(struct symtable *, node *);
774static void symtable_params(struct symtable *, node *);
775static void symtable_params_fplist(struct symtable *, node *n);
776static void symtable_global(struct symtable *, node *);
777static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000778static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000779static void symtable_list_comprehension(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +0000780static void symtable_list_for(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000781
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000782static int symtable_update_free_vars(struct symtable *);
783static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
784static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
785
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000786/* helper */
787static void
788do_pad(int pad)
789{
790 int i;
791 for (i = 0; i < pad; ++i)
792 fprintf(stderr, " ");
793}
794
795static void
796dump(node *n, int pad, int depth)
797{
798 int i;
799 if (depth == 0)
800 return;
801 do_pad(pad);
802 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
803 if (depth > 0)
804 depth--;
805 for (i = 0; i < NCH(n); ++i)
806 dump(CHILD(n, i), pad + 1, depth);
807}
808
809#define DUMP(N) dump(N, 0, -1)
810
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000811static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000812com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000813{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000814 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000815 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
816 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000817 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000818 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000819 goto fail;
820 if ((c->c_const_dict = PyDict_New()) == NULL)
821 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000822 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000823 goto fail;
824 if ((c->c_name_dict = PyDict_New()) == NULL)
825 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000826 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000827 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000828 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
829 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000830 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000831 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000832 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000833 c->c_freevars = NULL;
834 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000835 c->c_nlocals = 0;
836 c->c_argcount = 0;
837 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000838 c->c_nexti = 0;
839 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000840 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000841 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000842 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000843 c->c_begin = 0;
844 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000845 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000846 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000847 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000848 c->c_stacklevel = 0;
849 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000850 c->c_firstlineno = 0;
851 c->c_last_addr = 0;
852 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000853 c->c_lnotab_next = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +0000854 c->c_lnotab_last = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000855 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000856 c->c_nested = 0;
857 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000858 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000859 return 1;
860
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000861 fail:
862 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000863 return 0;
864}
865
866static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000867com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000868{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000869 Py_XDECREF(c->c_code);
870 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000871 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000872 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000873 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000874 Py_XDECREF(c->c_globals);
875 Py_XDECREF(c->c_locals);
876 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000877 Py_XDECREF(c->c_freevars);
878 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000879 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000880 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +0000881 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000882}
883
884static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000885com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000886{
887 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000888 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +0000889 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000890 /*
891 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
892 c->c_filename, c->c_name, c->c_lineno,
893 c->c_nexti, c->c_stacklevel, n);
894 */
895 }
Guido van Rossum8b993a91997-01-17 21:04:03 +0000896}
897
898static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000899com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000900{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000901 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000902 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000903 else
904 c->c_stacklevel -= n;
905}
906
907static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000908com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000909{
910 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000911 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000912 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000913 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000914}
915
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000916static int
917com_check_size(PyObject **s, int offset)
918{
919 int len = PyString_GET_SIZE(*s);
920 if (offset >= len)
921 return _PyString_Resize(s, len * 2);
922 return 0;
923}
924
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000925static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000926com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000927{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000928 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000929 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +0000930 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000931 if (com_check_size(&c->c_code, c->c_nexti)) {
932 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000933 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000934 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000935 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000936}
937
938static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000939com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000940{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000941 com_addbyte(c, x & 0xff);
942 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000943}
944
945static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000946com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000947{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000948 char *p;
949 if (c->c_lnotab == NULL)
950 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000951 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
952 c->c_errors++;
953 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000954 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000955 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000956 *p++ = addr;
957 *p++ = line;
958 c->c_lnotab_next += 2;
959}
960
961static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000962com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000963{
964 c->c_lineno = lineno;
965 if (c->c_firstlineno == 0) {
966 c->c_firstlineno = c->c_last_line = lineno;
967 }
968 else {
969 int incr_addr = c->c_nexti - c->c_last_addr;
970 int incr_line = lineno - c->c_last_line;
Armin Rigo80d937e2004-03-22 17:52:53 +0000971 c->c_lnotab_last = c->c_lnotab_next;
Tim Peters2a7f3842001-06-09 09:26:21 +0000972 while (incr_addr > 255) {
973 com_add_lnotab(c, 255, 0);
974 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000975 }
Tim Peters2a7f3842001-06-09 09:26:21 +0000976 while (incr_line > 255) {
977 com_add_lnotab(c, incr_addr, 255);
978 incr_line -=255;
979 incr_addr = 0;
980 }
981 if (incr_addr > 0 || incr_line > 0)
982 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000983 c->c_last_addr = c->c_nexti;
984 c->c_last_line = lineno;
985 }
986}
987
988static void
Armin Rigo80d937e2004-03-22 17:52:53 +0000989com_strip_lnotab(struct compiling *c)
990{
991 /* strip the last lnotab entry if no opcode were emitted.
992 * This prevents a line number to be generated on a final
993 * pass, like in the following example:
994 *
995 * if a:
996 * print 5
997 * else:
998 * pass
999 *
1000 * Without the fix, a line trace event would be generated
1001 * on the pass even if a is true (because of the implicit
1002 * return).
1003 */
1004 if (c->c_nexti == c->c_last_addr && c->c_lnotab_last > 0) {
1005 c->c_lnotab_next = c->c_lnotab_last;
1006 }
1007}
1008
1009static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001010com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001011{
Fred Drakeef8ace32000-08-24 00:32:09 +00001012 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +00001013 if (extended_arg){
1014 com_addbyte(c, EXTENDED_ARG);
1015 com_addint(c, extended_arg);
1016 arg &= 0xffff;
1017 }
Guido van Rossum8e793d91997-03-03 19:13:14 +00001018 com_addbyte(c, op);
1019 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001020}
1021
1022static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001023com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001024{
1025 /* Compile a forward reference for backpatching */
1026 int here;
1027 int anchor;
1028 com_addbyte(c, op);
1029 here = c->c_nexti;
1030 anchor = *p_anchor;
1031 *p_anchor = here;
1032 com_addint(c, anchor == 0 ? 0 : here - anchor);
1033}
1034
1035static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001036com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001037{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001038 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001039 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001040 int dist;
1041 int prev;
1042 for (;;) {
1043 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001044 prev = code[anchor] + (code[anchor+1] << 8);
1045 dist = target - (anchor+2);
1046 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001047 dist >>= 8;
1048 code[anchor+1] = dist;
1049 dist >>= 8;
1050 if (dist) {
1051 com_error(c, PyExc_SystemError,
1052 "com_backpatch: offset too large");
1053 break;
1054 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001055 if (!prev)
1056 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001057 anchor -= prev;
1058 }
1059}
1060
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001061/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001062
1063static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001064com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001065{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001066 PyObject *w, *t, *np=NULL;
1067 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001068
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001069 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001070 if (t == NULL)
1071 goto fail;
1072 w = PyDict_GetItem(dict, t);
1073 if (w != NULL) {
1074 n = PyInt_AsLong(w);
1075 } else {
1076 n = PyList_Size(list);
1077 np = PyInt_FromLong(n);
1078 if (np == NULL)
1079 goto fail;
1080 if (PyList_Append(list, v) != 0)
1081 goto fail;
1082 if (PyDict_SetItem(dict, t, np) != 0)
1083 goto fail;
1084 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001085 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001086 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001087 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001088 fail:
1089 Py_XDECREF(np);
1090 Py_XDECREF(t);
1091 c->c_errors++;
1092 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001093}
1094
1095static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001096com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001097{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001098 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001099}
1100
1101static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001102com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001103{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001104 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001105}
1106
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001107int
1108_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001109{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001110 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001111 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001112 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001113 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1114 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001115 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001116 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001117 return 0; /* Don't mangle __extremely_long_names */
1118 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1119 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001120 /* Strip leading underscores from class name */
1121 while (*p == '_')
1122 p++;
1123 if (*p == '\0')
1124 return 0; /* Don't mangle if class is just underscores */
1125 plen = strlen(p);
1126 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001127 plen = maxlen-nlen-2; /* Truncate class name if too long */
1128 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001129 buffer[0] = '_';
1130 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001131 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001132 return 1;
1133}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001134
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001135static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001136com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001137{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001138 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001139 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001140 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001141
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001142 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001143 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001144 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001145 c->c_errors++;
1146 i = 255;
1147 }
1148 else {
1149 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001150 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001151 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001152 com_addoparg(c, op, i);
1153}
1154
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001155#define NAME_LOCAL 0
1156#define NAME_GLOBAL 1
1157#define NAME_DEFAULT 2
1158#define NAME_CLOSURE 3
1159
1160static int
1161com_lookup_arg(PyObject *dict, PyObject *name)
1162{
1163 PyObject *v = PyDict_GetItem(dict, name);
1164 if (v == NULL)
1165 return -1;
1166 else
1167 return PyInt_AS_LONG(v);
1168}
1169
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001170static int
1171none_assignment_check(struct compiling *c, char *name, int assigning)
1172{
1173 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1174 char *msg;
1175 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001176 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001177 else
1178 msg = "deleting None";
1179 if (issue_warning(msg, c->c_filename, c->c_lineno) < 0) {
1180 c->c_errors++;
1181 return -1;
1182 }
1183 }
1184 return 0;
1185}
1186
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001187static void
1188com_addop_varname(struct compiling *c, int kind, char *name)
1189{
1190 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001191 int i, reftype;
1192 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001193 int op = STOP_CODE;
1194 char buffer[MANGLE_LEN];
1195
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001196 if (kind != VAR_LOAD &&
1197 none_assignment_check(c, name, kind == VAR_STORE))
1198 {
1199 c->c_errors++;
1200 i = 255;
1201 goto done;
1202 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001203 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001204 name = buffer;
1205 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1206 c->c_errors++;
1207 i = 255;
1208 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001209 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001210
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001211 reftype = get_ref_type(c, name);
1212 switch (reftype) {
1213 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001214 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001215 scope = NAME_LOCAL;
1216 break;
1217 case GLOBAL_EXPLICIT:
1218 scope = NAME_GLOBAL;
1219 break;
1220 case GLOBAL_IMPLICIT:
1221 if (c->c_flags & CO_OPTIMIZED)
1222 scope = NAME_GLOBAL;
1223 break;
1224 case FREE:
1225 case CELL:
1226 scope = NAME_CLOSURE;
1227 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001228 }
1229
1230 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001231 if (scope == NAME_LOCAL)
1232 i = com_lookup_arg(c->c_locals, v);
1233 else if (reftype == FREE)
1234 i = com_lookup_arg(c->c_freevars, v);
1235 else if (reftype == CELL)
1236 i = com_lookup_arg(c->c_cellvars, v);
1237 if (i == -1) {
1238 c->c_errors++; /* XXX no exception set */
1239 i = 255;
1240 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001241 }
1242 Py_DECREF(v);
1243
1244 switch (kind) {
1245 case VAR_LOAD:
1246 switch (scope) {
1247 case NAME_LOCAL:
1248 op = LOAD_FAST;
1249 break;
1250 case NAME_GLOBAL:
1251 op = LOAD_GLOBAL;
1252 break;
1253 case NAME_DEFAULT:
1254 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001255 break;
1256 case NAME_CLOSURE:
1257 op = LOAD_DEREF;
1258 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001259 }
1260 break;
1261 case VAR_STORE:
1262 switch (scope) {
1263 case NAME_LOCAL:
1264 op = STORE_FAST;
1265 break;
1266 case NAME_GLOBAL:
1267 op = STORE_GLOBAL;
1268 break;
1269 case NAME_DEFAULT:
1270 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001271 break;
1272 case NAME_CLOSURE:
1273 op = STORE_DEREF;
1274 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001275 }
1276 break;
1277 case VAR_DELETE:
1278 switch (scope) {
1279 case NAME_LOCAL:
1280 op = DELETE_FAST;
1281 break;
1282 case NAME_GLOBAL:
1283 op = DELETE_GLOBAL;
1284 break;
1285 case NAME_DEFAULT:
1286 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001287 break;
1288 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001289 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001290 PyOS_snprintf(buf, sizeof(buf),
1291 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001292 com_error(c, PyExc_SyntaxError, buf);
1293 i = 255;
1294 break;
1295 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001296 }
1297 break;
1298 }
1299done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001300 com_addoparg(c, op, i);
1301}
1302
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001303static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001304com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001305{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001306 char *name;
1307 char buffer[1000];
1308 /* XXX it is possible to write this code without the 1000
1309 chars on the total length of dotted names, I just can't be
1310 bothered right now */
1311 if (TYPE(n) == STAR)
1312 name = "*";
1313 else if (TYPE(n) == dotted_name) {
1314 char *p = buffer;
1315 int i;
1316 name = buffer;
1317 for (i = 0; i < NCH(n); i += 2) {
1318 char *s = STR(CHILD(n, i));
1319 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001320 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001321 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001322 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001323 break;
1324 }
1325 if (p != buffer)
1326 *p++ = '.';
1327 strcpy(p, s);
1328 p = strchr(p, '\0');
1329 }
1330 }
1331 else {
1332 REQ(n, NAME);
1333 name = STR(n);
1334 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001335 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001336}
1337
Guido van Rossum79f25d91997-04-29 20:08:16 +00001338static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001339parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001340{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001341 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001342 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001343 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001344#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001345 int imflag;
1346#endif
1347
Guido van Rossum282914b1991-04-04 10:42:56 +00001348 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001349 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001350#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001351 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001352#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001353 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001354 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001355 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001356 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001357 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001358 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001359 }
1360 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001361 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001362 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001363 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001364 if (errno != 0)
1365 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001366 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001367 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001368 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001369#ifndef WITHOUT_COMPLEX
1370 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001371 Py_complex z;
1372 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001373 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001374 z.imag = atof(s);
1375 PyFPE_END_PROTECT(z)
1376 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001377 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001378 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001379#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001380 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001381 PyFPE_START_PROTECT("atof", return 0)
1382 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001383 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001384 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001385 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001386}
1387
Guido van Rossum79f25d91997-04-29 20:08:16 +00001388static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001389decode_utf8(char **sPtr, char *end, char* encoding)
1390{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001391#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001392 Py_FatalError("decode_utf8 should not be called in this build.");
1393 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001394#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001395 PyObject *u, *v;
1396 char *s, *t;
1397 t = s = *sPtr;
1398 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1399 while (s < end && (*s & 0x80)) s++;
1400 *sPtr = s;
1401 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1402 if (u == NULL)
1403 return NULL;
1404 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1405 Py_DECREF(u);
1406 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001407#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001408}
1409
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001410/* compiler.transformer.Transformer.decode_literal depends on what
1411 might seem like minor details of this function -- changes here
1412 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001413static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001414parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001415{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001416 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001417 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001418 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001419 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001420 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001421 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001422 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001423
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001424 if (isalpha(quote) || quote == '_') {
1425 if (quote == 'u' || quote == 'U') {
1426 quote = *++s;
1427 unicode = 1;
1428 }
1429 if (quote == 'r' || quote == 'R') {
1430 quote = *++s;
1431 rawmode = 1;
1432 }
1433 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001434 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001435 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001436 return NULL;
1437 }
1438 s++;
1439 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001440 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001441 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001442 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001443 return NULL;
1444 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001445 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001446 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001447 return NULL;
1448 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001449 if (len >= 4 && s[0] == quote && s[1] == quote) {
1450 s += 2;
1451 len -= 2;
1452 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001453 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001454 return NULL;
1455 }
1456 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001457#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001458 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001459 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001460 char *buf;
1461 char *p;
1462 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001463 if (encoding == NULL) {
1464 buf = s;
1465 u = NULL;
1466 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1467 buf = s;
1468 u = NULL;
1469 } else {
1470 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1471 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1472 if (u == NULL)
1473 return NULL;
1474 p = buf = PyString_AsString(u);
1475 end = s + len;
1476 while (s < end) {
1477 if (*s == '\\') {
1478 *p++ = *s++;
1479 if (*s & 0x80) {
1480 strcpy(p, "u005c");
1481 p += 5;
1482 }
1483 }
1484 if (*s & 0x80) { /* XXX inefficient */
1485 char *r;
1486 int rn, i;
1487 w = decode_utf8(&s, end, "utf-16-be");
1488 if (w == NULL) {
1489 Py_DECREF(u);
1490 return NULL;
1491 }
1492 r = PyString_AsString(w);
1493 rn = PyString_Size(w);
1494 assert(rn % 2 == 0);
1495 for (i = 0; i < rn; i += 2) {
1496 sprintf(p, "\\u%02x%02x",
1497 r[i + 0] & 0xFF,
1498 r[i + 1] & 0xFF);
1499 p += 6;
1500 }
1501 Py_DECREF(w);
1502 } else {
1503 *p++ = *s++;
1504 }
1505 }
1506 len = p - buf;
1507 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001508 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001509 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001510 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001511 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1512 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001513 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001514 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001515 return v;
1516
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001517 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001518#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001519 need_encoding = (encoding != NULL &&
1520 strcmp(encoding, "utf-8") != 0 &&
1521 strcmp(encoding, "iso-8859-1") != 0);
1522 if (rawmode || strchr(s, '\\') == NULL) {
1523 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001524#ifndef Py_USING_UNICODE
1525 /* This should not happen - we never see any other
1526 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001527 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001528#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001529 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1530 if (u == NULL)
1531 return NULL;
1532 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1533 Py_DECREF(u);
1534 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001535#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001536 } else {
1537 return PyString_FromStringAndSize(s, len);
1538 }
1539 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001540
1541 v = PyString_DecodeEscape(s, len, NULL, unicode,
1542 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001543 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001544 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001545 return v;
1546}
1547
Guido van Rossum79f25d91997-04-29 20:08:16 +00001548static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001549parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001550{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001551 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001552 int i;
1553 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001554 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001555 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001556 for (i = 1; i < NCH(n); i++) {
1557 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001558 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001559 if (s == NULL)
1560 goto onError;
1561 if (PyString_Check(v) && PyString_Check(s)) {
1562 PyString_ConcatAndDel(&v, s);
1563 if (v == NULL)
1564 goto onError;
1565 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001566#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001567 else {
1568 PyObject *temp;
1569 temp = PyUnicode_Concat(v, s);
1570 Py_DECREF(s);
1571 if (temp == NULL)
1572 goto onError;
1573 Py_DECREF(v);
1574 v = temp;
1575 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001576#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001577 }
1578 }
1579 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001580
1581 onError:
1582 Py_XDECREF(v);
1583 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001584}
1585
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001586static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001587com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001588{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001589 int anchor = 0;
1590 int save_begin = c->c_begin;
1591
1592 /* list_iter: for v in expr [list_iter] */
1593 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001594 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001595 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001596 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001597 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001598 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001599 c->c_loops++;
1600 com_list_iter(c, n, e, t);
1601 c->c_loops--;
1602 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1603 c->c_begin = save_begin;
1604 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001605 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001606}
1607
1608static void
1609com_list_if(struct compiling *c, node *n, node *e, char *t)
1610{
1611 int anchor = 0;
1612 int a = 0;
1613 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001614 com_node(c, CHILD(n, 1));
1615 com_addfwref(c, JUMP_IF_FALSE, &a);
1616 com_addbyte(c, POP_TOP);
1617 com_pop(c, 1);
1618 com_list_iter(c, n, e, t);
1619 com_addfwref(c, JUMP_FORWARD, &anchor);
1620 com_backpatch(c, a);
1621 /* We jump here with an extra entry which we now pop */
1622 com_addbyte(c, POP_TOP);
1623 com_backpatch(c, anchor);
1624}
1625
1626static void
1627com_list_iter(struct compiling *c,
1628 node *p, /* parent of list_iter node */
1629 node *e, /* element expression node */
1630 char *t /* name of result list temp local */)
1631{
1632 /* list_iter is the last child in a listmaker, list_for, or list_if */
1633 node *n = CHILD(p, NCH(p)-1);
1634 if (TYPE(n) == list_iter) {
1635 n = CHILD(n, 0);
1636 switch (TYPE(n)) {
1637 case list_for:
1638 com_list_for(c, n, e, t);
1639 break;
1640 case list_if:
1641 com_list_if(c, n, e, t);
1642 break;
1643 default:
1644 com_error(c, PyExc_SystemError,
1645 "invalid list_iter node type");
1646 }
1647 }
1648 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001649 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001650 com_push(c, 1);
1651 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001652 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001653 com_pop(c, 2);
1654 }
1655}
1656
1657static void
1658com_list_comprehension(struct compiling *c, node *n)
1659{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001660 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001661 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001662
1663 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001664 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001665 com_addoparg(c, BUILD_LIST, 0);
1666 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1667 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001668 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001669 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001670 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001671 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001672 --c->c_tmpname;
1673}
1674
1675static void
1676com_listmaker(struct compiling *c, node *n)
1677{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001678 /* listmaker: test ( list_for | (',' test)* [','] ) */
1679 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001680 com_list_comprehension(c, n);
1681 else {
1682 int len = 0;
1683 int i;
1684 for (i = 0; i < NCH(n); i += 2, len++)
1685 com_node(c, CHILD(n, i));
1686 com_addoparg(c, BUILD_LIST, len);
1687 com_pop(c, len-1);
1688 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001689}
1690
1691static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001692com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001693{
1694 int i;
1695 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1696 for (i = 0; i+2 < NCH(n); i += 4) {
1697 /* We must arrange things just right for STORE_SUBSCR.
1698 It wants the stack to look like (value) (dict) (key) */
1699 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001700 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001701 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00001702 com_node(c, CHILD(n, i+2)); /* value */
1703 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001704 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001705 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001706 }
1707}
1708
1709static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001710com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001711{
1712 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001713 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001714 int i;
1715 REQ(n, atom);
1716 ch = CHILD(n, 0);
1717 switch (TYPE(ch)) {
1718 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001719 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001720 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001721 com_push(c, 1);
1722 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001723 else
1724 com_node(c, CHILD(n, 1));
1725 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001726 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001727 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001728 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001729 com_push(c, 1);
1730 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001731 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001732 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001733 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001734 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001735 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001736 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001737 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001738 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001739 break;
1740 case BACKQUOTE:
1741 com_node(c, CHILD(n, 1));
1742 com_addbyte(c, UNARY_CONVERT);
1743 break;
1744 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001745 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001746 i = 255;
1747 }
1748 else {
1749 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001750 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001751 }
1752 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001753 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001754 break;
1755 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001756 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001757 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001758 c->c_errors++;
1759 i = 255;
1760 }
1761 else {
1762 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001763 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001764 }
1765 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001766 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001767 break;
1768 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001769 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001770 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001771 break;
1772 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001773 com_error(c, PyExc_SystemError,
1774 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001775 }
1776}
1777
1778static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001779com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001780{
1781 if (NCH(n) == 1) {
1782 com_addbyte(c, op);
1783 }
1784 else if (NCH(n) == 2) {
1785 if (TYPE(CHILD(n, 0)) != COLON) {
1786 com_node(c, CHILD(n, 0));
1787 com_addbyte(c, op+1);
1788 }
1789 else {
1790 com_node(c, CHILD(n, 1));
1791 com_addbyte(c, op+2);
1792 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001793 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001794 }
1795 else {
1796 com_node(c, CHILD(n, 0));
1797 com_node(c, CHILD(n, 2));
1798 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001799 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001800 }
1801}
1802
Guido van Rossum635abd21997-01-06 22:56:52 +00001803static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001804com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1805{
1806 if (NCH(n) == 1) {
1807 com_addbyte(c, DUP_TOP);
1808 com_push(c, 1);
1809 com_addbyte(c, SLICE);
1810 com_node(c, augn);
1811 com_addbyte(c, opcode);
1812 com_pop(c, 1);
1813 com_addbyte(c, ROT_TWO);
1814 com_addbyte(c, STORE_SLICE);
1815 com_pop(c, 2);
1816 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1817 com_node(c, CHILD(n, 0));
1818 com_addoparg(c, DUP_TOPX, 2);
1819 com_push(c, 2);
1820 com_addbyte(c, SLICE+1);
1821 com_pop(c, 1);
1822 com_node(c, augn);
1823 com_addbyte(c, opcode);
1824 com_pop(c, 1);
1825 com_addbyte(c, ROT_THREE);
1826 com_addbyte(c, STORE_SLICE+1);
1827 com_pop(c, 3);
1828 } else if (NCH(n) == 2) {
1829 com_node(c, CHILD(n, 1));
1830 com_addoparg(c, DUP_TOPX, 2);
1831 com_push(c, 2);
1832 com_addbyte(c, SLICE+2);
1833 com_pop(c, 1);
1834 com_node(c, augn);
1835 com_addbyte(c, opcode);
1836 com_pop(c, 1);
1837 com_addbyte(c, ROT_THREE);
1838 com_addbyte(c, STORE_SLICE+2);
1839 com_pop(c, 3);
1840 } else {
1841 com_node(c, CHILD(n, 0));
1842 com_node(c, CHILD(n, 2));
1843 com_addoparg(c, DUP_TOPX, 3);
1844 com_push(c, 3);
1845 com_addbyte(c, SLICE+3);
1846 com_pop(c, 2);
1847 com_node(c, augn);
1848 com_addbyte(c, opcode);
1849 com_pop(c, 1);
1850 com_addbyte(c, ROT_FOUR);
1851 com_addbyte(c, STORE_SLICE+3);
1852 com_pop(c, 4);
1853 }
1854}
1855
1856static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001857com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001858{
1859 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001860 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001861 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001862 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001863 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001864 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001865 }
1866 else {
1867 com_node(c, CHILD(n, 0));
1868 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001869 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001870 }
1871 m = n;
1872 do {
1873 m = CHILD(m, 0);
1874 } while (NCH(m) == 1);
1875 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001876 /* f(lambda x: x[0] = 3) ends up getting parsed with
1877 * LHS test = lambda x: x[0], and RHS test = 3.
1878 * SF bug 132313 points out that complaining about a keyword
1879 * then is very confusing.
1880 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001881 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001882 TYPE(m) == lambdef ?
1883 "lambda cannot contain assignment" :
1884 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001885 }
1886 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001887 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00001888 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00001889 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001890 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001891 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001892 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001893 else if (*pkeywords == NULL) {
1894 c->c_errors++;
1895 Py_DECREF(v);
1896 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001897 if (PyDict_GetItem(*pkeywords, v) != NULL)
1898 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001899 "duplicate keyword argument");
1900 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001901 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001902 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001903 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001904 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001905 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001906 }
1907 }
1908 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001909}
1910
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001911static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001912com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001913{
1914 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001915 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001916 }
1917 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001918 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001919 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001920 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001921 int star_flag = 0;
1922 int starstar_flag = 0;
1923 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001924 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001925 na = 0;
1926 nk = 0;
1927 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001928 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001929 if (TYPE(ch) == STAR ||
1930 TYPE(ch) == DOUBLESTAR)
1931 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001932 if (ch->n_lineno != lineno) {
1933 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001934 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00001935 }
1936 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001937 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001938 na++;
1939 else
1940 nk++;
1941 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001942 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001943 while (i < NCH(n)) {
1944 node *tok = CHILD(n, i);
1945 node *ch = CHILD(n, i+1);
1946 i += 3;
1947 switch (TYPE(tok)) {
1948 case STAR: star_flag = 1; break;
1949 case DOUBLESTAR: starstar_flag = 1; break;
1950 }
1951 com_node(c, ch);
1952 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001953 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001954 com_error(c, PyExc_SyntaxError,
1955 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001956 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001957 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001958 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001959 star_flag + (starstar_flag << 1);
1960 else
1961 opcode = CALL_FUNCTION;
1962 com_addoparg(c, opcode, na | (nk << 8));
1963 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001964 }
1965}
1966
1967static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001968com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001969{
1970 com_addopname(c, LOAD_ATTR, n);
1971}
1972
1973static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001974com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001975{
1976 int i=0;
1977 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001978 node *ch;
1979
1980 /* first argument */
1981 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001982 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001983 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001984 i++;
1985 }
1986 else {
1987 com_node(c, CHILD(n,i));
1988 i++;
1989 REQ(CHILD(n,i),COLON);
1990 i++;
1991 }
1992 /* second argument */
1993 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1994 com_node(c, CHILD(n,i));
1995 i++;
1996 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001997 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001998 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001999 com_push(c, 1);
2000 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002001 /* remaining arguments */
2002 for (; i < NCH(n); i++) {
2003 ns++;
2004 ch=CHILD(n,i);
2005 REQ(ch, sliceop);
2006 if (NCH(ch) == 1) {
2007 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002008 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002009 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002010 }
2011 else
2012 com_node(c, CHILD(ch,1));
2013 }
2014 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002015 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002016}
2017
2018static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002019com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002020{
2021 node *ch;
2022 REQ(n, subscript);
2023 ch = CHILD(n,0);
2024 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002025 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002026 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002027 com_push(c, 1);
2028 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002029 else {
2030 /* check for slice */
2031 if ((TYPE(ch) == COLON || NCH(n) > 1))
2032 com_sliceobj(c, n);
2033 else {
2034 REQ(ch, test);
2035 com_node(c, ch);
2036 }
2037 }
2038}
2039
2040static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002041com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002042{
2043 int i, op;
2044 REQ(n, subscriptlist);
2045 /* Check to make backward compatible slice behavior for '[i:j]' */
2046 if (NCH(n) == 1) {
2047 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002048 /* 'Basic' slice, should have exactly one colon. */
2049 if ((TYPE(CHILD(sub, 0)) == COLON
2050 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2051 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2052 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002053 switch (assigning) {
2054 case OP_DELETE:
2055 op = DELETE_SLICE;
2056 break;
2057 case OP_ASSIGN:
2058 op = STORE_SLICE;
2059 break;
2060 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002061 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002062 break;
2063 default:
2064 com_augassign_slice(c, sub, assigning, augn);
2065 return;
2066 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002067 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002068 if (op == STORE_SLICE)
2069 com_pop(c, 2);
2070 else if (op == DELETE_SLICE)
2071 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002072 return;
2073 }
2074 }
2075 /* Else normal subscriptlist. Compile each subscript. */
2076 for (i = 0; i < NCH(n); i += 2)
2077 com_subscript(c, CHILD(n, i));
2078 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002079 if (NCH(n) > 1) {
2080 i = (NCH(n)+1) / 2;
2081 com_addoparg(c, BUILD_TUPLE, i);
2082 com_pop(c, i-1);
2083 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002084 switch (assigning) {
2085 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002086 op = DELETE_SUBSCR;
2087 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002088 break;
2089 default:
2090 case OP_ASSIGN:
2091 op = STORE_SUBSCR;
2092 i = 3;
2093 break;
2094 case OP_APPLY:
2095 op = BINARY_SUBSCR;
2096 i = 1;
2097 break;
2098 }
2099 if (assigning > OP_APPLY) {
2100 com_addoparg(c, DUP_TOPX, 2);
2101 com_push(c, 2);
2102 com_addbyte(c, BINARY_SUBSCR);
2103 com_pop(c, 1);
2104 com_node(c, augn);
2105 com_addbyte(c, assigning);
2106 com_pop(c, 1);
2107 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002108 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002109 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002110 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002111}
2112
2113static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002114com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002115{
2116 REQ(n, trailer);
2117 switch (TYPE(CHILD(n, 0))) {
2118 case LPAR:
2119 com_call_function(c, CHILD(n, 1));
2120 break;
2121 case DOT:
2122 com_select_member(c, CHILD(n, 1));
2123 break;
2124 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002125 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002126 break;
2127 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002128 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002129 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002130 }
2131}
2132
2133static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002134com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002135{
2136 int i;
2137 REQ(n, power);
2138 com_atom(c, CHILD(n, 0));
2139 for (i = 1; i < NCH(n); i++) {
2140 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2141 com_factor(c, CHILD(n, i+1));
2142 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002143 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002144 break;
2145 }
2146 else
2147 com_apply_trailer(c, CHILD(n, i));
2148 }
2149}
2150
2151static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002152com_invert_constant(struct compiling *c, node *n)
2153{
2154 /* Compute the inverse of int and longs and use them directly,
2155 but be prepared to generate code for all other
2156 possibilities (invalid numbers, floats, complex).
2157 */
2158 PyObject *num, *inv = NULL;
2159 int i;
2160
2161 REQ(n, NUMBER);
2162 num = parsenumber(c, STR(n));
2163 if (num == NULL)
2164 i = 255;
2165 else {
2166 inv = PyNumber_Invert(num);
2167 if (inv == NULL) {
2168 PyErr_Clear();
2169 i = com_addconst(c, num);
2170 } else {
2171 i = com_addconst(c, inv);
2172 Py_DECREF(inv);
2173 }
2174 Py_DECREF(num);
2175 }
2176 com_addoparg(c, LOAD_CONST, i);
2177 com_push(c, 1);
2178 if (num != NULL && inv == NULL)
2179 com_addbyte(c, UNARY_INVERT);
2180}
2181
Tim Peters51e26512001-09-07 08:45:55 +00002182static int
2183is_float_zero(const char *p)
2184{
2185 int found_radix_point = 0;
2186 int ch;
2187 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2188 switch (ch) {
2189 case '0':
2190 /* no reason to believe it's not 0 -- continue */
2191 break;
2192
2193 case 'e': case 'E': case 'j': case 'J':
2194 /* If this was a hex constant, we already would have
2195 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2196 must be an exponent marker, and we haven't yet
2197 seen a non-zero digit, and it doesn't matter what
2198 the exponent is then. For 'j' or 'J' similarly,
2199 except that this is an imaginary 0 then. */
2200 return 1;
2201
2202 case '.':
2203 found_radix_point = 1;
2204 break;
2205
2206 default:
2207 return 0;
2208 }
2209 }
2210 return found_radix_point;
2211}
2212
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002213static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002214com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002215{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002216 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002217 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002218 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002219 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002220 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002221 approriate value as a constant. If the value is negative,
2222 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002223 negative in the 0th position -- unless we're doing unary minus
2224 of a floating zero! In that case the sign is significant, but
2225 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002226 */
2227 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002228 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002229 && TYPE((pfactor = CHILD(n, 1))) == factor
2230 && NCH(pfactor) == 1
2231 && TYPE((ppower = CHILD(pfactor, 0))) == power
2232 && NCH(ppower) == 1
2233 && TYPE((patom = CHILD(ppower, 0))) == atom
2234 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002235 && !(childtype == MINUS &&
2236 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002237 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002238 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002239 return;
2240 }
2241 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002242 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002243 if (s == NULL) {
2244 com_error(c, PyExc_MemoryError, "");
2245 com_addbyte(c, 255);
2246 return;
2247 }
2248 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002249 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002250 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002251 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002252 }
Tim Peters51e26512001-09-07 08:45:55 +00002253 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002254 }
2255 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002256 com_factor(c, CHILD(n, 1));
2257 com_addbyte(c, UNARY_POSITIVE);
2258 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002259 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002260 com_factor(c, CHILD(n, 1));
2261 com_addbyte(c, UNARY_NEGATIVE);
2262 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002263 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002264 com_factor(c, CHILD(n, 1));
2265 com_addbyte(c, UNARY_INVERT);
2266 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002267 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002268 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002269 }
2270}
2271
2272static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002273com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002274{
2275 int i;
2276 int op;
2277 REQ(n, term);
2278 com_factor(c, CHILD(n, 0));
2279 for (i = 2; i < NCH(n); i += 2) {
2280 com_factor(c, CHILD(n, i));
2281 switch (TYPE(CHILD(n, i-1))) {
2282 case STAR:
2283 op = BINARY_MULTIPLY;
2284 break;
2285 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002286 if (c->c_flags & CO_FUTURE_DIVISION)
2287 op = BINARY_TRUE_DIVIDE;
2288 else
2289 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002290 break;
2291 case PERCENT:
2292 op = BINARY_MODULO;
2293 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002294 case DOUBLESLASH:
2295 op = BINARY_FLOOR_DIVIDE;
2296 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002297 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002298 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002299 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002300 op = 255;
2301 }
2302 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002303 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002304 }
2305}
2306
2307static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002308com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002309{
2310 int i;
2311 int op;
2312 REQ(n, arith_expr);
2313 com_term(c, CHILD(n, 0));
2314 for (i = 2; i < NCH(n); i += 2) {
2315 com_term(c, CHILD(n, i));
2316 switch (TYPE(CHILD(n, i-1))) {
2317 case PLUS:
2318 op = BINARY_ADD;
2319 break;
2320 case MINUS:
2321 op = BINARY_SUBTRACT;
2322 break;
2323 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002324 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002325 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002326 op = 255;
2327 }
2328 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002329 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002330 }
2331}
2332
2333static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002334com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002335{
2336 int i;
2337 int op;
2338 REQ(n, shift_expr);
2339 com_arith_expr(c, CHILD(n, 0));
2340 for (i = 2; i < NCH(n); i += 2) {
2341 com_arith_expr(c, CHILD(n, i));
2342 switch (TYPE(CHILD(n, i-1))) {
2343 case LEFTSHIFT:
2344 op = BINARY_LSHIFT;
2345 break;
2346 case RIGHTSHIFT:
2347 op = BINARY_RSHIFT;
2348 break;
2349 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002350 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002351 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002352 op = 255;
2353 }
2354 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002355 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002356 }
2357}
2358
2359static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002360com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002361{
2362 int i;
2363 int op;
2364 REQ(n, and_expr);
2365 com_shift_expr(c, CHILD(n, 0));
2366 for (i = 2; i < NCH(n); i += 2) {
2367 com_shift_expr(c, CHILD(n, i));
2368 if (TYPE(CHILD(n, i-1)) == AMPER) {
2369 op = BINARY_AND;
2370 }
2371 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002372 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002373 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002374 op = 255;
2375 }
2376 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002377 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002378 }
2379}
2380
2381static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002382com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002383{
2384 int i;
2385 int op;
2386 REQ(n, xor_expr);
2387 com_and_expr(c, CHILD(n, 0));
2388 for (i = 2; i < NCH(n); i += 2) {
2389 com_and_expr(c, CHILD(n, i));
2390 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2391 op = BINARY_XOR;
2392 }
2393 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002394 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002395 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002396 op = 255;
2397 }
2398 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002399 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002400 }
2401}
2402
2403static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002404com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002405{
2406 int i;
2407 int op;
2408 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002409 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002410 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002411 com_xor_expr(c, CHILD(n, i));
2412 if (TYPE(CHILD(n, i-1)) == VBAR) {
2413 op = BINARY_OR;
2414 }
2415 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002416 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002417 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002418 op = 255;
2419 }
2420 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002421 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002422 }
2423}
2424
2425static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002426cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002427{
2428 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00002429 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002430 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2431 if (NCH(n) == 1) {
2432 n = CHILD(n, 0);
2433 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002434 case LESS: return PyCmp_LT;
2435 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00002436 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00002437 case LESSEQUAL: return PyCmp_LE;
2438 case GREATEREQUAL: return PyCmp_GE;
2439 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2440 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2441 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002442 }
2443 }
2444 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002445 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002446 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002447 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002448 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002449 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002450 }
2451 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002452 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002453}
2454
2455static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002456com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002457{
2458 int i;
2459 enum cmp_op op;
2460 int anchor;
2461 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2462 com_expr(c, CHILD(n, 0));
2463 if (NCH(n) == 1)
2464 return;
2465
2466 /****************************************************************
2467 The following code is generated for all but the last
2468 comparison in a chain:
2469
2470 label: on stack: opcode: jump to:
2471
2472 a <code to load b>
2473 a, b DUP_TOP
2474 a, b, b ROT_THREE
2475 b, a, b COMPARE_OP
2476 b, 0-or-1 JUMP_IF_FALSE L1
2477 b, 1 POP_TOP
2478 b
2479
2480 We are now ready to repeat this sequence for the next
2481 comparison in the chain.
2482
2483 For the last we generate:
2484
2485 b <code to load c>
2486 b, c COMPARE_OP
2487 0-or-1
2488
2489 If there were any jumps to L1 (i.e., there was more than one
2490 comparison), we generate:
2491
2492 0-or-1 JUMP_FORWARD L2
2493 L1: b, 0 ROT_TWO
2494 0, b POP_TOP
2495 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002496 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002497 ****************************************************************/
2498
2499 anchor = 0;
2500
2501 for (i = 2; i < NCH(n); i += 2) {
2502 com_expr(c, CHILD(n, i));
2503 if (i+2 < NCH(n)) {
2504 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002505 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002506 com_addbyte(c, ROT_THREE);
2507 }
2508 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002509 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002510 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002511 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002512 }
2513 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002514 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002515 if (i+2 < NCH(n)) {
2516 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2517 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002518 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002519 }
2520 }
2521
2522 if (anchor) {
2523 int anchor2 = 0;
2524 com_addfwref(c, JUMP_FORWARD, &anchor2);
2525 com_backpatch(c, anchor);
2526 com_addbyte(c, ROT_TWO);
2527 com_addbyte(c, POP_TOP);
2528 com_backpatch(c, anchor2);
2529 }
2530}
2531
2532static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002533com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002534{
2535 REQ(n, not_test); /* 'not' not_test | comparison */
2536 if (NCH(n) == 1) {
2537 com_comparison(c, CHILD(n, 0));
2538 }
2539 else {
2540 com_not_test(c, CHILD(n, 1));
2541 com_addbyte(c, UNARY_NOT);
2542 }
2543}
2544
2545static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002546com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002547{
2548 int i;
2549 int anchor;
2550 REQ(n, and_test); /* not_test ('and' not_test)* */
2551 anchor = 0;
2552 i = 0;
2553 for (;;) {
2554 com_not_test(c, CHILD(n, i));
2555 if ((i += 2) >= NCH(n))
2556 break;
2557 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2558 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002559 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002560 }
2561 if (anchor)
2562 com_backpatch(c, anchor);
2563}
2564
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002565static int
2566com_make_closure(struct compiling *c, PyCodeObject *co)
2567{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002568 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002569 if (free == 0)
2570 return 0;
2571 for (i = 0; i < free; ++i) {
2572 /* Bypass com_addop_varname because it will generate
2573 LOAD_DEREF but LOAD_CLOSURE is needed.
2574 */
2575 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2576 int arg, reftype;
2577
2578 /* Special case: If a class contains a method with a
2579 free variable that has the same name as a method,
2580 the name will be considered free *and* local in the
2581 class. It should be handled by the closure, as
2582 well as by the normal name loookup logic.
2583 */
2584 reftype = get_ref_type(c, PyString_AS_STRING(name));
2585 if (reftype == CELL)
2586 arg = com_lookup_arg(c->c_cellvars, name);
2587 else /* (reftype == FREE) */
2588 arg = com_lookup_arg(c->c_freevars, name);
2589 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002590 fprintf(stderr, "lookup %s in %s %d %d\n"
2591 "freevars of %s: %s\n",
2592 PyObject_REPR(name),
2593 c->c_name,
2594 reftype, arg,
2595 PyString_AS_STRING(co->co_name),
2596 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002597 Py_FatalError("com_make_closure()");
2598 }
2599 com_addoparg(c, LOAD_CLOSURE, arg);
2600
2601 }
2602 com_push(c, free);
2603 return 1;
2604}
2605
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002606static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002607com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002608{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002609 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002610 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002611 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002612 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002613 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002614 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2615 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002616 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002617 if (co == NULL) {
2618 c->c_errors++;
2619 return;
2620 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002621 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002622 i = com_addconst(c, (PyObject *)co);
2623 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002624 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002625 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002626 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002627 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002628 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002629 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002630 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002631 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002632 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002633 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002634 else {
2635 int anchor = 0;
2636 int i = 0;
2637 for (;;) {
2638 com_and_test(c, CHILD(n, i));
2639 if ((i += 2) >= NCH(n))
2640 break;
2641 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2642 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002643 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002644 }
2645 if (anchor)
2646 com_backpatch(c, anchor);
2647 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002648}
2649
2650static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002651com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002652{
2653 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002654 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002655 com_node(c, CHILD(n, 0));
2656 }
2657 else {
2658 int i;
2659 int len;
2660 len = (NCH(n) + 1) / 2;
2661 for (i = 0; i < NCH(n); i += 2)
2662 com_node(c, CHILD(n, i));
2663 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002664 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002665 }
2666}
2667
2668
2669/* Begin of assignment compilation */
2670
Thomas Wouters434d0822000-08-24 20:11:32 +00002671
2672static void
2673com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2674{
2675 com_addbyte(c, DUP_TOP);
2676 com_push(c, 1);
2677 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002678 com_node(c, augn);
2679 com_addbyte(c, opcode);
2680 com_pop(c, 1);
2681 com_addbyte(c, ROT_TWO);
2682 com_addopname(c, STORE_ATTR, n);
2683 com_pop(c, 2);
2684}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002685
2686static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002687com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002688{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00002689 if (none_assignment_check(c, STR(n), assigning))
2690 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002691 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002692 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002693}
2694
2695static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002696com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002697{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002698 REQ(n, trailer);
2699 switch (TYPE(CHILD(n, 0))) {
2700 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002701 if (assigning == OP_DELETE)
2702 com_error(c, PyExc_SyntaxError,
2703 "can't delete function call");
2704 else
2705 com_error(c, PyExc_SyntaxError,
2706 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002707 break;
2708 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002709 if (assigning > OP_APPLY)
2710 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2711 else
2712 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002713 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002714 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002715 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002716 break;
2717 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002718 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002719 }
2720}
2721
2722static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002723com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002724{
2725 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002726 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002727 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002728 if (assigning) {
2729 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002730 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002731 com_push(c, i-1);
2732 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002733 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002734 com_assign(c, CHILD(n, i), assigning, NULL);
2735}
2736
2737static void
2738com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2739{
2740 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002741 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002742 com_push(c, 1);
2743 com_node(c, augn);
2744 com_addbyte(c, opcode);
2745 com_pop(c, 1);
2746 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002747}
2748
2749static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002750com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002751{
2752 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002753 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002754 if (assigning)
2755 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002756}
2757
2758static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002759com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002760{
2761 /* Loop to avoid trivial recursion */
2762 for (;;) {
2763 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002764
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002765 case exprlist:
2766 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002767 case testlist1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002768 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002769 if (assigning > OP_APPLY) {
2770 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002771 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002772 return;
2773 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002774 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002775 return;
2776 }
2777 n = CHILD(n, 0);
2778 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002779
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002780 case test:
2781 case and_test:
2782 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002783 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002784 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002785 case xor_expr:
2786 case and_expr:
2787 case shift_expr:
2788 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002789 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002790 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002791 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002792 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002793 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002794 return;
2795 }
2796 n = CHILD(n, 0);
2797 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002798
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002799 case power: /* atom trailer* ('**' power)*
2800 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002801 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002802 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002803 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002804 return;
2805 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002806 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002807 int i;
2808 com_node(c, CHILD(n, 0));
2809 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002810 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002811 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002812 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002813 return;
2814 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002815 com_apply_trailer(c, CHILD(n, i));
2816 } /* NB i is still alive */
2817 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002818 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002819 return;
2820 }
2821 n = CHILD(n, 0);
2822 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002823
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002824 case atom:
2825 switch (TYPE(CHILD(n, 0))) {
2826 case LPAR:
2827 n = CHILD(n, 1);
2828 if (TYPE(n) == RPAR) {
2829 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002830 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002831 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002832 return;
2833 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002834 if (assigning > OP_APPLY) {
2835 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00002836 "augmented assign to tuple literal not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002837 return;
2838 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002839 break;
2840 case LSQB:
2841 n = CHILD(n, 1);
2842 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002843 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002844 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002845 return;
2846 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002847 if (assigning > OP_APPLY) {
2848 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00002849 "augmented assign to list literal not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002850 return;
2851 }
2852 if (NCH(n) > 1
2853 && TYPE(CHILD(n, 1)) == list_for) {
2854 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002855 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002856 return;
2857 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002858 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002859 return;
2860 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002861 if (assigning > OP_APPLY)
2862 com_augassign_name(c, CHILD(n, 0),
2863 assigning, augn);
2864 else
2865 com_assign_name(c, CHILD(n, 0),
2866 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002867 return;
2868 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002869 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002870 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002871 return;
2872 }
2873 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002874
2875 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002876 com_error(c, PyExc_SyntaxError,
2877 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002878 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002879
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002880 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002881 com_error(c, PyExc_SystemError,
2882 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002883 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002884
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002885 }
2886 }
2887}
Guido van Rossum7c531111997-03-11 18:42:21 +00002888
Thomas Wouters434d0822000-08-24 20:11:32 +00002889static void
2890com_augassign(struct compiling *c, node *n)
2891{
2892 int opcode;
2893
2894 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2895 case '+': opcode = INPLACE_ADD; break;
2896 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002897 case '/':
2898 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
2899 opcode = INPLACE_FLOOR_DIVIDE;
2900 else if (c->c_flags & CO_FUTURE_DIVISION)
2901 opcode = INPLACE_TRUE_DIVIDE;
2902 else
2903 opcode = INPLACE_DIVIDE;
2904 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00002905 case '%': opcode = INPLACE_MODULO; break;
2906 case '<': opcode = INPLACE_LSHIFT; break;
2907 case '>': opcode = INPLACE_RSHIFT; break;
2908 case '&': opcode = INPLACE_AND; break;
2909 case '^': opcode = INPLACE_XOR; break;
2910 case '|': opcode = INPLACE_OR; break;
2911 case '*':
2912 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2913 opcode = INPLACE_POWER;
2914 else
2915 opcode = INPLACE_MULTIPLY;
2916 break;
2917 default:
2918 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2919 return;
2920 }
2921 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2922}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002923
2924static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002925com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002926{
Thomas Wouters434d0822000-08-24 20:11:32 +00002927 REQ(n, expr_stmt);
2928 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002929 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002930 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002931 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002932 if (NCH(n) == 1) {
2933 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002934 if (c->c_interactive)
2935 com_addbyte(c, PRINT_EXPR);
2936 else
2937 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002938 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002939 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002940 else if (TYPE(CHILD(n,1)) == augassign)
2941 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002942 else {
2943 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002944 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002945 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002946 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002947 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002948 com_push(c, 1);
2949 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002950 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002951 }
2952 }
2953}
2954
2955static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002956com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002957{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002958 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002959 int i;
2960 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002961 if (Py_OptimizeFlag)
2962 return;
2963 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00002964
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002965 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00002966 raise AssertionError [, <message>]
2967
2968 where <message> is the second test, if present.
2969 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002970 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002971 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002972 com_addbyte(c, POP_TOP);
2973 com_pop(c, 1);
2974 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002975 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002976 com_push(c, 1);
2977 i = NCH(n)/2; /* Either 2 or 4 */
2978 if (i > 1)
2979 com_node(c, CHILD(n, 3));
2980 com_addoparg(c, RAISE_VARARGS, i);
2981 com_pop(c, i);
2982 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002983 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002984 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002985 com_addbyte(c, POP_TOP);
2986}
2987
2988static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002989com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002990{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002991 int i = 1;
2992 node* stream = NULL;
2993
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002994 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002995
2996 /* are we using the extended print form? */
2997 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2998 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002999 com_node(c, stream);
3000 /* stack: [...] => [... stream] */
3001 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003002 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3003 i = 4;
3004 else
3005 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003006 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003007 for (; i < NCH(n); i += 2) {
3008 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003009 com_addbyte(c, DUP_TOP);
3010 /* stack: [stream] => [stream stream] */
3011 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003012 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003013 /* stack: [stream stream] => [stream stream obj] */
3014 com_addbyte(c, ROT_TWO);
3015 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003016 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003017 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003018 com_pop(c, 2);
3019 }
3020 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003021 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003022 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003023 com_addbyte(c, PRINT_ITEM);
3024 com_pop(c, 1);
3025 }
3026 }
3027 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003028 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003029 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003030 /* must pop the extra stream object off the stack */
3031 com_addbyte(c, POP_TOP);
3032 /* stack: [... stream] => [...] */
3033 com_pop(c, 1);
3034 }
3035 }
3036 else {
3037 if (stream != NULL) {
3038 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003039 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003040 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003041 com_pop(c, 1);
3042 }
3043 else
3044 com_addbyte(c, PRINT_NEWLINE);
3045 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003046}
3047
3048static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003049com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003050{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003051 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003052 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003053 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003054 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003055 if (c->c_flags & CO_GENERATOR) {
3056 if (NCH(n) > 1) {
3057 com_error(c, PyExc_SyntaxError,
3058 "'return' with argument inside generator");
3059 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003060 }
3061 if (NCH(n) < 2) {
3062 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003063 com_push(c, 1);
3064 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003065 else
3066 com_node(c, CHILD(n, 1));
3067 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003068 com_pop(c, 1);
3069}
3070
3071static void
3072com_yield_stmt(struct compiling *c, node *n)
3073{
Tim Peters95c80f82001-06-23 02:07:08 +00003074 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003075 REQ(n, yield_stmt); /* 'yield' testlist */
3076 if (!c->c_infunction) {
3077 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3078 }
Tim Peters95c80f82001-06-23 02:07:08 +00003079
3080 for (i = 0; i < c->c_nblocks; ++i) {
3081 if (c->c_block[i] == SETUP_FINALLY) {
3082 com_error(c, PyExc_SyntaxError,
3083 "'yield' not allowed in a 'try' block "
3084 "with a 'finally' clause");
3085 return;
3086 }
3087 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003088 com_node(c, CHILD(n, 1));
3089 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003090 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003091}
3092
3093static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003094com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003095{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003096 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003097 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3098 if (NCH(n) > 1) {
3099 com_node(c, CHILD(n, 1));
3100 if (NCH(n) > 3) {
3101 com_node(c, CHILD(n, 3));
3102 if (NCH(n) > 5)
3103 com_node(c, CHILD(n, 5));
3104 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003105 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003106 i = NCH(n)/2;
3107 com_addoparg(c, RAISE_VARARGS, i);
3108 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003109}
3110
3111static void
Thomas Wouters52152252000-08-17 22:55:00 +00003112com_from_import(struct compiling *c, node *n)
3113{
3114 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3115 com_push(c, 1);
3116 if (NCH(n) > 1) {
3117 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3118 com_error(c, PyExc_SyntaxError, "invalid syntax");
3119 return;
3120 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003121 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003122 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003123 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003124 com_pop(c, 1);
3125}
3126
3127static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003128com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003129{
3130 int i;
3131 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003132 /* 'import' dotted_name (',' dotted_name)* |
3133 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003134 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00003135 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003136 /* 'from' dotted_name 'import' ... */
3137 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003138
3139 if (TYPE(CHILD(n, 3)) == STAR) {
3140 tup = Py_BuildValue("(s)", "*");
3141 } else {
3142 tup = PyTuple_New((NCH(n) - 2)/2);
3143 for (i = 3; i < NCH(n); i += 2) {
3144 PyTuple_SET_ITEM(tup, (i-3)/2,
Guido van Rossum633d90c2002-12-23 16:51:42 +00003145 PyString_FromString(STR(
3146 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003147 }
3148 }
3149 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003150 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003151 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003152 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00003153 if (TYPE(CHILD(n, 3)) == STAR)
3154 com_addbyte(c, IMPORT_STAR);
3155 else {
3156 for (i = 3; i < NCH(n); i += 2)
3157 com_from_import(c, CHILD(n, i));
3158 com_addbyte(c, POP_TOP);
3159 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003160 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003161 }
3162 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003163 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003164 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003165 node *subn = CHILD(n, i);
3166 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003167 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003168 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003169 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003170 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003171 int j;
3172 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003173 com_error(c, PyExc_SyntaxError,
3174 "invalid syntax");
3175 return;
3176 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003177 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3178 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003179 CHILD(CHILD(subn, 0),
3180 j));
3181 com_addop_varname(c, VAR_STORE,
3182 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003183 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003184 com_addop_varname(c, VAR_STORE,
3185 STR(CHILD(CHILD(subn, 0),
3186 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003187 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003188 }
3189 }
3190}
3191
3192static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003193com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003194{
3195 REQ(n, exec_stmt);
3196 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3197 com_node(c, CHILD(n, 1));
3198 if (NCH(n) >= 4)
3199 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003200 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003201 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003202 com_push(c, 1);
3203 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003204 if (NCH(n) >= 6)
3205 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003206 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003207 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003208 com_push(c, 1);
3209 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003210 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003211 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003212}
3213
Guido van Rossum7c531111997-03-11 18:42:21 +00003214static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003215is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003216{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003217 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003218 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003219 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003220
3221 /* Label to avoid tail recursion */
3222 next:
3223 switch (TYPE(n)) {
3224
3225 case suite:
3226 if (NCH(n) == 1) {
3227 n = CHILD(n, 0);
3228 goto next;
3229 }
3230 /* Fall through */
3231 case file_input:
3232 for (i = 0; i < NCH(n); i++) {
3233 node *ch = CHILD(n, i);
3234 if (TYPE(ch) == stmt) {
3235 n = ch;
3236 goto next;
3237 }
3238 }
3239 break;
3240
3241 case stmt:
3242 case simple_stmt:
3243 case small_stmt:
3244 n = CHILD(n, 0);
3245 goto next;
3246
3247 case expr_stmt:
3248 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003249 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003250 case test:
3251 case and_test:
3252 case not_test:
3253 case comparison:
3254 case expr:
3255 case xor_expr:
3256 case and_expr:
3257 case shift_expr:
3258 case arith_expr:
3259 case term:
3260 case factor:
3261 case power:
3262 case atom:
3263 if (NCH(n) == 1) {
3264 n = CHILD(n, 0);
3265 goto next;
3266 }
3267 break;
3268
3269 case NAME:
3270 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3271 return 1;
3272 break;
3273
3274 case NUMBER:
3275 v = parsenumber(c, STR(n));
3276 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003277 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003278 break;
3279 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003280 i = PyObject_IsTrue(v);
3281 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003282 return i == 0;
3283
3284 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003285 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003286 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003287 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003288 break;
3289 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003290 i = PyObject_IsTrue(v);
3291 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003292 return i == 0;
3293
3294 }
3295 return 0;
3296}
3297
Tim Peters08a898f2001-06-28 01:52:22 +00003298
3299/* Look under n for a return stmt with an expression.
3300 * This hack is used to find illegal returns under "if 0:" blocks in
3301 * functions already known to be generators (as determined by the symtable
3302 * pass).
3303 * Return the offending return node if found, else NULL.
3304 */
3305static node *
3306look_for_offending_return(node *n)
3307{
3308 int i;
3309
3310 for (i = 0; i < NCH(n); ++i) {
3311 node *kid = CHILD(n, i);
3312
3313 switch (TYPE(kid)) {
3314 case classdef:
3315 case funcdef:
3316 case lambdef:
3317 /* Stuff in nested functions & classes doesn't
3318 affect the code block we started in. */
3319 return NULL;
3320
3321 case return_stmt:
3322 if (NCH(kid) > 1)
3323 return kid;
3324 break;
3325
3326 default: {
3327 node *bad = look_for_offending_return(kid);
3328 if (bad != NULL)
3329 return bad;
3330 }
3331 }
3332 }
3333
3334 return NULL;
3335}
3336
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003337static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003338com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003339{
3340 int i;
3341 int anchor = 0;
3342 REQ(n, if_stmt);
3343 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3344 for (i = 0; i+3 < NCH(n); i+=4) {
3345 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003346 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003347 if (is_constant_false(c, ch)) {
3348 /* We're going to skip this block. However, if this
3349 is a generator, we have to check the dead code
3350 anyway to make sure there aren't any return stmts
3351 with expressions, in the same scope. */
3352 if (c->c_flags & CO_GENERATOR) {
3353 node *p = look_for_offending_return(n);
3354 if (p != NULL) {
3355 int savelineno = c->c_lineno;
3356 c->c_lineno = p->n_lineno;
3357 com_error(c, PyExc_SyntaxError,
3358 "'return' with argument "
3359 "inside generator");
3360 c->c_lineno = savelineno;
3361 }
3362 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003363 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003364 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003365 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003366 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003367 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003368 com_addfwref(c, JUMP_IF_FALSE, &a);
3369 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003370 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003371 com_node(c, CHILD(n, i+3));
3372 com_addfwref(c, JUMP_FORWARD, &anchor);
3373 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003374 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003375 com_addbyte(c, POP_TOP);
3376 }
3377 if (i+2 < NCH(n))
3378 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003379 if (anchor)
3380 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003381}
3382
3383static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003384com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003385{
3386 int break_anchor = 0;
3387 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003388 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003389 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3390 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003391 block_push(c, SETUP_LOOP);
3392 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003393 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003394 com_node(c, CHILD(n, 1));
3395 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3396 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003397 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003398 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003399 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003400 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003401 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3402 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003403 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003404 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003405 com_addbyte(c, POP_TOP);
3406 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003407 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003408 if (NCH(n) > 4)
3409 com_node(c, CHILD(n, 6));
3410 com_backpatch(c, break_anchor);
3411}
3412
3413static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003414com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003415{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003416 int break_anchor = 0;
3417 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003418 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003419 REQ(n, for_stmt);
3420 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3421 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003422 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003423 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003424 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003425 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00003426 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003427 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003428 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003429 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003430 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003431 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003432 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003433 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3434 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003435 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003436 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003437 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003438 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003439 if (NCH(n) > 8)
3440 com_node(c, CHILD(n, 8));
3441 com_backpatch(c, break_anchor);
3442}
3443
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003444/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003445
3446 SETUP_FINALLY L
3447 <code for S>
3448 POP_BLOCK
3449 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003450 L: <code for Sf>
3451 END_FINALLY
3452
3453 The special instructions use the block stack. Each block
3454 stack entry contains the instruction that created it (here
3455 SETUP_FINALLY), the level of the value stack at the time the
3456 block stack entry was created, and a label (here L).
3457
3458 SETUP_FINALLY:
3459 Pushes the current value stack level and the label
3460 onto the block stack.
3461 POP_BLOCK:
3462 Pops en entry from the block stack, and pops the value
3463 stack until its level is the same as indicated on the
3464 block stack. (The label is ignored.)
3465 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003466 Pops a variable number of entries from the *value* stack
3467 and re-raises the exception they specify. The number of
3468 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003469
3470 The block stack is unwound when an exception is raised:
3471 when a SETUP_FINALLY entry is found, the exception is pushed
3472 onto the value stack (and the exception condition is cleared),
3473 and the interpreter jumps to the label gotten from the block
3474 stack.
3475
3476 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003477 (The contents of the value stack is shown in [], with the top
3478 at the right; 'tb' is trace-back info, 'val' the exception's
3479 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003480
3481 Value stack Label Instruction Argument
3482 [] SETUP_EXCEPT L1
3483 [] <code for S>
3484 [] POP_BLOCK
3485 [] JUMP_FORWARD L0
3486
Guido van Rossum3f5da241990-12-20 15:06:42 +00003487 [tb, val, exc] L1: DUP )
3488 [tb, val, exc, exc] <evaluate E1> )
3489 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3490 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3491 [tb, val, exc, 1] POP )
3492 [tb, val, exc] POP
3493 [tb, val] <assign to V1> (or POP if no V1)
3494 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003495 [] <code for S1>
3496 JUMP_FORWARD L0
3497
Guido van Rossum3f5da241990-12-20 15:06:42 +00003498 [tb, val, exc, 0] L2: POP
3499 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003500 .............................etc.......................
3501
Guido van Rossum3f5da241990-12-20 15:06:42 +00003502 [tb, val, exc, 0] Ln+1: POP
3503 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003504
3505 [] L0: <next statement>
3506
3507 Of course, parts are not generated if Vi or Ei is not present.
3508*/
3509
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003510static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003511com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003512{
3513 int except_anchor = 0;
3514 int end_anchor = 0;
3515 int else_anchor = 0;
3516 int i;
3517 node *ch;
3518
3519 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3520 block_push(c, SETUP_EXCEPT);
3521 com_node(c, CHILD(n, 2));
3522 com_addbyte(c, POP_BLOCK);
3523 block_pop(c, SETUP_EXCEPT);
3524 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3525 com_backpatch(c, except_anchor);
3526 for (i = 3;
3527 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3528 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003529 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003530 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003531 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003532 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003533 break;
3534 }
3535 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003536 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003537 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003538 if (NCH(ch) > 1) {
3539 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003540 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003541 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003542 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003543 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003544 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3545 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003546 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003547 }
3548 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003549 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003550 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003551 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003552 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003553 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003554 com_pop(c, 1);
3555 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003556 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003557 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003558 com_node(c, CHILD(n, i+2));
3559 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3560 if (except_anchor) {
3561 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003562 /* We come in with [tb, val, exc, 0] on the
3563 stack; one pop and it's the same as
3564 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003565 com_addbyte(c, POP_TOP);
3566 }
3567 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003568 /* We actually come in here with [tb, val, exc] but the
3569 END_FINALLY will zap those and jump around.
3570 The c_stacklevel does not reflect them so we need not pop
3571 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003572 com_addbyte(c, END_FINALLY);
3573 com_backpatch(c, else_anchor);
3574 if (i < NCH(n))
3575 com_node(c, CHILD(n, i+2));
3576 com_backpatch(c, end_anchor);
3577}
3578
3579static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003580com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003581{
3582 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003583 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003584
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003585 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3586 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003587 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003588 com_addbyte(c, POP_BLOCK);
3589 block_pop(c, SETUP_FINALLY);
3590 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003591 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003592 /* While the generated code pushes only one item,
3593 the try-finally handling can enter here with
3594 up to three items. OK, here are the details:
3595 3 for an exception, 2 for RETURN, 1 for BREAK. */
3596 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003597 com_backpatch(c, finally_anchor);
3598 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003599 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003600 com_node(c, ch);
3601 com_addbyte(c, END_FINALLY);
3602 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003603 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003604}
3605
3606static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003607com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003608{
3609 REQ(n, try_stmt);
3610 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3611 | 'try' ':' suite 'finally' ':' suite */
3612 if (TYPE(CHILD(n, 3)) != except_clause)
3613 com_try_finally(c, n);
3614 else
3615 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003616}
3617
Guido van Rossum8b993a91997-01-17 21:04:03 +00003618static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003619get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003620{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003621 int i;
3622
Guido van Rossum8b993a91997-01-17 21:04:03 +00003623 /* Label to avoid tail recursion */
3624 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003625 switch (TYPE(n)) {
3626
3627 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003628 if (NCH(n) == 1) {
3629 n = CHILD(n, 0);
3630 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003631 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003632 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003633 case file_input:
3634 for (i = 0; i < NCH(n); i++) {
3635 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003636 if (TYPE(ch) == stmt) {
3637 n = ch;
3638 goto next;
3639 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003640 }
3641 break;
3642
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003643 case stmt:
3644 case simple_stmt:
3645 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003646 n = CHILD(n, 0);
3647 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003648
3649 case expr_stmt:
3650 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003651 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003652 case test:
3653 case and_test:
3654 case not_test:
3655 case comparison:
3656 case expr:
3657 case xor_expr:
3658 case and_expr:
3659 case shift_expr:
3660 case arith_expr:
3661 case term:
3662 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003663 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003664 if (NCH(n) == 1) {
3665 n = CHILD(n, 0);
3666 goto next;
3667 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003668 break;
3669
3670 case atom:
3671 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003672 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003673 break;
3674
3675 }
3676 return NULL;
3677}
3678
Guido van Rossum79f25d91997-04-29 20:08:16 +00003679static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003680get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003681{
Guido van Rossum541563e1999-01-28 15:08:09 +00003682 /* Don't generate doc-strings if run with -OO */
3683 if (Py_OptimizeFlag > 1)
3684 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003685 n = get_rawdocstring(n);
3686 if (n == NULL)
3687 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003688 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003689}
3690
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003691static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003692com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003693{
3694 REQ(n, suite);
3695 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3696 if (NCH(n) == 1) {
3697 com_node(c, CHILD(n, 0));
3698 }
3699 else {
3700 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003701 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003702 node *ch = CHILD(n, i);
3703 if (TYPE(ch) == stmt)
3704 com_node(c, ch);
3705 }
3706 }
3707}
3708
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003709/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003710static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003711com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003712{
3713 int i = c->c_nblocks;
3714 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3715 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3716 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003717 else if (i <= 0) {
3718 /* at the outer level */
3719 com_error(c, PyExc_SyntaxError,
3720 "'continue' not properly in loop");
3721 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003722 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003723 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003724 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003725 if (c->c_block[j] == SETUP_LOOP)
3726 break;
3727 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003728 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003729 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003730 for (; i > j; --i) {
3731 if (c->c_block[i] == SETUP_EXCEPT ||
3732 c->c_block[i] == SETUP_FINALLY) {
3733 com_addoparg(c, CONTINUE_LOOP,
3734 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003735 return;
3736 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003737 if (c->c_block[i] == END_FINALLY) {
3738 com_error(c, PyExc_SyntaxError,
3739 "'continue' not supported inside 'finally' clause");
3740 return;
3741 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003742 }
3743 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003744 com_error(c, PyExc_SyntaxError,
3745 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003746 }
3747 /* XXX Could allow it inside a 'finally' clause
3748 XXX if we could pop the exception still on the stack */
3749}
3750
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003751/* Return the number of default values in the argument list.
3752
3753 If a non-default argument follows a default argument, set an
3754 exception and return -1.
3755*/
3756
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003757static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003758com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003759{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003760 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003761 if (TYPE(n) == lambdef) {
3762 /* lambdef: 'lambda' [varargslist] ':' test */
3763 n = CHILD(n, 1);
3764 }
3765 else {
3766 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3767 n = CHILD(n, 2);
3768 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3769 n = CHILD(n, 1);
3770 }
3771 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003772 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003773 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003774 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003775 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3776 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003777 ndefs = 0;
3778 for (i = 0; i < nch; i++) {
3779 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003780 if (TYPE(CHILD(n, i)) == STAR ||
3781 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003782 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003783 i++;
3784 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003785 t = RPAR; /* Anything except EQUAL or COMMA */
3786 else
3787 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003788 if (t == EQUAL) {
3789 i++;
3790 ndefs++;
3791 com_node(c, CHILD(n, i));
3792 i++;
3793 if (i >= nch)
3794 break;
3795 t = TYPE(CHILD(n, i));
3796 }
3797 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003798 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003799 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003800 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003801 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003802 return -1;
3803 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003804 }
3805 if (t != COMMA)
3806 break;
3807 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003808 return ndefs;
3809}
3810
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003811static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003812com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003813{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003814 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003815 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003816 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003817 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003818 if (ndefs < 0)
3819 return;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003820 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3821 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003822 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003823 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003824 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003825 c->c_errors++;
3826 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003827 int closure = com_make_closure(c, (PyCodeObject *)co);
3828 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003829 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003830 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003831 if (closure)
3832 com_addoparg(c, MAKE_CLOSURE, ndefs);
3833 else
3834 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003835 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003836 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003837 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003838 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003839 }
3840}
3841
3842static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003843com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003844{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003845 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003846 REQ(n, testlist);
3847 /* testlist: test (',' test)* [','] */
3848 for (i = 0; i < NCH(n); i += 2)
3849 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003850 i = (NCH(n)+1) / 2;
3851 com_addoparg(c, BUILD_TUPLE, i);
3852 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003853}
3854
3855static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003856com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003857{
Guido van Rossum25831651993-05-19 14:50:45 +00003858 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003859 PyObject *v;
3860 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003861 char *name;
3862
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003863 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003864 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003865 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003866 c->c_errors++;
3867 return;
3868 }
3869 /* Push the class name on the stack */
3870 i = com_addconst(c, v);
3871 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003872 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003873 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003874 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003875 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003876 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003877 com_push(c, 1);
3878 }
Guido van Rossum25831651993-05-19 14:50:45 +00003879 else
3880 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003881 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003882 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003883 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003884 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003885 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003886 c->c_errors++;
3887 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003888 int closure = com_make_closure(c, co);
3889 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003890 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003891 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003892 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003893 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003894 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003895 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003896 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003897 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003898 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003899 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003900 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003901 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003902 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003903 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003904}
3905
3906static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003907com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003908{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003909 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003910 if (c->c_errors)
3911 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003912 switch (TYPE(n)) {
3913
3914 /* Definition nodes */
3915
3916 case funcdef:
3917 com_funcdef(c, n);
3918 break;
3919 case classdef:
3920 com_classdef(c, n);
3921 break;
3922
3923 /* Trivial parse tree nodes */
3924
3925 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003926 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003927 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003928 n = CHILD(n, 0);
3929 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003930
3931 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003932 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003933 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003934 {
3935 int i;
3936 for (i = 0; i < NCH(n)-1; i += 2)
3937 com_node(c, CHILD(n, i));
3938 }
3939 break;
3940
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003941 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003942 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003943 n = CHILD(n, 0);
3944 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003945
3946 /* Statement nodes */
3947
3948 case expr_stmt:
3949 com_expr_stmt(c, n);
3950 break;
3951 case print_stmt:
3952 com_print_stmt(c, n);
3953 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003954 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003955 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003956 break;
3957 case pass_stmt:
3958 break;
3959 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003960 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003961 com_error(c, PyExc_SyntaxError,
3962 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003963 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003964 com_addbyte(c, BREAK_LOOP);
3965 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003966 case continue_stmt:
3967 com_continue_stmt(c, n);
3968 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003969 case return_stmt:
3970 com_return_stmt(c, n);
3971 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003972 case yield_stmt:
3973 com_yield_stmt(c, n);
3974 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003975 case raise_stmt:
3976 com_raise_stmt(c, n);
3977 break;
3978 case import_stmt:
3979 com_import_stmt(c, n);
3980 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003981 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003982 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003983 case exec_stmt:
3984 com_exec_stmt(c, n);
3985 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003986 case assert_stmt:
3987 com_assert_stmt(c, n);
3988 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003989 case if_stmt:
3990 com_if_stmt(c, n);
3991 break;
3992 case while_stmt:
3993 com_while_stmt(c, n);
3994 break;
3995 case for_stmt:
3996 com_for_stmt(c, n);
3997 break;
3998 case try_stmt:
3999 com_try_stmt(c, n);
4000 break;
4001 case suite:
4002 com_suite(c, n);
4003 break;
4004
4005 /* Expression nodes */
4006
4007 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004008 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004009 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004010 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004011 break;
4012 case test:
4013 com_test(c, n);
4014 break;
4015 case and_test:
4016 com_and_test(c, n);
4017 break;
4018 case not_test:
4019 com_not_test(c, n);
4020 break;
4021 case comparison:
4022 com_comparison(c, n);
4023 break;
4024 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004025 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004026 break;
4027 case expr:
4028 com_expr(c, n);
4029 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004030 case xor_expr:
4031 com_xor_expr(c, n);
4032 break;
4033 case and_expr:
4034 com_and_expr(c, n);
4035 break;
4036 case shift_expr:
4037 com_shift_expr(c, n);
4038 break;
4039 case arith_expr:
4040 com_arith_expr(c, n);
4041 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004042 case term:
4043 com_term(c, n);
4044 break;
4045 case factor:
4046 com_factor(c, n);
4047 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004048 case power:
4049 com_power(c, n);
4050 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004051 case atom:
4052 com_atom(c, n);
4053 break;
4054
4055 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004056 com_error(c, PyExc_SystemError,
4057 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004058 }
4059}
4060
Tim Petersdbd9ba62000-07-09 03:09:57 +00004061static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004062
4063static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004064com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004065{
4066 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4067 if (TYPE(CHILD(n, 0)) == LPAR)
4068 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004069 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004070 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004071 com_pop(c, 1);
4072 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004073}
4074
4075static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004076com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004077{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004078 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004079 if (NCH(n) == 1) {
4080 com_fpdef(c, CHILD(n, 0));
4081 }
4082 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004083 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004084 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004085 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004086 for (i = 0; i < NCH(n); i += 2)
4087 com_fpdef(c, CHILD(n, i));
4088 }
4089}
4090
4091static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004092com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004093{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004094 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004095 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004096 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004097 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004098 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004099 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004100 nch = NCH(n);
4101 /* Enter all arguments in table of locals */
4102 for (i = 0, narg = 0; i < nch; i++) {
4103 node *ch = CHILD(n, i);
4104 node *fp;
4105 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004106 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004107 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4108 fp = CHILD(ch, 0);
4109 if (TYPE(fp) != NAME) {
4110 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4111 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004112 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004113 narg++;
4114 /* all name updates handled by symtable */
4115 if (++i >= nch)
4116 break;
4117 ch = CHILD(n, i);
4118 if (TYPE(ch) == EQUAL)
4119 i += 2;
4120 else
4121 REQ(ch, COMMA);
4122 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004123 if (complex) {
4124 /* Generate code for complex arguments only after
4125 having counted the simple arguments */
4126 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004127 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004128 node *ch = CHILD(n, i);
4129 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004130 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004131 break;
4132 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4133 fp = CHILD(ch, 0);
4134 if (TYPE(fp) != NAME) {
4135 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004136 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004137 com_fpdef(c, ch);
4138 }
4139 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004140 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004141 break;
4142 ch = CHILD(n, i);
4143 if (TYPE(ch) == EQUAL)
4144 i += 2;
4145 else
4146 REQ(ch, COMMA);
4147 }
4148 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004149}
4150
4151static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004152com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004153{
4154 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004155 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004156 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004157 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004158 if (doc != NULL) {
4159 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004160 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004161 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004162 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004163 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004164 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004165 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004166 for (i = 0; i < NCH(n); i++) {
4167 node *ch = CHILD(n, i);
4168 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4169 com_node(c, ch);
4170 }
4171}
4172
4173/* Top-level compile-node interface */
4174
4175static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004176compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004177{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004178 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004179 node *ch;
4180 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00004181 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004182 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004183 if (doc != NULL) {
4184 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004185 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004186 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004187 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004188 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004189 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
4190 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004191 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004192 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004193 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004194 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004195 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004196 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004197 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4198 com_push(c, 1);
4199 com_addbyte(c, RETURN_VALUE);
4200 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004201}
4202
4203static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004204compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004205{
Guido van Rossum590baa41993-11-30 13:40:46 +00004206 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004207 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004208 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004209
4210 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004211 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004212 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004213 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004214 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004215 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004216 else
4217 ch = CHILD(n, 2);
4218 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004219 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004220 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004221}
4222
4223static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004224compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004225{
4226 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004227 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004228 REQ(n, classdef);
4229 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4230 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004231 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004232 /* Initialize local __module__ from global __name__ */
4233 com_addop_name(c, LOAD_GLOBAL, "__name__");
4234 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004235 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004236 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004237 if (doc != NULL) {
4238 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004239 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004240 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004241 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004242 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004243 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004244 }
4245 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004246 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004247 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00004248 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004249 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004250 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004251 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004252 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004253}
4254
4255static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004256compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004257{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004258 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004259
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004260 switch (TYPE(n)) {
4261
Guido van Rossum4c417781991-01-21 16:09:22 +00004262 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004263 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004264 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004265 n = CHILD(n, 0);
4266 if (TYPE(n) != NEWLINE)
4267 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004268 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004269 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4270 com_push(c, 1);
4271 com_addbyte(c, RETURN_VALUE);
4272 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004273 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004274 break;
4275
Guido van Rossum4c417781991-01-21 16:09:22 +00004276 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004277 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004278 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004279 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4280 com_push(c, 1);
4281 com_addbyte(c, RETURN_VALUE);
4282 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004283 break;
4284
Guido van Rossum590baa41993-11-30 13:40:46 +00004285 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004286 com_node(c, CHILD(n, 0));
4287 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004288 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004289 break;
4290
Guido van Rossum590baa41993-11-30 13:40:46 +00004291 case lambdef: /* anonymous function definition */
4292 compile_lambdef(c, n);
4293 break;
4294
Guido van Rossum4c417781991-01-21 16:09:22 +00004295 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004296 compile_funcdef(c, n);
4297 break;
4298
Guido van Rossum4c417781991-01-21 16:09:22 +00004299 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004300 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004301 break;
4302
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004303 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004304 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004305 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004306 }
4307}
4308
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004309static PyObject *
4310dict_keys_inorder(PyObject *dict, int offset)
4311{
4312 PyObject *tuple, *k, *v;
4313 int i, pos = 0, size = PyDict_Size(dict);
4314
4315 tuple = PyTuple_New(size);
4316 if (tuple == NULL)
4317 return NULL;
4318 while (PyDict_Next(dict, &pos, &k, &v)) {
4319 i = PyInt_AS_LONG(v);
4320 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004321 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004322 PyTuple_SET_ITEM(tuple, i - offset, k);
4323 }
4324 return tuple;
4325}
4326
Guido van Rossum79f25d91997-04-29 20:08:16 +00004327PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004328PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004329{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004330 return PyNode_CompileFlags(n, filename, NULL);
4331}
4332
4333PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004334PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004335{
4336 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004337}
4338
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004339struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004340PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004341{
4342 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004343 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004344
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004345 ff = PyNode_Future(n, filename);
4346 if (ff == NULL)
4347 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004348 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00004349 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004350 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004351 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004352 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004353 return st;
4354}
4355
Guido van Rossum79f25d91997-04-29 20:08:16 +00004356static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004357icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004358{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004359 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004360}
4361
Guido van Rossum79f25d91997-04-29 20:08:16 +00004362static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004363jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004364 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004365{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004366 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004367 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004368 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004369 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004370 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4371 sc.c_encoding = "utf-8";
4372 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004373 sc.c_encoding = STR(n);
4374 n = CHILD(n, 0);
4375 } else {
4376 sc.c_encoding = NULL;
4377 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004378 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004379 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004380 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004381 /* c_symtable still points to parent's symbols */
4382 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004383 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004384 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004385 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004386 if (base->c_encoding != NULL) {
4387 assert(sc.c_encoding == NULL);
4388 sc.c_encoding = base->c_encoding;
4389 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004390 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004391 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004392 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004393 if (sc.c_future == NULL) {
4394 com_free(&sc);
4395 return NULL;
4396 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004397 if (flags) {
4398 int merged = sc.c_future->ff_features |
4399 flags->cf_flags;
4400 sc.c_future->ff_features = merged;
4401 flags->cf_flags = merged;
4402 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004403 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
4404 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004405 com_free(&sc);
4406 return NULL;
4407 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004408 /* reset symbol table for second pass */
4409 sc.c_symtable->st_nscopes = 1;
4410 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004411 }
4412 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004413 if (symtable_load_symbols(&sc) < 0) {
4414 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004415 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004416 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004417 compile_node(&sc, n);
4418 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004419 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004420 PyObject *consts, *names, *varnames, *filename, *name,
4421 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004422 consts = PyList_AsTuple(sc.c_consts);
4423 names = PyList_AsTuple(sc.c_names);
4424 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004425 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4426 freevars = dict_keys_inorder(sc.c_freevars,
4427 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004428 filename = PyString_InternFromString(sc.c_filename);
4429 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004430 if (!PyErr_Occurred())
4431 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004432 sc.c_nlocals,
4433 sc.c_maxstacklevel,
4434 sc.c_flags,
4435 sc.c_code,
4436 consts,
4437 names,
4438 varnames,
4439 freevars,
4440 cellvars,
4441 filename,
4442 name,
4443 sc.c_firstlineno,
4444 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004445 Py_XDECREF(consts);
4446 Py_XDECREF(names);
4447 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004448 Py_XDECREF(freevars);
4449 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004450 Py_XDECREF(filename);
4451 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004452 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004453 else if (!PyErr_Occurred()) {
4454 /* This could happen if someone called PyErr_Clear() after an
4455 error was reported above. That's not supposed to happen,
4456 but I just plugged one case and I'm not sure there can't be
4457 others. In that case, raise SystemError so that at least
4458 it gets reported instead dumping core. */
4459 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4460 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004461 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004462 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004463 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004464 sc.c_symtable = NULL;
4465 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004466 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004467 return co;
4468}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004469
4470int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004471PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004472{
4473 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004474 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004475 int line = co->co_firstlineno;
4476 int addr = 0;
4477 while (--size >= 0) {
4478 addr += *p++;
4479 if (addr > addrq)
4480 break;
4481 line += *p++;
4482 }
4483 return line;
4484}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004485
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004486/* The test for LOCAL must come before the test for FREE in order to
4487 handle classes where name is both local and free. The local var is
4488 a method and the free var is a free var referenced within a method.
4489*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004490
4491static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004492get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004493{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004494 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004495 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004496
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004497 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4498 return CELL;
4499 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4500 return LOCAL;
4501 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4502 return FREE;
4503 v = PyDict_GetItemString(c->c_globals, name);
4504 if (v) {
4505 if (v == Py_None)
4506 return GLOBAL_EXPLICIT;
4507 else {
4508 return GLOBAL_IMPLICIT;
4509 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004510 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004511 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004512 "unknown scope for %.100s in %.100s(%s) "
4513 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4514 name, c->c_name,
4515 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4516 c->c_filename,
4517 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4518 PyObject_REPR(c->c_locals),
4519 PyObject_REPR(c->c_globals)
4520 );
4521
4522 Py_FatalError(buf);
4523 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004524}
4525
Guido van Rossum207fda62001-03-02 03:30:41 +00004526/* Helper functions to issue warnings */
4527
4528static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004529issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004530{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004531 if (PyErr_Occurred()) {
4532 /* This can happen because symtable_node continues
4533 processing even after raising a SyntaxError.
4534 Calling PyErr_WarnExplicit now would clobber the
4535 pending exception; instead we fail and let that
4536 exception propagate.
4537 */
4538 return -1;
4539 }
Guido van Rossum207fda62001-03-02 03:30:41 +00004540 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4541 lineno, NULL, NULL) < 0) {
4542 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4543 PyErr_SetString(PyExc_SyntaxError, msg);
4544 PyErr_SyntaxLocation(filename, lineno);
4545 }
4546 return -1;
4547 }
4548 return 0;
4549}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004550
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004551static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004552symtable_warn(struct symtable *st, char *msg)
4553{
Guido van Rossum207fda62001-03-02 03:30:41 +00004554 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004555 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004556 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004557 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004558 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004559}
4560
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004561/* Helper function for setting lineno and filename */
4562
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004563static struct symtable *
4564symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004565{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004566 struct symtable *st;
4567
4568 st = symtable_init();
4569 if (st == NULL)
4570 return NULL;
4571 st->st_future = ff;
4572 st->st_filename = filename;
4573 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
4574 if (st->st_errors > 0)
4575 goto fail;
4576 symtable_node(st, n);
4577 if (st->st_errors > 0)
4578 goto fail;
4579 return st;
4580 fail:
4581 if (!PyErr_Occurred()) {
4582 /* This could happen because after a syntax error is
4583 detected, the symbol-table-building continues for
4584 a while, and PyErr_Clear() might erroneously be
4585 called during that process. One such case has been
4586 fixed, but there might be more (now or later).
4587 */
4588 PyErr_SetString(PyExc_SystemError, "lost exception");
4589 }
4590 st->st_future = NULL;
4591 st->st_filename = NULL;
4592 PySymtable_Free(st);
4593 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004594}
4595
4596static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004597symtable_init_compiling_symbols(struct compiling *c)
4598{
4599 PyObject *varnames;
4600
4601 varnames = c->c_symtable->st_cur->ste_varnames;
4602 if (varnames == NULL) {
4603 varnames = PyList_New(0);
4604 if (varnames == NULL)
4605 return -1;
4606 c->c_symtable->st_cur->ste_varnames = varnames;
4607 Py_INCREF(varnames);
4608 } else
4609 Py_INCREF(varnames);
4610 c->c_varnames = varnames;
4611
4612 c->c_globals = PyDict_New();
4613 if (c->c_globals == NULL)
4614 return -1;
4615 c->c_freevars = PyDict_New();
4616 if (c->c_freevars == NULL)
4617 return -1;
4618 c->c_cellvars = PyDict_New();
4619 if (c->c_cellvars == NULL)
4620 return -1;
4621 return 0;
4622}
4623
4624struct symbol_info {
4625 int si_nlocals;
4626 int si_ncells;
4627 int si_nfrees;
4628 int si_nimplicit;
4629};
4630
4631static void
4632symtable_init_info(struct symbol_info *si)
4633{
4634 si->si_nlocals = 0;
4635 si->si_ncells = 0;
4636 si->si_nfrees = 0;
4637 si->si_nimplicit = 0;
4638}
4639
4640static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004641symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004642 struct symbol_info *si)
4643{
4644 PyObject *dict, *v;
4645
4646 /* Seperate logic for DEF_FREE. If it occurs in a function,
4647 it indicates a local that we must allocate storage for (a
4648 cell var). If it occurs in a class, then the class has a
4649 method and a free variable with the same name.
4650 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004651 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004652 /* If it isn't declared locally, it can't be a cell. */
4653 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4654 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004655 v = PyInt_FromLong(si->si_ncells++);
4656 dict = c->c_cellvars;
4657 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004658 /* If it is free anyway, then there is no need to do
4659 anything here.
4660 */
4661 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004662 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004663 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004664 v = PyInt_FromLong(si->si_nfrees++);
4665 dict = c->c_freevars;
4666 }
4667 if (v == NULL)
4668 return -1;
4669 if (PyDict_SetItem(dict, name, v) < 0) {
4670 Py_DECREF(v);
4671 return -1;
4672 }
4673 Py_DECREF(v);
4674 return 0;
4675}
4676
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004677/* If a variable is a cell and an argument, make sure that appears in
4678 co_cellvars before any variable to its right in varnames.
4679*/
4680
4681
4682static int
4683symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4684 PyObject *varnames, int flags)
4685{
Tim Petersb39903b2003-03-24 17:22:24 +00004686 PyObject *v = NULL;
4687 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004688 int i, pos;
4689
4690 if (flags & CO_VARARGS)
4691 argcount++;
4692 if (flags & CO_VARKEYWORDS)
4693 argcount++;
4694 for (i = argcount; --i >= 0; ) {
4695 v = PyList_GET_ITEM(varnames, i);
4696 if (PyDict_GetItem(*cellvars, v)) {
4697 if (list == NULL) {
4698 list = PyList_New(1);
4699 if (list == NULL)
4700 return -1;
4701 PyList_SET_ITEM(list, 0, v);
4702 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004703 } else {
4704 if (PyList_Insert(list, 0, v) < 0) {
4705 Py_DECREF(list);
4706 return -1;
4707 }
4708 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004709 }
4710 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00004711 if (list == NULL)
4712 return 0;
4713
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004714 /* There are cellvars that are also arguments. Create a dict
4715 to replace cellvars and put the args at the front.
4716 */
4717 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004718 if (d == NULL)
4719 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004720 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4721 v = PyInt_FromLong(i);
4722 if (v == NULL)
4723 goto fail;
4724 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4725 goto fail;
4726 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4727 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00004728 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004729 }
4730 pos = 0;
4731 i = PyList_GET_SIZE(list);
4732 Py_DECREF(list);
4733 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4734 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004735 if (w == NULL)
4736 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004737 if (PyDict_SetItem(d, v, w) < 0) {
4738 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00004739 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004740 goto fail;
4741 }
4742 Py_DECREF(w);
4743 }
4744 Py_DECREF(*cellvars);
4745 *cellvars = d;
4746 return 1;
4747 fail:
4748 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00004749 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004750 return -1;
4751}
4752
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004753static int
4754symtable_freevar_offsets(PyObject *freevars, int offset)
4755{
4756 PyObject *name, *v;
4757 int pos;
4758
4759 /* The cell vars are the first elements of the closure,
4760 followed by the free vars. Update the offsets in
4761 c_freevars to account for number of cellvars. */
4762 pos = 0;
4763 while (PyDict_Next(freevars, &pos, &name, &v)) {
4764 int i = PyInt_AS_LONG(v) + offset;
4765 PyObject *o = PyInt_FromLong(i);
4766 if (o == NULL)
4767 return -1;
4768 if (PyDict_SetItem(freevars, name, o) < 0) {
4769 Py_DECREF(o);
4770 return -1;
4771 }
4772 Py_DECREF(o);
4773 }
4774 return 0;
4775}
4776
4777static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004778symtable_check_unoptimized(struct compiling *c,
4779 PySymtableEntryObject *ste,
4780 struct symbol_info *si)
4781{
4782 char buf[300];
4783
4784 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4785 || (ste->ste_nested && si->si_nimplicit)))
4786 return 0;
4787
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004788#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4789
4790#define ILLEGAL_IS "is a nested function"
4791
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004792#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004793"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004794
4795#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004796"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004797
4798#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00004799"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004800"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004801
4802 /* XXX perhaps the linenos for these opt-breaking statements
4803 should be stored so the exception can point to them. */
4804
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004805 if (ste->ste_child_free) {
4806 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004807 PyOS_snprintf(buf, sizeof(buf),
4808 ILLEGAL_IMPORT_STAR,
4809 PyString_AS_STRING(ste->ste_name),
4810 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004811 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004812 PyOS_snprintf(buf, sizeof(buf),
4813 ILLEGAL_BARE_EXEC,
4814 PyString_AS_STRING(ste->ste_name),
4815 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004816 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004817 PyOS_snprintf(buf, sizeof(buf),
4818 ILLEGAL_EXEC_AND_IMPORT_STAR,
4819 PyString_AS_STRING(ste->ste_name),
4820 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004821 }
4822 } else {
4823 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004824 PyOS_snprintf(buf, sizeof(buf),
4825 ILLEGAL_IMPORT_STAR,
4826 PyString_AS_STRING(ste->ste_name),
4827 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004828 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004829 PyOS_snprintf(buf, sizeof(buf),
4830 ILLEGAL_BARE_EXEC,
4831 PyString_AS_STRING(ste->ste_name),
4832 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004833 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004834 PyOS_snprintf(buf, sizeof(buf),
4835 ILLEGAL_EXEC_AND_IMPORT_STAR,
4836 PyString_AS_STRING(ste->ste_name),
4837 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004838 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004839 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004840
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004841 PyErr_SetString(PyExc_SyntaxError, buf);
4842 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4843 ste->ste_opt_lineno);
4844 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004845}
4846
4847static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004848symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4849 struct symbol_info *si)
4850{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004851 if (c->c_future)
4852 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004853 if (ste->ste_generator)
4854 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004855 if (ste->ste_type != TYPE_MODULE)
4856 c->c_flags |= CO_NEWLOCALS;
4857 if (ste->ste_type == TYPE_FUNCTION) {
4858 c->c_nlocals = si->si_nlocals;
4859 if (ste->ste_optimized == 0)
4860 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004861 else if (ste->ste_optimized != OPT_EXEC)
4862 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004863 }
4864 return 0;
4865}
4866
4867static int
Jeremy Hylton98326132003-09-22 04:26:44 +00004868symtable_error(struct symtable *st, int lineno)
4869{
4870 if (lineno == 0)
4871 lineno = st->st_cur->ste_lineno;
4872 PyErr_SyntaxLocation(st->st_filename, lineno);
4873 st->st_errors++;
4874 return -1;
4875}
4876
4877static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004878symtable_load_symbols(struct compiling *c)
4879{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004880 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004881 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004882 PyObject *name, *varnames, *v;
4883 int i, flags, pos;
4884 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004885
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004886 v = NULL;
4887
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004888 if (symtable_init_compiling_symbols(c) < 0)
4889 goto fail;
4890 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004891 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004892 si.si_nlocals = PyList_GET_SIZE(varnames);
4893 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004894
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004895 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004896 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004897 if (v == NULL)
4898 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004899 if (PyDict_SetItem(c->c_locals,
4900 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004901 goto fail;
4902 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004903 }
4904
4905 /* XXX The cases below define the rules for whether a name is
4906 local or global. The logic could probably be clearer. */
4907 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004908 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4909 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004910
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004911 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004912 /* undo the original DEF_FREE */
4913 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004914
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004915 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004916 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004917 2. Free variables in methods that are also class
4918 variables or declared global.
4919 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004920 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004921 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004922
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004923 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004924 c->c_argcount--;
4925 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004926 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004927 c->c_argcount--;
4928 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004929 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004930 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004931 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004932 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00004933 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004934 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00004935 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004936 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004937 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004938 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4939 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004940 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004941 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00004942 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004943 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004944 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004945 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004946 if (v == NULL)
4947 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004948 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004949 goto fail;
4950 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004951 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004952 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004953 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004954 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004955 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004956 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004957 if (v == NULL)
4958 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004959 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004960 goto fail;
4961 Py_DECREF(v);
4962 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004963 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004964 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00004965 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004966 goto fail;
4967 if (st->st_nscopes != 1) {
4968 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004969 if (v == NULL)
4970 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004971 if (PyDict_SetItem(st->st_global,
4972 name, v))
4973 goto fail;
4974 Py_DECREF(v);
4975 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004976 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004977 }
4978 }
4979
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004980 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4981
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004982 if (si.si_ncells > 1) { /* one cell is always in order */
4983 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4984 c->c_varnames, c->c_flags) < 0)
4985 return -1;
4986 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004987 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4988 return -1;
4989 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004990 fail:
4991 /* is this always the right thing to do? */
4992 Py_XDECREF(v);
4993 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004994}
4995
4996static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004997symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004998{
4999 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005000
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005001 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005002 if (st == NULL)
5003 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005004 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005005
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005006 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005007 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005008 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005009 goto fail;
5010 if ((st->st_symbols = PyDict_New()) == NULL)
5011 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005012 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005013 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005014 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005015 st->st_private = NULL;
5016 return st;
5017 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005018 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005019 return NULL;
5020}
5021
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005022void
5023PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005024{
5025 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005026 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005027 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005028 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005029}
5030
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005031/* When the compiler exits a scope, it must should update the scope's
5032 free variable information with the list of free variables in its
5033 children.
5034
5035 Variables that are free in children and defined in the current
5036 scope are cellvars.
5037
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005038 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005039 false), free variables in children that are not defined here are
5040 implicit globals.
5041
5042*/
5043
5044static int
5045symtable_update_free_vars(struct symtable *st)
5046{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005047 int i, j, def;
5048 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005049 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005050
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005051 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005052 def = DEF_FREE_CLASS;
5053 else
5054 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005055 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005056 int pos = 0;
5057
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005058 if (list && PyList_SetSlice(list, 0,
5059 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005060 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005061 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005062 PyList_GET_ITEM(ste->ste_children, i);
5063 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005064 int flags = PyInt_AS_LONG(o);
5065 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005066 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005067 if (list == NULL) {
5068 list = PyList_New(0);
5069 if (list == NULL)
5070 return -1;
5071 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005072 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005073 if (PyList_Append(list, name) < 0) {
5074 Py_DECREF(list);
5075 return -1;
5076 }
5077 }
5078 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005079 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005080 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005081 v = PyDict_GetItem(ste->ste_symbols, name);
5082 /* If a name N is declared global in scope A and
5083 referenced in scope B contained (perhaps
5084 indirectly) in A and there are no scopes
5085 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005086 is global in B. Unless A is a class scope,
5087 because class scopes are not considered for
5088 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005089 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005090 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005091 int flags = PyInt_AS_LONG(v);
5092 if (flags & DEF_GLOBAL) {
5093 symtable_undo_free(st, child->ste_id,
5094 name);
5095 continue;
5096 }
5097 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005098 if (ste->ste_nested) {
5099 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005100 name, def) < 0) {
5101 Py_DECREF(list);
5102 return -1;
5103 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005104 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005105 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005106 name) < 0) {
5107 Py_DECREF(list);
5108 return -1;
5109 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005110 }
5111 }
5112 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005113
5114 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005115 return 0;
5116}
5117
5118/* If the current scope is a non-nested class or if name is not
5119 defined in the current, non-nested scope, then it is an implicit
5120 global in all nested scopes.
5121*/
5122
5123static int
5124symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5125{
5126 PyObject *o;
5127 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005128 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005129
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005130 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005131 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005132 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005133 if (o == NULL)
5134 return symtable_undo_free(st, child, name);
5135 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005136
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005137 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005138 return symtable_undo_free(st, child, name);
5139 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005140 return symtable_add_def_o(st, ste->ste_symbols,
5141 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005142}
5143
5144static int
5145symtable_undo_free(struct symtable *st, PyObject *id,
5146 PyObject *name)
5147{
5148 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005149 PyObject *info;
5150 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005151
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005152 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5153 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005154 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005155
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005156 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005157 if (info == NULL)
5158 return 0;
5159 v = PyInt_AS_LONG(info);
5160 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005161 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005162 DEF_FREE_GLOBAL) < 0)
5163 return -1;
5164 } else
5165 /* If the name is defined here or declared global,
5166 then the recursion stops. */
5167 return 0;
5168
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005169 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5170 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005171 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005172 PyList_GET_ITEM(ste->ste_children, i);
5173 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005174 if (x < 0)
5175 return x;
5176 }
5177 return 0;
5178}
5179
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005180/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5181 This reference is released when the scope is exited, via the DECREF
5182 in symtable_exit_scope().
5183*/
5184
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005185static int
5186symtable_exit_scope(struct symtable *st)
5187{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005188 int end;
5189
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005190 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005191 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005192 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005193 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005194 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5195 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005196 if (PySequence_DelItem(st->st_stack, end) < 0)
5197 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005198 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005199}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005200
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005201static void
5202symtable_enter_scope(struct symtable *st, char *name, int type,
5203 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005204{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005205 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005206
5207 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005208 prev = st->st_cur;
5209 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005210 st->st_errors++;
5211 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005212 }
5213 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005214 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005215 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005216 if (st->st_cur == NULL) {
5217 st->st_errors++;
5218 return;
5219 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005220 if (strcmp(name, TOP) == 0)
5221 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005222 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005223 if (PyList_Append(prev->ste_children,
5224 (PyObject *)st->st_cur) < 0)
5225 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005226 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005227}
5228
5229static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005230symtable_lookup(struct symtable *st, char *name)
5231{
5232 char buffer[MANGLE_LEN];
5233 PyObject *v;
5234 int flags;
5235
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005236 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005237 name = buffer;
5238 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5239 if (v == NULL) {
5240 if (PyErr_Occurred())
5241 return -1;
5242 else
5243 return 0;
5244 }
5245
5246 flags = PyInt_AS_LONG(v);
5247 return flags;
5248}
5249
5250static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005251symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005252{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005253 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005254 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005255 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005256
Guido van Rossumb7164622002-08-16 02:48:11 +00005257 /* Warn about None, except inside a tuple (where the assignment
5258 code already issues a warning). */
5259 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5260 *name == 'N' && strcmp(name, "None") == 0)
5261 {
5262 if (symtable_warn(st, "argument named None"))
5263 return -1;
5264 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005265 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005266 name = buffer;
5267 if ((s = PyString_InternFromString(name)) == NULL)
5268 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005269 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5270 Py_DECREF(s);
5271 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005272}
5273
5274/* Must only be called with mangled names */
5275
5276static int
5277symtable_add_def_o(struct symtable *st, PyObject *dict,
5278 PyObject *name, int flag)
5279{
5280 PyObject *o;
5281 int val;
5282
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005283 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005284 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005285 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005286 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005287 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005288 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005289 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005290 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005291 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005292 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005293 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005294 if (o == NULL)
5295 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005296 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005297 Py_DECREF(o);
5298 return -1;
5299 }
5300 Py_DECREF(o);
5301
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005302 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005303 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005304 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005305 } else if (flag & DEF_GLOBAL) {
5306 /* XXX need to update DEF_GLOBAL for other flags too;
5307 perhaps only DEF_FREE_GLOBAL */
5308 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005309 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005310 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005311 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005312 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005313 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005314 if (o == NULL)
5315 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005316 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005317 Py_DECREF(o);
5318 return -1;
5319 }
5320 Py_DECREF(o);
5321 }
5322 return 0;
5323}
5324
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005325#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005326
Tim Peters08a898f2001-06-28 01:52:22 +00005327/* Look for a yield stmt under n. Return 1 if found, else 0.
5328 This hack is used to look inside "if 0:" blocks (which are normally
5329 ignored) in case those are the only places a yield occurs (so that this
5330 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005331static int
5332look_for_yield(node *n)
5333{
5334 int i;
5335
5336 for (i = 0; i < NCH(n); ++i) {
5337 node *kid = CHILD(n, i);
5338
5339 switch (TYPE(kid)) {
5340
5341 case classdef:
5342 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005343 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005344 /* Stuff in nested functions and classes can't make
5345 the parent a generator. */
5346 return 0;
5347
5348 case yield_stmt:
5349 return 1;
5350
5351 default:
5352 if (look_for_yield(kid))
5353 return 1;
5354 }
5355 }
5356 return 0;
5357}
5358
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005359static void
5360symtable_node(struct symtable *st, node *n)
5361{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005362 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005363
5364 loop:
5365 switch (TYPE(n)) {
5366 case funcdef: {
5367 char *func_name = STR(CHILD(n, 1));
5368 symtable_add_def(st, func_name, DEF_LOCAL);
5369 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005370 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005371 symtable_funcdef(st, n);
5372 symtable_exit_scope(st);
5373 break;
5374 }
5375 case lambdef:
5376 if (NCH(n) == 4)
5377 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005378 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005379 symtable_funcdef(st, n);
5380 symtable_exit_scope(st);
5381 break;
5382 case classdef: {
5383 char *tmp, *class_name = STR(CHILD(n, 1));
5384 symtable_add_def(st, class_name, DEF_LOCAL);
5385 if (TYPE(CHILD(n, 2)) == LPAR) {
5386 node *bases = CHILD(n, 3);
5387 int i;
5388 for (i = 0; i < NCH(bases); i += 2) {
5389 symtable_node(st, CHILD(bases, i));
5390 }
5391 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005392 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005393 tmp = st->st_private;
5394 st->st_private = class_name;
5395 symtable_node(st, CHILD(n, NCH(n) - 1));
5396 st->st_private = tmp;
5397 symtable_exit_scope(st);
5398 break;
5399 }
5400 case if_stmt:
5401 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005402 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5403 if (st->st_cur->ste_generator == 0)
5404 st->st_cur->ste_generator =
5405 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005406 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005407 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005408 symtable_node(st, CHILD(n, i + 1));
5409 symtable_node(st, CHILD(n, i + 3));
5410 }
5411 if (i + 2 < NCH(n))
5412 symtable_node(st, CHILD(n, i + 2));
5413 break;
5414 case global_stmt:
5415 symtable_global(st, n);
5416 break;
5417 case import_stmt:
5418 symtable_import(st, n);
5419 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005420 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005421 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005422 symtable_node(st, CHILD(n, 1));
5423 if (NCH(n) > 2)
5424 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005425 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005426 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005427 st->st_cur->ste_opt_lineno = n->n_lineno;
5428 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005429 if (NCH(n) > 4)
5430 symtable_node(st, CHILD(n, 5));
5431 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005432
5433 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005434 case assert_stmt:
5435 if (Py_OptimizeFlag)
5436 return;
5437 if (NCH(n) == 2) {
5438 n = CHILD(n, 1);
5439 goto loop;
5440 } else {
5441 symtable_node(st, CHILD(n, 1));
5442 n = CHILD(n, 3);
5443 goto loop;
5444 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005445 case except_clause:
5446 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005447 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005448 if (NCH(n) > 1) {
5449 n = CHILD(n, 1);
5450 goto loop;
5451 }
5452 break;
5453 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005454 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005455 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005456 case yield_stmt:
5457 st->st_cur->ste_generator = 1;
5458 n = CHILD(n, 1);
5459 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005460 case expr_stmt:
5461 if (NCH(n) == 1)
5462 n = CHILD(n, 0);
5463 else {
5464 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005465 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005466 symtable_node(st, CHILD(n, 2));
5467 break;
5468 } else {
5469 int i;
5470 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005471 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005472 n = CHILD(n, NCH(n) - 1);
5473 }
5474 }
5475 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005476 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005477 /* only occurs when there are multiple for loops
5478 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005479 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005480 if (TYPE(n) == list_for)
5481 symtable_list_for(st, n);
5482 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005483 REQ(n, list_if);
5484 symtable_node(st, CHILD(n, 1));
5485 if (NCH(n) == 3) {
5486 n = CHILD(n, 2);
5487 goto loop;
5488 }
5489 }
5490 break;
5491 case for_stmt:
5492 symtable_assign(st, CHILD(n, 1), 0);
5493 for (i = 3; i < NCH(n); ++i)
5494 if (TYPE(CHILD(n, i)) >= single_input)
5495 symtable_node(st, CHILD(n, i));
5496 break;
5497 /* The remaining cases fall through to default except in
5498 special circumstances. This requires the individual cases
5499 to be coded with great care, even though they look like
5500 rather innocuous. Each case must double-check TYPE(n).
5501 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005502 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005503 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005504 n = CHILD(n, 2);
5505 goto loop;
5506 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005507 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005508 case listmaker:
5509 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005510 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005511 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005512 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005513 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005514 case atom:
5515 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5516 symtable_add_use(st, STR(CHILD(n, 0)));
5517 break;
5518 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005519 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005520 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005521 /* Walk over every non-token child with a special case
5522 for one child.
5523 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005524 if (NCH(n) == 1) {
5525 n = CHILD(n, 0);
5526 goto loop;
5527 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005528 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005529 if (TYPE(CHILD(n, i)) >= single_input)
5530 symtable_node(st, CHILD(n, i));
5531 }
5532}
5533
5534static void
5535symtable_funcdef(struct symtable *st, node *n)
5536{
5537 node *body;
5538
5539 if (TYPE(n) == lambdef) {
5540 if (NCH(n) == 4)
5541 symtable_params(st, CHILD(n, 1));
5542 } else
5543 symtable_params(st, CHILD(n, 2));
5544 body = CHILD(n, NCH(n) - 1);
5545 symtable_node(st, body);
5546}
5547
5548/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00005549 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005550 which are references in the defining scope. symtable_params()
5551 parses the parameter names, which are defined in the function's
5552 body.
5553
5554 varargslist:
5555 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5556 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5557*/
5558
5559static void
5560symtable_default_args(struct symtable *st, node *n)
5561{
5562 node *c;
5563 int i;
5564
5565 if (TYPE(n) == parameters) {
5566 n = CHILD(n, 1);
5567 if (TYPE(n) == RPAR)
5568 return;
5569 }
5570 REQ(n, varargslist);
5571 for (i = 0; i < NCH(n); i += 2) {
5572 c = CHILD(n, i);
5573 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5574 break;
5575 }
5576 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5577 symtable_node(st, CHILD(n, i));
5578 }
5579}
5580
5581static void
5582symtable_params(struct symtable *st, node *n)
5583{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005584 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00005585 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005586
5587 if (TYPE(n) == parameters) {
5588 n = CHILD(n, 1);
5589 if (TYPE(n) == RPAR)
5590 return;
5591 }
5592 REQ(n, varargslist);
5593 for (i = 0; i < NCH(n); i += 2) {
5594 c = CHILD(n, i);
5595 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5596 ext = 1;
5597 break;
5598 }
5599 if (TYPE(c) == test) {
5600 continue;
5601 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00005602 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005603 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00005604 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005605 char nbuf[30];
5606 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005607 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005608 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005609 }
5610 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005611 if (ext) {
5612 c = CHILD(n, i);
5613 if (TYPE(c) == STAR) {
5614 i++;
5615 symtable_add_def(st, STR(CHILD(n, i)),
5616 DEF_PARAM | DEF_STAR);
5617 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005618 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005619 c = NULL;
5620 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005621 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005622 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005623 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005624 i++;
5625 symtable_add_def(st, STR(CHILD(n, i)),
5626 DEF_PARAM | DEF_DOUBLESTAR);
5627 }
5628 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005629 if (complex >= 0) {
5630 int j;
5631 for (j = 0; j <= complex; j++) {
5632 c = CHILD(n, j);
5633 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005634 c = CHILD(n, ++j);
5635 else if (TYPE(c) == EQUAL)
5636 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005637 if (TYPE(CHILD(c, 0)) == LPAR)
5638 symtable_params_fplist(st, CHILD(c, 1));
5639 }
5640 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005641}
5642
5643static void
5644symtable_params_fplist(struct symtable *st, node *n)
5645{
5646 int i;
5647 node *c;
5648
5649 REQ(n, fplist);
5650 for (i = 0; i < NCH(n); i += 2) {
5651 c = CHILD(n, i);
5652 REQ(c, fpdef);
5653 if (NCH(c) == 1)
5654 symtable_add_def(st, STR(CHILD(c, 0)),
5655 DEF_PARAM | DEF_INTUPLE);
5656 else
5657 symtable_params_fplist(st, CHILD(c, 1));
5658 }
5659
5660}
5661
5662static void
5663symtable_global(struct symtable *st, node *n)
5664{
5665 int i;
5666
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005667 /* XXX It might be helpful to warn about module-level global
5668 statements, but it's hard to tell the difference between
5669 module-level and a string passed to exec.
5670 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005671
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005672 for (i = 1; i < NCH(n); i += 2) {
5673 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005674 int flags;
5675
5676 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005677 if (flags < 0)
5678 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005679 if (flags && flags != DEF_GLOBAL) {
5680 char buf[500];
5681 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005682 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005683 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00005684 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005685 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005686 }
5687 else {
5688 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005689 PyOS_snprintf(buf, sizeof(buf),
5690 GLOBAL_AFTER_ASSIGN,
5691 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005692 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005693 PyOS_snprintf(buf, sizeof(buf),
5694 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005695 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005696 }
5697 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005698 symtable_add_def(st, name, DEF_GLOBAL);
5699 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005700}
5701
5702static void
5703symtable_list_comprehension(struct symtable *st, node *n)
5704{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005705 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005706 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005707
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005708 REQ(n, listmaker);
5709 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
5710 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005711 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005712 symtable_list_for(st, CHILD(n, 1));
5713 symtable_node(st, CHILD(n, 0));
5714 --st->st_cur->ste_tmpname;
5715}
5716
5717static void
5718symtable_list_for(struct symtable *st, node *n)
5719{
5720 REQ(n, list_for);
5721 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005722 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005723 symtable_node(st, CHILD(n, 3));
5724 if (NCH(n) == 5)
5725 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005726}
5727
5728static void
5729symtable_import(struct symtable *st, node *n)
5730{
5731 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005732 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005733 | 'from' dotted_name 'import'
5734 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005735 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005736 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005737 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005738 node *dotname = CHILD(n, 1);
5739 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5740 /* check for bogus imports */
5741 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5742 PyErr_SetString(PyExc_SyntaxError,
5743 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00005744 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005745 return;
5746 }
5747 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005748 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005749 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005750 if (symtable_warn(st,
5751 "import * only allowed at module level") < 0)
5752 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005753 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005754 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005755 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005756 } else {
5757 for (i = 3; i < NCH(n); i += 2) {
5758 node *c = CHILD(n, i);
5759 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005760 symtable_assign(st, CHILD(c, 2),
5761 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005762 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005763 symtable_assign(st, CHILD(c, 0),
5764 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005765 }
5766 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005767 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005768 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005769 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005770 }
5771 }
5772}
5773
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005774/* The third argument to symatble_assign() is a flag to be passed to
5775 symtable_add_def() if it is eventually called. The flag is useful
5776 to specify the particular type of assignment that should be
5777 recorded, e.g. an assignment caused by import.
5778 */
5779
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005780static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005781symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005782{
5783 node *tmp;
5784 int i;
5785
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005786 loop:
5787 switch (TYPE(n)) {
5788 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005789 /* invalid assignment, e.g. lambda x:x=2. The next
5790 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005791 return;
5792 case power:
5793 if (NCH(n) > 2) {
5794 for (i = 2; i < NCH(n); ++i)
5795 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5796 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005797 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005798 if (NCH(n) > 1) {
5799 symtable_node(st, CHILD(n, 0));
5800 symtable_node(st, CHILD(n, 1));
5801 } else {
5802 n = CHILD(n, 0);
5803 goto loop;
5804 }
5805 return;
5806 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005807 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5808 /* XXX This is an error, but the next pass
5809 will catch it. */
5810 return;
5811 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005812 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005813 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005814 }
5815 return;
5816 case exprlist:
5817 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00005818 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005819 if (NCH(n) == 1) {
5820 n = CHILD(n, 0);
5821 goto loop;
5822 }
5823 else {
5824 int i;
5825 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005826 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005827 return;
5828 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005829 case atom:
5830 tmp = CHILD(n, 0);
5831 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5832 n = CHILD(n, 1);
5833 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005834 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00005835 if (strcmp(STR(tmp), "__debug__") == 0) {
5836 PyErr_SetString(PyExc_SyntaxError,
5837 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00005838 symtable_error(st, n->n_lineno);
5839 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00005840 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005841 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005842 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005843 return;
5844 case dotted_as_name:
5845 if (NCH(n) == 3)
5846 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005847 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005848 else
5849 symtable_add_def(st,
5850 STR(CHILD(CHILD(n,
5851 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005852 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005853 return;
5854 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005855 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005856 return;
5857 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005858 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005859 return;
5860 default:
5861 if (NCH(n) == 0)
5862 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005863 if (NCH(n) == 1) {
5864 n = CHILD(n, 0);
5865 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005866 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005867 /* Should only occur for errors like x + 1 = 1,
5868 which will be caught in the next pass. */
5869 for (i = 0; i < NCH(n); ++i)
5870 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005871 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005872 }
5873}