blob: 16328b53e7d05c2f9aace208ff5a76cadb5399b1 [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
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000395 /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with
396 with JUMP_IF_TRUE POP_TOP NOP */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000397 case UNARY_NOT:
398 if (codestr[i+1] != JUMP_IF_FALSE ||
399 codestr[i+4] != POP_TOP ||
400 !ISBASICBLOCK(blocks,i,5))
401 continue;
402 tgt = GETJUMPTGT(codestr, (i+1));
403 if (codestr[tgt] != POP_TOP)
404 continue;
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000405 j = GETARG(codestr, i+1) + 1;
406 codestr[i] = JUMP_IF_TRUE;
407 SETARG(codestr, i, j);
408 codestr[i+3] = POP_TOP;
409 codestr[i+4] = NOP;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000410 break;
411
412 /* not a is b --> a is not b
413 not a in b --> a not in b
414 not a is not b --> a is b
415 not a not in b --> a in b */
416 case COMPARE_OP:
417 j = GETARG(codestr, i);
418 if (j < 6 || j > 9 ||
419 codestr[i+3] != UNARY_NOT ||
420 !ISBASICBLOCK(blocks,i,4))
421 continue;
422 SETARG(codestr, i, (j^1));
423 codestr[i+3] = NOP;
424 break;
425
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000426 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP.
427 Note, only the first opcode is changed, the others still
428 perform normally if they happen to be jump targets. */
429 case LOAD_CONST:
430 j = GETARG(codestr, i);
431 if (codestr[i+3] != JUMP_IF_FALSE ||
432 codestr[i+6] != POP_TOP ||
433 !PyObject_IsTrue(PyTuple_GET_ITEM(consts, j)))
434 continue;
435 codestr[i] = JUMP_FORWARD;
436 SETARG(codestr, i, 4);
437 break;
438
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000439 /* Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2 JMP+2 NOP NOP.
440 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2 JMP+1 NOP. */
441 case BUILD_TUPLE:
442 case BUILD_LIST:
443 if (codestr[i+3] != UNPACK_SEQUENCE)
444 continue;
445 if (!ISBASICBLOCK(blocks,i,6))
446 continue;
447 if (GETARG(codestr, i) == 2 && \
448 GETARG(codestr, i+3) == 2) {
449 codestr[i] = ROT_TWO;
450 codestr[i+1] = JUMP_FORWARD;
451 SETARG(codestr, i+1, 2);
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000452 codestr[i+4] = NOP;
453 codestr[i+5] = NOP;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000454 continue;
455 }
456 if (GETARG(codestr, i) == 3 && \
457 GETARG(codestr, i+3) == 3) {
458 codestr[i] = ROT_THREE;
459 codestr[i+1] = ROT_TWO;
460 codestr[i+2] = JUMP_FORWARD;
461 SETARG(codestr, i+2, 1);
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000462 codestr[i+5] = NOP;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000463 }
464 break;
465
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000466 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000467 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000468 case JUMP_FORWARD:
469 case JUMP_IF_FALSE:
470 case JUMP_IF_TRUE:
471 case JUMP_ABSOLUTE:
472 case CONTINUE_LOOP:
473 case SETUP_LOOP:
474 case SETUP_EXCEPT:
475 case SETUP_FINALLY:
476 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000477 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000478 continue;
479 tgttgt = GETJUMPTGT(codestr, tgt);
480 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
481 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000482 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000483 tgttgt -= i + 3; /* Calc relative jump addr */
484 if (tgttgt < 0) /* No backward relative jumps */
485 continue;
486 codestr[i] = opcode;
487 SETARG(codestr, i, tgttgt);
488 break;
489
490 case EXTENDED_ARG:
491 PyMem_Free(codestr);
492 goto exitUnchanged;
493 }
494 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000495 code = PyString_FromStringAndSize((char *)codestr, codelen);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000496 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000497 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000498 return code;
499
500exitUnchanged:
501 Py_INCREF(code);
502 return code;
503}
504
Guido van Rossum79f25d91997-04-29 20:08:16 +0000505PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000506PyCode_New(int argcount, int nlocals, int stacksize, int flags,
507 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000508 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
509 PyObject *filename, PyObject *name, int firstlineno,
510 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000511{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000512 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000513 int i;
514 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000515 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000516 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000517 consts == NULL || !PyTuple_Check(consts) ||
518 names == NULL || !PyTuple_Check(names) ||
519 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000520 freevars == NULL || !PyTuple_Check(freevars) ||
521 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000522 name == NULL || !PyString_Check(name) ||
523 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000524 lnotab == NULL || !PyString_Check(lnotab) ||
525 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000526 PyErr_BadInternalCall();
527 return NULL;
528 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000529 intern_strings(names);
530 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000531 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000532 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000533 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000534 for (i = PyTuple_Size(consts); --i >= 0; ) {
535 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000536 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000537 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000538 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000539 continue;
540 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000541 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000542 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000543 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000544 co->co_argcount = argcount;
545 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000546 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000547 co->co_flags = flags;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000548 co->co_code = optimize_code(code, consts);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000549 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000550 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000551 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000552 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000553 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000554 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000555 Py_INCREF(freevars);
556 co->co_freevars = freevars;
557 Py_INCREF(cellvars);
558 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000559 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000560 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000561 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000562 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000563 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000564 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000565 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000566 if (PyTuple_GET_SIZE(freevars) == 0 &&
567 PyTuple_GET_SIZE(cellvars) == 0)
568 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000569 }
570 return co;
571}
572
573
574/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000575
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000576/* The compiler uses two passes to generate bytecodes. The first pass
577 builds the symbol table. The second pass generates the bytecode.
578
579 The first pass uses a single symtable struct. The second pass uses
580 a compiling struct for each code block. The compiling structs
581 share a reference to the symtable.
582
583 The two passes communicate via symtable_load_symbols() and via
584 is_local() and is_global(). The former initializes several slots
585 in the compiling struct: c_varnames, c_locals, c_nlocals,
586 c_argcount, c_globals, and c_flags.
587*/
588
Tim Peters2a7f3842001-06-09 09:26:21 +0000589/* All about c_lnotab.
590
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000591c_lnotab is an array of unsigned bytes disguised as a Python string. Since
592version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
593mapped to source code line #s via c_lnotab instead.
594
Tim Peters2a7f3842001-06-09 09:26:21 +0000595The array is conceptually a list of
596 (bytecode offset increment, line number increment)
597pairs. The details are important and delicate, best illustrated by example:
598
599 byte code offset source code line number
600 0 1
601 6 2
602 50 7
603 350 307
604 361 308
605
606The first trick is that these numbers aren't stored, only the increments
607from one row to the next (this doesn't really work, but it's a start):
608
609 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
610
611The second trick is that an unsigned byte can't hold negative values, or
612values larger than 255, so (a) there's a deep assumption that byte code
613offsets and their corresponding line #s both increase monotonically, and (b)
614if at least one column jumps by more than 255 from one row to the next, more
615than one pair is written to the table. In case #b, there's no way to know
616from looking at the table later how many were written. That's the delicate
617part. A user of c_lnotab desiring to find the source line number
618corresponding to a bytecode address A should do something like this
619
620 lineno = addr = 0
621 for addr_incr, line_incr in c_lnotab:
622 addr += addr_incr
623 if addr > A:
624 return lineno
625 lineno += line_incr
626
627In order for this to work, when the addr field increments by more than 255,
628the line # increment in each pair generated must be 0 until the remaining addr
629increment is < 256. So, in the example above, com_set_lineno should not (as
630was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
631255, 0, 45, 255, 0, 45.
632*/
633
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000634struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000635 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000636 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000637 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000638 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000639 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +0000640 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000641 PyObject *c_locals; /* dictionary (value=localID) */
642 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000643 PyObject *c_freevars; /* dictionary (value=None) */
644 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000645 int c_nlocals; /* index of next local */
646 int c_argcount; /* number of top-level arguments */
647 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000648 int c_nexti; /* index into c_code */
649 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000650 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000651 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000652 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000653 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000654 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000655 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +0000656 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000657 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000658 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000659 int c_stacklevel; /* Current stack level */
660 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000661 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000662 PyObject *c_lnotab; /* Table mapping address to line number */
Armin Rigo80d937e2004-03-22 17:52:53 +0000663 int c_last_addr; /* last op addr seen and recorded in lnotab */
664 int c_last_line; /* last line seen and recorded in lnotab */
665 int c_lnotab_next; /* current length of lnotab */
666 int c_lnotab_last; /* start of last lnotab record added */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000667 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000668 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000669 int c_nested; /* Is block nested funcdef or lamdef? */
670 int c_closure; /* Is nested w/freevars? */
671 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000672 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000673 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000674};
675
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000676static int
677is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000678{
679 if ((v & (USE | DEF_FREE))
680 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
681 return 1;
682 if (v & DEF_FREE_CLASS)
683 return 1;
684 return 0;
685}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000686
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000687static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000688com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000689{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000690 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
691
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000692 if (c == NULL) {
693 /* Error occurred via symtable call to
694 is_constant_false */
695 PyErr_SetString(exc, msg);
696 return;
697 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000698 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000699 if (c->c_lineno < 1 || c->c_interactive) {
700 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000701 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000702 return;
703 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000704 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000705 if (v == NULL)
706 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000707
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000708 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000709 if (line == NULL) {
710 Py_INCREF(Py_None);
711 line = Py_None;
712 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000713 if (exc == PyExc_SyntaxError) {
714 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
715 Py_None, line);
716 if (t == NULL)
717 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000718 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000719 if (w == NULL)
720 goto exit;
721 PyErr_SetObject(exc, w);
722 } else {
723 /* Make sure additional exceptions are printed with
724 file and line, also. */
725 PyErr_SetObject(exc, v);
726 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
727 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000728 exit:
729 Py_XDECREF(t);
730 Py_XDECREF(v);
731 Py_XDECREF(w);
732 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000733}
734
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000735/* Interface to the block stack */
736
737static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000738block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000739{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000740 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000741 com_error(c, PyExc_SystemError,
742 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000743 }
744 else {
745 c->c_block[c->c_nblocks++] = type;
746 }
747}
748
749static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000750block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000751{
752 if (c->c_nblocks > 0)
753 c->c_nblocks--;
754 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000755 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000756 }
757}
758
Guido van Rossum681d79a1995-07-18 14:51:37 +0000759/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000760
Martin v. Löwis95292d62002-12-11 14:04:59 +0000761static int issue_warning(const char *, const char *, int);
762static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000763static void com_free(struct compiling *);
764static void com_push(struct compiling *, int);
765static void com_pop(struct compiling *, int);
766static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000767static void com_node(struct compiling *, node *);
768static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000769static void com_addbyte(struct compiling *, int);
770static void com_addint(struct compiling *, int);
771static void com_addoparg(struct compiling *, int, int);
772static void com_addfwref(struct compiling *, int, int *);
773static void com_backpatch(struct compiling *, int);
774static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
775static int com_addconst(struct compiling *, PyObject *);
776static int com_addname(struct compiling *, PyObject *);
777static void com_addopname(struct compiling *, int, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000778static void com_test(struct compiling *c, node *n);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000779static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000780static void com_list_iter(struct compiling *, node *, node *, char *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000781static void com_gen_iter(struct compiling *, node *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000782static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000783static void com_assign(struct compiling *, node *, int, node *);
784static void com_assign_name(struct compiling *, node *, int);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000785static int com_make_closure(struct compiling *c, PyCodeObject *co);
786
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000787static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +0000788static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000789 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000790static PyObject *parsestrplus(struct compiling*, node *);
791static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000792static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000793
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000794static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000795
796/* symtable operations */
Raymond Hettinger354433a2004-05-19 08:20:33 +0000797static int symtable_lookup(struct symtable *st, char *name);
Jeremy Hylton1955fcf2003-07-15 20:23:26 +0000798static struct symtable *symtable_build(node *, PyFutureFeatures *,
799 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000800static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000801static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000802static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000803static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000804static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000805static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000806
807static void symtable_node(struct symtable *, node *);
808static void symtable_funcdef(struct symtable *, node *);
809static void symtable_default_args(struct symtable *, node *);
810static void symtable_params(struct symtable *, node *);
811static void symtable_params_fplist(struct symtable *, node *n);
812static void symtable_global(struct symtable *, node *);
813static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000814static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000815static void symtable_list_comprehension(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000816static void symtable_generator_expression(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +0000817static void symtable_list_for(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000818static void symtable_gen_for(struct symtable *, node *, int);
819static void symtable_gen_iter(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000820
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000821static int symtable_update_free_vars(struct symtable *);
822static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
823static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
824
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000825/* helper */
826static void
827do_pad(int pad)
828{
829 int i;
830 for (i = 0; i < pad; ++i)
831 fprintf(stderr, " ");
832}
833
834static void
835dump(node *n, int pad, int depth)
836{
837 int i;
838 if (depth == 0)
839 return;
840 do_pad(pad);
841 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
842 if (depth > 0)
843 depth--;
844 for (i = 0; i < NCH(n); ++i)
845 dump(CHILD(n, i), pad + 1, depth);
846}
847
848#define DUMP(N) dump(N, 0, -1)
849
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000850static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000851com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000852{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000853 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000854 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
855 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000856 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000857 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000858 goto fail;
859 if ((c->c_const_dict = PyDict_New()) == NULL)
860 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000861 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000862 goto fail;
863 if ((c->c_name_dict = PyDict_New()) == NULL)
864 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000865 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000866 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000867 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
868 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000869 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000870 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000871 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000872 c->c_freevars = NULL;
873 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000874 c->c_nlocals = 0;
875 c->c_argcount = 0;
876 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000877 c->c_nexti = 0;
878 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000879 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000880 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000881 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000882 c->c_begin = 0;
883 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000884 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000885 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000886 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000887 c->c_stacklevel = 0;
888 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000889 c->c_firstlineno = 0;
890 c->c_last_addr = 0;
891 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000892 c->c_lnotab_next = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +0000893 c->c_lnotab_last = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000894 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000895 c->c_nested = 0;
896 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000897 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000898 return 1;
899
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000900 fail:
901 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000902 return 0;
903}
904
905static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000906com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000907{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000908 Py_XDECREF(c->c_code);
909 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000910 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000911 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000912 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000913 Py_XDECREF(c->c_globals);
914 Py_XDECREF(c->c_locals);
915 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000916 Py_XDECREF(c->c_freevars);
917 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000918 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000919 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +0000920 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000921}
922
923static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000924com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000925{
926 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000927 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +0000928 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000929 /*
930 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
931 c->c_filename, c->c_name, c->c_lineno,
932 c->c_nexti, c->c_stacklevel, n);
933 */
934 }
Guido van Rossum8b993a91997-01-17 21:04:03 +0000935}
936
937static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000938com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000939{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000940 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000941 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000942 else
943 c->c_stacklevel -= n;
944}
945
946static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000947com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000948{
949 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000950 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000951 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000952 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000953}
954
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000955static int
956com_check_size(PyObject **s, int offset)
957{
958 int len = PyString_GET_SIZE(*s);
959 if (offset >= len)
960 return _PyString_Resize(s, len * 2);
961 return 0;
962}
963
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000964static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000965com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000966{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000967 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000968 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +0000969 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000970 if (com_check_size(&c->c_code, c->c_nexti)) {
971 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000972 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000973 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000974 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000975}
976
977static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000978com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000979{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000980 com_addbyte(c, x & 0xff);
981 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000982}
983
984static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000985com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000986{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000987 char *p;
988 if (c->c_lnotab == NULL)
989 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000990 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
991 c->c_errors++;
992 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000993 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000994 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000995 *p++ = addr;
996 *p++ = line;
997 c->c_lnotab_next += 2;
998}
999
1000static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001001com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001002{
1003 c->c_lineno = lineno;
1004 if (c->c_firstlineno == 0) {
1005 c->c_firstlineno = c->c_last_line = lineno;
1006 }
1007 else {
1008 int incr_addr = c->c_nexti - c->c_last_addr;
1009 int incr_line = lineno - c->c_last_line;
Armin Rigo80d937e2004-03-22 17:52:53 +00001010 c->c_lnotab_last = c->c_lnotab_next;
Tim Peters2a7f3842001-06-09 09:26:21 +00001011 while (incr_addr > 255) {
1012 com_add_lnotab(c, 255, 0);
1013 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001014 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001015 while (incr_line > 255) {
1016 com_add_lnotab(c, incr_addr, 255);
1017 incr_line -=255;
1018 incr_addr = 0;
1019 }
1020 if (incr_addr > 0 || incr_line > 0)
1021 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001022 c->c_last_addr = c->c_nexti;
1023 c->c_last_line = lineno;
1024 }
1025}
1026
1027static void
Armin Rigo80d937e2004-03-22 17:52:53 +00001028com_strip_lnotab(struct compiling *c)
1029{
1030 /* strip the last lnotab entry if no opcode were emitted.
1031 * This prevents a line number to be generated on a final
1032 * pass, like in the following example:
1033 *
1034 * if a:
1035 * print 5
1036 * else:
1037 * pass
1038 *
1039 * Without the fix, a line trace event would be generated
1040 * on the pass even if a is true (because of the implicit
1041 * return).
1042 */
1043 if (c->c_nexti == c->c_last_addr && c->c_lnotab_last > 0) {
1044 c->c_lnotab_next = c->c_lnotab_last;
1045 }
1046}
1047
1048static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001049com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001050{
Fred Drakeef8ace32000-08-24 00:32:09 +00001051 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +00001052 if (extended_arg){
1053 com_addbyte(c, EXTENDED_ARG);
1054 com_addint(c, extended_arg);
1055 arg &= 0xffff;
1056 }
Guido van Rossum8e793d91997-03-03 19:13:14 +00001057 com_addbyte(c, op);
1058 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001059}
1060
1061static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001062com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001063{
1064 /* Compile a forward reference for backpatching */
1065 int here;
1066 int anchor;
1067 com_addbyte(c, op);
1068 here = c->c_nexti;
1069 anchor = *p_anchor;
1070 *p_anchor = here;
1071 com_addint(c, anchor == 0 ? 0 : here - anchor);
1072}
1073
1074static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001075com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001076{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001077 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001078 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001079 int dist;
1080 int prev;
1081 for (;;) {
1082 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001083 prev = code[anchor] + (code[anchor+1] << 8);
1084 dist = target - (anchor+2);
1085 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001086 dist >>= 8;
1087 code[anchor+1] = dist;
1088 dist >>= 8;
1089 if (dist) {
1090 com_error(c, PyExc_SystemError,
1091 "com_backpatch: offset too large");
1092 break;
1093 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001094 if (!prev)
1095 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001096 anchor -= prev;
1097 }
1098}
1099
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001100/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001101
1102static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001103com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001104{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001105 PyObject *w, *t, *np=NULL;
1106 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001107
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001108 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001109 if (t == NULL)
1110 goto fail;
1111 w = PyDict_GetItem(dict, t);
1112 if (w != NULL) {
1113 n = PyInt_AsLong(w);
1114 } else {
1115 n = PyList_Size(list);
1116 np = PyInt_FromLong(n);
1117 if (np == NULL)
1118 goto fail;
1119 if (PyList_Append(list, v) != 0)
1120 goto fail;
1121 if (PyDict_SetItem(dict, t, np) != 0)
1122 goto fail;
1123 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001124 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001125 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001126 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001127 fail:
1128 Py_XDECREF(np);
1129 Py_XDECREF(t);
1130 c->c_errors++;
1131 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001132}
1133
1134static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001135com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001136{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001137 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001138}
1139
1140static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001141com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001142{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001143 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001144}
1145
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001146int
1147_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001148{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001149 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001150 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001151 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001152 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1153 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001154 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001155 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001156 return 0; /* Don't mangle __extremely_long_names */
1157 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1158 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001159 /* Strip leading underscores from class name */
1160 while (*p == '_')
1161 p++;
1162 if (*p == '\0')
1163 return 0; /* Don't mangle if class is just underscores */
1164 plen = strlen(p);
1165 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001166 plen = maxlen-nlen-2; /* Truncate class name if too long */
1167 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001168 buffer[0] = '_';
1169 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001170 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001171 return 1;
1172}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001173
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001174static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001175com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001176{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001177 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001178 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001179 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001180
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001181 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001182 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001183 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001184 c->c_errors++;
1185 i = 255;
1186 }
1187 else {
1188 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001189 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001190 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001191 com_addoparg(c, op, i);
1192}
1193
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001194#define NAME_LOCAL 0
1195#define NAME_GLOBAL 1
1196#define NAME_DEFAULT 2
1197#define NAME_CLOSURE 3
1198
1199static int
1200com_lookup_arg(PyObject *dict, PyObject *name)
1201{
1202 PyObject *v = PyDict_GetItem(dict, name);
1203 if (v == NULL)
1204 return -1;
1205 else
1206 return PyInt_AS_LONG(v);
1207}
1208
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001209static int
1210none_assignment_check(struct compiling *c, char *name, int assigning)
1211{
1212 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1213 char *msg;
1214 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001215 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001216 else
1217 msg = "deleting None";
1218 if (issue_warning(msg, c->c_filename, c->c_lineno) < 0) {
1219 c->c_errors++;
1220 return -1;
1221 }
1222 }
1223 return 0;
1224}
1225
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001226static void
1227com_addop_varname(struct compiling *c, int kind, char *name)
1228{
1229 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001230 int i, reftype;
1231 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001232 int op = STOP_CODE;
1233 char buffer[MANGLE_LEN];
1234
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001235 if (kind != VAR_LOAD &&
1236 none_assignment_check(c, name, kind == VAR_STORE))
1237 {
1238 c->c_errors++;
1239 i = 255;
1240 goto done;
1241 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001242 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001243 name = buffer;
1244 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1245 c->c_errors++;
1246 i = 255;
1247 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001248 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001249
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001250 reftype = get_ref_type(c, name);
1251 switch (reftype) {
1252 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001253 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001254 scope = NAME_LOCAL;
1255 break;
1256 case GLOBAL_EXPLICIT:
1257 scope = NAME_GLOBAL;
1258 break;
1259 case GLOBAL_IMPLICIT:
1260 if (c->c_flags & CO_OPTIMIZED)
1261 scope = NAME_GLOBAL;
1262 break;
1263 case FREE:
1264 case CELL:
1265 scope = NAME_CLOSURE;
1266 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001267 }
1268
1269 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001270 if (scope == NAME_LOCAL)
1271 i = com_lookup_arg(c->c_locals, v);
1272 else if (reftype == FREE)
1273 i = com_lookup_arg(c->c_freevars, v);
1274 else if (reftype == CELL)
1275 i = com_lookup_arg(c->c_cellvars, v);
1276 if (i == -1) {
1277 c->c_errors++; /* XXX no exception set */
1278 i = 255;
1279 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001280 }
1281 Py_DECREF(v);
1282
1283 switch (kind) {
1284 case VAR_LOAD:
1285 switch (scope) {
1286 case NAME_LOCAL:
1287 op = LOAD_FAST;
1288 break;
1289 case NAME_GLOBAL:
1290 op = LOAD_GLOBAL;
1291 break;
1292 case NAME_DEFAULT:
1293 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001294 break;
1295 case NAME_CLOSURE:
1296 op = LOAD_DEREF;
1297 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001298 }
1299 break;
1300 case VAR_STORE:
1301 switch (scope) {
1302 case NAME_LOCAL:
1303 op = STORE_FAST;
1304 break;
1305 case NAME_GLOBAL:
1306 op = STORE_GLOBAL;
1307 break;
1308 case NAME_DEFAULT:
1309 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001310 break;
1311 case NAME_CLOSURE:
1312 op = STORE_DEREF;
1313 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001314 }
1315 break;
1316 case VAR_DELETE:
1317 switch (scope) {
1318 case NAME_LOCAL:
1319 op = DELETE_FAST;
1320 break;
1321 case NAME_GLOBAL:
1322 op = DELETE_GLOBAL;
1323 break;
1324 case NAME_DEFAULT:
1325 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001326 break;
1327 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001328 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001329 PyOS_snprintf(buf, sizeof(buf),
1330 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001331 com_error(c, PyExc_SyntaxError, buf);
1332 i = 255;
1333 break;
1334 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001335 }
1336 break;
1337 }
1338done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001339 com_addoparg(c, op, i);
1340}
1341
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001342static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001343com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001344{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001345 char *name;
1346 char buffer[1000];
1347 /* XXX it is possible to write this code without the 1000
1348 chars on the total length of dotted names, I just can't be
1349 bothered right now */
1350 if (TYPE(n) == STAR)
1351 name = "*";
1352 else if (TYPE(n) == dotted_name) {
1353 char *p = buffer;
1354 int i;
1355 name = buffer;
1356 for (i = 0; i < NCH(n); i += 2) {
1357 char *s = STR(CHILD(n, i));
1358 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001359 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001360 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001361 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001362 break;
1363 }
1364 if (p != buffer)
1365 *p++ = '.';
1366 strcpy(p, s);
1367 p = strchr(p, '\0');
1368 }
1369 }
1370 else {
1371 REQ(n, NAME);
1372 name = STR(n);
1373 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001374 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001375}
1376
Guido van Rossum79f25d91997-04-29 20:08:16 +00001377static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001378parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001379{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001380 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001381 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001382 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001383#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001384 int imflag;
1385#endif
1386
Guido van Rossum282914b1991-04-04 10:42:56 +00001387 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001388 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001389#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001390 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001391#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001392 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001393 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001394 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001395 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001396 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001397 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001398 }
1399 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001400 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001401 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001402 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001403 if (errno != 0)
1404 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001405 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001406 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001407 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001408#ifndef WITHOUT_COMPLEX
1409 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001410 Py_complex z;
1411 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001412 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001413 z.imag = PyOS_ascii_atof(s);
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001414 PyFPE_END_PROTECT(z)
1415 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001416 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001417 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001418#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001419 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001420 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001421 dx = PyOS_ascii_atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001422 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001423 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001424 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001425}
1426
Guido van Rossum79f25d91997-04-29 20:08:16 +00001427static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001428decode_utf8(char **sPtr, char *end, char* encoding)
1429{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001430#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001431 Py_FatalError("decode_utf8 should not be called in this build.");
1432 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001433#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001434 PyObject *u, *v;
1435 char *s, *t;
1436 t = s = *sPtr;
1437 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1438 while (s < end && (*s & 0x80)) s++;
1439 *sPtr = s;
1440 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1441 if (u == NULL)
1442 return NULL;
1443 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1444 Py_DECREF(u);
1445 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001446#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001447}
1448
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001449/* compiler.transformer.Transformer.decode_literal depends on what
1450 might seem like minor details of this function -- changes here
1451 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001452static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001453parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001454{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001455 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001456 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001457 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001458 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001459 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001460 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001461 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001462
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001463 if (isalpha(quote) || quote == '_') {
1464 if (quote == 'u' || quote == 'U') {
1465 quote = *++s;
1466 unicode = 1;
1467 }
1468 if (quote == 'r' || quote == 'R') {
1469 quote = *++s;
1470 rawmode = 1;
1471 }
1472 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001473 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001474 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001475 return NULL;
1476 }
1477 s++;
1478 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001479 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001480 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001481 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001482 return NULL;
1483 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001484 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001485 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001486 return NULL;
1487 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001488 if (len >= 4 && s[0] == quote && s[1] == quote) {
1489 s += 2;
1490 len -= 2;
1491 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001492 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001493 return NULL;
1494 }
1495 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001496#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001497 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001498 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001499 char *buf;
1500 char *p;
1501 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001502 if (encoding == NULL) {
1503 buf = s;
1504 u = NULL;
1505 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1506 buf = s;
1507 u = NULL;
1508 } else {
1509 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1510 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1511 if (u == NULL)
1512 return NULL;
1513 p = buf = PyString_AsString(u);
1514 end = s + len;
1515 while (s < end) {
1516 if (*s == '\\') {
1517 *p++ = *s++;
1518 if (*s & 0x80) {
1519 strcpy(p, "u005c");
1520 p += 5;
1521 }
1522 }
1523 if (*s & 0x80) { /* XXX inefficient */
1524 char *r;
1525 int rn, i;
1526 w = decode_utf8(&s, end, "utf-16-be");
1527 if (w == NULL) {
1528 Py_DECREF(u);
1529 return NULL;
1530 }
1531 r = PyString_AsString(w);
1532 rn = PyString_Size(w);
1533 assert(rn % 2 == 0);
1534 for (i = 0; i < rn; i += 2) {
1535 sprintf(p, "\\u%02x%02x",
1536 r[i + 0] & 0xFF,
1537 r[i + 1] & 0xFF);
1538 p += 6;
1539 }
1540 Py_DECREF(w);
1541 } else {
1542 *p++ = *s++;
1543 }
1544 }
1545 len = p - buf;
1546 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001547 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001548 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001549 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001550 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1551 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001552 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001553 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001554 return v;
1555
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001556 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001557#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001558 need_encoding = (encoding != NULL &&
1559 strcmp(encoding, "utf-8") != 0 &&
1560 strcmp(encoding, "iso-8859-1") != 0);
1561 if (rawmode || strchr(s, '\\') == NULL) {
1562 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001563#ifndef Py_USING_UNICODE
1564 /* This should not happen - we never see any other
1565 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001566 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001567#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001568 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1569 if (u == NULL)
1570 return NULL;
1571 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1572 Py_DECREF(u);
1573 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001574#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001575 } else {
1576 return PyString_FromStringAndSize(s, len);
1577 }
1578 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001579
1580 v = PyString_DecodeEscape(s, len, NULL, unicode,
1581 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001582 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001583 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001584 return v;
1585}
1586
Guido van Rossum79f25d91997-04-29 20:08:16 +00001587static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001588parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001589{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001590 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001591 int i;
1592 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001593 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001594 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001595 for (i = 1; i < NCH(n); i++) {
1596 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001597 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001598 if (s == NULL)
1599 goto onError;
1600 if (PyString_Check(v) && PyString_Check(s)) {
1601 PyString_ConcatAndDel(&v, s);
1602 if (v == NULL)
1603 goto onError;
1604 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001605#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001606 else {
1607 PyObject *temp;
1608 temp = PyUnicode_Concat(v, s);
1609 Py_DECREF(s);
1610 if (temp == NULL)
1611 goto onError;
1612 Py_DECREF(v);
1613 v = temp;
1614 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001615#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001616 }
1617 }
1618 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001619
1620 onError:
1621 Py_XDECREF(v);
1622 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001623}
1624
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001625static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001626com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001627{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001628 int anchor = 0;
1629 int save_begin = c->c_begin;
1630
Raymond Hettinger354433a2004-05-19 08:20:33 +00001631 /* list_for: for v in expr [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001632 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001633 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001634 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001635 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001636 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001637 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001638 c->c_loops++;
1639 com_list_iter(c, n, e, t);
1640 c->c_loops--;
1641 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1642 c->c_begin = save_begin;
1643 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001644 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001645}
1646
1647static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001648com_gen_for(struct compiling *c, node *n, node *t, int is_outmost)
1649{
1650 int break_anchor = 0;
1651 int anchor = 0;
1652 int save_begin = c->c_begin;
1653
1654 REQ(n, gen_for);
1655 /* gen_for: for v in test [gen_iter] */
1656
1657 com_addfwref(c, SETUP_LOOP, &break_anchor);
1658 block_push(c, SETUP_LOOP);
1659
1660 if (is_outmost) {
1661 com_addop_varname(c, VAR_LOAD, "[outmost-iterable]");
1662 com_push(c, 1);
1663 }
1664 else {
1665 com_node(c, CHILD(n, 3));
1666 com_addbyte(c, GET_ITER);
1667 }
1668
1669 c->c_begin = c->c_nexti;
1670 com_set_lineno(c, c->c_last_line);
1671 com_addfwref(c, FOR_ITER, &anchor);
1672 com_push(c, 1);
1673 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
1674
1675 if (NCH(n) == 5)
1676 com_gen_iter(c, CHILD(n, 4), t);
1677 else {
1678 com_test(c, t);
1679 com_addbyte(c, YIELD_VALUE);
1680 com_pop(c, 1);
1681 }
1682
1683 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1684 c->c_begin = save_begin;
1685
1686 com_backpatch(c, anchor);
1687 com_pop(c, 1); /* FOR_ITER has popped this */
1688 com_addbyte(c, POP_BLOCK);
1689 block_pop(c, SETUP_LOOP);
1690 com_backpatch(c, break_anchor);
1691}
1692
1693static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001694com_list_if(struct compiling *c, node *n, node *e, char *t)
1695{
1696 int anchor = 0;
1697 int a = 0;
1698 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001699 com_node(c, CHILD(n, 1));
1700 com_addfwref(c, JUMP_IF_FALSE, &a);
1701 com_addbyte(c, POP_TOP);
1702 com_pop(c, 1);
1703 com_list_iter(c, n, e, t);
1704 com_addfwref(c, JUMP_FORWARD, &anchor);
1705 com_backpatch(c, a);
1706 /* We jump here with an extra entry which we now pop */
1707 com_addbyte(c, POP_TOP);
1708 com_backpatch(c, anchor);
1709}
1710
1711static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001712com_gen_if(struct compiling *c, node *n, node *t)
1713{
1714 /* gen_if: 'if' test [gen_iter] */
1715 int anchor = 0;
1716 int a=0;
1717
1718 com_node(c, CHILD(n, 1));
1719 com_addfwref(c, JUMP_IF_FALSE, &a);
1720 com_addbyte(c, POP_TOP);
1721 com_pop(c, 1);
1722
1723 if (NCH(n) == 3)
1724 com_gen_iter(c, CHILD(n, 2), t);
1725 else {
1726 com_test(c, t);
1727 com_addbyte(c, YIELD_VALUE);
1728 com_pop(c, 1);
1729 }
1730 com_addfwref(c, JUMP_FORWARD, &anchor);
1731 com_backpatch(c, a);
1732 /* We jump here with an extra entry which we now pop */
1733 com_addbyte(c, POP_TOP);
1734 com_backpatch(c, anchor);
1735}
1736
1737static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001738com_list_iter(struct compiling *c,
1739 node *p, /* parent of list_iter node */
1740 node *e, /* element expression node */
1741 char *t /* name of result list temp local */)
1742{
1743 /* list_iter is the last child in a listmaker, list_for, or list_if */
1744 node *n = CHILD(p, NCH(p)-1);
1745 if (TYPE(n) == list_iter) {
1746 n = CHILD(n, 0);
1747 switch (TYPE(n)) {
1748 case list_for:
1749 com_list_for(c, n, e, t);
1750 break;
1751 case list_if:
1752 com_list_if(c, n, e, t);
1753 break;
1754 default:
1755 com_error(c, PyExc_SystemError,
1756 "invalid list_iter node type");
1757 }
1758 }
1759 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001760 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001761 com_push(c, 1);
1762 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001763 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001764 com_pop(c, 2);
1765 }
1766}
1767
1768static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001769com_gen_iter(struct compiling *c, node *n, node *t)
1770{
1771 /* gen_iter: gen_for | gen_if */
1772 node *ch;
1773 REQ(n, gen_iter);
1774
1775 ch = CHILD(n, 0);
1776
1777 switch (TYPE(ch)) {
1778 case gen_for:
1779 com_gen_for(c, ch, t, 0);
1780 break;
1781 case gen_if:
1782 com_gen_if(c, ch, t);
1783 break;
1784 default:
1785 com_error(c, PyExc_SystemError,
1786 "invalid gen_iter node type");
1787 }
1788}
1789
1790static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001791com_list_comprehension(struct compiling *c, node *n)
1792{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001793 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001794 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001795
1796 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001797 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001798 com_addoparg(c, BUILD_LIST, 0);
1799 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1800 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001801 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001802 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001803 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001804 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001805 --c->c_tmpname;
1806}
1807
1808static void
1809com_listmaker(struct compiling *c, node *n)
1810{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001811 /* listmaker: test ( list_for | (',' test)* [','] ) */
1812 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001813 com_list_comprehension(c, n);
1814 else {
1815 int len = 0;
1816 int i;
1817 for (i = 0; i < NCH(n); i += 2, len++)
1818 com_node(c, CHILD(n, i));
1819 com_addoparg(c, BUILD_LIST, len);
1820 com_pop(c, len-1);
1821 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001822}
1823
1824static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001825com_generator_expression(struct compiling *c, node *n)
1826{
1827 /* testlist_gexp: test gen_for */
1828 /* argument: test gen_for */
1829 PyCodeObject *co;
1830
1831 REQ(CHILD(n, 0), test);
1832 REQ(CHILD(n, 1), gen_for);
1833
1834 symtable_enter_scope(c->c_symtable, "<genexpr>", TYPE(n),
1835 n->n_lineno);
1836 co = icompile(n, c);
1837 symtable_exit_scope(c->c_symtable);
1838
1839 if (co == NULL)
1840 c->c_errors++;
1841 else {
1842 int closure = com_make_closure(c, co);
1843 int i = com_addconst(c, (PyObject *)co);
1844
1845 com_addoparg(c, LOAD_CONST, i);
1846 com_push(c, 1);
1847 if (closure)
1848 com_addoparg(c, MAKE_CLOSURE, 0);
1849 else
1850 com_addoparg(c, MAKE_FUNCTION, 0);
1851
1852 com_test(c, CHILD(CHILD(n, 1), 3));
1853 com_addbyte(c, GET_ITER);
1854 com_addoparg(c, CALL_FUNCTION, 1);
1855 com_pop(c, 1);
1856
1857 Py_DECREF(co);
1858 }
1859}
1860
1861static void
1862com_testlist_gexp(struct compiling *c, node *n)
1863{
1864 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
1865 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
1866 com_generator_expression(c, n);
1867 else com_list(c, n, 0);
1868}
1869
1870static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001871com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001872{
1873 int i;
1874 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1875 for (i = 0; i+2 < NCH(n); i += 4) {
1876 /* We must arrange things just right for STORE_SUBSCR.
1877 It wants the stack to look like (value) (dict) (key) */
1878 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001879 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001880 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00001881 com_node(c, CHILD(n, i+2)); /* value */
1882 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001883 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001884 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001885 }
1886}
1887
1888static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001889com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001890{
1891 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001892 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001893 int i;
1894 REQ(n, atom);
1895 ch = CHILD(n, 0);
1896 switch (TYPE(ch)) {
1897 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001898 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001899 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001900 com_push(c, 1);
1901 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001902 else
Raymond Hettinger354433a2004-05-19 08:20:33 +00001903 com_testlist_gexp(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001904 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001905 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001906 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001907 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001908 com_push(c, 1);
1909 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001910 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001911 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001912 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001913 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001914 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001915 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001916 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001917 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001918 break;
1919 case BACKQUOTE:
1920 com_node(c, CHILD(n, 1));
1921 com_addbyte(c, UNARY_CONVERT);
1922 break;
1923 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001924 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001925 i = 255;
1926 }
1927 else {
1928 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001929 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001930 }
1931 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001932 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001933 break;
1934 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001935 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001936 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001937 c->c_errors++;
1938 i = 255;
1939 }
1940 else {
1941 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001942 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001943 }
1944 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001945 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001946 break;
1947 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001948 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001949 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001950 break;
1951 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001952 com_error(c, PyExc_SystemError,
1953 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001954 }
1955}
1956
1957static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001958com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001959{
1960 if (NCH(n) == 1) {
1961 com_addbyte(c, op);
1962 }
1963 else if (NCH(n) == 2) {
1964 if (TYPE(CHILD(n, 0)) != COLON) {
1965 com_node(c, CHILD(n, 0));
1966 com_addbyte(c, op+1);
1967 }
1968 else {
1969 com_node(c, CHILD(n, 1));
1970 com_addbyte(c, op+2);
1971 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001972 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001973 }
1974 else {
1975 com_node(c, CHILD(n, 0));
1976 com_node(c, CHILD(n, 2));
1977 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001978 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001979 }
1980}
1981
Guido van Rossum635abd21997-01-06 22:56:52 +00001982static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001983com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1984{
1985 if (NCH(n) == 1) {
1986 com_addbyte(c, DUP_TOP);
1987 com_push(c, 1);
1988 com_addbyte(c, SLICE);
1989 com_node(c, augn);
1990 com_addbyte(c, opcode);
1991 com_pop(c, 1);
1992 com_addbyte(c, ROT_TWO);
1993 com_addbyte(c, STORE_SLICE);
1994 com_pop(c, 2);
1995 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1996 com_node(c, CHILD(n, 0));
1997 com_addoparg(c, DUP_TOPX, 2);
1998 com_push(c, 2);
1999 com_addbyte(c, SLICE+1);
2000 com_pop(c, 1);
2001 com_node(c, augn);
2002 com_addbyte(c, opcode);
2003 com_pop(c, 1);
2004 com_addbyte(c, ROT_THREE);
2005 com_addbyte(c, STORE_SLICE+1);
2006 com_pop(c, 3);
2007 } else if (NCH(n) == 2) {
2008 com_node(c, CHILD(n, 1));
2009 com_addoparg(c, DUP_TOPX, 2);
2010 com_push(c, 2);
2011 com_addbyte(c, SLICE+2);
2012 com_pop(c, 1);
2013 com_node(c, augn);
2014 com_addbyte(c, opcode);
2015 com_pop(c, 1);
2016 com_addbyte(c, ROT_THREE);
2017 com_addbyte(c, STORE_SLICE+2);
2018 com_pop(c, 3);
2019 } else {
2020 com_node(c, CHILD(n, 0));
2021 com_node(c, CHILD(n, 2));
2022 com_addoparg(c, DUP_TOPX, 3);
2023 com_push(c, 3);
2024 com_addbyte(c, SLICE+3);
2025 com_pop(c, 2);
2026 com_node(c, augn);
2027 com_addbyte(c, opcode);
2028 com_pop(c, 1);
2029 com_addbyte(c, ROT_FOUR);
2030 com_addbyte(c, STORE_SLICE+3);
2031 com_pop(c, 4);
2032 }
2033}
2034
2035static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002036com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002037{
2038 node *m;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002039 REQ(n, argument); /* [test '='] test [gen_for]; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00002040 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00002041 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002042 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00002043 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002044 }
2045 else {
2046 com_node(c, CHILD(n, 0));
2047 }
Guido van Rossum635abd21997-01-06 22:56:52 +00002048 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002049 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00002050 if (NCH(n) == 2) {
2051 com_generator_expression(c, n);
2052 return;
2053 }
2054
Guido van Rossumf10570b1995-07-07 22:53:21 +00002055 m = n;
2056 do {
2057 m = CHILD(m, 0);
2058 } while (NCH(m) == 1);
2059 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00002060 /* f(lambda x: x[0] = 3) ends up getting parsed with
2061 * LHS test = lambda x: x[0], and RHS test = 3.
2062 * SF bug 132313 points out that complaining about a keyword
2063 * then is very confusing.
2064 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002065 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00002066 TYPE(m) == lambdef ?
2067 "lambda cannot contain assignment" :
2068 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002069 }
2070 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002071 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00002072 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00002073 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002074 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002075 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002076 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002077 else if (*pkeywords == NULL) {
2078 c->c_errors++;
2079 Py_DECREF(v);
2080 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002081 if (PyDict_GetItem(*pkeywords, v) != NULL)
2082 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00002083 "duplicate keyword argument");
2084 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002085 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00002086 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002087 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002088 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002089 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002090 }
2091 }
2092 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002093}
2094
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002095static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002096com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002097{
2098 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00002099 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002100 }
2101 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002102 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00002103 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00002104 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00002105 int star_flag = 0;
2106 int starstar_flag = 0;
2107 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002108 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002109 na = 0;
2110 nk = 0;
2111 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00002112 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00002113 if (TYPE(ch) == STAR ||
2114 TYPE(ch) == DOUBLESTAR)
2115 break;
Guido van Rossumca906051998-12-10 16:56:22 +00002116 if (ch->n_lineno != lineno) {
2117 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002118 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00002119 }
2120 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00002121 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002122 na++;
2123 else
2124 nk++;
2125 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002126 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00002127 while (i < NCH(n)) {
2128 node *tok = CHILD(n, i);
2129 node *ch = CHILD(n, i+1);
2130 i += 3;
2131 switch (TYPE(tok)) {
2132 case STAR: star_flag = 1; break;
2133 case DOUBLESTAR: starstar_flag = 1; break;
2134 }
2135 com_node(c, ch);
2136 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002137 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002138 com_error(c, PyExc_SyntaxError,
2139 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002140 }
Jeremy Hylton76901512000-03-28 23:49:17 +00002141 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00002142 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00002143 star_flag + (starstar_flag << 1);
2144 else
2145 opcode = CALL_FUNCTION;
2146 com_addoparg(c, opcode, na | (nk << 8));
2147 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002148 }
2149}
2150
2151static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002152com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002153{
2154 com_addopname(c, LOAD_ATTR, n);
2155}
2156
2157static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002158com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002159{
2160 int i=0;
2161 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00002162 node *ch;
2163
2164 /* first argument */
2165 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002166 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002167 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002168 i++;
2169 }
2170 else {
2171 com_node(c, CHILD(n,i));
2172 i++;
2173 REQ(CHILD(n,i),COLON);
2174 i++;
2175 }
2176 /* second argument */
2177 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
2178 com_node(c, CHILD(n,i));
2179 i++;
2180 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002181 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002182 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002183 com_push(c, 1);
2184 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002185 /* remaining arguments */
2186 for (; i < NCH(n); i++) {
2187 ns++;
2188 ch=CHILD(n,i);
2189 REQ(ch, sliceop);
2190 if (NCH(ch) == 1) {
2191 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002192 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002193 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002194 }
2195 else
2196 com_node(c, CHILD(ch,1));
2197 }
2198 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002199 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002200}
2201
2202static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002203com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002204{
2205 node *ch;
2206 REQ(n, subscript);
2207 ch = CHILD(n,0);
2208 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002209 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002210 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002211 com_push(c, 1);
2212 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002213 else {
2214 /* check for slice */
2215 if ((TYPE(ch) == COLON || NCH(n) > 1))
2216 com_sliceobj(c, n);
2217 else {
2218 REQ(ch, test);
2219 com_node(c, ch);
2220 }
2221 }
2222}
2223
2224static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002225com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002226{
2227 int i, op;
2228 REQ(n, subscriptlist);
2229 /* Check to make backward compatible slice behavior for '[i:j]' */
2230 if (NCH(n) == 1) {
2231 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002232 /* 'Basic' slice, should have exactly one colon. */
2233 if ((TYPE(CHILD(sub, 0)) == COLON
2234 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2235 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2236 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002237 switch (assigning) {
2238 case OP_DELETE:
2239 op = DELETE_SLICE;
2240 break;
2241 case OP_ASSIGN:
2242 op = STORE_SLICE;
2243 break;
2244 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002245 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002246 break;
2247 default:
2248 com_augassign_slice(c, sub, assigning, augn);
2249 return;
2250 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002251 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002252 if (op == STORE_SLICE)
2253 com_pop(c, 2);
2254 else if (op == DELETE_SLICE)
2255 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002256 return;
2257 }
2258 }
2259 /* Else normal subscriptlist. Compile each subscript. */
2260 for (i = 0; i < NCH(n); i += 2)
2261 com_subscript(c, CHILD(n, i));
2262 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002263 if (NCH(n) > 1) {
2264 i = (NCH(n)+1) / 2;
2265 com_addoparg(c, BUILD_TUPLE, i);
2266 com_pop(c, i-1);
2267 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002268 switch (assigning) {
2269 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002270 op = DELETE_SUBSCR;
2271 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002272 break;
2273 default:
2274 case OP_ASSIGN:
2275 op = STORE_SUBSCR;
2276 i = 3;
2277 break;
2278 case OP_APPLY:
2279 op = BINARY_SUBSCR;
2280 i = 1;
2281 break;
2282 }
2283 if (assigning > OP_APPLY) {
2284 com_addoparg(c, DUP_TOPX, 2);
2285 com_push(c, 2);
2286 com_addbyte(c, BINARY_SUBSCR);
2287 com_pop(c, 1);
2288 com_node(c, augn);
2289 com_addbyte(c, assigning);
2290 com_pop(c, 1);
2291 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002292 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002293 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002294 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002295}
2296
2297static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002298com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002299{
2300 REQ(n, trailer);
2301 switch (TYPE(CHILD(n, 0))) {
2302 case LPAR:
2303 com_call_function(c, CHILD(n, 1));
2304 break;
2305 case DOT:
2306 com_select_member(c, CHILD(n, 1));
2307 break;
2308 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002309 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002310 break;
2311 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002312 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002313 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002314 }
2315}
2316
2317static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002318com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002319{
2320 int i;
2321 REQ(n, power);
2322 com_atom(c, CHILD(n, 0));
2323 for (i = 1; i < NCH(n); i++) {
2324 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2325 com_factor(c, CHILD(n, i+1));
2326 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002327 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002328 break;
2329 }
2330 else
2331 com_apply_trailer(c, CHILD(n, i));
2332 }
2333}
2334
2335static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002336com_invert_constant(struct compiling *c, node *n)
2337{
2338 /* Compute the inverse of int and longs and use them directly,
2339 but be prepared to generate code for all other
2340 possibilities (invalid numbers, floats, complex).
2341 */
2342 PyObject *num, *inv = NULL;
2343 int i;
2344
2345 REQ(n, NUMBER);
2346 num = parsenumber(c, STR(n));
2347 if (num == NULL)
2348 i = 255;
2349 else {
2350 inv = PyNumber_Invert(num);
2351 if (inv == NULL) {
2352 PyErr_Clear();
2353 i = com_addconst(c, num);
2354 } else {
2355 i = com_addconst(c, inv);
2356 Py_DECREF(inv);
2357 }
2358 Py_DECREF(num);
2359 }
2360 com_addoparg(c, LOAD_CONST, i);
2361 com_push(c, 1);
2362 if (num != NULL && inv == NULL)
2363 com_addbyte(c, UNARY_INVERT);
2364}
2365
Tim Peters51e26512001-09-07 08:45:55 +00002366static int
2367is_float_zero(const char *p)
2368{
2369 int found_radix_point = 0;
2370 int ch;
2371 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2372 switch (ch) {
2373 case '0':
2374 /* no reason to believe it's not 0 -- continue */
2375 break;
2376
2377 case 'e': case 'E': case 'j': case 'J':
2378 /* If this was a hex constant, we already would have
2379 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2380 must be an exponent marker, and we haven't yet
2381 seen a non-zero digit, and it doesn't matter what
2382 the exponent is then. For 'j' or 'J' similarly,
2383 except that this is an imaginary 0 then. */
2384 return 1;
2385
2386 case '.':
2387 found_radix_point = 1;
2388 break;
2389
2390 default:
2391 return 0;
2392 }
2393 }
2394 return found_radix_point;
2395}
2396
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002397static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002398com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002399{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002400 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002401 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002402 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002403 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002404 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002405 approriate value as a constant. If the value is negative,
2406 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002407 negative in the 0th position -- unless we're doing unary minus
2408 of a floating zero! In that case the sign is significant, but
2409 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002410 */
2411 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002412 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002413 && TYPE((pfactor = CHILD(n, 1))) == factor
2414 && NCH(pfactor) == 1
2415 && TYPE((ppower = CHILD(pfactor, 0))) == power
2416 && NCH(ppower) == 1
2417 && TYPE((patom = CHILD(ppower, 0))) == atom
2418 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002419 && !(childtype == MINUS &&
2420 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002421 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002422 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002423 return;
2424 }
2425 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002426 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002427 if (s == NULL) {
2428 com_error(c, PyExc_MemoryError, "");
2429 com_addbyte(c, 255);
2430 return;
2431 }
2432 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002433 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002434 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002435 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002436 }
Tim Peters51e26512001-09-07 08:45:55 +00002437 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002438 }
2439 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002440 com_factor(c, CHILD(n, 1));
2441 com_addbyte(c, UNARY_POSITIVE);
2442 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002443 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002444 com_factor(c, CHILD(n, 1));
2445 com_addbyte(c, UNARY_NEGATIVE);
2446 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002447 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002448 com_factor(c, CHILD(n, 1));
2449 com_addbyte(c, UNARY_INVERT);
2450 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002451 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002452 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002453 }
2454}
2455
2456static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002457com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002458{
2459 int i;
2460 int op;
2461 REQ(n, term);
2462 com_factor(c, CHILD(n, 0));
2463 for (i = 2; i < NCH(n); i += 2) {
2464 com_factor(c, CHILD(n, i));
2465 switch (TYPE(CHILD(n, i-1))) {
2466 case STAR:
2467 op = BINARY_MULTIPLY;
2468 break;
2469 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002470 if (c->c_flags & CO_FUTURE_DIVISION)
2471 op = BINARY_TRUE_DIVIDE;
2472 else
2473 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002474 break;
2475 case PERCENT:
2476 op = BINARY_MODULO;
2477 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002478 case DOUBLESLASH:
2479 op = BINARY_FLOOR_DIVIDE;
2480 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002481 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002482 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002483 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002484 op = 255;
2485 }
2486 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002487 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002488 }
2489}
2490
2491static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002492com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002493{
2494 int i;
2495 int op;
2496 REQ(n, arith_expr);
2497 com_term(c, CHILD(n, 0));
2498 for (i = 2; i < NCH(n); i += 2) {
2499 com_term(c, CHILD(n, i));
2500 switch (TYPE(CHILD(n, i-1))) {
2501 case PLUS:
2502 op = BINARY_ADD;
2503 break;
2504 case MINUS:
2505 op = BINARY_SUBTRACT;
2506 break;
2507 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002508 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002509 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002510 op = 255;
2511 }
2512 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002513 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002514 }
2515}
2516
2517static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002518com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002519{
2520 int i;
2521 int op;
2522 REQ(n, shift_expr);
2523 com_arith_expr(c, CHILD(n, 0));
2524 for (i = 2; i < NCH(n); i += 2) {
2525 com_arith_expr(c, CHILD(n, i));
2526 switch (TYPE(CHILD(n, i-1))) {
2527 case LEFTSHIFT:
2528 op = BINARY_LSHIFT;
2529 break;
2530 case RIGHTSHIFT:
2531 op = BINARY_RSHIFT;
2532 break;
2533 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002534 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002535 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002536 op = 255;
2537 }
2538 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002539 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002540 }
2541}
2542
2543static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002544com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002545{
2546 int i;
2547 int op;
2548 REQ(n, and_expr);
2549 com_shift_expr(c, CHILD(n, 0));
2550 for (i = 2; i < NCH(n); i += 2) {
2551 com_shift_expr(c, CHILD(n, i));
2552 if (TYPE(CHILD(n, i-1)) == AMPER) {
2553 op = BINARY_AND;
2554 }
2555 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002556 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002557 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002558 op = 255;
2559 }
2560 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002561 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002562 }
2563}
2564
2565static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002566com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002567{
2568 int i;
2569 int op;
2570 REQ(n, xor_expr);
2571 com_and_expr(c, CHILD(n, 0));
2572 for (i = 2; i < NCH(n); i += 2) {
2573 com_and_expr(c, CHILD(n, i));
2574 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2575 op = BINARY_XOR;
2576 }
2577 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002578 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002579 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002580 op = 255;
2581 }
2582 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002583 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002584 }
2585}
2586
2587static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002588com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002589{
2590 int i;
2591 int op;
2592 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002593 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002594 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002595 com_xor_expr(c, CHILD(n, i));
2596 if (TYPE(CHILD(n, i-1)) == VBAR) {
2597 op = BINARY_OR;
2598 }
2599 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002600 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002601 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002602 op = 255;
2603 }
2604 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002605 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002606 }
2607}
2608
2609static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002610cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002611{
2612 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00002613 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002614 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2615 if (NCH(n) == 1) {
2616 n = CHILD(n, 0);
2617 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002618 case LESS: return PyCmp_LT;
2619 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00002620 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00002621 case LESSEQUAL: return PyCmp_LE;
2622 case GREATEREQUAL: return PyCmp_GE;
2623 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2624 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2625 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002626 }
2627 }
2628 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002629 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002630 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002631 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002632 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002633 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002634 }
2635 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002636 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002637}
2638
2639static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002640com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002641{
2642 int i;
2643 enum cmp_op op;
2644 int anchor;
2645 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2646 com_expr(c, CHILD(n, 0));
2647 if (NCH(n) == 1)
2648 return;
2649
2650 /****************************************************************
2651 The following code is generated for all but the last
2652 comparison in a chain:
2653
2654 label: on stack: opcode: jump to:
2655
2656 a <code to load b>
2657 a, b DUP_TOP
2658 a, b, b ROT_THREE
2659 b, a, b COMPARE_OP
2660 b, 0-or-1 JUMP_IF_FALSE L1
2661 b, 1 POP_TOP
2662 b
2663
2664 We are now ready to repeat this sequence for the next
2665 comparison in the chain.
2666
2667 For the last we generate:
2668
2669 b <code to load c>
2670 b, c COMPARE_OP
2671 0-or-1
2672
2673 If there were any jumps to L1 (i.e., there was more than one
2674 comparison), we generate:
2675
2676 0-or-1 JUMP_FORWARD L2
2677 L1: b, 0 ROT_TWO
2678 0, b POP_TOP
2679 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002680 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002681 ****************************************************************/
2682
2683 anchor = 0;
2684
2685 for (i = 2; i < NCH(n); i += 2) {
2686 com_expr(c, CHILD(n, i));
2687 if (i+2 < NCH(n)) {
2688 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002689 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002690 com_addbyte(c, ROT_THREE);
2691 }
2692 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002693 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002694 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002695 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002696 }
2697 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002698 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002699 if (i+2 < NCH(n)) {
2700 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2701 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002702 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002703 }
2704 }
2705
2706 if (anchor) {
2707 int anchor2 = 0;
2708 com_addfwref(c, JUMP_FORWARD, &anchor2);
2709 com_backpatch(c, anchor);
2710 com_addbyte(c, ROT_TWO);
2711 com_addbyte(c, POP_TOP);
2712 com_backpatch(c, anchor2);
2713 }
2714}
2715
2716static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002717com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002718{
2719 REQ(n, not_test); /* 'not' not_test | comparison */
2720 if (NCH(n) == 1) {
2721 com_comparison(c, CHILD(n, 0));
2722 }
2723 else {
2724 com_not_test(c, CHILD(n, 1));
2725 com_addbyte(c, UNARY_NOT);
2726 }
2727}
2728
2729static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002730com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002731{
2732 int i;
2733 int anchor;
2734 REQ(n, and_test); /* not_test ('and' not_test)* */
2735 anchor = 0;
2736 i = 0;
2737 for (;;) {
2738 com_not_test(c, CHILD(n, i));
2739 if ((i += 2) >= NCH(n))
2740 break;
2741 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2742 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002743 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002744 }
2745 if (anchor)
2746 com_backpatch(c, anchor);
2747}
2748
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002749static int
2750com_make_closure(struct compiling *c, PyCodeObject *co)
2751{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002752 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002753 if (free == 0)
2754 return 0;
2755 for (i = 0; i < free; ++i) {
2756 /* Bypass com_addop_varname because it will generate
2757 LOAD_DEREF but LOAD_CLOSURE is needed.
2758 */
2759 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2760 int arg, reftype;
2761
2762 /* Special case: If a class contains a method with a
2763 free variable that has the same name as a method,
2764 the name will be considered free *and* local in the
2765 class. It should be handled by the closure, as
2766 well as by the normal name loookup logic.
2767 */
2768 reftype = get_ref_type(c, PyString_AS_STRING(name));
2769 if (reftype == CELL)
2770 arg = com_lookup_arg(c->c_cellvars, name);
2771 else /* (reftype == FREE) */
2772 arg = com_lookup_arg(c->c_freevars, name);
2773 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002774 fprintf(stderr, "lookup %s in %s %d %d\n"
2775 "freevars of %s: %s\n",
2776 PyObject_REPR(name),
2777 c->c_name,
2778 reftype, arg,
2779 PyString_AS_STRING(co->co_name),
2780 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002781 Py_FatalError("com_make_closure()");
2782 }
2783 com_addoparg(c, LOAD_CLOSURE, arg);
2784
2785 }
2786 com_push(c, free);
2787 return 1;
2788}
2789
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002790static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002791com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002792{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002793 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002794 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002795 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002796 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002797 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002798 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2799 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002800 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002801 if (co == NULL) {
2802 c->c_errors++;
2803 return;
2804 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002805 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002806 i = com_addconst(c, (PyObject *)co);
2807 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002808 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002809 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002810 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002811 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002812 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002813 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002814 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002815 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002816 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002817 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002818 else {
2819 int anchor = 0;
2820 int i = 0;
2821 for (;;) {
2822 com_and_test(c, CHILD(n, i));
2823 if ((i += 2) >= NCH(n))
2824 break;
2825 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2826 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002827 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002828 }
2829 if (anchor)
2830 com_backpatch(c, anchor);
2831 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002832}
2833
2834static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002835com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002836{
2837 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002838 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002839 com_node(c, CHILD(n, 0));
2840 }
2841 else {
2842 int i;
2843 int len;
2844 len = (NCH(n) + 1) / 2;
2845 for (i = 0; i < NCH(n); i += 2)
2846 com_node(c, CHILD(n, i));
2847 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002848 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002849 }
2850}
2851
2852
2853/* Begin of assignment compilation */
2854
Thomas Wouters434d0822000-08-24 20:11:32 +00002855
2856static void
2857com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2858{
2859 com_addbyte(c, DUP_TOP);
2860 com_push(c, 1);
2861 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002862 com_node(c, augn);
2863 com_addbyte(c, opcode);
2864 com_pop(c, 1);
2865 com_addbyte(c, ROT_TWO);
2866 com_addopname(c, STORE_ATTR, n);
2867 com_pop(c, 2);
2868}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002869
2870static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002871com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002872{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00002873 if (none_assignment_check(c, STR(n), assigning))
2874 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002875 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002876 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002877}
2878
2879static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002880com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002881{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002882 REQ(n, trailer);
2883 switch (TYPE(CHILD(n, 0))) {
2884 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002885 if (assigning == OP_DELETE)
2886 com_error(c, PyExc_SyntaxError,
2887 "can't delete function call");
2888 else
2889 com_error(c, PyExc_SyntaxError,
2890 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002891 break;
2892 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002893 if (assigning > OP_APPLY)
2894 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2895 else
2896 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002897 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002898 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002899 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002900 break;
2901 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002902 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002903 }
2904}
2905
2906static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002907com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002908{
2909 int i;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002910 if (TYPE(n) != testlist && TYPE(n) != testlist_gexp &&
2911 TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002912 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002913 if (assigning) {
2914 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002915 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002916 com_push(c, i-1);
2917 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002918 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002919 com_assign(c, CHILD(n, i), assigning, NULL);
2920}
2921
2922static void
2923com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2924{
2925 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002926 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002927 com_push(c, 1);
2928 com_node(c, augn);
2929 com_addbyte(c, opcode);
2930 com_pop(c, 1);
2931 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002932}
2933
2934static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002935com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002936{
2937 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002938 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002939 if (assigning)
2940 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002941}
2942
2943static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002944com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002945{
2946 /* Loop to avoid trivial recursion */
2947 for (;;) {
2948 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002949
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002950 case exprlist:
2951 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002952 case testlist1:
Raymond Hettinger354433a2004-05-19 08:20:33 +00002953 case testlist_gexp:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002954 if (NCH(n) > 1) {
Raymond Hettinger354433a2004-05-19 08:20:33 +00002955 if (TYPE(CHILD(n, 1)) == gen_for) {
2956 com_error(c, PyExc_SystemError,
2957 "assign to generator expression not possible");
2958 return;
2959 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002960 if (assigning > OP_APPLY) {
2961 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002962 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002963 return;
2964 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002965 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002966 return;
2967 }
2968 n = CHILD(n, 0);
2969 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002970
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002971 case test:
2972 case and_test:
2973 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002974 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002975 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002976 case xor_expr:
2977 case and_expr:
2978 case shift_expr:
2979 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002980 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002981 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002982 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002983 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002984 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002985 return;
2986 }
2987 n = CHILD(n, 0);
2988 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002989
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002990 case power: /* atom trailer* ('**' power)*
2991 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002992 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002993 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002994 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002995 return;
2996 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002997 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002998 int i;
2999 com_node(c, CHILD(n, 0));
3000 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003001 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003002 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003003 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00003004 return;
3005 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003006 com_apply_trailer(c, CHILD(n, i));
3007 } /* NB i is still alive */
3008 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00003009 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003010 return;
3011 }
3012 n = CHILD(n, 0);
3013 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003014
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003015 case atom:
3016 switch (TYPE(CHILD(n, 0))) {
3017 case LPAR:
3018 n = CHILD(n, 1);
3019 if (TYPE(n) == RPAR) {
3020 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003021 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003022 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003023 return;
3024 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003025 if (assigning > OP_APPLY) {
3026 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003027 "augmented assign to tuple literal not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003028 return;
3029 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003030 break;
3031 case LSQB:
3032 n = CHILD(n, 1);
3033 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003034 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003035 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003036 return;
3037 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003038 if (assigning > OP_APPLY) {
3039 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003040 "augmented assign to list literal not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003041 return;
3042 }
3043 if (NCH(n) > 1
3044 && TYPE(CHILD(n, 1)) == list_for) {
3045 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003046 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00003047 return;
3048 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003049 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003050 return;
3051 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00003052 if (assigning > OP_APPLY)
3053 com_augassign_name(c, CHILD(n, 0),
3054 assigning, augn);
3055 else
3056 com_assign_name(c, CHILD(n, 0),
3057 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003058 return;
3059 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003060 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003061 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003062 return;
3063 }
3064 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003065
3066 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003067 com_error(c, PyExc_SyntaxError,
3068 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003069 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003070
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003071 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003072 com_error(c, PyExc_SystemError,
3073 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003074 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003075
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003076 }
3077 }
3078}
Guido van Rossum7c531111997-03-11 18:42:21 +00003079
Thomas Wouters434d0822000-08-24 20:11:32 +00003080static void
3081com_augassign(struct compiling *c, node *n)
3082{
3083 int opcode;
3084
3085 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
3086 case '+': opcode = INPLACE_ADD; break;
3087 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00003088 case '/':
3089 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
3090 opcode = INPLACE_FLOOR_DIVIDE;
3091 else if (c->c_flags & CO_FUTURE_DIVISION)
3092 opcode = INPLACE_TRUE_DIVIDE;
3093 else
3094 opcode = INPLACE_DIVIDE;
3095 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00003096 case '%': opcode = INPLACE_MODULO; break;
3097 case '<': opcode = INPLACE_LSHIFT; break;
3098 case '>': opcode = INPLACE_RSHIFT; break;
3099 case '&': opcode = INPLACE_AND; break;
3100 case '^': opcode = INPLACE_XOR; break;
3101 case '|': opcode = INPLACE_OR; break;
3102 case '*':
3103 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
3104 opcode = INPLACE_POWER;
3105 else
3106 opcode = INPLACE_MULTIPLY;
3107 break;
3108 default:
3109 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
3110 return;
3111 }
3112 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
3113}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003114
3115static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003116com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003117{
Thomas Wouters434d0822000-08-24 20:11:32 +00003118 REQ(n, expr_stmt);
3119 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003120 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00003121 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003122 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00003123 if (NCH(n) == 1) {
3124 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003125 if (c->c_interactive)
3126 com_addbyte(c, PRINT_EXPR);
3127 else
3128 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003129 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003130 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003131 else if (TYPE(CHILD(n,1)) == augassign)
3132 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003133 else {
3134 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00003135 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003136 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003137 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003138 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003139 com_push(c, 1);
3140 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003141 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003142 }
3143 }
3144}
3145
3146static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003147com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00003148{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003149 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003150 int i;
3151 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003152 if (Py_OptimizeFlag)
3153 return;
3154 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00003155
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003156 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00003157 raise AssertionError [, <message>]
3158
3159 where <message> is the second test, if present.
3160 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003161 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003162 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003163 com_addbyte(c, POP_TOP);
3164 com_pop(c, 1);
3165 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003166 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00003167 com_push(c, 1);
3168 i = NCH(n)/2; /* Either 2 or 4 */
3169 if (i > 1)
3170 com_node(c, CHILD(n, 3));
3171 com_addoparg(c, RAISE_VARARGS, i);
3172 com_pop(c, i);
3173 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003174 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003175 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003176 com_addbyte(c, POP_TOP);
3177}
3178
3179static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003180com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003181{
Barry Warsaw29c574e2000-08-21 15:38:56 +00003182 int i = 1;
3183 node* stream = NULL;
3184
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003185 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003186
3187 /* are we using the extended print form? */
3188 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
3189 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00003190 com_node(c, stream);
3191 /* stack: [...] => [... stream] */
3192 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003193 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3194 i = 4;
3195 else
3196 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003197 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003198 for (; i < NCH(n); i += 2) {
3199 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003200 com_addbyte(c, DUP_TOP);
3201 /* stack: [stream] => [stream stream] */
3202 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003203 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003204 /* stack: [stream stream] => [stream stream obj] */
3205 com_addbyte(c, ROT_TWO);
3206 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003207 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003208 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003209 com_pop(c, 2);
3210 }
3211 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003212 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003213 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003214 com_addbyte(c, PRINT_ITEM);
3215 com_pop(c, 1);
3216 }
3217 }
3218 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003219 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003220 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003221 /* must pop the extra stream object off the stack */
3222 com_addbyte(c, POP_TOP);
3223 /* stack: [... stream] => [...] */
3224 com_pop(c, 1);
3225 }
3226 }
3227 else {
3228 if (stream != NULL) {
3229 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003230 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003231 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003232 com_pop(c, 1);
3233 }
3234 else
3235 com_addbyte(c, PRINT_NEWLINE);
3236 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003237}
3238
3239static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003240com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003241{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003242 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003243 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003244 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003245 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003246 if (c->c_flags & CO_GENERATOR) {
3247 if (NCH(n) > 1) {
3248 com_error(c, PyExc_SyntaxError,
3249 "'return' with argument inside generator");
3250 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003251 }
3252 if (NCH(n) < 2) {
3253 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003254 com_push(c, 1);
3255 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003256 else
3257 com_node(c, CHILD(n, 1));
3258 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003259 com_pop(c, 1);
3260}
3261
3262static void
3263com_yield_stmt(struct compiling *c, node *n)
3264{
Tim Peters95c80f82001-06-23 02:07:08 +00003265 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003266 REQ(n, yield_stmt); /* 'yield' testlist */
3267 if (!c->c_infunction) {
3268 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3269 }
Tim Peters95c80f82001-06-23 02:07:08 +00003270
3271 for (i = 0; i < c->c_nblocks; ++i) {
3272 if (c->c_block[i] == SETUP_FINALLY) {
3273 com_error(c, PyExc_SyntaxError,
3274 "'yield' not allowed in a 'try' block "
3275 "with a 'finally' clause");
3276 return;
3277 }
3278 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003279 com_node(c, CHILD(n, 1));
3280 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003281 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003282}
3283
3284static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003285com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003286{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003287 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003288 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3289 if (NCH(n) > 1) {
3290 com_node(c, CHILD(n, 1));
3291 if (NCH(n) > 3) {
3292 com_node(c, CHILD(n, 3));
3293 if (NCH(n) > 5)
3294 com_node(c, CHILD(n, 5));
3295 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003296 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003297 i = NCH(n)/2;
3298 com_addoparg(c, RAISE_VARARGS, i);
3299 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003300}
3301
3302static void
Thomas Wouters52152252000-08-17 22:55:00 +00003303com_from_import(struct compiling *c, node *n)
3304{
3305 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3306 com_push(c, 1);
3307 if (NCH(n) > 1) {
3308 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3309 com_error(c, PyExc_SyntaxError, "invalid syntax");
3310 return;
3311 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003312 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003313 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003314 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003315 com_pop(c, 1);
3316}
3317
3318static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003319com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003320{
3321 int i;
3322 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003323 /* 'import' dotted_name (',' dotted_name)* |
3324 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003325 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00003326 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003327 /* 'from' dotted_name 'import' ... */
3328 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003329
3330 if (TYPE(CHILD(n, 3)) == STAR) {
3331 tup = Py_BuildValue("(s)", "*");
3332 } else {
3333 tup = PyTuple_New((NCH(n) - 2)/2);
3334 for (i = 3; i < NCH(n); i += 2) {
3335 PyTuple_SET_ITEM(tup, (i-3)/2,
Guido van Rossum633d90c2002-12-23 16:51:42 +00003336 PyString_FromString(STR(
3337 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003338 }
3339 }
3340 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003341 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003342 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003343 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00003344 if (TYPE(CHILD(n, 3)) == STAR)
3345 com_addbyte(c, IMPORT_STAR);
3346 else {
3347 for (i = 3; i < NCH(n); i += 2)
3348 com_from_import(c, CHILD(n, i));
3349 com_addbyte(c, POP_TOP);
3350 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003351 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003352 }
3353 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003354 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003355 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003356 node *subn = CHILD(n, i);
3357 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003358 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003359 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003360 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003361 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003362 int j;
3363 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003364 com_error(c, PyExc_SyntaxError,
3365 "invalid syntax");
3366 return;
3367 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003368 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3369 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003370 CHILD(CHILD(subn, 0),
3371 j));
3372 com_addop_varname(c, VAR_STORE,
3373 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003374 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003375 com_addop_varname(c, VAR_STORE,
3376 STR(CHILD(CHILD(subn, 0),
3377 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003378 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003379 }
3380 }
3381}
3382
3383static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003384com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003385{
3386 REQ(n, exec_stmt);
3387 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3388 com_node(c, CHILD(n, 1));
3389 if (NCH(n) >= 4)
3390 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003391 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003392 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003393 com_push(c, 1);
3394 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003395 if (NCH(n) >= 6)
3396 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003397 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003398 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003399 com_push(c, 1);
3400 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003401 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003402 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003403}
3404
Guido van Rossum7c531111997-03-11 18:42:21 +00003405static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003406is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003407{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003408 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003409 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003410 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003411
3412 /* Label to avoid tail recursion */
3413 next:
3414 switch (TYPE(n)) {
3415
3416 case suite:
3417 if (NCH(n) == 1) {
3418 n = CHILD(n, 0);
3419 goto next;
3420 }
3421 /* Fall through */
3422 case file_input:
3423 for (i = 0; i < NCH(n); i++) {
3424 node *ch = CHILD(n, i);
3425 if (TYPE(ch) == stmt) {
3426 n = ch;
3427 goto next;
3428 }
3429 }
3430 break;
3431
3432 case stmt:
3433 case simple_stmt:
3434 case small_stmt:
3435 n = CHILD(n, 0);
3436 goto next;
3437
3438 case expr_stmt:
3439 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003440 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003441 case test:
3442 case and_test:
3443 case not_test:
3444 case comparison:
3445 case expr:
3446 case xor_expr:
3447 case and_expr:
3448 case shift_expr:
3449 case arith_expr:
3450 case term:
3451 case factor:
3452 case power:
3453 case atom:
3454 if (NCH(n) == 1) {
3455 n = CHILD(n, 0);
3456 goto next;
3457 }
3458 break;
3459
3460 case NAME:
3461 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3462 return 1;
3463 break;
3464
3465 case NUMBER:
3466 v = parsenumber(c, STR(n));
3467 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003468 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003469 break;
3470 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003471 i = PyObject_IsTrue(v);
3472 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003473 return i == 0;
3474
3475 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003476 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003477 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003478 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003479 break;
3480 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003481 i = PyObject_IsTrue(v);
3482 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003483 return i == 0;
3484
3485 }
3486 return 0;
3487}
3488
Tim Peters08a898f2001-06-28 01:52:22 +00003489
3490/* Look under n for a return stmt with an expression.
3491 * This hack is used to find illegal returns under "if 0:" blocks in
3492 * functions already known to be generators (as determined by the symtable
3493 * pass).
3494 * Return the offending return node if found, else NULL.
3495 */
3496static node *
3497look_for_offending_return(node *n)
3498{
3499 int i;
3500
3501 for (i = 0; i < NCH(n); ++i) {
3502 node *kid = CHILD(n, i);
3503
3504 switch (TYPE(kid)) {
3505 case classdef:
3506 case funcdef:
3507 case lambdef:
3508 /* Stuff in nested functions & classes doesn't
3509 affect the code block we started in. */
3510 return NULL;
3511
3512 case return_stmt:
3513 if (NCH(kid) > 1)
3514 return kid;
3515 break;
3516
3517 default: {
3518 node *bad = look_for_offending_return(kid);
3519 if (bad != NULL)
3520 return bad;
3521 }
3522 }
3523 }
3524
3525 return NULL;
3526}
3527
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003528static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003529com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003530{
3531 int i;
3532 int anchor = 0;
3533 REQ(n, if_stmt);
3534 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3535 for (i = 0; i+3 < NCH(n); i+=4) {
3536 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003537 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003538 if (is_constant_false(c, ch)) {
3539 /* We're going to skip this block. However, if this
3540 is a generator, we have to check the dead code
3541 anyway to make sure there aren't any return stmts
3542 with expressions, in the same scope. */
3543 if (c->c_flags & CO_GENERATOR) {
3544 node *p = look_for_offending_return(n);
3545 if (p != NULL) {
3546 int savelineno = c->c_lineno;
3547 c->c_lineno = p->n_lineno;
3548 com_error(c, PyExc_SyntaxError,
3549 "'return' with argument "
3550 "inside generator");
3551 c->c_lineno = savelineno;
3552 }
3553 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003554 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003555 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003556 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003557 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003558 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003559 com_addfwref(c, JUMP_IF_FALSE, &a);
3560 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003561 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003562 com_node(c, CHILD(n, i+3));
3563 com_addfwref(c, JUMP_FORWARD, &anchor);
3564 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003565 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003566 com_addbyte(c, POP_TOP);
3567 }
3568 if (i+2 < NCH(n))
3569 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003570 if (anchor)
3571 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003572}
3573
3574static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003575com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003576{
3577 int break_anchor = 0;
3578 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003579 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003580 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3581 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003582 block_push(c, SETUP_LOOP);
3583 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003584 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003585 com_node(c, CHILD(n, 1));
3586 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3587 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003588 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003589 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003590 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003591 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003592 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3593 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003594 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003595 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003596 com_addbyte(c, POP_TOP);
3597 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003598 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003599 if (NCH(n) > 4)
3600 com_node(c, CHILD(n, 6));
3601 com_backpatch(c, break_anchor);
3602}
3603
3604static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003605com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003606{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003607 int break_anchor = 0;
3608 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003609 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003610 REQ(n, for_stmt);
3611 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3612 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003613 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003614 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003615 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003616 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00003617 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003618 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003619 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003620 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003621 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003622 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003623 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003624 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3625 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003626 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003627 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003628 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003629 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003630 if (NCH(n) > 8)
3631 com_node(c, CHILD(n, 8));
3632 com_backpatch(c, break_anchor);
3633}
3634
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003635/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003636
3637 SETUP_FINALLY L
3638 <code for S>
3639 POP_BLOCK
3640 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003641 L: <code for Sf>
3642 END_FINALLY
3643
3644 The special instructions use the block stack. Each block
3645 stack entry contains the instruction that created it (here
3646 SETUP_FINALLY), the level of the value stack at the time the
3647 block stack entry was created, and a label (here L).
3648
3649 SETUP_FINALLY:
3650 Pushes the current value stack level and the label
3651 onto the block stack.
3652 POP_BLOCK:
3653 Pops en entry from the block stack, and pops the value
3654 stack until its level is the same as indicated on the
3655 block stack. (The label is ignored.)
3656 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003657 Pops a variable number of entries from the *value* stack
3658 and re-raises the exception they specify. The number of
3659 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003660
3661 The block stack is unwound when an exception is raised:
3662 when a SETUP_FINALLY entry is found, the exception is pushed
3663 onto the value stack (and the exception condition is cleared),
3664 and the interpreter jumps to the label gotten from the block
3665 stack.
3666
3667 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003668 (The contents of the value stack is shown in [], with the top
3669 at the right; 'tb' is trace-back info, 'val' the exception's
3670 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003671
3672 Value stack Label Instruction Argument
3673 [] SETUP_EXCEPT L1
3674 [] <code for S>
3675 [] POP_BLOCK
3676 [] JUMP_FORWARD L0
3677
Guido van Rossum3f5da241990-12-20 15:06:42 +00003678 [tb, val, exc] L1: DUP )
3679 [tb, val, exc, exc] <evaluate E1> )
3680 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3681 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3682 [tb, val, exc, 1] POP )
3683 [tb, val, exc] POP
3684 [tb, val] <assign to V1> (or POP if no V1)
3685 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003686 [] <code for S1>
3687 JUMP_FORWARD L0
3688
Guido van Rossum3f5da241990-12-20 15:06:42 +00003689 [tb, val, exc, 0] L2: POP
3690 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003691 .............................etc.......................
3692
Guido van Rossum3f5da241990-12-20 15:06:42 +00003693 [tb, val, exc, 0] Ln+1: POP
3694 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003695
3696 [] L0: <next statement>
3697
3698 Of course, parts are not generated if Vi or Ei is not present.
3699*/
3700
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003701static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003702com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003703{
3704 int except_anchor = 0;
3705 int end_anchor = 0;
3706 int else_anchor = 0;
3707 int i;
3708 node *ch;
3709
3710 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3711 block_push(c, SETUP_EXCEPT);
3712 com_node(c, CHILD(n, 2));
3713 com_addbyte(c, POP_BLOCK);
3714 block_pop(c, SETUP_EXCEPT);
3715 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3716 com_backpatch(c, except_anchor);
3717 for (i = 3;
3718 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3719 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003720 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003721 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003722 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003723 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003724 break;
3725 }
3726 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003727 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003728 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003729 if (NCH(ch) > 1) {
3730 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003731 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003732 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003733 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003734 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003735 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3736 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003737 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003738 }
3739 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003740 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003741 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003742 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003743 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003744 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003745 com_pop(c, 1);
3746 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003747 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003748 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003749 com_node(c, CHILD(n, i+2));
3750 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3751 if (except_anchor) {
3752 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003753 /* We come in with [tb, val, exc, 0] on the
3754 stack; one pop and it's the same as
3755 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003756 com_addbyte(c, POP_TOP);
3757 }
3758 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003759 /* We actually come in here with [tb, val, exc] but the
3760 END_FINALLY will zap those and jump around.
3761 The c_stacklevel does not reflect them so we need not pop
3762 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003763 com_addbyte(c, END_FINALLY);
3764 com_backpatch(c, else_anchor);
3765 if (i < NCH(n))
3766 com_node(c, CHILD(n, i+2));
3767 com_backpatch(c, end_anchor);
3768}
3769
3770static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003771com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003772{
3773 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003774 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003775
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003776 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3777 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003778 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003779 com_addbyte(c, POP_BLOCK);
3780 block_pop(c, SETUP_FINALLY);
3781 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003782 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003783 /* While the generated code pushes only one item,
3784 the try-finally handling can enter here with
3785 up to three items. OK, here are the details:
3786 3 for an exception, 2 for RETURN, 1 for BREAK. */
3787 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003788 com_backpatch(c, finally_anchor);
3789 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003790 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003791 com_node(c, ch);
3792 com_addbyte(c, END_FINALLY);
3793 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003794 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003795}
3796
3797static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003798com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003799{
3800 REQ(n, try_stmt);
3801 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3802 | 'try' ':' suite 'finally' ':' suite */
3803 if (TYPE(CHILD(n, 3)) != except_clause)
3804 com_try_finally(c, n);
3805 else
3806 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003807}
3808
Guido van Rossum8b993a91997-01-17 21:04:03 +00003809static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003810get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003811{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003812 int i;
3813
Guido van Rossum8b993a91997-01-17 21:04:03 +00003814 /* Label to avoid tail recursion */
3815 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003816 switch (TYPE(n)) {
3817
3818 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003819 if (NCH(n) == 1) {
3820 n = CHILD(n, 0);
3821 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003822 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003823 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003824 case file_input:
3825 for (i = 0; i < NCH(n); i++) {
3826 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003827 if (TYPE(ch) == stmt) {
3828 n = ch;
3829 goto next;
3830 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003831 }
3832 break;
3833
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003834 case stmt:
3835 case simple_stmt:
3836 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003837 n = CHILD(n, 0);
3838 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003839
3840 case expr_stmt:
3841 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003842 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003843 case test:
3844 case and_test:
3845 case not_test:
3846 case comparison:
3847 case expr:
3848 case xor_expr:
3849 case and_expr:
3850 case shift_expr:
3851 case arith_expr:
3852 case term:
3853 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003854 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003855 if (NCH(n) == 1) {
3856 n = CHILD(n, 0);
3857 goto next;
3858 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003859 break;
3860
3861 case atom:
3862 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003863 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003864 break;
3865
3866 }
3867 return NULL;
3868}
3869
Guido van Rossum79f25d91997-04-29 20:08:16 +00003870static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003871get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003872{
Guido van Rossum541563e1999-01-28 15:08:09 +00003873 /* Don't generate doc-strings if run with -OO */
3874 if (Py_OptimizeFlag > 1)
3875 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003876 n = get_rawdocstring(n);
3877 if (n == NULL)
3878 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003879 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003880}
3881
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003882static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003883com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003884{
3885 REQ(n, suite);
3886 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3887 if (NCH(n) == 1) {
3888 com_node(c, CHILD(n, 0));
3889 }
3890 else {
3891 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003892 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003893 node *ch = CHILD(n, i);
3894 if (TYPE(ch) == stmt)
3895 com_node(c, ch);
3896 }
3897 }
3898}
3899
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003900/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003901static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003902com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003903{
3904 int i = c->c_nblocks;
3905 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3906 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3907 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003908 else if (i <= 0) {
3909 /* at the outer level */
3910 com_error(c, PyExc_SyntaxError,
3911 "'continue' not properly in loop");
3912 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003913 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003914 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003915 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003916 if (c->c_block[j] == SETUP_LOOP)
3917 break;
3918 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003919 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003920 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003921 for (; i > j; --i) {
3922 if (c->c_block[i] == SETUP_EXCEPT ||
3923 c->c_block[i] == SETUP_FINALLY) {
3924 com_addoparg(c, CONTINUE_LOOP,
3925 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003926 return;
3927 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003928 if (c->c_block[i] == END_FINALLY) {
3929 com_error(c, PyExc_SyntaxError,
3930 "'continue' not supported inside 'finally' clause");
3931 return;
3932 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003933 }
3934 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003935 com_error(c, PyExc_SyntaxError,
3936 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003937 }
3938 /* XXX Could allow it inside a 'finally' clause
3939 XXX if we could pop the exception still on the stack */
3940}
3941
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003942/* Return the number of default values in the argument list.
3943
3944 If a non-default argument follows a default argument, set an
3945 exception and return -1.
3946*/
3947
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003948static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003949com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003950{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003951 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003952 if (TYPE(n) == lambdef) {
3953 /* lambdef: 'lambda' [varargslist] ':' test */
3954 n = CHILD(n, 1);
3955 }
3956 else {
3957 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3958 n = CHILD(n, 2);
3959 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3960 n = CHILD(n, 1);
3961 }
3962 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003963 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003964 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003965 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003966 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3967 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003968 ndefs = 0;
3969 for (i = 0; i < nch; i++) {
3970 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003971 if (TYPE(CHILD(n, i)) == STAR ||
3972 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003973 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003974 i++;
3975 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003976 t = RPAR; /* Anything except EQUAL or COMMA */
3977 else
3978 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003979 if (t == EQUAL) {
3980 i++;
3981 ndefs++;
3982 com_node(c, CHILD(n, i));
3983 i++;
3984 if (i >= nch)
3985 break;
3986 t = TYPE(CHILD(n, i));
3987 }
3988 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003989 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003990 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003991 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003992 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003993 return -1;
3994 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003995 }
3996 if (t != COMMA)
3997 break;
3998 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003999 return ndefs;
4000}
4001
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004002static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004003com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004004{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004005 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004006 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004007 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004008 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004009 if (ndefs < 0)
4010 return;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004011 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
4012 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004013 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004014 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004015 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004016 c->c_errors++;
4017 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004018 int closure = com_make_closure(c, (PyCodeObject *)co);
4019 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004020 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004021 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004022 if (closure)
4023 com_addoparg(c, MAKE_CLOSURE, ndefs);
4024 else
4025 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004026 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004027 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004028 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004029 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004030 }
4031}
4032
4033static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004034com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004035{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004036 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004037 REQ(n, testlist);
4038 /* testlist: test (',' test)* [','] */
4039 for (i = 0; i < NCH(n); i += 2)
4040 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004041 i = (NCH(n)+1) / 2;
4042 com_addoparg(c, BUILD_TUPLE, i);
4043 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004044}
4045
4046static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004047com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004048{
Guido van Rossum25831651993-05-19 14:50:45 +00004049 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004050 PyObject *v;
4051 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004052 char *name;
4053
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004054 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004055 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004056 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004057 c->c_errors++;
4058 return;
4059 }
4060 /* Push the class name on the stack */
4061 i = com_addconst(c, v);
4062 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004063 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004064 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004065 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004066 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004067 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004068 com_push(c, 1);
4069 }
Guido van Rossum25831651993-05-19 14:50:45 +00004070 else
4071 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004072 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004073 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004074 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004075 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004076 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004077 c->c_errors++;
4078 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004079 int closure = com_make_closure(c, co);
4080 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004081 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004082 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004083 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004084 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004085 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004086 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004087 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004088 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004089 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004090 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004091 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004092 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004093 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004094 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004095}
4096
4097static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004098com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004099{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004100 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004101 if (c->c_errors)
4102 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004103 switch (TYPE(n)) {
4104
4105 /* Definition nodes */
4106
4107 case funcdef:
4108 com_funcdef(c, n);
4109 break;
4110 case classdef:
4111 com_classdef(c, n);
4112 break;
4113
4114 /* Trivial parse tree nodes */
4115
4116 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004117 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004118 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004119 n = CHILD(n, 0);
4120 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004121
4122 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004123 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004124 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004125 {
4126 int i;
4127 for (i = 0; i < NCH(n)-1; i += 2)
4128 com_node(c, CHILD(n, i));
4129 }
4130 break;
4131
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004132 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004133 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004134 n = CHILD(n, 0);
4135 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004136
4137 /* Statement nodes */
4138
4139 case expr_stmt:
4140 com_expr_stmt(c, n);
4141 break;
4142 case print_stmt:
4143 com_print_stmt(c, n);
4144 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004145 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004146 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004147 break;
4148 case pass_stmt:
4149 break;
4150 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004151 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004152 com_error(c, PyExc_SyntaxError,
4153 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004154 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004155 com_addbyte(c, BREAK_LOOP);
4156 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004157 case continue_stmt:
4158 com_continue_stmt(c, n);
4159 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004160 case return_stmt:
4161 com_return_stmt(c, n);
4162 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004163 case yield_stmt:
4164 com_yield_stmt(c, n);
4165 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004166 case raise_stmt:
4167 com_raise_stmt(c, n);
4168 break;
4169 case import_stmt:
4170 com_import_stmt(c, n);
4171 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004172 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004173 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004174 case exec_stmt:
4175 com_exec_stmt(c, n);
4176 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004177 case assert_stmt:
4178 com_assert_stmt(c, n);
4179 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004180 case if_stmt:
4181 com_if_stmt(c, n);
4182 break;
4183 case while_stmt:
4184 com_while_stmt(c, n);
4185 break;
4186 case for_stmt:
4187 com_for_stmt(c, n);
4188 break;
4189 case try_stmt:
4190 com_try_stmt(c, n);
4191 break;
4192 case suite:
4193 com_suite(c, n);
4194 break;
4195
4196 /* Expression nodes */
4197
4198 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004199 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004200 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004201 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004202 break;
4203 case test:
4204 com_test(c, n);
4205 break;
4206 case and_test:
4207 com_and_test(c, n);
4208 break;
4209 case not_test:
4210 com_not_test(c, n);
4211 break;
4212 case comparison:
4213 com_comparison(c, n);
4214 break;
4215 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004216 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004217 break;
4218 case expr:
4219 com_expr(c, n);
4220 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004221 case xor_expr:
4222 com_xor_expr(c, n);
4223 break;
4224 case and_expr:
4225 com_and_expr(c, n);
4226 break;
4227 case shift_expr:
4228 com_shift_expr(c, n);
4229 break;
4230 case arith_expr:
4231 com_arith_expr(c, n);
4232 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004233 case term:
4234 com_term(c, n);
4235 break;
4236 case factor:
4237 com_factor(c, n);
4238 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004239 case power:
4240 com_power(c, n);
4241 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004242 case atom:
4243 com_atom(c, n);
4244 break;
4245
4246 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004247 com_error(c, PyExc_SystemError,
4248 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004249 }
4250}
4251
Tim Petersdbd9ba62000-07-09 03:09:57 +00004252static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004253
4254static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004255com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004256{
4257 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4258 if (TYPE(CHILD(n, 0)) == LPAR)
4259 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004260 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004261 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004262 com_pop(c, 1);
4263 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004264}
4265
4266static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004267com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004268{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004269 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004270 if (NCH(n) == 1) {
4271 com_fpdef(c, CHILD(n, 0));
4272 }
4273 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004274 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004275 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004276 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004277 for (i = 0; i < NCH(n); i += 2)
4278 com_fpdef(c, CHILD(n, i));
4279 }
4280}
4281
4282static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004283com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004284{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004285 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004286 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004287 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004288 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004289 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004290 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004291 nch = NCH(n);
4292 /* Enter all arguments in table of locals */
4293 for (i = 0, narg = 0; i < nch; i++) {
4294 node *ch = CHILD(n, i);
4295 node *fp;
4296 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004297 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004298 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4299 fp = CHILD(ch, 0);
4300 if (TYPE(fp) != NAME) {
4301 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4302 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004303 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004304 narg++;
4305 /* all name updates handled by symtable */
4306 if (++i >= nch)
4307 break;
4308 ch = CHILD(n, i);
4309 if (TYPE(ch) == EQUAL)
4310 i += 2;
4311 else
4312 REQ(ch, COMMA);
4313 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004314 if (complex) {
4315 /* Generate code for complex arguments only after
4316 having counted the simple arguments */
4317 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004318 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004319 node *ch = CHILD(n, i);
4320 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004321 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004322 break;
4323 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4324 fp = CHILD(ch, 0);
4325 if (TYPE(fp) != NAME) {
4326 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004327 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004328 com_fpdef(c, ch);
4329 }
4330 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004331 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004332 break;
4333 ch = CHILD(n, i);
4334 if (TYPE(ch) == EQUAL)
4335 i += 2;
4336 else
4337 REQ(ch, COMMA);
4338 }
4339 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004340}
4341
4342static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004343com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004344{
4345 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004346 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004347 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004348 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004349 if (doc != NULL) {
4350 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004351 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004352 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004353 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004354 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004355 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004356 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004357 for (i = 0; i < NCH(n); i++) {
4358 node *ch = CHILD(n, i);
4359 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4360 com_node(c, ch);
4361 }
4362}
4363
4364/* Top-level compile-node interface */
4365
4366static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004367compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004368{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004369 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004370 node *ch;
4371 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00004372 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004373 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004374 if (doc != NULL) {
4375 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004376 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004377 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004378 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004379 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004380 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
4381 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004382 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004383 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004384 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004385 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004386 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004387 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004388 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4389 com_push(c, 1);
4390 com_addbyte(c, RETURN_VALUE);
4391 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004392}
4393
4394static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004395compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004396{
Guido van Rossum590baa41993-11-30 13:40:46 +00004397 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004398 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004399 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004400
4401 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004402 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004403 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004404 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004405 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004406 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004407 else
4408 ch = CHILD(n, 2);
4409 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004410 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004411 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004412}
4413
4414static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004415compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004416{
4417 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004418 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004419 REQ(n, classdef);
4420 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4421 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004422 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004423 /* Initialize local __module__ from global __name__ */
4424 com_addop_name(c, LOAD_GLOBAL, "__name__");
4425 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004426 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004427 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004428 if (doc != NULL) {
4429 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004430 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004431 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004432 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004433 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004434 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004435 }
4436 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004437 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004438 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00004439 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004440 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004441 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004442 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004443 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004444}
4445
4446static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00004447compile_generator_expression(struct compiling *c, node *n)
4448{
4449 /* testlist_gexp: test gen_for */
4450 /* argument: test gen_for */
4451 REQ(CHILD(n, 0), test);
4452 REQ(CHILD(n, 1), gen_for);
4453
4454 c->c_name = "<generator expression>";
4455 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
4456
4457 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4458 com_push(c, 1);
4459 com_addbyte(c, RETURN_VALUE);
4460 com_pop(c, 1);
4461}
4462
4463static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004464compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004465{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004466 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004467
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004468 switch (TYPE(n)) {
4469
Guido van Rossum4c417781991-01-21 16:09:22 +00004470 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004471 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004472 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004473 n = CHILD(n, 0);
4474 if (TYPE(n) != NEWLINE)
4475 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004476 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004477 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4478 com_push(c, 1);
4479 com_addbyte(c, RETURN_VALUE);
4480 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004481 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004482 break;
4483
Guido van Rossum4c417781991-01-21 16:09:22 +00004484 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004485 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004486 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004487 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4488 com_push(c, 1);
4489 com_addbyte(c, RETURN_VALUE);
4490 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004491 break;
4492
Guido van Rossum590baa41993-11-30 13:40:46 +00004493 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004494 com_node(c, CHILD(n, 0));
4495 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004496 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004497 break;
4498
Guido van Rossum590baa41993-11-30 13:40:46 +00004499 case lambdef: /* anonymous function definition */
4500 compile_lambdef(c, n);
4501 break;
4502
Guido van Rossum4c417781991-01-21 16:09:22 +00004503 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004504 compile_funcdef(c, n);
4505 break;
4506
Guido van Rossum4c417781991-01-21 16:09:22 +00004507 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004508 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004509 break;
4510
Raymond Hettinger354433a2004-05-19 08:20:33 +00004511 case testlist_gexp: /* A generator expression */
4512 case argument: /* A generator expression */
4513 compile_generator_expression(c, n);
4514 break;
4515
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004516 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004517 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004518 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004519 }
4520}
4521
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004522static PyObject *
4523dict_keys_inorder(PyObject *dict, int offset)
4524{
4525 PyObject *tuple, *k, *v;
4526 int i, pos = 0, size = PyDict_Size(dict);
4527
4528 tuple = PyTuple_New(size);
4529 if (tuple == NULL)
4530 return NULL;
4531 while (PyDict_Next(dict, &pos, &k, &v)) {
4532 i = PyInt_AS_LONG(v);
4533 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004534 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004535 PyTuple_SET_ITEM(tuple, i - offset, k);
4536 }
4537 return tuple;
4538}
4539
Guido van Rossum79f25d91997-04-29 20:08:16 +00004540PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004541PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004542{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004543 return PyNode_CompileFlags(n, filename, NULL);
4544}
4545
4546PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004547PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004548{
4549 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004550}
4551
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004552struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004553PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004554{
4555 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004556 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004557
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004558 ff = PyNode_Future(n, filename);
4559 if (ff == NULL)
4560 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004561 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00004562 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004563 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004564 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004565 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004566 return st;
4567}
4568
Guido van Rossum79f25d91997-04-29 20:08:16 +00004569static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004570icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004571{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004572 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004573}
4574
Guido van Rossum79f25d91997-04-29 20:08:16 +00004575static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004576jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004577 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004578{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004579 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004580 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004581 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004582 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004583 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4584 sc.c_encoding = "utf-8";
4585 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004586 sc.c_encoding = STR(n);
4587 n = CHILD(n, 0);
4588 } else {
4589 sc.c_encoding = NULL;
4590 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004591 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004592 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004593 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004594 /* c_symtable still points to parent's symbols */
4595 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004596 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004597 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004598 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004599 if (base->c_encoding != NULL) {
4600 assert(sc.c_encoding == NULL);
4601 sc.c_encoding = base->c_encoding;
4602 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004603 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004604 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004605 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004606 if (sc.c_future == NULL) {
4607 com_free(&sc);
4608 return NULL;
4609 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004610 if (flags) {
4611 int merged = sc.c_future->ff_features |
4612 flags->cf_flags;
4613 sc.c_future->ff_features = merged;
4614 flags->cf_flags = merged;
4615 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004616 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
4617 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004618 com_free(&sc);
4619 return NULL;
4620 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004621 /* reset symbol table for second pass */
4622 sc.c_symtable->st_nscopes = 1;
4623 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004624 }
4625 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004626 if (symtable_load_symbols(&sc) < 0) {
4627 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004628 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004629 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004630 compile_node(&sc, n);
4631 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004632 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004633 PyObject *consts, *names, *varnames, *filename, *name,
4634 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004635 consts = PyList_AsTuple(sc.c_consts);
4636 names = PyList_AsTuple(sc.c_names);
4637 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004638 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4639 freevars = dict_keys_inorder(sc.c_freevars,
4640 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004641 filename = PyString_InternFromString(sc.c_filename);
4642 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004643 if (!PyErr_Occurred())
4644 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004645 sc.c_nlocals,
4646 sc.c_maxstacklevel,
4647 sc.c_flags,
4648 sc.c_code,
4649 consts,
4650 names,
4651 varnames,
4652 freevars,
4653 cellvars,
4654 filename,
4655 name,
4656 sc.c_firstlineno,
4657 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004658 Py_XDECREF(consts);
4659 Py_XDECREF(names);
4660 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004661 Py_XDECREF(freevars);
4662 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004663 Py_XDECREF(filename);
4664 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004665 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004666 else if (!PyErr_Occurred()) {
4667 /* This could happen if someone called PyErr_Clear() after an
4668 error was reported above. That's not supposed to happen,
4669 but I just plugged one case and I'm not sure there can't be
4670 others. In that case, raise SystemError so that at least
4671 it gets reported instead dumping core. */
4672 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4673 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004674 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004675 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004676 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004677 sc.c_symtable = NULL;
4678 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004679 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004680 return co;
4681}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004682
4683int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004684PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004685{
4686 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004687 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004688 int line = co->co_firstlineno;
4689 int addr = 0;
4690 while (--size >= 0) {
4691 addr += *p++;
4692 if (addr > addrq)
4693 break;
4694 line += *p++;
4695 }
4696 return line;
4697}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004698
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004699/* The test for LOCAL must come before the test for FREE in order to
4700 handle classes where name is both local and free. The local var is
4701 a method and the free var is a free var referenced within a method.
4702*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004703
4704static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004705get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004706{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004707 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004708 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004709
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004710 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4711 return CELL;
4712 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4713 return LOCAL;
4714 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4715 return FREE;
4716 v = PyDict_GetItemString(c->c_globals, name);
4717 if (v) {
4718 if (v == Py_None)
4719 return GLOBAL_EXPLICIT;
4720 else {
4721 return GLOBAL_IMPLICIT;
4722 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004723 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004724 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004725 "unknown scope for %.100s in %.100s(%s) "
4726 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4727 name, c->c_name,
4728 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4729 c->c_filename,
4730 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4731 PyObject_REPR(c->c_locals),
4732 PyObject_REPR(c->c_globals)
4733 );
4734
4735 Py_FatalError(buf);
4736 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004737}
4738
Guido van Rossum207fda62001-03-02 03:30:41 +00004739/* Helper functions to issue warnings */
4740
4741static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004742issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004743{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004744 if (PyErr_Occurred()) {
4745 /* This can happen because symtable_node continues
4746 processing even after raising a SyntaxError.
4747 Calling PyErr_WarnExplicit now would clobber the
4748 pending exception; instead we fail and let that
4749 exception propagate.
4750 */
4751 return -1;
4752 }
Guido van Rossum207fda62001-03-02 03:30:41 +00004753 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4754 lineno, NULL, NULL) < 0) {
4755 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4756 PyErr_SetString(PyExc_SyntaxError, msg);
4757 PyErr_SyntaxLocation(filename, lineno);
4758 }
4759 return -1;
4760 }
4761 return 0;
4762}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004763
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004764static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004765symtable_warn(struct symtable *st, char *msg)
4766{
Guido van Rossum207fda62001-03-02 03:30:41 +00004767 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004768 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004769 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004770 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004771 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004772}
4773
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004774/* Helper function for setting lineno and filename */
4775
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004776static struct symtable *
4777symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004778{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004779 struct symtable *st;
4780
4781 st = symtable_init();
4782 if (st == NULL)
4783 return NULL;
4784 st->st_future = ff;
4785 st->st_filename = filename;
4786 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
4787 if (st->st_errors > 0)
4788 goto fail;
4789 symtable_node(st, n);
4790 if (st->st_errors > 0)
4791 goto fail;
4792 return st;
4793 fail:
4794 if (!PyErr_Occurred()) {
4795 /* This could happen because after a syntax error is
4796 detected, the symbol-table-building continues for
4797 a while, and PyErr_Clear() might erroneously be
4798 called during that process. One such case has been
4799 fixed, but there might be more (now or later).
4800 */
4801 PyErr_SetString(PyExc_SystemError, "lost exception");
4802 }
4803 st->st_future = NULL;
4804 st->st_filename = NULL;
4805 PySymtable_Free(st);
4806 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004807}
4808
4809static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004810symtable_init_compiling_symbols(struct compiling *c)
4811{
4812 PyObject *varnames;
4813
4814 varnames = c->c_symtable->st_cur->ste_varnames;
4815 if (varnames == NULL) {
4816 varnames = PyList_New(0);
4817 if (varnames == NULL)
4818 return -1;
4819 c->c_symtable->st_cur->ste_varnames = varnames;
4820 Py_INCREF(varnames);
4821 } else
4822 Py_INCREF(varnames);
4823 c->c_varnames = varnames;
4824
4825 c->c_globals = PyDict_New();
4826 if (c->c_globals == NULL)
4827 return -1;
4828 c->c_freevars = PyDict_New();
4829 if (c->c_freevars == NULL)
4830 return -1;
4831 c->c_cellvars = PyDict_New();
4832 if (c->c_cellvars == NULL)
4833 return -1;
4834 return 0;
4835}
4836
4837struct symbol_info {
4838 int si_nlocals;
4839 int si_ncells;
4840 int si_nfrees;
4841 int si_nimplicit;
4842};
4843
4844static void
4845symtable_init_info(struct symbol_info *si)
4846{
4847 si->si_nlocals = 0;
4848 si->si_ncells = 0;
4849 si->si_nfrees = 0;
4850 si->si_nimplicit = 0;
4851}
4852
4853static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004854symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004855 struct symbol_info *si)
4856{
4857 PyObject *dict, *v;
4858
4859 /* Seperate logic for DEF_FREE. If it occurs in a function,
4860 it indicates a local that we must allocate storage for (a
4861 cell var). If it occurs in a class, then the class has a
4862 method and a free variable with the same name.
4863 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004864 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004865 /* If it isn't declared locally, it can't be a cell. */
4866 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4867 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004868 v = PyInt_FromLong(si->si_ncells++);
4869 dict = c->c_cellvars;
4870 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004871 /* If it is free anyway, then there is no need to do
4872 anything here.
4873 */
4874 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004875 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004876 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004877 v = PyInt_FromLong(si->si_nfrees++);
4878 dict = c->c_freevars;
4879 }
4880 if (v == NULL)
4881 return -1;
4882 if (PyDict_SetItem(dict, name, v) < 0) {
4883 Py_DECREF(v);
4884 return -1;
4885 }
4886 Py_DECREF(v);
4887 return 0;
4888}
4889
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004890/* If a variable is a cell and an argument, make sure that appears in
4891 co_cellvars before any variable to its right in varnames.
4892*/
4893
4894
4895static int
4896symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4897 PyObject *varnames, int flags)
4898{
Tim Petersb39903b2003-03-24 17:22:24 +00004899 PyObject *v = NULL;
4900 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004901 int i, pos;
4902
4903 if (flags & CO_VARARGS)
4904 argcount++;
4905 if (flags & CO_VARKEYWORDS)
4906 argcount++;
4907 for (i = argcount; --i >= 0; ) {
4908 v = PyList_GET_ITEM(varnames, i);
4909 if (PyDict_GetItem(*cellvars, v)) {
4910 if (list == NULL) {
4911 list = PyList_New(1);
4912 if (list == NULL)
4913 return -1;
4914 PyList_SET_ITEM(list, 0, v);
4915 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004916 } else {
4917 if (PyList_Insert(list, 0, v) < 0) {
4918 Py_DECREF(list);
4919 return -1;
4920 }
4921 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004922 }
4923 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00004924 if (list == NULL)
4925 return 0;
4926
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004927 /* There are cellvars that are also arguments. Create a dict
4928 to replace cellvars and put the args at the front.
4929 */
4930 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004931 if (d == NULL)
4932 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004933 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4934 v = PyInt_FromLong(i);
4935 if (v == NULL)
4936 goto fail;
4937 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4938 goto fail;
4939 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4940 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00004941 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004942 }
4943 pos = 0;
4944 i = PyList_GET_SIZE(list);
4945 Py_DECREF(list);
4946 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4947 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004948 if (w == NULL)
4949 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004950 if (PyDict_SetItem(d, v, w) < 0) {
4951 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00004952 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004953 goto fail;
4954 }
4955 Py_DECREF(w);
4956 }
4957 Py_DECREF(*cellvars);
4958 *cellvars = d;
4959 return 1;
4960 fail:
4961 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00004962 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004963 return -1;
4964}
4965
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004966static int
4967symtable_freevar_offsets(PyObject *freevars, int offset)
4968{
4969 PyObject *name, *v;
4970 int pos;
4971
4972 /* The cell vars are the first elements of the closure,
4973 followed by the free vars. Update the offsets in
4974 c_freevars to account for number of cellvars. */
4975 pos = 0;
4976 while (PyDict_Next(freevars, &pos, &name, &v)) {
4977 int i = PyInt_AS_LONG(v) + offset;
4978 PyObject *o = PyInt_FromLong(i);
4979 if (o == NULL)
4980 return -1;
4981 if (PyDict_SetItem(freevars, name, o) < 0) {
4982 Py_DECREF(o);
4983 return -1;
4984 }
4985 Py_DECREF(o);
4986 }
4987 return 0;
4988}
4989
4990static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004991symtable_check_unoptimized(struct compiling *c,
4992 PySymtableEntryObject *ste,
4993 struct symbol_info *si)
4994{
4995 char buf[300];
4996
4997 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4998 || (ste->ste_nested && si->si_nimplicit)))
4999 return 0;
5000
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005001#define ILLEGAL_CONTAINS "contains a nested function with free variables"
5002
5003#define ILLEGAL_IS "is a nested function"
5004
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005005#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005006"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005007
5008#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005009"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005010
5011#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005012"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005013"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005014
5015 /* XXX perhaps the linenos for these opt-breaking statements
5016 should be stored so the exception can point to them. */
5017
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005018 if (ste->ste_child_free) {
5019 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005020 PyOS_snprintf(buf, sizeof(buf),
5021 ILLEGAL_IMPORT_STAR,
5022 PyString_AS_STRING(ste->ste_name),
5023 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005024 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005025 PyOS_snprintf(buf, sizeof(buf),
5026 ILLEGAL_BARE_EXEC,
5027 PyString_AS_STRING(ste->ste_name),
5028 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005029 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005030 PyOS_snprintf(buf, sizeof(buf),
5031 ILLEGAL_EXEC_AND_IMPORT_STAR,
5032 PyString_AS_STRING(ste->ste_name),
5033 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005034 }
5035 } else {
5036 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005037 PyOS_snprintf(buf, sizeof(buf),
5038 ILLEGAL_IMPORT_STAR,
5039 PyString_AS_STRING(ste->ste_name),
5040 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005041 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005042 PyOS_snprintf(buf, sizeof(buf),
5043 ILLEGAL_BARE_EXEC,
5044 PyString_AS_STRING(ste->ste_name),
5045 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005046 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005047 PyOS_snprintf(buf, sizeof(buf),
5048 ILLEGAL_EXEC_AND_IMPORT_STAR,
5049 PyString_AS_STRING(ste->ste_name),
5050 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005051 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005052 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005053
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005054 PyErr_SetString(PyExc_SyntaxError, buf);
5055 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5056 ste->ste_opt_lineno);
5057 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005058}
5059
5060static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005061symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5062 struct symbol_info *si)
5063{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005064 if (c->c_future)
5065 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005066 if (ste->ste_generator)
5067 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005068 if (ste->ste_type != TYPE_MODULE)
5069 c->c_flags |= CO_NEWLOCALS;
5070 if (ste->ste_type == TYPE_FUNCTION) {
5071 c->c_nlocals = si->si_nlocals;
5072 if (ste->ste_optimized == 0)
5073 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005074 else if (ste->ste_optimized != OPT_EXEC)
5075 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005076 }
5077 return 0;
5078}
5079
5080static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005081symtable_error(struct symtable *st, int lineno)
5082{
5083 if (lineno == 0)
5084 lineno = st->st_cur->ste_lineno;
5085 PyErr_SyntaxLocation(st->st_filename, lineno);
5086 st->st_errors++;
5087 return -1;
5088}
5089
5090static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005091symtable_load_symbols(struct compiling *c)
5092{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005093 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005094 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005095 PyObject *name, *varnames, *v;
5096 int i, flags, pos;
5097 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005098
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005099 v = NULL;
5100
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005101 if (symtable_init_compiling_symbols(c) < 0)
5102 goto fail;
5103 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005104 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005105 si.si_nlocals = PyList_GET_SIZE(varnames);
5106 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005107
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005108 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005109 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005110 if (v == NULL)
5111 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005112 if (PyDict_SetItem(c->c_locals,
5113 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005114 goto fail;
5115 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005116 }
5117
5118 /* XXX The cases below define the rules for whether a name is
5119 local or global. The logic could probably be clearer. */
5120 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005121 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5122 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005123
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005124 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005125 /* undo the original DEF_FREE */
5126 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005127
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005128 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005129 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005130 2. Free variables in methods that are also class
5131 variables or declared global.
5132 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005133 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005134 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005135
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005136 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005137 c->c_argcount--;
5138 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005139 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005140 c->c_argcount--;
5141 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005142 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005143 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005144 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005145 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005146 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005147 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005148 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005149 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005150 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005151 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5152 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005153 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005154 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005155 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005156 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005157 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005158 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005159 if (v == NULL)
5160 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005161 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005162 goto fail;
5163 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005164 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005165 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005166 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005167 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005168 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005169 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005170 if (v == NULL)
5171 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005172 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005173 goto fail;
5174 Py_DECREF(v);
5175 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005176 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005177 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005178 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005179 goto fail;
5180 if (st->st_nscopes != 1) {
5181 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005182 if (v == NULL)
5183 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005184 if (PyDict_SetItem(st->st_global,
5185 name, v))
5186 goto fail;
5187 Py_DECREF(v);
5188 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005189 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005190 }
5191 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005192 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5193
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005194 if (si.si_ncells > 1) { /* one cell is always in order */
5195 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5196 c->c_varnames, c->c_flags) < 0)
5197 return -1;
5198 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005199 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5200 return -1;
5201 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005202 fail:
5203 /* is this always the right thing to do? */
5204 Py_XDECREF(v);
5205 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005206}
5207
5208static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005209symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005210{
5211 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005212
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005213 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005214 if (st == NULL)
5215 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005216 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005217
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005218 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005219 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005220 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005221 goto fail;
5222 if ((st->st_symbols = PyDict_New()) == NULL)
5223 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005224 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005225 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005226 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005227 st->st_private = NULL;
5228 return st;
5229 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005230 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005231 return NULL;
5232}
5233
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005234void
5235PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005236{
5237 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005238 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005239 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005240 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005241}
5242
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005243/* When the compiler exits a scope, it must should update the scope's
5244 free variable information with the list of free variables in its
5245 children.
5246
5247 Variables that are free in children and defined in the current
5248 scope are cellvars.
5249
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005250 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005251 false), free variables in children that are not defined here are
5252 implicit globals.
5253
5254*/
5255
5256static int
5257symtable_update_free_vars(struct symtable *st)
5258{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005259 int i, j, def;
5260 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005261 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005262
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005263 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005264 def = DEF_FREE_CLASS;
5265 else
5266 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005267 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005268 int pos = 0;
5269
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005270 if (list && PyList_SetSlice(list, 0,
5271 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005272 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005273 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005274 PyList_GET_ITEM(ste->ste_children, i);
5275 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005276 int flags = PyInt_AS_LONG(o);
5277 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005278 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005279 if (list == NULL) {
5280 list = PyList_New(0);
5281 if (list == NULL)
5282 return -1;
5283 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005284 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005285 if (PyList_Append(list, name) < 0) {
5286 Py_DECREF(list);
5287 return -1;
5288 }
5289 }
5290 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005291 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005292 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005293 v = PyDict_GetItem(ste->ste_symbols, name);
5294 /* If a name N is declared global in scope A and
5295 referenced in scope B contained (perhaps
5296 indirectly) in A and there are no scopes
5297 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005298 is global in B. Unless A is a class scope,
5299 because class scopes are not considered for
5300 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005301 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005302 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005303 int flags = PyInt_AS_LONG(v);
5304 if (flags & DEF_GLOBAL) {
5305 symtable_undo_free(st, child->ste_id,
5306 name);
5307 continue;
5308 }
5309 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005310 if (ste->ste_nested) {
5311 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005312 name, def) < 0) {
5313 Py_DECREF(list);
5314 return -1;
5315 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005316 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005317 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005318 name) < 0) {
5319 Py_DECREF(list);
5320 return -1;
5321 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005322 }
5323 }
5324 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005325
5326 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005327 return 0;
5328}
5329
5330/* If the current scope is a non-nested class or if name is not
5331 defined in the current, non-nested scope, then it is an implicit
5332 global in all nested scopes.
5333*/
5334
5335static int
5336symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5337{
5338 PyObject *o;
5339 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005340 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005341
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005342 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005343 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005344 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005345 if (o == NULL)
5346 return symtable_undo_free(st, child, name);
5347 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005348
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005349 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005350 return symtable_undo_free(st, child, name);
5351 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005352 return symtable_add_def_o(st, ste->ste_symbols,
5353 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005354}
5355
5356static int
5357symtable_undo_free(struct symtable *st, PyObject *id,
5358 PyObject *name)
5359{
5360 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005361 PyObject *info;
5362 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005363
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005364 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5365 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005366 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005367
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005368 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005369 if (info == NULL)
5370 return 0;
5371 v = PyInt_AS_LONG(info);
5372 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005373 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005374 DEF_FREE_GLOBAL) < 0)
5375 return -1;
5376 } else
5377 /* If the name is defined here or declared global,
5378 then the recursion stops. */
5379 return 0;
5380
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005381 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5382 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005383 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005384 PyList_GET_ITEM(ste->ste_children, i);
5385 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005386 if (x < 0)
5387 return x;
5388 }
5389 return 0;
5390}
5391
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005392/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5393 This reference is released when the scope is exited, via the DECREF
5394 in symtable_exit_scope().
5395*/
5396
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005397static int
5398symtable_exit_scope(struct symtable *st)
5399{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005400 int end;
5401
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005402 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005403 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005404 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005405 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005406 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5407 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005408 if (PySequence_DelItem(st->st_stack, end) < 0)
5409 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005410 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005411}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005412
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005413static void
5414symtable_enter_scope(struct symtable *st, char *name, int type,
5415 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005416{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005417 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005418
5419 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005420 prev = st->st_cur;
5421 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005422 st->st_errors++;
5423 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005424 }
5425 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005426 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005427 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005428 if (st->st_cur == NULL) {
5429 st->st_errors++;
5430 return;
5431 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005432 if (strcmp(name, TOP) == 0)
5433 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005434 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005435 if (PyList_Append(prev->ste_children,
5436 (PyObject *)st->st_cur) < 0)
5437 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005438 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005439}
5440
5441static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005442symtable_lookup(struct symtable *st, char *name)
5443{
5444 char buffer[MANGLE_LEN];
5445 PyObject *v;
5446 int flags;
5447
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005448 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005449 name = buffer;
5450 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5451 if (v == NULL) {
5452 if (PyErr_Occurred())
5453 return -1;
5454 else
5455 return 0;
5456 }
5457
5458 flags = PyInt_AS_LONG(v);
5459 return flags;
5460}
5461
5462static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005463symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005464{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005465 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005466 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005467 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005468
Guido van Rossumb7164622002-08-16 02:48:11 +00005469 /* Warn about None, except inside a tuple (where the assignment
5470 code already issues a warning). */
5471 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5472 *name == 'N' && strcmp(name, "None") == 0)
5473 {
5474 if (symtable_warn(st, "argument named None"))
5475 return -1;
5476 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005477 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005478 name = buffer;
5479 if ((s = PyString_InternFromString(name)) == NULL)
5480 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005481 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5482 Py_DECREF(s);
5483 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005484}
5485
5486/* Must only be called with mangled names */
5487
5488static int
5489symtable_add_def_o(struct symtable *st, PyObject *dict,
5490 PyObject *name, int flag)
5491{
5492 PyObject *o;
5493 int val;
5494
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005495 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005496 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005497 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005498 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005499 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005500 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005501 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005502 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005503 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005504 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005505 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005506 if (o == NULL)
5507 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005508 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005509 Py_DECREF(o);
5510 return -1;
5511 }
5512 Py_DECREF(o);
5513
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005514 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005515 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005516 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005517 } else if (flag & DEF_GLOBAL) {
5518 /* XXX need to update DEF_GLOBAL for other flags too;
5519 perhaps only DEF_FREE_GLOBAL */
5520 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005521 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005522 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005523 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005524 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005525 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005526 if (o == NULL)
5527 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005528 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005529 Py_DECREF(o);
5530 return -1;
5531 }
5532 Py_DECREF(o);
5533 }
5534 return 0;
5535}
5536
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005537#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005538
Tim Peters08a898f2001-06-28 01:52:22 +00005539/* Look for a yield stmt under n. Return 1 if found, else 0.
5540 This hack is used to look inside "if 0:" blocks (which are normally
5541 ignored) in case those are the only places a yield occurs (so that this
5542 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005543static int
5544look_for_yield(node *n)
5545{
5546 int i;
5547
5548 for (i = 0; i < NCH(n); ++i) {
5549 node *kid = CHILD(n, i);
5550
5551 switch (TYPE(kid)) {
5552
5553 case classdef:
5554 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005555 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005556 /* Stuff in nested functions and classes can't make
5557 the parent a generator. */
5558 return 0;
5559
5560 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00005561 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005562
5563 default:
5564 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00005565 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005566 }
5567 }
5568 return 0;
5569}
5570
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005571static void
5572symtable_node(struct symtable *st, node *n)
5573{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005574 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005575
5576 loop:
5577 switch (TYPE(n)) {
5578 case funcdef: {
5579 char *func_name = STR(CHILD(n, 1));
5580 symtable_add_def(st, func_name, DEF_LOCAL);
5581 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005582 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005583 symtable_funcdef(st, n);
5584 symtable_exit_scope(st);
5585 break;
5586 }
5587 case lambdef:
5588 if (NCH(n) == 4)
5589 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005590 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005591 symtable_funcdef(st, n);
5592 symtable_exit_scope(st);
5593 break;
5594 case classdef: {
5595 char *tmp, *class_name = STR(CHILD(n, 1));
5596 symtable_add_def(st, class_name, DEF_LOCAL);
5597 if (TYPE(CHILD(n, 2)) == LPAR) {
5598 node *bases = CHILD(n, 3);
5599 int i;
5600 for (i = 0; i < NCH(bases); i += 2) {
5601 symtable_node(st, CHILD(bases, i));
5602 }
5603 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005604 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005605 tmp = st->st_private;
5606 st->st_private = class_name;
5607 symtable_node(st, CHILD(n, NCH(n) - 1));
5608 st->st_private = tmp;
5609 symtable_exit_scope(st);
5610 break;
5611 }
5612 case if_stmt:
5613 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005614 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5615 if (st->st_cur->ste_generator == 0)
5616 st->st_cur->ste_generator =
5617 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005618 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005619 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005620 symtable_node(st, CHILD(n, i + 1));
5621 symtable_node(st, CHILD(n, i + 3));
5622 }
5623 if (i + 2 < NCH(n))
5624 symtable_node(st, CHILD(n, i + 2));
5625 break;
5626 case global_stmt:
5627 symtable_global(st, n);
5628 break;
5629 case import_stmt:
5630 symtable_import(st, n);
5631 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005632 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005633 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005634 symtable_node(st, CHILD(n, 1));
5635 if (NCH(n) > 2)
5636 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005637 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005638 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005639 st->st_cur->ste_opt_lineno = n->n_lineno;
5640 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005641 if (NCH(n) > 4)
5642 symtable_node(st, CHILD(n, 5));
5643 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005644
5645 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005646 case assert_stmt:
5647 if (Py_OptimizeFlag)
5648 return;
5649 if (NCH(n) == 2) {
5650 n = CHILD(n, 1);
5651 goto loop;
5652 } else {
5653 symtable_node(st, CHILD(n, 1));
5654 n = CHILD(n, 3);
5655 goto loop;
5656 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005657 case except_clause:
5658 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005659 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005660 if (NCH(n) > 1) {
5661 n = CHILD(n, 1);
5662 goto loop;
5663 }
5664 break;
5665 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005666 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005667 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005668 case yield_stmt:
5669 st->st_cur->ste_generator = 1;
5670 n = CHILD(n, 1);
5671 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005672 case expr_stmt:
5673 if (NCH(n) == 1)
5674 n = CHILD(n, 0);
5675 else {
5676 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005677 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005678 symtable_node(st, CHILD(n, 2));
5679 break;
5680 } else {
5681 int i;
5682 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005683 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005684 n = CHILD(n, NCH(n) - 1);
5685 }
5686 }
5687 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005688 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005689 /* only occurs when there are multiple for loops
5690 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005691 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005692 if (TYPE(n) == list_for)
5693 symtable_list_for(st, n);
5694 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005695 REQ(n, list_if);
5696 symtable_node(st, CHILD(n, 1));
5697 if (NCH(n) == 3) {
5698 n = CHILD(n, 2);
5699 goto loop;
5700 }
5701 }
5702 break;
5703 case for_stmt:
5704 symtable_assign(st, CHILD(n, 1), 0);
5705 for (i = 3; i < NCH(n); ++i)
5706 if (TYPE(CHILD(n, i)) >= single_input)
5707 symtable_node(st, CHILD(n, i));
5708 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00005709 case arglist:
5710 if (NCH(n) > 1)
5711 for (i = 0; i < NCH(n); ++i) {
5712 node *ch = CHILD(n, i);
5713 if (TYPE(ch) == argument && NCH(ch) == 2 &&
5714 TYPE(CHILD(ch, 1)) == gen_for) {
5715 PyErr_SetString(PyExc_SyntaxError,
5716 "invalid syntax");
5717 symtable_error(st, n->n_lineno);
5718 return;
5719 }
5720 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005721 /* The remaining cases fall through to default except in
5722 special circumstances. This requires the individual cases
5723 to be coded with great care, even though they look like
5724 rather innocuous. Each case must double-check TYPE(n).
5725 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005726 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005727 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005728 n = CHILD(n, 2);
5729 goto loop;
5730 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00005731 else if (TYPE(n) == argument && NCH(n) == 2 &&
5732 TYPE(CHILD(n, 1)) == gen_for) {
5733 symtable_generator_expression(st, n);
5734 break;
5735 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005736 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005737 case listmaker:
5738 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005739 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005740 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005741 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005742 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00005743 case testlist_gexp:
5744 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
5745 symtable_generator_expression(st, n);
5746 break;
5747 }
5748 /* fall through */
5749
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005750 case atom:
5751 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5752 symtable_add_use(st, STR(CHILD(n, 0)));
5753 break;
5754 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005755 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005756 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005757 /* Walk over every non-token child with a special case
5758 for one child.
5759 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005760 if (NCH(n) == 1) {
5761 n = CHILD(n, 0);
5762 goto loop;
5763 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005764 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005765 if (TYPE(CHILD(n, i)) >= single_input)
5766 symtable_node(st, CHILD(n, i));
5767 }
5768}
5769
5770static void
5771symtable_funcdef(struct symtable *st, node *n)
5772{
5773 node *body;
5774
5775 if (TYPE(n) == lambdef) {
5776 if (NCH(n) == 4)
5777 symtable_params(st, CHILD(n, 1));
5778 } else
5779 symtable_params(st, CHILD(n, 2));
5780 body = CHILD(n, NCH(n) - 1);
5781 symtable_node(st, body);
5782}
5783
5784/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00005785 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005786 which are references in the defining scope. symtable_params()
5787 parses the parameter names, which are defined in the function's
5788 body.
5789
5790 varargslist:
5791 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5792 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5793*/
5794
5795static void
5796symtable_default_args(struct symtable *st, node *n)
5797{
5798 node *c;
5799 int i;
5800
5801 if (TYPE(n) == parameters) {
5802 n = CHILD(n, 1);
5803 if (TYPE(n) == RPAR)
5804 return;
5805 }
5806 REQ(n, varargslist);
5807 for (i = 0; i < NCH(n); i += 2) {
5808 c = CHILD(n, i);
5809 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5810 break;
5811 }
5812 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5813 symtable_node(st, CHILD(n, i));
5814 }
5815}
5816
5817static void
5818symtable_params(struct symtable *st, node *n)
5819{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005820 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00005821 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005822
5823 if (TYPE(n) == parameters) {
5824 n = CHILD(n, 1);
5825 if (TYPE(n) == RPAR)
5826 return;
5827 }
5828 REQ(n, varargslist);
5829 for (i = 0; i < NCH(n); i += 2) {
5830 c = CHILD(n, i);
5831 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5832 ext = 1;
5833 break;
5834 }
5835 if (TYPE(c) == test) {
5836 continue;
5837 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00005838 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005839 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00005840 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005841 char nbuf[30];
5842 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005843 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005844 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005845 }
5846 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005847 if (ext) {
5848 c = CHILD(n, i);
5849 if (TYPE(c) == STAR) {
5850 i++;
5851 symtable_add_def(st, STR(CHILD(n, i)),
5852 DEF_PARAM | DEF_STAR);
5853 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005854 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005855 c = NULL;
5856 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005857 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005858 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005859 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005860 i++;
5861 symtable_add_def(st, STR(CHILD(n, i)),
5862 DEF_PARAM | DEF_DOUBLESTAR);
5863 }
5864 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005865 if (complex >= 0) {
5866 int j;
5867 for (j = 0; j <= complex; j++) {
5868 c = CHILD(n, j);
5869 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005870 c = CHILD(n, ++j);
5871 else if (TYPE(c) == EQUAL)
5872 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005873 if (TYPE(CHILD(c, 0)) == LPAR)
5874 symtable_params_fplist(st, CHILD(c, 1));
5875 }
5876 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005877}
5878
5879static void
5880symtable_params_fplist(struct symtable *st, node *n)
5881{
5882 int i;
5883 node *c;
5884
5885 REQ(n, fplist);
5886 for (i = 0; i < NCH(n); i += 2) {
5887 c = CHILD(n, i);
5888 REQ(c, fpdef);
5889 if (NCH(c) == 1)
5890 symtable_add_def(st, STR(CHILD(c, 0)),
5891 DEF_PARAM | DEF_INTUPLE);
5892 else
5893 symtable_params_fplist(st, CHILD(c, 1));
5894 }
5895
5896}
5897
5898static void
5899symtable_global(struct symtable *st, node *n)
5900{
5901 int i;
5902
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005903 /* XXX It might be helpful to warn about module-level global
5904 statements, but it's hard to tell the difference between
5905 module-level and a string passed to exec.
5906 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005907
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005908 for (i = 1; i < NCH(n); i += 2) {
5909 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005910 int flags;
5911
5912 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005913 if (flags < 0)
5914 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005915 if (flags && flags != DEF_GLOBAL) {
5916 char buf[500];
5917 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005918 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005919 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00005920 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005921 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005922 }
5923 else {
5924 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005925 PyOS_snprintf(buf, sizeof(buf),
5926 GLOBAL_AFTER_ASSIGN,
5927 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005928 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005929 PyOS_snprintf(buf, sizeof(buf),
5930 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005931 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005932 }
5933 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005934 symtable_add_def(st, name, DEF_GLOBAL);
5935 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005936}
5937
5938static void
5939symtable_list_comprehension(struct symtable *st, node *n)
5940{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005941 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005942 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005943
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005944 REQ(n, listmaker);
5945 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
5946 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005947 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005948 symtable_list_for(st, CHILD(n, 1));
5949 symtable_node(st, CHILD(n, 0));
5950 --st->st_cur->ste_tmpname;
5951}
5952
5953static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00005954symtable_generator_expression(struct symtable *st, node *n)
5955{
5956 /* testlist_gexp: test gen_for */
5957 REQ(CHILD(n, 0), test);
5958 REQ(CHILD(n, 1), gen_for);
5959
5960 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
5961 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
5962
5963 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
5964
5965 symtable_gen_for(st, CHILD(n, 1), 1);
5966 symtable_node(st, CHILD(n, 0));
5967 symtable_exit_scope(st);
5968
5969 /* for outmost iterable precomputation */
5970 symtable_node(st, CHILD(CHILD(n, 1), 3));
5971}
5972
5973static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005974symtable_list_for(struct symtable *st, node *n)
5975{
5976 REQ(n, list_for);
5977 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005978 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005979 symtable_node(st, CHILD(n, 3));
5980 if (NCH(n) == 5)
5981 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005982}
5983
5984static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00005985symtable_gen_for(struct symtable *st, node *n, int is_outmost)
5986{
5987 REQ(n, gen_for);
5988
5989 /* gen_for: for v in test [gen_iter] */
5990 symtable_assign(st, CHILD(n, 1), 0);
5991 if (is_outmost)
5992 symtable_add_use(st, "[outmost-iterable]");
5993 else
5994 symtable_node(st, CHILD(n, 3));
5995
5996 if (NCH(n) == 5)
5997 symtable_gen_iter(st, CHILD(n, 4));
5998}
5999
6000static void
6001symtable_gen_iter(struct symtable *st, node *n)
6002{
6003 REQ(n, gen_iter);
6004
6005 n = CHILD(n, 0);
6006 if (TYPE(n) == gen_for)
6007 symtable_gen_for(st, n, 0);
6008 else {
6009 REQ(n, gen_if);
6010 symtable_node(st, CHILD(n, 1));
6011
6012 if (NCH(n) == 3)
6013 symtable_gen_iter(st, CHILD(n, 2));
6014 }
6015}
6016
6017static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006018symtable_import(struct symtable *st, node *n)
6019{
6020 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006021 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006022 | 'from' dotted_name 'import'
6023 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00006024 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006025 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006026 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006027 node *dotname = CHILD(n, 1);
6028 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6029 /* check for bogus imports */
6030 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6031 PyErr_SetString(PyExc_SyntaxError,
6032 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006033 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006034 return;
6035 }
6036 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006037 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006038 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006039 if (symtable_warn(st,
6040 "import * only allowed at module level") < 0)
6041 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006042 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006043 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006044 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006045 } else {
6046 for (i = 3; i < NCH(n); i += 2) {
6047 node *c = CHILD(n, i);
6048 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006049 symtable_assign(st, CHILD(c, 2),
6050 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006051 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006052 symtable_assign(st, CHILD(c, 0),
6053 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006054 }
6055 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006056 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006057 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006058 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006059 }
6060 }
6061}
6062
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006063/* The third argument to symatble_assign() is a flag to be passed to
6064 symtable_add_def() if it is eventually called. The flag is useful
6065 to specify the particular type of assignment that should be
6066 recorded, e.g. an assignment caused by import.
6067 */
6068
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006069static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006070symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006071{
6072 node *tmp;
6073 int i;
6074
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006075 loop:
6076 switch (TYPE(n)) {
6077 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006078 /* invalid assignment, e.g. lambda x:x=2. The next
6079 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006080 return;
6081 case power:
6082 if (NCH(n) > 2) {
6083 for (i = 2; i < NCH(n); ++i)
6084 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6085 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006086 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006087 if (NCH(n) > 1) {
6088 symtable_node(st, CHILD(n, 0));
6089 symtable_node(st, CHILD(n, 1));
6090 } else {
6091 n = CHILD(n, 0);
6092 goto loop;
6093 }
6094 return;
6095 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006096 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6097 /* XXX This is an error, but the next pass
6098 will catch it. */
6099 return;
6100 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006101 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006102 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006103 }
6104 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006105 case testlist_gexp:
6106 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6107 /* XXX This is an error, but the next pass
6108 will catch it. */
6109 return;
6110 } else {
6111 for (i = 0; i < NCH(n); i += 2)
6112 symtable_assign(st, CHILD(n, i), def_flag);
6113 }
6114 return;
6115
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006116 case exprlist:
6117 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006118 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006119 if (NCH(n) == 1) {
6120 n = CHILD(n, 0);
6121 goto loop;
6122 }
6123 else {
6124 int i;
6125 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006126 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006127 return;
6128 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006129 case atom:
6130 tmp = CHILD(n, 0);
6131 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6132 n = CHILD(n, 1);
6133 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006134 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006135 if (strcmp(STR(tmp), "__debug__") == 0) {
6136 PyErr_SetString(PyExc_SyntaxError,
6137 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006138 symtable_error(st, n->n_lineno);
6139 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006140 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006141 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006142 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006143 return;
6144 case dotted_as_name:
6145 if (NCH(n) == 3)
6146 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006147 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006148 else
6149 symtable_add_def(st,
6150 STR(CHILD(CHILD(n,
6151 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006152 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006153 return;
6154 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006155 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006156 return;
6157 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006158 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006159 return;
6160 default:
6161 if (NCH(n) == 0)
6162 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006163 if (NCH(n) == 1) {
6164 n = CHILD(n, 0);
6165 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006166 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006167 /* Should only occur for errors like x + 1 = 1,
6168 which will be caught in the next pass. */
6169 for (i = 0; i < NCH(n); ++i)
6170 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006171 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006172 }
6173}