blob: 15159f840ee8b56254951ed9fbc2f07339f107a6 [file] [log] [blame]
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001/* Compile an expression node to intermediate code */
2
Guido van Rossum3f5da241990-12-20 15:06:42 +00003/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004 XXX add __doc__ attribute == co_doc to code object attributes?
5 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +00006 XXX Generate simple jump for break/return outside 'try...finally'
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00007 XXX Allow 'continue' inside finally clause of try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +00008 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +00009 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000010*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011
Guido van Rossum79f25d91997-04-29 20:08:16 +000012#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000013
Guido van Rossum10dc2e81990-11-18 17:27:39 +000014#include "node.h"
15#include "token.h"
16#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000017#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000018#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000019#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000020#include "structmember.h"
21
22#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000023
Guido van Rossumb05a5c71997-05-07 17:46:13 +000024/* Three symbols from graminit.h are also defined in Python.h, with
25 Py_ prefixes to their names. Python.h can't include graminit.h
26 (which defines too many confusing symbols), but we can check here
27 that they haven't changed (which is very unlikely, but possible). */
28#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000029 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000030#endif
31#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000032 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000033#endif
34#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000035 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000036#endif
37
Guido van Rossum8e793d91997-03-03 19:13:14 +000038int Py_OptimizeFlag = 0;
39
Guido van Rossum8861b741996-07-30 16:49:37 +000040#define OP_DELETE 0
41#define OP_ASSIGN 1
42#define OP_APPLY 2
43
Jeremy Hyltone36f7782001-01-19 03:21:30 +000044#define VAR_LOAD 0
45#define VAR_STORE 1
46#define VAR_DELETE 2
47
Jeremy Hylton64949cb2001-01-25 20:06:59 +000048#define DEL_CLOSURE_ERROR \
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000049"can not delete variable '%.400s' referenced in nested scope"
50
51#define DUPLICATE_ARGUMENT \
52"duplicate argument '%s' in function definition"
53
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000054#define ILLEGAL_DYNAMIC_SCOPE \
55"%.100s: exec or 'import *' makes names ambiguous in nested scope"
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000056
Jeremy Hylton29906ee2001-02-27 04:23:34 +000057#define GLOBAL_AFTER_ASSIGN \
58"name '%.400s' is assigned to before global declaration"
59
60#define GLOBAL_AFTER_USE \
61"name '%.400s' is used prior to global declaration"
62
Martin v. Löwisdd7eb142003-10-18 22:05:25 +000063#define PARAM_GLOBAL \
Neal Norwitz2a47c0f2002-01-29 00:53:41 +000064"name '%.400s' is a function parameter and declared global"
Jeremy Hylton29906ee2001-02-27 04:23:34 +000065
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +000066#define LATE_FUTURE \
67"from __future__ imports must occur at the beginning of the file"
68
Jeremy Hylton897b8212001-03-23 14:08:38 +000069#define ASSIGN_DEBUG \
70"can not assign to __debug__"
71
Jeremy Hyltone36f7782001-01-19 03:21:30 +000072#define MANGLE_LEN 256
73
Guido van Rossum79f25d91997-04-29 20:08:16 +000074#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000075
Guido van Rossum6f799372001-09-20 20:46:19 +000076static PyMemberDef code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000077 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
78 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000079 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000080 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000081 {"co_code", T_OBJECT, OFF(co_code), READONLY},
82 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
83 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000084 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000085 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
86 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000087 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000088 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000089 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
90 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000091 {NULL} /* Sentinel */
92};
93
Guido van Rossumbea18cc2002-06-14 20:41:17 +000094PyDoc_STRVAR(code_doc,
95"code(argcount, nlocals, stacksize, flags, codestring, constants, names,\n\
96 varnames, filename, name, firstlineno, lnotab[, freevars[, cellvars]])\n\
97\n\
98Create a code object. Not for the faint of heart.");
99
100static PyObject *
101code_new(PyTypeObject *type, PyObject *args, PyObject *kw)
102{
103 int argcount;
104 int nlocals;
105 int stacksize;
106 int flags;
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000107 PyObject *co;
Raymond Hettingercc1798e2003-09-16 04:27:52 +0000108 PyObject *empty = NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000109 PyObject *code;
110 PyObject *consts;
111 PyObject *names;
112 PyObject *varnames;
113 PyObject *freevars = NULL;
114 PyObject *cellvars = NULL;
115 PyObject *filename;
116 PyObject *name;
117 int firstlineno;
118 PyObject *lnotab;
119
120 if (!PyArg_ParseTuple(args, "iiiiSO!O!O!SSiS|O!O!:code",
121 &argcount, &nlocals, &stacksize, &flags,
122 &code,
123 &PyTuple_Type, &consts,
124 &PyTuple_Type, &names,
125 &PyTuple_Type, &varnames,
126 &filename, &name,
127 &firstlineno, &lnotab,
128 &PyTuple_Type, &freevars,
129 &PyTuple_Type, &cellvars))
130 return NULL;
131
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000132 if (!PyObject_CheckReadBuffer(code)) {
133 PyErr_SetString(PyExc_TypeError,
134 "bytecode object must be a single-segment read-only buffer");
135 return NULL;
136 }
137
Raymond Hettingercc1798e2003-09-16 04:27:52 +0000138 if (freevars == NULL || cellvars == NULL) {
139 empty = PyTuple_New(0);
140 if (empty == NULL)
141 return NULL;
142 if (freevars == NULL)
143 freevars = empty;
144 if (cellvars == NULL)
145 cellvars = empty;
146 }
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000147
148 co = (PyObject *) PyCode_New(argcount, nlocals, stacksize, flags,
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000149 code, consts, names, varnames,
150 freevars, cellvars, filename, name,
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000151 firstlineno, lnotab);
Raymond Hettingercc1798e2003-09-16 04:27:52 +0000152 Py_XDECREF(empty);
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000153 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000154}
155
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000156static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000157code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000158{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000159 Py_XDECREF(co->co_code);
160 Py_XDECREF(co->co_consts);
161 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000162 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000163 Py_XDECREF(co->co_freevars);
164 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000165 Py_XDECREF(co->co_filename);
166 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000167 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000168 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000169}
170
Guido van Rossum79f25d91997-04-29 20:08:16 +0000171static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000172code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000173{
174 char buf[500];
175 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000176 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000177 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000178
Guido van Rossuma396a882000-04-07 01:21:36 +0000179 if (co->co_firstlineno != 0)
180 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000181 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000182 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000183 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000184 name = PyString_AS_STRING(co->co_name);
Barry Warsaw8f6d8682001-11-28 21:10:39 +0000185 PyOS_snprintf(buf, sizeof(buf),
186 "<code object %.100s at %p, file \"%.300s\", line %d>",
187 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000188 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000189}
190
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000191static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000192code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000193{
194 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000195 cmp = PyObject_Compare(co->co_name, cp->co_name);
196 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000197 cmp = co->co_argcount - cp->co_argcount;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000198 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000199 cmp = co->co_nlocals - cp->co_nlocals;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000200 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000201 cmp = co->co_flags - cp->co_flags;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000202 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000203 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000204 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000205 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000206 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000207 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000208 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000209 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000210 if (cmp) return cmp;
211 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
212 if (cmp) return cmp;
213 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000214 return cmp;
215}
216
217static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000218code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000219{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000220 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000221 h0 = PyObject_Hash(co->co_name);
222 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000223 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000224 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000225 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000226 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000227 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000228 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000229 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000230 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000231 h5 = PyObject_Hash(co->co_freevars);
232 if (h5 == -1) return -1;
233 h6 = PyObject_Hash(co->co_cellvars);
234 if (h6 == -1) return -1;
235 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000236 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000237 if (h == -1) h = -2;
238 return h;
239}
240
Jeremy Hylton78891072001-03-01 06:09:34 +0000241/* XXX code objects need to participate in GC? */
242
Guido van Rossum79f25d91997-04-29 20:08:16 +0000243PyTypeObject PyCode_Type = {
244 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000245 0,
246 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000247 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000248 0,
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000249 (destructor)code_dealloc, /* tp_dealloc */
250 0, /* tp_print */
251 0, /* tp_getattr */
252 0, /* tp_setattr */
253 (cmpfunc)code_compare, /* tp_compare */
254 (reprfunc)code_repr, /* tp_repr */
255 0, /* tp_as_number */
256 0, /* tp_as_sequence */
257 0, /* tp_as_mapping */
258 (hashfunc)code_hash, /* tp_hash */
259 0, /* tp_call */
260 0, /* tp_str */
261 PyObject_GenericGetAttr, /* tp_getattro */
262 0, /* tp_setattro */
263 0, /* tp_as_buffer */
264 Py_TPFLAGS_DEFAULT, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000265 code_doc, /* tp_doc */
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000266 0, /* tp_traverse */
267 0, /* tp_clear */
268 0, /* tp_richcompare */
269 0, /* tp_weaklistoffset */
270 0, /* tp_iter */
271 0, /* tp_iternext */
272 0, /* tp_methods */
273 code_memberlist, /* tp_members */
274 0, /* tp_getset */
275 0, /* tp_base */
276 0, /* tp_dict */
277 0, /* tp_descr_get */
278 0, /* tp_descr_set */
279 0, /* tp_dictoffset */
280 0, /* tp_init */
281 0, /* tp_alloc */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000282 code_new, /* tp_new */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000283};
284
Guido van Rossum644a12b1997-04-09 19:24:53 +0000285#define NAME_CHARS \
286 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
287
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000288/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
289
290static int
291all_name_chars(unsigned char *s)
292{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000293 static char ok_name_char[256];
294 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000295
Guido van Rossumcd90c202001-02-09 15:06:42 +0000296 if (ok_name_char[*name_chars] == 0) {
297 unsigned char *p;
298 for (p = name_chars; *p; p++)
299 ok_name_char[*p] = 1;
300 }
301 while (*s) {
302 if (ok_name_char[*s++] == 0)
303 return 0;
304 }
305 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000306}
307
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000308static int
309intern_strings(PyObject *tuple)
310{
311 int i;
312
313 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
314 PyObject *v = PyTuple_GET_ITEM(tuple, i);
315 if (v == NULL || !PyString_Check(v)) {
316 Py_FatalError("non-string found in code slot");
317 PyErr_BadInternalCall();
318 return -1;
319 }
320 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
321 }
322 return 0;
323}
324
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000325#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
326#define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD)
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000327#define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE || op==CONTINUE_LOOP)
328#define GETJUMPTGT(arr, i) (GETARG(arr,i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+3))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000329#define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000330#define CODESIZE(op) (HAS_ARG(op) ? 3 : 1)
331#define ISBASICBLOCK(blocks, start, bytes) (blocks[start]==blocks[start+bytes-1])
332
333static unsigned int *
334markblocks(unsigned char *code, int len)
335{
336 unsigned int *blocks = PyMem_Malloc(len*sizeof(int));
337 int i,j, opcode, oldblock, newblock, blockcnt = 0;
338
339 if (blocks == NULL)
340 return NULL;
341 memset(blocks, 0, len*sizeof(int));
342 for (i=0 ; i<len ; i+=CODESIZE(opcode)) {
343 opcode = code[i];
344 switch (opcode) {
345 case FOR_ITER:
346 case JUMP_FORWARD:
347 case JUMP_IF_FALSE:
348 case JUMP_IF_TRUE:
349 case JUMP_ABSOLUTE:
350 case CONTINUE_LOOP:
351 case SETUP_LOOP:
352 case SETUP_EXCEPT:
353 case SETUP_FINALLY:
354 j = GETJUMPTGT(code, i);
355 oldblock = blocks[j];
356 newblock = ++blockcnt;
357 for (; j<len ; j++) {
358 if (blocks[j] != (unsigned)oldblock)
359 break;
360 blocks[j] = newblock;
361 }
362 break;
363 }
364 }
365 return blocks;
366}
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000367
368static PyObject *
369optimize_code(PyObject *code, PyObject* consts)
370{
371 int i, j, codelen;
372 int tgt, tgttgt, opcode;
373 unsigned char *codestr;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000374 unsigned int *blocks;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000375
376 /* Make a modifiable copy of the code string */
377 if (!PyString_Check(code))
378 goto exitUnchanged;
379 codelen = PyString_Size(code);
380 codestr = PyMem_Malloc(codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000381 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000382 goto exitUnchanged;
383 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000384 blocks = markblocks(codestr, codelen);
385 if (blocks == NULL) {
386 PyMem_Free(codestr);
387 goto exitUnchanged;
388 }
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000389 assert(PyTuple_Check(consts));
390
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000391 for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000392 opcode = codestr[i];
393 switch (opcode) {
394
395 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP.
396 Note, only the first opcode is changed, the others still
397 perform normally if they happen to be jump targets. */
398 case LOAD_CONST:
399 j = GETARG(codestr, i);
400 if (codestr[i+3] != JUMP_IF_FALSE ||
401 codestr[i+6] != POP_TOP ||
402 !PyObject_IsTrue(PyTuple_GET_ITEM(consts, j)))
403 continue;
404 codestr[i] = JUMP_FORWARD;
405 SETARG(codestr, i, 4);
406 break;
407
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000408 /* Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2 JMP+2 NOP NOP.
409 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2 JMP+1 NOP. */
410 case BUILD_TUPLE:
411 case BUILD_LIST:
412 if (codestr[i+3] != UNPACK_SEQUENCE)
413 continue;
414 if (!ISBASICBLOCK(blocks,i,6))
415 continue;
416 if (GETARG(codestr, i) == 2 && \
417 GETARG(codestr, i+3) == 2) {
418 codestr[i] = ROT_TWO;
419 codestr[i+1] = JUMP_FORWARD;
420 SETARG(codestr, i+1, 2);
421 codestr[i+4] = DUP_TOP; /* Filler codes used as NOPs */
422 codestr[i+5] = POP_TOP;
423 continue;
424 }
425 if (GETARG(codestr, i) == 3 && \
426 GETARG(codestr, i+3) == 3) {
427 codestr[i] = ROT_THREE;
428 codestr[i+1] = ROT_TWO;
429 codestr[i+2] = JUMP_FORWARD;
430 SETARG(codestr, i+2, 1);
431 codestr[i+5] = DUP_TOP;
432 }
433 break;
434
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000435 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000436 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000437 case JUMP_FORWARD:
438 case JUMP_IF_FALSE:
439 case JUMP_IF_TRUE:
440 case JUMP_ABSOLUTE:
441 case CONTINUE_LOOP:
442 case SETUP_LOOP:
443 case SETUP_EXCEPT:
444 case SETUP_FINALLY:
445 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000446 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000447 continue;
448 tgttgt = GETJUMPTGT(codestr, tgt);
449 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
450 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000451 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000452 tgttgt -= i + 3; /* Calc relative jump addr */
453 if (tgttgt < 0) /* No backward relative jumps */
454 continue;
455 codestr[i] = opcode;
456 SETARG(codestr, i, tgttgt);
457 break;
458
459 case EXTENDED_ARG:
460 PyMem_Free(codestr);
461 goto exitUnchanged;
462 }
463 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000464 code = PyString_FromStringAndSize((char *)codestr, codelen);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000465 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000466 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000467 return code;
468
469exitUnchanged:
470 Py_INCREF(code);
471 return code;
472}
473
Guido van Rossum79f25d91997-04-29 20:08:16 +0000474PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000475PyCode_New(int argcount, int nlocals, int stacksize, int flags,
476 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000477 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
478 PyObject *filename, PyObject *name, int firstlineno,
479 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000480{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000481 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000482 int i;
483 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000484 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000485 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000486 consts == NULL || !PyTuple_Check(consts) ||
487 names == NULL || !PyTuple_Check(names) ||
488 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000489 freevars == NULL || !PyTuple_Check(freevars) ||
490 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000491 name == NULL || !PyString_Check(name) ||
492 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000493 lnotab == NULL || !PyString_Check(lnotab) ||
494 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000495 PyErr_BadInternalCall();
496 return NULL;
497 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000498 intern_strings(names);
499 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000500 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000501 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000502 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000503 for (i = PyTuple_Size(consts); --i >= 0; ) {
504 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000505 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000506 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000507 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000508 continue;
509 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000510 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000511 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000512 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000513 co->co_argcount = argcount;
514 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000515 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000516 co->co_flags = flags;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000517 co->co_code = optimize_code(code, consts);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000518 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000519 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000520 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000521 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000522 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000523 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000524 Py_INCREF(freevars);
525 co->co_freevars = freevars;
526 Py_INCREF(cellvars);
527 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000528 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000529 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000530 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000531 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000532 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000533 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000534 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000535 if (PyTuple_GET_SIZE(freevars) == 0 &&
536 PyTuple_GET_SIZE(cellvars) == 0)
537 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000538 }
539 return co;
540}
541
542
543/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000544
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000545/* The compiler uses two passes to generate bytecodes. The first pass
546 builds the symbol table. The second pass generates the bytecode.
547
548 The first pass uses a single symtable struct. The second pass uses
549 a compiling struct for each code block. The compiling structs
550 share a reference to the symtable.
551
552 The two passes communicate via symtable_load_symbols() and via
553 is_local() and is_global(). The former initializes several slots
554 in the compiling struct: c_varnames, c_locals, c_nlocals,
555 c_argcount, c_globals, and c_flags.
556*/
557
Tim Peters2a7f3842001-06-09 09:26:21 +0000558/* All about c_lnotab.
559
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000560c_lnotab is an array of unsigned bytes disguised as a Python string. Since
561version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
562mapped to source code line #s via c_lnotab instead.
563
Tim Peters2a7f3842001-06-09 09:26:21 +0000564The array is conceptually a list of
565 (bytecode offset increment, line number increment)
566pairs. The details are important and delicate, best illustrated by example:
567
568 byte code offset source code line number
569 0 1
570 6 2
571 50 7
572 350 307
573 361 308
574
575The first trick is that these numbers aren't stored, only the increments
576from one row to the next (this doesn't really work, but it's a start):
577
578 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
579
580The second trick is that an unsigned byte can't hold negative values, or
581values larger than 255, so (a) there's a deep assumption that byte code
582offsets and their corresponding line #s both increase monotonically, and (b)
583if at least one column jumps by more than 255 from one row to the next, more
584than one pair is written to the table. In case #b, there's no way to know
585from looking at the table later how many were written. That's the delicate
586part. A user of c_lnotab desiring to find the source line number
587corresponding to a bytecode address A should do something like this
588
589 lineno = addr = 0
590 for addr_incr, line_incr in c_lnotab:
591 addr += addr_incr
592 if addr > A:
593 return lineno
594 lineno += line_incr
595
596In order for this to work, when the addr field increments by more than 255,
597the line # increment in each pair generated must be 0 until the remaining addr
598increment is < 256. So, in the example above, com_set_lineno should not (as
599was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
600255, 0, 45, 255, 0, 45.
601*/
602
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000603struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000604 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000605 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000606 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000607 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000608 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +0000609 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000610 PyObject *c_locals; /* dictionary (value=localID) */
611 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000612 PyObject *c_freevars; /* dictionary (value=None) */
613 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000614 int c_nlocals; /* index of next local */
615 int c_argcount; /* number of top-level arguments */
616 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000617 int c_nexti; /* index into c_code */
618 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000619 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000620 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000621 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000622 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000623 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000624 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +0000625 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000626 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000627 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000628 int c_stacklevel; /* Current stack level */
629 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000630 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000631 PyObject *c_lnotab; /* Table mapping address to line number */
Armin Rigo80d937e2004-03-22 17:52:53 +0000632 int c_last_addr; /* last op addr seen and recorded in lnotab */
633 int c_last_line; /* last line seen and recorded in lnotab */
634 int c_lnotab_next; /* current length of lnotab */
635 int c_lnotab_last; /* start of last lnotab record added */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000636 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000637 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000638 int c_nested; /* Is block nested funcdef or lamdef? */
639 int c_closure; /* Is nested w/freevars? */
640 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000641 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000642 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000643};
644
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000645static int
646is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000647{
648 if ((v & (USE | DEF_FREE))
649 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
650 return 1;
651 if (v & DEF_FREE_CLASS)
652 return 1;
653 return 0;
654}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000655
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000656static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000657com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000658{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000659 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
660
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000661 if (c == NULL) {
662 /* Error occurred via symtable call to
663 is_constant_false */
664 PyErr_SetString(exc, msg);
665 return;
666 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000667 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000668 if (c->c_lineno < 1 || c->c_interactive) {
669 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000670 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000671 return;
672 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000673 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000674 if (v == NULL)
675 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000676
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000677 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000678 if (line == NULL) {
679 Py_INCREF(Py_None);
680 line = Py_None;
681 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000682 if (exc == PyExc_SyntaxError) {
683 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
684 Py_None, line);
685 if (t == NULL)
686 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000687 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000688 if (w == NULL)
689 goto exit;
690 PyErr_SetObject(exc, w);
691 } else {
692 /* Make sure additional exceptions are printed with
693 file and line, also. */
694 PyErr_SetObject(exc, v);
695 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
696 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000697 exit:
698 Py_XDECREF(t);
699 Py_XDECREF(v);
700 Py_XDECREF(w);
701 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000702}
703
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000704/* Interface to the block stack */
705
706static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000707block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000708{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000709 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000710 com_error(c, PyExc_SystemError,
711 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000712 }
713 else {
714 c->c_block[c->c_nblocks++] = type;
715 }
716}
717
718static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000719block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000720{
721 if (c->c_nblocks > 0)
722 c->c_nblocks--;
723 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000724 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000725 }
726}
727
Guido van Rossum681d79a1995-07-18 14:51:37 +0000728/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000729
Martin v. Löwis95292d62002-12-11 14:04:59 +0000730static int issue_warning(const char *, const char *, int);
731static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000732static void com_free(struct compiling *);
733static void com_push(struct compiling *, int);
734static void com_pop(struct compiling *, int);
735static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000736static void com_node(struct compiling *, node *);
737static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000738static void com_addbyte(struct compiling *, int);
739static void com_addint(struct compiling *, int);
740static void com_addoparg(struct compiling *, int, int);
741static void com_addfwref(struct compiling *, int, int *);
742static void com_backpatch(struct compiling *, int);
743static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
744static int com_addconst(struct compiling *, PyObject *);
745static int com_addname(struct compiling *, PyObject *);
746static void com_addopname(struct compiling *, int, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000747static void com_test(struct compiling *c, node *n);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000748static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000749static void com_list_iter(struct compiling *, node *, node *, char *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000750static void com_gen_iter(struct compiling *, node *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000751static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000752static void com_assign(struct compiling *, node *, int, node *);
753static void com_assign_name(struct compiling *, node *, int);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000754static int com_make_closure(struct compiling *c, PyCodeObject *co);
755
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000756static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +0000757static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000758 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000759static PyObject *parsestrplus(struct compiling*, node *);
760static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000761static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000762
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000763static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000764
765/* symtable operations */
Raymond Hettinger354433a2004-05-19 08:20:33 +0000766static int symtable_lookup(struct symtable *st, char *name);
Jeremy Hylton1955fcf2003-07-15 20:23:26 +0000767static struct symtable *symtable_build(node *, PyFutureFeatures *,
768 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000769static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000770static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000771static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000772static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000773static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000774static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000775
776static void symtable_node(struct symtable *, node *);
777static void symtable_funcdef(struct symtable *, node *);
778static void symtable_default_args(struct symtable *, node *);
779static void symtable_params(struct symtable *, node *);
780static void symtable_params_fplist(struct symtable *, node *n);
781static void symtable_global(struct symtable *, node *);
782static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000783static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000784static void symtable_list_comprehension(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000785static void symtable_generator_expression(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +0000786static void symtable_list_for(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000787static void symtable_gen_for(struct symtable *, node *, int);
788static void symtable_gen_iter(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000789
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000790static int symtable_update_free_vars(struct symtable *);
791static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
792static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
793
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000794/* helper */
795static void
796do_pad(int pad)
797{
798 int i;
799 for (i = 0; i < pad; ++i)
800 fprintf(stderr, " ");
801}
802
803static void
804dump(node *n, int pad, int depth)
805{
806 int i;
807 if (depth == 0)
808 return;
809 do_pad(pad);
810 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
811 if (depth > 0)
812 depth--;
813 for (i = 0; i < NCH(n); ++i)
814 dump(CHILD(n, i), pad + 1, depth);
815}
816
817#define DUMP(N) dump(N, 0, -1)
818
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000819static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000820com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000821{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000822 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000823 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
824 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000825 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000826 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000827 goto fail;
828 if ((c->c_const_dict = PyDict_New()) == NULL)
829 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000830 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000831 goto fail;
832 if ((c->c_name_dict = PyDict_New()) == NULL)
833 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000834 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000835 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000836 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
837 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000838 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000839 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000840 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000841 c->c_freevars = NULL;
842 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000843 c->c_nlocals = 0;
844 c->c_argcount = 0;
845 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000846 c->c_nexti = 0;
847 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000848 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000849 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000850 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000851 c->c_begin = 0;
852 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000853 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000854 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000855 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000856 c->c_stacklevel = 0;
857 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000858 c->c_firstlineno = 0;
859 c->c_last_addr = 0;
860 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000861 c->c_lnotab_next = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +0000862 c->c_lnotab_last = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000863 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000864 c->c_nested = 0;
865 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000866 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000867 return 1;
868
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000869 fail:
870 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000871 return 0;
872}
873
874static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000875com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000876{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000877 Py_XDECREF(c->c_code);
878 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000879 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000880 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000881 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000882 Py_XDECREF(c->c_globals);
883 Py_XDECREF(c->c_locals);
884 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000885 Py_XDECREF(c->c_freevars);
886 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000887 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000888 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +0000889 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000890}
891
892static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000893com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000894{
895 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000896 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +0000897 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000898 /*
899 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
900 c->c_filename, c->c_name, c->c_lineno,
901 c->c_nexti, c->c_stacklevel, n);
902 */
903 }
Guido van Rossum8b993a91997-01-17 21:04:03 +0000904}
905
906static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000907com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000908{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000909 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000910 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000911 else
912 c->c_stacklevel -= n;
913}
914
915static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000916com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000917{
918 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000919 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000920 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000921 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000922}
923
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000924static int
925com_check_size(PyObject **s, int offset)
926{
927 int len = PyString_GET_SIZE(*s);
928 if (offset >= len)
929 return _PyString_Resize(s, len * 2);
930 return 0;
931}
932
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000933static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000934com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000935{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000936 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000937 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +0000938 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000939 if (com_check_size(&c->c_code, c->c_nexti)) {
940 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000941 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000942 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000943 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000944}
945
946static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000947com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000948{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000949 com_addbyte(c, x & 0xff);
950 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000951}
952
953static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000954com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000955{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000956 char *p;
957 if (c->c_lnotab == NULL)
958 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000959 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
960 c->c_errors++;
961 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000962 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000963 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000964 *p++ = addr;
965 *p++ = line;
966 c->c_lnotab_next += 2;
967}
968
969static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000970com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000971{
972 c->c_lineno = lineno;
973 if (c->c_firstlineno == 0) {
974 c->c_firstlineno = c->c_last_line = lineno;
975 }
976 else {
977 int incr_addr = c->c_nexti - c->c_last_addr;
978 int incr_line = lineno - c->c_last_line;
Armin Rigo80d937e2004-03-22 17:52:53 +0000979 c->c_lnotab_last = c->c_lnotab_next;
Tim Peters2a7f3842001-06-09 09:26:21 +0000980 while (incr_addr > 255) {
981 com_add_lnotab(c, 255, 0);
982 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000983 }
Tim Peters2a7f3842001-06-09 09:26:21 +0000984 while (incr_line > 255) {
985 com_add_lnotab(c, incr_addr, 255);
986 incr_line -=255;
987 incr_addr = 0;
988 }
989 if (incr_addr > 0 || incr_line > 0)
990 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000991 c->c_last_addr = c->c_nexti;
992 c->c_last_line = lineno;
993 }
994}
995
996static void
Armin Rigo80d937e2004-03-22 17:52:53 +0000997com_strip_lnotab(struct compiling *c)
998{
999 /* strip the last lnotab entry if no opcode were emitted.
1000 * This prevents a line number to be generated on a final
1001 * pass, like in the following example:
1002 *
1003 * if a:
1004 * print 5
1005 * else:
1006 * pass
1007 *
1008 * Without the fix, a line trace event would be generated
1009 * on the pass even if a is true (because of the implicit
1010 * return).
1011 */
1012 if (c->c_nexti == c->c_last_addr && c->c_lnotab_last > 0) {
1013 c->c_lnotab_next = c->c_lnotab_last;
1014 }
1015}
1016
1017static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001018com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001019{
Fred Drakeef8ace32000-08-24 00:32:09 +00001020 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +00001021 if (extended_arg){
1022 com_addbyte(c, EXTENDED_ARG);
1023 com_addint(c, extended_arg);
1024 arg &= 0xffff;
1025 }
Guido van Rossum8e793d91997-03-03 19:13:14 +00001026 com_addbyte(c, op);
1027 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001028}
1029
1030static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001031com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001032{
1033 /* Compile a forward reference for backpatching */
1034 int here;
1035 int anchor;
1036 com_addbyte(c, op);
1037 here = c->c_nexti;
1038 anchor = *p_anchor;
1039 *p_anchor = here;
1040 com_addint(c, anchor == 0 ? 0 : here - anchor);
1041}
1042
1043static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001044com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001045{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001046 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001047 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001048 int dist;
1049 int prev;
1050 for (;;) {
1051 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001052 prev = code[anchor] + (code[anchor+1] << 8);
1053 dist = target - (anchor+2);
1054 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001055 dist >>= 8;
1056 code[anchor+1] = dist;
1057 dist >>= 8;
1058 if (dist) {
1059 com_error(c, PyExc_SystemError,
1060 "com_backpatch: offset too large");
1061 break;
1062 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001063 if (!prev)
1064 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001065 anchor -= prev;
1066 }
1067}
1068
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001069/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001070
1071static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001072com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001073{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001074 PyObject *w, *t, *np=NULL;
1075 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001076
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001077 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001078 if (t == NULL)
1079 goto fail;
1080 w = PyDict_GetItem(dict, t);
1081 if (w != NULL) {
1082 n = PyInt_AsLong(w);
1083 } else {
1084 n = PyList_Size(list);
1085 np = PyInt_FromLong(n);
1086 if (np == NULL)
1087 goto fail;
1088 if (PyList_Append(list, v) != 0)
1089 goto fail;
1090 if (PyDict_SetItem(dict, t, np) != 0)
1091 goto fail;
1092 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001093 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001094 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001095 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001096 fail:
1097 Py_XDECREF(np);
1098 Py_XDECREF(t);
1099 c->c_errors++;
1100 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001101}
1102
1103static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001104com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001105{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001106 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001107}
1108
1109static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001110com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001111{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001112 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001113}
1114
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001115int
1116_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001117{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001118 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001119 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001120 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001121 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1122 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001123 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001124 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001125 return 0; /* Don't mangle __extremely_long_names */
1126 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1127 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001128 /* Strip leading underscores from class name */
1129 while (*p == '_')
1130 p++;
1131 if (*p == '\0')
1132 return 0; /* Don't mangle if class is just underscores */
1133 plen = strlen(p);
1134 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001135 plen = maxlen-nlen-2; /* Truncate class name if too long */
1136 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001137 buffer[0] = '_';
1138 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001139 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001140 return 1;
1141}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001142
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001143static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001144com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001145{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001146 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001147 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001148 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001149
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001150 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001151 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001152 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001153 c->c_errors++;
1154 i = 255;
1155 }
1156 else {
1157 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001158 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001159 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001160 com_addoparg(c, op, i);
1161}
1162
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001163#define NAME_LOCAL 0
1164#define NAME_GLOBAL 1
1165#define NAME_DEFAULT 2
1166#define NAME_CLOSURE 3
1167
1168static int
1169com_lookup_arg(PyObject *dict, PyObject *name)
1170{
1171 PyObject *v = PyDict_GetItem(dict, name);
1172 if (v == NULL)
1173 return -1;
1174 else
1175 return PyInt_AS_LONG(v);
1176}
1177
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001178static int
1179none_assignment_check(struct compiling *c, char *name, int assigning)
1180{
1181 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1182 char *msg;
1183 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001184 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001185 else
1186 msg = "deleting None";
1187 if (issue_warning(msg, c->c_filename, c->c_lineno) < 0) {
1188 c->c_errors++;
1189 return -1;
1190 }
1191 }
1192 return 0;
1193}
1194
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001195static void
1196com_addop_varname(struct compiling *c, int kind, char *name)
1197{
1198 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001199 int i, reftype;
1200 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001201 int op = STOP_CODE;
1202 char buffer[MANGLE_LEN];
1203
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001204 if (kind != VAR_LOAD &&
1205 none_assignment_check(c, name, kind == VAR_STORE))
1206 {
1207 c->c_errors++;
1208 i = 255;
1209 goto done;
1210 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001211 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001212 name = buffer;
1213 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1214 c->c_errors++;
1215 i = 255;
1216 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001217 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001218
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001219 reftype = get_ref_type(c, name);
1220 switch (reftype) {
1221 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001222 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001223 scope = NAME_LOCAL;
1224 break;
1225 case GLOBAL_EXPLICIT:
1226 scope = NAME_GLOBAL;
1227 break;
1228 case GLOBAL_IMPLICIT:
1229 if (c->c_flags & CO_OPTIMIZED)
1230 scope = NAME_GLOBAL;
1231 break;
1232 case FREE:
1233 case CELL:
1234 scope = NAME_CLOSURE;
1235 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001236 }
1237
1238 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001239 if (scope == NAME_LOCAL)
1240 i = com_lookup_arg(c->c_locals, v);
1241 else if (reftype == FREE)
1242 i = com_lookup_arg(c->c_freevars, v);
1243 else if (reftype == CELL)
1244 i = com_lookup_arg(c->c_cellvars, v);
1245 if (i == -1) {
1246 c->c_errors++; /* XXX no exception set */
1247 i = 255;
1248 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001249 }
1250 Py_DECREF(v);
1251
1252 switch (kind) {
1253 case VAR_LOAD:
1254 switch (scope) {
1255 case NAME_LOCAL:
1256 op = LOAD_FAST;
1257 break;
1258 case NAME_GLOBAL:
1259 op = LOAD_GLOBAL;
1260 break;
1261 case NAME_DEFAULT:
1262 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001263 break;
1264 case NAME_CLOSURE:
1265 op = LOAD_DEREF;
1266 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001267 }
1268 break;
1269 case VAR_STORE:
1270 switch (scope) {
1271 case NAME_LOCAL:
1272 op = STORE_FAST;
1273 break;
1274 case NAME_GLOBAL:
1275 op = STORE_GLOBAL;
1276 break;
1277 case NAME_DEFAULT:
1278 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001279 break;
1280 case NAME_CLOSURE:
1281 op = STORE_DEREF;
1282 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001283 }
1284 break;
1285 case VAR_DELETE:
1286 switch (scope) {
1287 case NAME_LOCAL:
1288 op = DELETE_FAST;
1289 break;
1290 case NAME_GLOBAL:
1291 op = DELETE_GLOBAL;
1292 break;
1293 case NAME_DEFAULT:
1294 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001295 break;
1296 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001297 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001298 PyOS_snprintf(buf, sizeof(buf),
1299 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001300 com_error(c, PyExc_SyntaxError, buf);
1301 i = 255;
1302 break;
1303 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001304 }
1305 break;
1306 }
1307done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001308 com_addoparg(c, op, i);
1309}
1310
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001311static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001312com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001313{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001314 char *name;
1315 char buffer[1000];
1316 /* XXX it is possible to write this code without the 1000
1317 chars on the total length of dotted names, I just can't be
1318 bothered right now */
1319 if (TYPE(n) == STAR)
1320 name = "*";
1321 else if (TYPE(n) == dotted_name) {
1322 char *p = buffer;
1323 int i;
1324 name = buffer;
1325 for (i = 0; i < NCH(n); i += 2) {
1326 char *s = STR(CHILD(n, i));
1327 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001328 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001329 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001330 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001331 break;
1332 }
1333 if (p != buffer)
1334 *p++ = '.';
1335 strcpy(p, s);
1336 p = strchr(p, '\0');
1337 }
1338 }
1339 else {
1340 REQ(n, NAME);
1341 name = STR(n);
1342 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001343 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001344}
1345
Guido van Rossum79f25d91997-04-29 20:08:16 +00001346static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001347parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001348{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001349 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001350 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001351 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001352#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001353 int imflag;
1354#endif
1355
Guido van Rossum282914b1991-04-04 10:42:56 +00001356 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001357 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001358#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001359 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001360#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001361 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001362 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001363 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001364 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001365 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001366 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001367 }
1368 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001369 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001370 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001371 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001372 if (errno != 0)
1373 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001374 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001375 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001376 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001377#ifndef WITHOUT_COMPLEX
1378 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001379 Py_complex z;
1380 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001381 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001382 z.imag = atof(s);
1383 PyFPE_END_PROTECT(z)
1384 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001385 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001386 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001387#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001388 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001389 PyFPE_START_PROTECT("atof", return 0)
1390 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001391 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001392 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001393 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001394}
1395
Guido van Rossum79f25d91997-04-29 20:08:16 +00001396static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001397decode_utf8(char **sPtr, char *end, char* encoding)
1398{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001399#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001400 Py_FatalError("decode_utf8 should not be called in this build.");
1401 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001402#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001403 PyObject *u, *v;
1404 char *s, *t;
1405 t = s = *sPtr;
1406 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1407 while (s < end && (*s & 0x80)) s++;
1408 *sPtr = s;
1409 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1410 if (u == NULL)
1411 return NULL;
1412 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1413 Py_DECREF(u);
1414 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001415#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001416}
1417
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001418/* compiler.transformer.Transformer.decode_literal depends on what
1419 might seem like minor details of this function -- changes here
1420 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001421static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001422parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001423{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001424 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001425 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001426 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001427 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001428 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001429 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001430 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001431
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001432 if (isalpha(quote) || quote == '_') {
1433 if (quote == 'u' || quote == 'U') {
1434 quote = *++s;
1435 unicode = 1;
1436 }
1437 if (quote == 'r' || quote == 'R') {
1438 quote = *++s;
1439 rawmode = 1;
1440 }
1441 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001442 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001443 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001444 return NULL;
1445 }
1446 s++;
1447 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001448 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001449 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001450 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001451 return NULL;
1452 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001453 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001454 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001455 return NULL;
1456 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001457 if (len >= 4 && s[0] == quote && s[1] == quote) {
1458 s += 2;
1459 len -= 2;
1460 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001461 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001462 return NULL;
1463 }
1464 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001465#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001466 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001467 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001468 char *buf;
1469 char *p;
1470 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001471 if (encoding == NULL) {
1472 buf = s;
1473 u = NULL;
1474 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1475 buf = s;
1476 u = NULL;
1477 } else {
1478 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1479 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1480 if (u == NULL)
1481 return NULL;
1482 p = buf = PyString_AsString(u);
1483 end = s + len;
1484 while (s < end) {
1485 if (*s == '\\') {
1486 *p++ = *s++;
1487 if (*s & 0x80) {
1488 strcpy(p, "u005c");
1489 p += 5;
1490 }
1491 }
1492 if (*s & 0x80) { /* XXX inefficient */
1493 char *r;
1494 int rn, i;
1495 w = decode_utf8(&s, end, "utf-16-be");
1496 if (w == NULL) {
1497 Py_DECREF(u);
1498 return NULL;
1499 }
1500 r = PyString_AsString(w);
1501 rn = PyString_Size(w);
1502 assert(rn % 2 == 0);
1503 for (i = 0; i < rn; i += 2) {
1504 sprintf(p, "\\u%02x%02x",
1505 r[i + 0] & 0xFF,
1506 r[i + 1] & 0xFF);
1507 p += 6;
1508 }
1509 Py_DECREF(w);
1510 } else {
1511 *p++ = *s++;
1512 }
1513 }
1514 len = p - buf;
1515 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001516 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001517 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001518 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001519 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1520 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001521 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001522 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001523 return v;
1524
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001525 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001526#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001527 need_encoding = (encoding != NULL &&
1528 strcmp(encoding, "utf-8") != 0 &&
1529 strcmp(encoding, "iso-8859-1") != 0);
1530 if (rawmode || strchr(s, '\\') == NULL) {
1531 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001532#ifndef Py_USING_UNICODE
1533 /* This should not happen - we never see any other
1534 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001535 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001536#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001537 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1538 if (u == NULL)
1539 return NULL;
1540 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1541 Py_DECREF(u);
1542 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001543#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001544 } else {
1545 return PyString_FromStringAndSize(s, len);
1546 }
1547 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001548
1549 v = PyString_DecodeEscape(s, len, NULL, unicode,
1550 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001551 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001552 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001553 return v;
1554}
1555
Guido van Rossum79f25d91997-04-29 20:08:16 +00001556static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001557parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001558{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001559 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001560 int i;
1561 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001562 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001563 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001564 for (i = 1; i < NCH(n); i++) {
1565 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001566 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001567 if (s == NULL)
1568 goto onError;
1569 if (PyString_Check(v) && PyString_Check(s)) {
1570 PyString_ConcatAndDel(&v, s);
1571 if (v == NULL)
1572 goto onError;
1573 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001574#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001575 else {
1576 PyObject *temp;
1577 temp = PyUnicode_Concat(v, s);
1578 Py_DECREF(s);
1579 if (temp == NULL)
1580 goto onError;
1581 Py_DECREF(v);
1582 v = temp;
1583 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001584#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001585 }
1586 }
1587 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001588
1589 onError:
1590 Py_XDECREF(v);
1591 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001592}
1593
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001594static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001595com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001596{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001597 int anchor = 0;
1598 int save_begin = c->c_begin;
1599
Raymond Hettinger354433a2004-05-19 08:20:33 +00001600 /* list_for: for v in expr [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001601 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001602 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001603 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001604 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001605 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001606 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001607 c->c_loops++;
1608 com_list_iter(c, n, e, t);
1609 c->c_loops--;
1610 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1611 c->c_begin = save_begin;
1612 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001613 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001614}
1615
1616static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001617com_gen_for(struct compiling *c, node *n, node *t, int is_outmost)
1618{
1619 int break_anchor = 0;
1620 int anchor = 0;
1621 int save_begin = c->c_begin;
1622
1623 REQ(n, gen_for);
1624 /* gen_for: for v in test [gen_iter] */
1625
1626 com_addfwref(c, SETUP_LOOP, &break_anchor);
1627 block_push(c, SETUP_LOOP);
1628
1629 if (is_outmost) {
1630 com_addop_varname(c, VAR_LOAD, "[outmost-iterable]");
1631 com_push(c, 1);
1632 }
1633 else {
1634 com_node(c, CHILD(n, 3));
1635 com_addbyte(c, GET_ITER);
1636 }
1637
1638 c->c_begin = c->c_nexti;
1639 com_set_lineno(c, c->c_last_line);
1640 com_addfwref(c, FOR_ITER, &anchor);
1641 com_push(c, 1);
1642 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
1643
1644 if (NCH(n) == 5)
1645 com_gen_iter(c, CHILD(n, 4), t);
1646 else {
1647 com_test(c, t);
1648 com_addbyte(c, YIELD_VALUE);
1649 com_pop(c, 1);
1650 }
1651
1652 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1653 c->c_begin = save_begin;
1654
1655 com_backpatch(c, anchor);
1656 com_pop(c, 1); /* FOR_ITER has popped this */
1657 com_addbyte(c, POP_BLOCK);
1658 block_pop(c, SETUP_LOOP);
1659 com_backpatch(c, break_anchor);
1660}
1661
1662static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001663com_list_if(struct compiling *c, node *n, node *e, char *t)
1664{
1665 int anchor = 0;
1666 int a = 0;
1667 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001668 com_node(c, CHILD(n, 1));
1669 com_addfwref(c, JUMP_IF_FALSE, &a);
1670 com_addbyte(c, POP_TOP);
1671 com_pop(c, 1);
1672 com_list_iter(c, n, e, t);
1673 com_addfwref(c, JUMP_FORWARD, &anchor);
1674 com_backpatch(c, a);
1675 /* We jump here with an extra entry which we now pop */
1676 com_addbyte(c, POP_TOP);
1677 com_backpatch(c, anchor);
1678}
1679
1680static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001681com_gen_if(struct compiling *c, node *n, node *t)
1682{
1683 /* gen_if: 'if' test [gen_iter] */
1684 int anchor = 0;
1685 int a=0;
1686
1687 com_node(c, CHILD(n, 1));
1688 com_addfwref(c, JUMP_IF_FALSE, &a);
1689 com_addbyte(c, POP_TOP);
1690 com_pop(c, 1);
1691
1692 if (NCH(n) == 3)
1693 com_gen_iter(c, CHILD(n, 2), t);
1694 else {
1695 com_test(c, t);
1696 com_addbyte(c, YIELD_VALUE);
1697 com_pop(c, 1);
1698 }
1699 com_addfwref(c, JUMP_FORWARD, &anchor);
1700 com_backpatch(c, a);
1701 /* We jump here with an extra entry which we now pop */
1702 com_addbyte(c, POP_TOP);
1703 com_backpatch(c, anchor);
1704}
1705
1706static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001707com_list_iter(struct compiling *c,
1708 node *p, /* parent of list_iter node */
1709 node *e, /* element expression node */
1710 char *t /* name of result list temp local */)
1711{
1712 /* list_iter is the last child in a listmaker, list_for, or list_if */
1713 node *n = CHILD(p, NCH(p)-1);
1714 if (TYPE(n) == list_iter) {
1715 n = CHILD(n, 0);
1716 switch (TYPE(n)) {
1717 case list_for:
1718 com_list_for(c, n, e, t);
1719 break;
1720 case list_if:
1721 com_list_if(c, n, e, t);
1722 break;
1723 default:
1724 com_error(c, PyExc_SystemError,
1725 "invalid list_iter node type");
1726 }
1727 }
1728 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001729 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001730 com_push(c, 1);
1731 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001732 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001733 com_pop(c, 2);
1734 }
1735}
1736
1737static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001738com_gen_iter(struct compiling *c, node *n, node *t)
1739{
1740 /* gen_iter: gen_for | gen_if */
1741 node *ch;
1742 REQ(n, gen_iter);
1743
1744 ch = CHILD(n, 0);
1745
1746 switch (TYPE(ch)) {
1747 case gen_for:
1748 com_gen_for(c, ch, t, 0);
1749 break;
1750 case gen_if:
1751 com_gen_if(c, ch, t);
1752 break;
1753 default:
1754 com_error(c, PyExc_SystemError,
1755 "invalid gen_iter node type");
1756 }
1757}
1758
1759static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001760com_list_comprehension(struct compiling *c, node *n)
1761{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001762 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001763 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001764
1765 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001766 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001767 com_addoparg(c, BUILD_LIST, 0);
1768 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1769 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001770 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001771 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001772 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001773 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001774 --c->c_tmpname;
1775}
1776
1777static void
1778com_listmaker(struct compiling *c, node *n)
1779{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001780 /* listmaker: test ( list_for | (',' test)* [','] ) */
1781 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001782 com_list_comprehension(c, n);
1783 else {
1784 int len = 0;
1785 int i;
1786 for (i = 0; i < NCH(n); i += 2, len++)
1787 com_node(c, CHILD(n, i));
1788 com_addoparg(c, BUILD_LIST, len);
1789 com_pop(c, len-1);
1790 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001791}
1792
1793static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001794com_generator_expression(struct compiling *c, node *n)
1795{
1796 /* testlist_gexp: test gen_for */
1797 /* argument: test gen_for */
1798 PyCodeObject *co;
1799
1800 REQ(CHILD(n, 0), test);
1801 REQ(CHILD(n, 1), gen_for);
1802
1803 symtable_enter_scope(c->c_symtable, "<genexpr>", TYPE(n),
1804 n->n_lineno);
1805 co = icompile(n, c);
1806 symtable_exit_scope(c->c_symtable);
1807
1808 if (co == NULL)
1809 c->c_errors++;
1810 else {
1811 int closure = com_make_closure(c, co);
1812 int i = com_addconst(c, (PyObject *)co);
1813
1814 com_addoparg(c, LOAD_CONST, i);
1815 com_push(c, 1);
1816 if (closure)
1817 com_addoparg(c, MAKE_CLOSURE, 0);
1818 else
1819 com_addoparg(c, MAKE_FUNCTION, 0);
1820
1821 com_test(c, CHILD(CHILD(n, 1), 3));
1822 com_addbyte(c, GET_ITER);
1823 com_addoparg(c, CALL_FUNCTION, 1);
1824 com_pop(c, 1);
1825
1826 Py_DECREF(co);
1827 }
1828}
1829
1830static void
1831com_testlist_gexp(struct compiling *c, node *n)
1832{
1833 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
1834 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
1835 com_generator_expression(c, n);
1836 else com_list(c, n, 0);
1837}
1838
1839static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001840com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001841{
1842 int i;
1843 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1844 for (i = 0; i+2 < NCH(n); i += 4) {
1845 /* We must arrange things just right for STORE_SUBSCR.
1846 It wants the stack to look like (value) (dict) (key) */
1847 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001848 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001849 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00001850 com_node(c, CHILD(n, i+2)); /* value */
1851 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001852 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001853 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001854 }
1855}
1856
1857static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001858com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001859{
1860 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001861 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001862 int i;
1863 REQ(n, atom);
1864 ch = CHILD(n, 0);
1865 switch (TYPE(ch)) {
1866 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001867 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001868 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001869 com_push(c, 1);
1870 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001871 else
Raymond Hettinger354433a2004-05-19 08:20:33 +00001872 com_testlist_gexp(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001873 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001874 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001875 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001876 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001877 com_push(c, 1);
1878 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001879 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001880 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001881 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001882 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001883 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001884 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001885 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001886 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001887 break;
1888 case BACKQUOTE:
1889 com_node(c, CHILD(n, 1));
1890 com_addbyte(c, UNARY_CONVERT);
1891 break;
1892 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001893 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001894 i = 255;
1895 }
1896 else {
1897 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001898 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001899 }
1900 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001901 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001902 break;
1903 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001904 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001905 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001906 c->c_errors++;
1907 i = 255;
1908 }
1909 else {
1910 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001911 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001912 }
1913 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001914 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001915 break;
1916 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001917 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001918 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001919 break;
1920 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001921 com_error(c, PyExc_SystemError,
1922 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001923 }
1924}
1925
1926static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001927com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001928{
1929 if (NCH(n) == 1) {
1930 com_addbyte(c, op);
1931 }
1932 else if (NCH(n) == 2) {
1933 if (TYPE(CHILD(n, 0)) != COLON) {
1934 com_node(c, CHILD(n, 0));
1935 com_addbyte(c, op+1);
1936 }
1937 else {
1938 com_node(c, CHILD(n, 1));
1939 com_addbyte(c, op+2);
1940 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001941 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001942 }
1943 else {
1944 com_node(c, CHILD(n, 0));
1945 com_node(c, CHILD(n, 2));
1946 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001947 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001948 }
1949}
1950
Guido van Rossum635abd21997-01-06 22:56:52 +00001951static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001952com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1953{
1954 if (NCH(n) == 1) {
1955 com_addbyte(c, DUP_TOP);
1956 com_push(c, 1);
1957 com_addbyte(c, SLICE);
1958 com_node(c, augn);
1959 com_addbyte(c, opcode);
1960 com_pop(c, 1);
1961 com_addbyte(c, ROT_TWO);
1962 com_addbyte(c, STORE_SLICE);
1963 com_pop(c, 2);
1964 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1965 com_node(c, CHILD(n, 0));
1966 com_addoparg(c, DUP_TOPX, 2);
1967 com_push(c, 2);
1968 com_addbyte(c, SLICE+1);
1969 com_pop(c, 1);
1970 com_node(c, augn);
1971 com_addbyte(c, opcode);
1972 com_pop(c, 1);
1973 com_addbyte(c, ROT_THREE);
1974 com_addbyte(c, STORE_SLICE+1);
1975 com_pop(c, 3);
1976 } else if (NCH(n) == 2) {
1977 com_node(c, CHILD(n, 1));
1978 com_addoparg(c, DUP_TOPX, 2);
1979 com_push(c, 2);
1980 com_addbyte(c, SLICE+2);
1981 com_pop(c, 1);
1982 com_node(c, augn);
1983 com_addbyte(c, opcode);
1984 com_pop(c, 1);
1985 com_addbyte(c, ROT_THREE);
1986 com_addbyte(c, STORE_SLICE+2);
1987 com_pop(c, 3);
1988 } else {
1989 com_node(c, CHILD(n, 0));
1990 com_node(c, CHILD(n, 2));
1991 com_addoparg(c, DUP_TOPX, 3);
1992 com_push(c, 3);
1993 com_addbyte(c, SLICE+3);
1994 com_pop(c, 2);
1995 com_node(c, augn);
1996 com_addbyte(c, opcode);
1997 com_pop(c, 1);
1998 com_addbyte(c, ROT_FOUR);
1999 com_addbyte(c, STORE_SLICE+3);
2000 com_pop(c, 4);
2001 }
2002}
2003
2004static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002005com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002006{
2007 node *m;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002008 REQ(n, argument); /* [test '='] test [gen_for]; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00002009 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00002010 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002011 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00002012 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002013 }
2014 else {
2015 com_node(c, CHILD(n, 0));
2016 }
Guido van Rossum635abd21997-01-06 22:56:52 +00002017 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002018 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00002019 if (NCH(n) == 2) {
2020 com_generator_expression(c, n);
2021 return;
2022 }
2023
Guido van Rossumf10570b1995-07-07 22:53:21 +00002024 m = n;
2025 do {
2026 m = CHILD(m, 0);
2027 } while (NCH(m) == 1);
2028 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00002029 /* f(lambda x: x[0] = 3) ends up getting parsed with
2030 * LHS test = lambda x: x[0], and RHS test = 3.
2031 * SF bug 132313 points out that complaining about a keyword
2032 * then is very confusing.
2033 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002034 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00002035 TYPE(m) == lambdef ?
2036 "lambda cannot contain assignment" :
2037 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002038 }
2039 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002040 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00002041 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00002042 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002043 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002044 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002045 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002046 else if (*pkeywords == NULL) {
2047 c->c_errors++;
2048 Py_DECREF(v);
2049 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002050 if (PyDict_GetItem(*pkeywords, v) != NULL)
2051 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00002052 "duplicate keyword argument");
2053 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002054 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00002055 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002056 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002057 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002058 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002059 }
2060 }
2061 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002062}
2063
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002064static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002065com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002066{
2067 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00002068 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002069 }
2070 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002071 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00002072 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00002073 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00002074 int star_flag = 0;
2075 int starstar_flag = 0;
2076 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002077 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002078 na = 0;
2079 nk = 0;
2080 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00002081 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00002082 if (TYPE(ch) == STAR ||
2083 TYPE(ch) == DOUBLESTAR)
2084 break;
Guido van Rossumca906051998-12-10 16:56:22 +00002085 if (ch->n_lineno != lineno) {
2086 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002087 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00002088 }
2089 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00002090 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002091 na++;
2092 else
2093 nk++;
2094 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002095 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00002096 while (i < NCH(n)) {
2097 node *tok = CHILD(n, i);
2098 node *ch = CHILD(n, i+1);
2099 i += 3;
2100 switch (TYPE(tok)) {
2101 case STAR: star_flag = 1; break;
2102 case DOUBLESTAR: starstar_flag = 1; break;
2103 }
2104 com_node(c, ch);
2105 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002106 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002107 com_error(c, PyExc_SyntaxError,
2108 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002109 }
Jeremy Hylton76901512000-03-28 23:49:17 +00002110 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00002111 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00002112 star_flag + (starstar_flag << 1);
2113 else
2114 opcode = CALL_FUNCTION;
2115 com_addoparg(c, opcode, na | (nk << 8));
2116 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002117 }
2118}
2119
2120static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002121com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002122{
2123 com_addopname(c, LOAD_ATTR, n);
2124}
2125
2126static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002127com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002128{
2129 int i=0;
2130 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00002131 node *ch;
2132
2133 /* first argument */
2134 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002135 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002136 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002137 i++;
2138 }
2139 else {
2140 com_node(c, CHILD(n,i));
2141 i++;
2142 REQ(CHILD(n,i),COLON);
2143 i++;
2144 }
2145 /* second argument */
2146 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
2147 com_node(c, CHILD(n,i));
2148 i++;
2149 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002150 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002151 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002152 com_push(c, 1);
2153 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002154 /* remaining arguments */
2155 for (; i < NCH(n); i++) {
2156 ns++;
2157 ch=CHILD(n,i);
2158 REQ(ch, sliceop);
2159 if (NCH(ch) == 1) {
2160 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002161 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002162 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002163 }
2164 else
2165 com_node(c, CHILD(ch,1));
2166 }
2167 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002168 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002169}
2170
2171static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002172com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002173{
2174 node *ch;
2175 REQ(n, subscript);
2176 ch = CHILD(n,0);
2177 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002178 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002179 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002180 com_push(c, 1);
2181 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002182 else {
2183 /* check for slice */
2184 if ((TYPE(ch) == COLON || NCH(n) > 1))
2185 com_sliceobj(c, n);
2186 else {
2187 REQ(ch, test);
2188 com_node(c, ch);
2189 }
2190 }
2191}
2192
2193static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002194com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002195{
2196 int i, op;
2197 REQ(n, subscriptlist);
2198 /* Check to make backward compatible slice behavior for '[i:j]' */
2199 if (NCH(n) == 1) {
2200 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002201 /* 'Basic' slice, should have exactly one colon. */
2202 if ((TYPE(CHILD(sub, 0)) == COLON
2203 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2204 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2205 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002206 switch (assigning) {
2207 case OP_DELETE:
2208 op = DELETE_SLICE;
2209 break;
2210 case OP_ASSIGN:
2211 op = STORE_SLICE;
2212 break;
2213 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002214 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002215 break;
2216 default:
2217 com_augassign_slice(c, sub, assigning, augn);
2218 return;
2219 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002220 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002221 if (op == STORE_SLICE)
2222 com_pop(c, 2);
2223 else if (op == DELETE_SLICE)
2224 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002225 return;
2226 }
2227 }
2228 /* Else normal subscriptlist. Compile each subscript. */
2229 for (i = 0; i < NCH(n); i += 2)
2230 com_subscript(c, CHILD(n, i));
2231 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002232 if (NCH(n) > 1) {
2233 i = (NCH(n)+1) / 2;
2234 com_addoparg(c, BUILD_TUPLE, i);
2235 com_pop(c, i-1);
2236 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002237 switch (assigning) {
2238 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002239 op = DELETE_SUBSCR;
2240 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002241 break;
2242 default:
2243 case OP_ASSIGN:
2244 op = STORE_SUBSCR;
2245 i = 3;
2246 break;
2247 case OP_APPLY:
2248 op = BINARY_SUBSCR;
2249 i = 1;
2250 break;
2251 }
2252 if (assigning > OP_APPLY) {
2253 com_addoparg(c, DUP_TOPX, 2);
2254 com_push(c, 2);
2255 com_addbyte(c, BINARY_SUBSCR);
2256 com_pop(c, 1);
2257 com_node(c, augn);
2258 com_addbyte(c, assigning);
2259 com_pop(c, 1);
2260 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002261 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002262 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002263 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002264}
2265
2266static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002267com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002268{
2269 REQ(n, trailer);
2270 switch (TYPE(CHILD(n, 0))) {
2271 case LPAR:
2272 com_call_function(c, CHILD(n, 1));
2273 break;
2274 case DOT:
2275 com_select_member(c, CHILD(n, 1));
2276 break;
2277 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002278 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002279 break;
2280 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002281 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002282 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002283 }
2284}
2285
2286static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002287com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002288{
2289 int i;
2290 REQ(n, power);
2291 com_atom(c, CHILD(n, 0));
2292 for (i = 1; i < NCH(n); i++) {
2293 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2294 com_factor(c, CHILD(n, i+1));
2295 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002296 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002297 break;
2298 }
2299 else
2300 com_apply_trailer(c, CHILD(n, i));
2301 }
2302}
2303
2304static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002305com_invert_constant(struct compiling *c, node *n)
2306{
2307 /* Compute the inverse of int and longs and use them directly,
2308 but be prepared to generate code for all other
2309 possibilities (invalid numbers, floats, complex).
2310 */
2311 PyObject *num, *inv = NULL;
2312 int i;
2313
2314 REQ(n, NUMBER);
2315 num = parsenumber(c, STR(n));
2316 if (num == NULL)
2317 i = 255;
2318 else {
2319 inv = PyNumber_Invert(num);
2320 if (inv == NULL) {
2321 PyErr_Clear();
2322 i = com_addconst(c, num);
2323 } else {
2324 i = com_addconst(c, inv);
2325 Py_DECREF(inv);
2326 }
2327 Py_DECREF(num);
2328 }
2329 com_addoparg(c, LOAD_CONST, i);
2330 com_push(c, 1);
2331 if (num != NULL && inv == NULL)
2332 com_addbyte(c, UNARY_INVERT);
2333}
2334
Tim Peters51e26512001-09-07 08:45:55 +00002335static int
2336is_float_zero(const char *p)
2337{
2338 int found_radix_point = 0;
2339 int ch;
2340 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2341 switch (ch) {
2342 case '0':
2343 /* no reason to believe it's not 0 -- continue */
2344 break;
2345
2346 case 'e': case 'E': case 'j': case 'J':
2347 /* If this was a hex constant, we already would have
2348 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2349 must be an exponent marker, and we haven't yet
2350 seen a non-zero digit, and it doesn't matter what
2351 the exponent is then. For 'j' or 'J' similarly,
2352 except that this is an imaginary 0 then. */
2353 return 1;
2354
2355 case '.':
2356 found_radix_point = 1;
2357 break;
2358
2359 default:
2360 return 0;
2361 }
2362 }
2363 return found_radix_point;
2364}
2365
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002366static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002367com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002368{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002369 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002370 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002371 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002372 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002373 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002374 approriate value as a constant. If the value is negative,
2375 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002376 negative in the 0th position -- unless we're doing unary minus
2377 of a floating zero! In that case the sign is significant, but
2378 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002379 */
2380 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002381 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002382 && TYPE((pfactor = CHILD(n, 1))) == factor
2383 && NCH(pfactor) == 1
2384 && TYPE((ppower = CHILD(pfactor, 0))) == power
2385 && NCH(ppower) == 1
2386 && TYPE((patom = CHILD(ppower, 0))) == atom
2387 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002388 && !(childtype == MINUS &&
2389 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002390 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002391 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002392 return;
2393 }
2394 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002395 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002396 if (s == NULL) {
2397 com_error(c, PyExc_MemoryError, "");
2398 com_addbyte(c, 255);
2399 return;
2400 }
2401 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002402 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002403 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002404 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002405 }
Tim Peters51e26512001-09-07 08:45:55 +00002406 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002407 }
2408 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002409 com_factor(c, CHILD(n, 1));
2410 com_addbyte(c, UNARY_POSITIVE);
2411 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002412 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002413 com_factor(c, CHILD(n, 1));
2414 com_addbyte(c, UNARY_NEGATIVE);
2415 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002416 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002417 com_factor(c, CHILD(n, 1));
2418 com_addbyte(c, UNARY_INVERT);
2419 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002420 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002421 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002422 }
2423}
2424
2425static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002426com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002427{
2428 int i;
2429 int op;
2430 REQ(n, term);
2431 com_factor(c, CHILD(n, 0));
2432 for (i = 2; i < NCH(n); i += 2) {
2433 com_factor(c, CHILD(n, i));
2434 switch (TYPE(CHILD(n, i-1))) {
2435 case STAR:
2436 op = BINARY_MULTIPLY;
2437 break;
2438 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002439 if (c->c_flags & CO_FUTURE_DIVISION)
2440 op = BINARY_TRUE_DIVIDE;
2441 else
2442 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002443 break;
2444 case PERCENT:
2445 op = BINARY_MODULO;
2446 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002447 case DOUBLESLASH:
2448 op = BINARY_FLOOR_DIVIDE;
2449 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002450 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002451 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002452 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002453 op = 255;
2454 }
2455 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002456 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002457 }
2458}
2459
2460static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002461com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002462{
2463 int i;
2464 int op;
2465 REQ(n, arith_expr);
2466 com_term(c, CHILD(n, 0));
2467 for (i = 2; i < NCH(n); i += 2) {
2468 com_term(c, CHILD(n, i));
2469 switch (TYPE(CHILD(n, i-1))) {
2470 case PLUS:
2471 op = BINARY_ADD;
2472 break;
2473 case MINUS:
2474 op = BINARY_SUBTRACT;
2475 break;
2476 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002477 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002478 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002479 op = 255;
2480 }
2481 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002482 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002483 }
2484}
2485
2486static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002487com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002488{
2489 int i;
2490 int op;
2491 REQ(n, shift_expr);
2492 com_arith_expr(c, CHILD(n, 0));
2493 for (i = 2; i < NCH(n); i += 2) {
2494 com_arith_expr(c, CHILD(n, i));
2495 switch (TYPE(CHILD(n, i-1))) {
2496 case LEFTSHIFT:
2497 op = BINARY_LSHIFT;
2498 break;
2499 case RIGHTSHIFT:
2500 op = BINARY_RSHIFT;
2501 break;
2502 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002503 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002504 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002505 op = 255;
2506 }
2507 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002508 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002509 }
2510}
2511
2512static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002513com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002514{
2515 int i;
2516 int op;
2517 REQ(n, and_expr);
2518 com_shift_expr(c, CHILD(n, 0));
2519 for (i = 2; i < NCH(n); i += 2) {
2520 com_shift_expr(c, CHILD(n, i));
2521 if (TYPE(CHILD(n, i-1)) == AMPER) {
2522 op = BINARY_AND;
2523 }
2524 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002525 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002526 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002527 op = 255;
2528 }
2529 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002530 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002531 }
2532}
2533
2534static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002535com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002536{
2537 int i;
2538 int op;
2539 REQ(n, xor_expr);
2540 com_and_expr(c, CHILD(n, 0));
2541 for (i = 2; i < NCH(n); i += 2) {
2542 com_and_expr(c, CHILD(n, i));
2543 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2544 op = BINARY_XOR;
2545 }
2546 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002547 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002548 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002549 op = 255;
2550 }
2551 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002552 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002553 }
2554}
2555
2556static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002557com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002558{
2559 int i;
2560 int op;
2561 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002562 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002563 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002564 com_xor_expr(c, CHILD(n, i));
2565 if (TYPE(CHILD(n, i-1)) == VBAR) {
2566 op = BINARY_OR;
2567 }
2568 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002569 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002570 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002571 op = 255;
2572 }
2573 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002574 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002575 }
2576}
2577
2578static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002579cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002580{
2581 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00002582 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002583 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2584 if (NCH(n) == 1) {
2585 n = CHILD(n, 0);
2586 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002587 case LESS: return PyCmp_LT;
2588 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00002589 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00002590 case LESSEQUAL: return PyCmp_LE;
2591 case GREATEREQUAL: return PyCmp_GE;
2592 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2593 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2594 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002595 }
2596 }
2597 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002598 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002599 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002600 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002601 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002602 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002603 }
2604 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002605 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002606}
2607
2608static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002609com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002610{
2611 int i;
2612 enum cmp_op op;
2613 int anchor;
2614 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2615 com_expr(c, CHILD(n, 0));
2616 if (NCH(n) == 1)
2617 return;
2618
2619 /****************************************************************
2620 The following code is generated for all but the last
2621 comparison in a chain:
2622
2623 label: on stack: opcode: jump to:
2624
2625 a <code to load b>
2626 a, b DUP_TOP
2627 a, b, b ROT_THREE
2628 b, a, b COMPARE_OP
2629 b, 0-or-1 JUMP_IF_FALSE L1
2630 b, 1 POP_TOP
2631 b
2632
2633 We are now ready to repeat this sequence for the next
2634 comparison in the chain.
2635
2636 For the last we generate:
2637
2638 b <code to load c>
2639 b, c COMPARE_OP
2640 0-or-1
2641
2642 If there were any jumps to L1 (i.e., there was more than one
2643 comparison), we generate:
2644
2645 0-or-1 JUMP_FORWARD L2
2646 L1: b, 0 ROT_TWO
2647 0, b POP_TOP
2648 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002649 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002650 ****************************************************************/
2651
2652 anchor = 0;
2653
2654 for (i = 2; i < NCH(n); i += 2) {
2655 com_expr(c, CHILD(n, i));
2656 if (i+2 < NCH(n)) {
2657 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002658 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002659 com_addbyte(c, ROT_THREE);
2660 }
2661 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002662 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002663 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002664 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002665 }
2666 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002667 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002668 if (i+2 < NCH(n)) {
2669 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2670 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002671 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002672 }
2673 }
2674
2675 if (anchor) {
2676 int anchor2 = 0;
2677 com_addfwref(c, JUMP_FORWARD, &anchor2);
2678 com_backpatch(c, anchor);
2679 com_addbyte(c, ROT_TWO);
2680 com_addbyte(c, POP_TOP);
2681 com_backpatch(c, anchor2);
2682 }
2683}
2684
2685static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002686com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002687{
2688 REQ(n, not_test); /* 'not' not_test | comparison */
2689 if (NCH(n) == 1) {
2690 com_comparison(c, CHILD(n, 0));
2691 }
2692 else {
2693 com_not_test(c, CHILD(n, 1));
2694 com_addbyte(c, UNARY_NOT);
2695 }
2696}
2697
2698static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002699com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002700{
2701 int i;
2702 int anchor;
2703 REQ(n, and_test); /* not_test ('and' not_test)* */
2704 anchor = 0;
2705 i = 0;
2706 for (;;) {
2707 com_not_test(c, CHILD(n, i));
2708 if ((i += 2) >= NCH(n))
2709 break;
2710 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2711 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002712 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002713 }
2714 if (anchor)
2715 com_backpatch(c, anchor);
2716}
2717
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002718static int
2719com_make_closure(struct compiling *c, PyCodeObject *co)
2720{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002721 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002722 if (free == 0)
2723 return 0;
2724 for (i = 0; i < free; ++i) {
2725 /* Bypass com_addop_varname because it will generate
2726 LOAD_DEREF but LOAD_CLOSURE is needed.
2727 */
2728 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2729 int arg, reftype;
2730
2731 /* Special case: If a class contains a method with a
2732 free variable that has the same name as a method,
2733 the name will be considered free *and* local in the
2734 class. It should be handled by the closure, as
2735 well as by the normal name loookup logic.
2736 */
2737 reftype = get_ref_type(c, PyString_AS_STRING(name));
2738 if (reftype == CELL)
2739 arg = com_lookup_arg(c->c_cellvars, name);
2740 else /* (reftype == FREE) */
2741 arg = com_lookup_arg(c->c_freevars, name);
2742 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002743 fprintf(stderr, "lookup %s in %s %d %d\n"
2744 "freevars of %s: %s\n",
2745 PyObject_REPR(name),
2746 c->c_name,
2747 reftype, arg,
2748 PyString_AS_STRING(co->co_name),
2749 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002750 Py_FatalError("com_make_closure()");
2751 }
2752 com_addoparg(c, LOAD_CLOSURE, arg);
2753
2754 }
2755 com_push(c, free);
2756 return 1;
2757}
2758
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002759static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002760com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002761{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002762 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002763 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002764 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002765 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002766 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002767 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2768 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002769 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002770 if (co == NULL) {
2771 c->c_errors++;
2772 return;
2773 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002774 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002775 i = com_addconst(c, (PyObject *)co);
2776 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002777 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002778 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002779 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002780 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002781 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002782 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002783 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002784 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002785 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002786 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002787 else {
2788 int anchor = 0;
2789 int i = 0;
2790 for (;;) {
2791 com_and_test(c, CHILD(n, i));
2792 if ((i += 2) >= NCH(n))
2793 break;
2794 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2795 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002796 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002797 }
2798 if (anchor)
2799 com_backpatch(c, anchor);
2800 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002801}
2802
2803static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002804com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002805{
2806 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002807 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002808 com_node(c, CHILD(n, 0));
2809 }
2810 else {
2811 int i;
2812 int len;
2813 len = (NCH(n) + 1) / 2;
2814 for (i = 0; i < NCH(n); i += 2)
2815 com_node(c, CHILD(n, i));
2816 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002817 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002818 }
2819}
2820
2821
2822/* Begin of assignment compilation */
2823
Thomas Wouters434d0822000-08-24 20:11:32 +00002824
2825static void
2826com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2827{
2828 com_addbyte(c, DUP_TOP);
2829 com_push(c, 1);
2830 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002831 com_node(c, augn);
2832 com_addbyte(c, opcode);
2833 com_pop(c, 1);
2834 com_addbyte(c, ROT_TWO);
2835 com_addopname(c, STORE_ATTR, n);
2836 com_pop(c, 2);
2837}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002838
2839static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002840com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002841{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00002842 if (none_assignment_check(c, STR(n), assigning))
2843 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002844 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002845 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002846}
2847
2848static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002849com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002850{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002851 REQ(n, trailer);
2852 switch (TYPE(CHILD(n, 0))) {
2853 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002854 if (assigning == OP_DELETE)
2855 com_error(c, PyExc_SyntaxError,
2856 "can't delete function call");
2857 else
2858 com_error(c, PyExc_SyntaxError,
2859 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002860 break;
2861 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002862 if (assigning > OP_APPLY)
2863 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2864 else
2865 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002866 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002867 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002868 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002869 break;
2870 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002871 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002872 }
2873}
2874
2875static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002876com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002877{
2878 int i;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002879 if (TYPE(n) != testlist && TYPE(n) != testlist_gexp &&
2880 TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002881 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002882 if (assigning) {
2883 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002884 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002885 com_push(c, i-1);
2886 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002887 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002888 com_assign(c, CHILD(n, i), assigning, NULL);
2889}
2890
2891static void
2892com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2893{
2894 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002895 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002896 com_push(c, 1);
2897 com_node(c, augn);
2898 com_addbyte(c, opcode);
2899 com_pop(c, 1);
2900 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002901}
2902
2903static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002904com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002905{
2906 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002907 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002908 if (assigning)
2909 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002910}
2911
2912static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002913com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002914{
2915 /* Loop to avoid trivial recursion */
2916 for (;;) {
2917 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002918
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002919 case exprlist:
2920 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002921 case testlist1:
Raymond Hettinger354433a2004-05-19 08:20:33 +00002922 case testlist_gexp:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002923 if (NCH(n) > 1) {
Raymond Hettinger354433a2004-05-19 08:20:33 +00002924 if (TYPE(CHILD(n, 1)) == gen_for) {
2925 com_error(c, PyExc_SystemError,
2926 "assign to generator expression not possible");
2927 return;
2928 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002929 if (assigning > OP_APPLY) {
2930 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002931 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002932 return;
2933 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002934 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002935 return;
2936 }
2937 n = CHILD(n, 0);
2938 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002939
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002940 case test:
2941 case and_test:
2942 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002943 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002944 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002945 case xor_expr:
2946 case and_expr:
2947 case shift_expr:
2948 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002949 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002950 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002951 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002952 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002953 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002954 return;
2955 }
2956 n = CHILD(n, 0);
2957 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002958
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002959 case power: /* atom trailer* ('**' power)*
2960 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002961 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002962 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002963 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002964 return;
2965 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002966 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002967 int i;
2968 com_node(c, CHILD(n, 0));
2969 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002970 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002971 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002972 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002973 return;
2974 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002975 com_apply_trailer(c, CHILD(n, i));
2976 } /* NB i is still alive */
2977 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002978 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002979 return;
2980 }
2981 n = CHILD(n, 0);
2982 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002983
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002984 case atom:
2985 switch (TYPE(CHILD(n, 0))) {
2986 case LPAR:
2987 n = CHILD(n, 1);
2988 if (TYPE(n) == RPAR) {
2989 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002990 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002991 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002992 return;
2993 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002994 if (assigning > OP_APPLY) {
2995 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00002996 "augmented assign to tuple literal not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002997 return;
2998 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002999 break;
3000 case LSQB:
3001 n = CHILD(n, 1);
3002 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003003 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003004 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003005 return;
3006 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003007 if (assigning > OP_APPLY) {
3008 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003009 "augmented assign to list literal not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003010 return;
3011 }
3012 if (NCH(n) > 1
3013 && TYPE(CHILD(n, 1)) == list_for) {
3014 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003015 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00003016 return;
3017 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003018 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003019 return;
3020 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00003021 if (assigning > OP_APPLY)
3022 com_augassign_name(c, CHILD(n, 0),
3023 assigning, augn);
3024 else
3025 com_assign_name(c, CHILD(n, 0),
3026 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003027 return;
3028 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003029 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003030 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003031 return;
3032 }
3033 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003034
3035 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003036 com_error(c, PyExc_SyntaxError,
3037 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003038 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003039
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003040 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003041 com_error(c, PyExc_SystemError,
3042 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003043 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003044
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003045 }
3046 }
3047}
Guido van Rossum7c531111997-03-11 18:42:21 +00003048
Thomas Wouters434d0822000-08-24 20:11:32 +00003049static void
3050com_augassign(struct compiling *c, node *n)
3051{
3052 int opcode;
3053
3054 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
3055 case '+': opcode = INPLACE_ADD; break;
3056 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00003057 case '/':
3058 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
3059 opcode = INPLACE_FLOOR_DIVIDE;
3060 else if (c->c_flags & CO_FUTURE_DIVISION)
3061 opcode = INPLACE_TRUE_DIVIDE;
3062 else
3063 opcode = INPLACE_DIVIDE;
3064 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00003065 case '%': opcode = INPLACE_MODULO; break;
3066 case '<': opcode = INPLACE_LSHIFT; break;
3067 case '>': opcode = INPLACE_RSHIFT; break;
3068 case '&': opcode = INPLACE_AND; break;
3069 case '^': opcode = INPLACE_XOR; break;
3070 case '|': opcode = INPLACE_OR; break;
3071 case '*':
3072 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
3073 opcode = INPLACE_POWER;
3074 else
3075 opcode = INPLACE_MULTIPLY;
3076 break;
3077 default:
3078 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
3079 return;
3080 }
3081 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
3082}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003083
3084static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003085com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003086{
Thomas Wouters434d0822000-08-24 20:11:32 +00003087 REQ(n, expr_stmt);
3088 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003089 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00003090 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003091 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00003092 if (NCH(n) == 1) {
3093 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003094 if (c->c_interactive)
3095 com_addbyte(c, PRINT_EXPR);
3096 else
3097 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003098 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003099 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003100 else if (TYPE(CHILD(n,1)) == augassign)
3101 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003102 else {
3103 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00003104 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003105 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003106 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003107 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003108 com_push(c, 1);
3109 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003110 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003111 }
3112 }
3113}
3114
3115static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003116com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00003117{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003118 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003119 int i;
3120 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003121 if (Py_OptimizeFlag)
3122 return;
3123 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00003124
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003125 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00003126 raise AssertionError [, <message>]
3127
3128 where <message> is the second test, if present.
3129 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003130 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003131 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003132 com_addbyte(c, POP_TOP);
3133 com_pop(c, 1);
3134 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003135 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00003136 com_push(c, 1);
3137 i = NCH(n)/2; /* Either 2 or 4 */
3138 if (i > 1)
3139 com_node(c, CHILD(n, 3));
3140 com_addoparg(c, RAISE_VARARGS, i);
3141 com_pop(c, i);
3142 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003143 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003144 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003145 com_addbyte(c, POP_TOP);
3146}
3147
3148static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003149com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003150{
Barry Warsaw29c574e2000-08-21 15:38:56 +00003151 int i = 1;
3152 node* stream = NULL;
3153
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003154 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003155
3156 /* are we using the extended print form? */
3157 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
3158 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00003159 com_node(c, stream);
3160 /* stack: [...] => [... stream] */
3161 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003162 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3163 i = 4;
3164 else
3165 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003166 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003167 for (; i < NCH(n); i += 2) {
3168 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003169 com_addbyte(c, DUP_TOP);
3170 /* stack: [stream] => [stream stream] */
3171 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003172 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003173 /* stack: [stream stream] => [stream stream obj] */
3174 com_addbyte(c, ROT_TWO);
3175 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003176 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003177 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003178 com_pop(c, 2);
3179 }
3180 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003181 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003182 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003183 com_addbyte(c, PRINT_ITEM);
3184 com_pop(c, 1);
3185 }
3186 }
3187 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003188 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003189 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003190 /* must pop the extra stream object off the stack */
3191 com_addbyte(c, POP_TOP);
3192 /* stack: [... stream] => [...] */
3193 com_pop(c, 1);
3194 }
3195 }
3196 else {
3197 if (stream != NULL) {
3198 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003199 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003200 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003201 com_pop(c, 1);
3202 }
3203 else
3204 com_addbyte(c, PRINT_NEWLINE);
3205 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003206}
3207
3208static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003209com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003210{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003211 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003212 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003213 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003214 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003215 if (c->c_flags & CO_GENERATOR) {
3216 if (NCH(n) > 1) {
3217 com_error(c, PyExc_SyntaxError,
3218 "'return' with argument inside generator");
3219 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003220 }
3221 if (NCH(n) < 2) {
3222 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003223 com_push(c, 1);
3224 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003225 else
3226 com_node(c, CHILD(n, 1));
3227 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003228 com_pop(c, 1);
3229}
3230
3231static void
3232com_yield_stmt(struct compiling *c, node *n)
3233{
Tim Peters95c80f82001-06-23 02:07:08 +00003234 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003235 REQ(n, yield_stmt); /* 'yield' testlist */
3236 if (!c->c_infunction) {
3237 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3238 }
Tim Peters95c80f82001-06-23 02:07:08 +00003239
3240 for (i = 0; i < c->c_nblocks; ++i) {
3241 if (c->c_block[i] == SETUP_FINALLY) {
3242 com_error(c, PyExc_SyntaxError,
3243 "'yield' not allowed in a 'try' block "
3244 "with a 'finally' clause");
3245 return;
3246 }
3247 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003248 com_node(c, CHILD(n, 1));
3249 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003250 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003251}
3252
3253static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003254com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003255{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003256 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003257 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3258 if (NCH(n) > 1) {
3259 com_node(c, CHILD(n, 1));
3260 if (NCH(n) > 3) {
3261 com_node(c, CHILD(n, 3));
3262 if (NCH(n) > 5)
3263 com_node(c, CHILD(n, 5));
3264 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003265 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003266 i = NCH(n)/2;
3267 com_addoparg(c, RAISE_VARARGS, i);
3268 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003269}
3270
3271static void
Thomas Wouters52152252000-08-17 22:55:00 +00003272com_from_import(struct compiling *c, node *n)
3273{
3274 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3275 com_push(c, 1);
3276 if (NCH(n) > 1) {
3277 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3278 com_error(c, PyExc_SyntaxError, "invalid syntax");
3279 return;
3280 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003281 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003282 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003283 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003284 com_pop(c, 1);
3285}
3286
3287static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003288com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003289{
3290 int i;
3291 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003292 /* 'import' dotted_name (',' dotted_name)* |
3293 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003294 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00003295 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003296 /* 'from' dotted_name 'import' ... */
3297 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003298
3299 if (TYPE(CHILD(n, 3)) == STAR) {
3300 tup = Py_BuildValue("(s)", "*");
3301 } else {
3302 tup = PyTuple_New((NCH(n) - 2)/2);
3303 for (i = 3; i < NCH(n); i += 2) {
3304 PyTuple_SET_ITEM(tup, (i-3)/2,
Guido van Rossum633d90c2002-12-23 16:51:42 +00003305 PyString_FromString(STR(
3306 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003307 }
3308 }
3309 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003310 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003311 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003312 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00003313 if (TYPE(CHILD(n, 3)) == STAR)
3314 com_addbyte(c, IMPORT_STAR);
3315 else {
3316 for (i = 3; i < NCH(n); i += 2)
3317 com_from_import(c, CHILD(n, i));
3318 com_addbyte(c, POP_TOP);
3319 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003320 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003321 }
3322 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003323 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003324 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003325 node *subn = CHILD(n, i);
3326 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003327 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003328 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003329 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003330 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003331 int j;
3332 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003333 com_error(c, PyExc_SyntaxError,
3334 "invalid syntax");
3335 return;
3336 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003337 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3338 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003339 CHILD(CHILD(subn, 0),
3340 j));
3341 com_addop_varname(c, VAR_STORE,
3342 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003343 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003344 com_addop_varname(c, VAR_STORE,
3345 STR(CHILD(CHILD(subn, 0),
3346 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003347 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003348 }
3349 }
3350}
3351
3352static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003353com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003354{
3355 REQ(n, exec_stmt);
3356 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3357 com_node(c, CHILD(n, 1));
3358 if (NCH(n) >= 4)
3359 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003360 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003361 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003362 com_push(c, 1);
3363 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003364 if (NCH(n) >= 6)
3365 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003366 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003367 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003368 com_push(c, 1);
3369 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003370 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003371 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003372}
3373
Guido van Rossum7c531111997-03-11 18:42:21 +00003374static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003375is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003376{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003377 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003378 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003379 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003380
3381 /* Label to avoid tail recursion */
3382 next:
3383 switch (TYPE(n)) {
3384
3385 case suite:
3386 if (NCH(n) == 1) {
3387 n = CHILD(n, 0);
3388 goto next;
3389 }
3390 /* Fall through */
3391 case file_input:
3392 for (i = 0; i < NCH(n); i++) {
3393 node *ch = CHILD(n, i);
3394 if (TYPE(ch) == stmt) {
3395 n = ch;
3396 goto next;
3397 }
3398 }
3399 break;
3400
3401 case stmt:
3402 case simple_stmt:
3403 case small_stmt:
3404 n = CHILD(n, 0);
3405 goto next;
3406
3407 case expr_stmt:
3408 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003409 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003410 case test:
3411 case and_test:
3412 case not_test:
3413 case comparison:
3414 case expr:
3415 case xor_expr:
3416 case and_expr:
3417 case shift_expr:
3418 case arith_expr:
3419 case term:
3420 case factor:
3421 case power:
3422 case atom:
3423 if (NCH(n) == 1) {
3424 n = CHILD(n, 0);
3425 goto next;
3426 }
3427 break;
3428
3429 case NAME:
3430 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3431 return 1;
3432 break;
3433
3434 case NUMBER:
3435 v = parsenumber(c, STR(n));
3436 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003437 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003438 break;
3439 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003440 i = PyObject_IsTrue(v);
3441 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003442 return i == 0;
3443
3444 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003445 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003446 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003447 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003448 break;
3449 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003450 i = PyObject_IsTrue(v);
3451 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003452 return i == 0;
3453
3454 }
3455 return 0;
3456}
3457
Tim Peters08a898f2001-06-28 01:52:22 +00003458
3459/* Look under n for a return stmt with an expression.
3460 * This hack is used to find illegal returns under "if 0:" blocks in
3461 * functions already known to be generators (as determined by the symtable
3462 * pass).
3463 * Return the offending return node if found, else NULL.
3464 */
3465static node *
3466look_for_offending_return(node *n)
3467{
3468 int i;
3469
3470 for (i = 0; i < NCH(n); ++i) {
3471 node *kid = CHILD(n, i);
3472
3473 switch (TYPE(kid)) {
3474 case classdef:
3475 case funcdef:
3476 case lambdef:
3477 /* Stuff in nested functions & classes doesn't
3478 affect the code block we started in. */
3479 return NULL;
3480
3481 case return_stmt:
3482 if (NCH(kid) > 1)
3483 return kid;
3484 break;
3485
3486 default: {
3487 node *bad = look_for_offending_return(kid);
3488 if (bad != NULL)
3489 return bad;
3490 }
3491 }
3492 }
3493
3494 return NULL;
3495}
3496
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003497static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003498com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003499{
3500 int i;
3501 int anchor = 0;
3502 REQ(n, if_stmt);
3503 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3504 for (i = 0; i+3 < NCH(n); i+=4) {
3505 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003506 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003507 if (is_constant_false(c, ch)) {
3508 /* We're going to skip this block. However, if this
3509 is a generator, we have to check the dead code
3510 anyway to make sure there aren't any return stmts
3511 with expressions, in the same scope. */
3512 if (c->c_flags & CO_GENERATOR) {
3513 node *p = look_for_offending_return(n);
3514 if (p != NULL) {
3515 int savelineno = c->c_lineno;
3516 c->c_lineno = p->n_lineno;
3517 com_error(c, PyExc_SyntaxError,
3518 "'return' with argument "
3519 "inside generator");
3520 c->c_lineno = savelineno;
3521 }
3522 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003523 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003524 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003525 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003526 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003527 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003528 com_addfwref(c, JUMP_IF_FALSE, &a);
3529 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003530 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003531 com_node(c, CHILD(n, i+3));
3532 com_addfwref(c, JUMP_FORWARD, &anchor);
3533 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003534 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003535 com_addbyte(c, POP_TOP);
3536 }
3537 if (i+2 < NCH(n))
3538 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003539 if (anchor)
3540 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003541}
3542
3543static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003544com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003545{
3546 int break_anchor = 0;
3547 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003548 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003549 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3550 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003551 block_push(c, SETUP_LOOP);
3552 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003553 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003554 com_node(c, CHILD(n, 1));
3555 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3556 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003557 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003558 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003559 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003560 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003561 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3562 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003563 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003564 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003565 com_addbyte(c, POP_TOP);
3566 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003567 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003568 if (NCH(n) > 4)
3569 com_node(c, CHILD(n, 6));
3570 com_backpatch(c, break_anchor);
3571}
3572
3573static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003574com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003575{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003576 int break_anchor = 0;
3577 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003578 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003579 REQ(n, for_stmt);
3580 /* 'for' exprlist 'in' exprlist ':' 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);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003583 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003584 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003585 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00003586 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003587 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003588 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003589 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003590 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003591 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003592 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003593 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3594 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003595 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003596 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003597 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) > 8)
3600 com_node(c, CHILD(n, 8));
3601 com_backpatch(c, break_anchor);
3602}
3603
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003604/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003605
3606 SETUP_FINALLY L
3607 <code for S>
3608 POP_BLOCK
3609 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003610 L: <code for Sf>
3611 END_FINALLY
3612
3613 The special instructions use the block stack. Each block
3614 stack entry contains the instruction that created it (here
3615 SETUP_FINALLY), the level of the value stack at the time the
3616 block stack entry was created, and a label (here L).
3617
3618 SETUP_FINALLY:
3619 Pushes the current value stack level and the label
3620 onto the block stack.
3621 POP_BLOCK:
3622 Pops en entry from the block stack, and pops the value
3623 stack until its level is the same as indicated on the
3624 block stack. (The label is ignored.)
3625 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003626 Pops a variable number of entries from the *value* stack
3627 and re-raises the exception they specify. The number of
3628 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003629
3630 The block stack is unwound when an exception is raised:
3631 when a SETUP_FINALLY entry is found, the exception is pushed
3632 onto the value stack (and the exception condition is cleared),
3633 and the interpreter jumps to the label gotten from the block
3634 stack.
3635
3636 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003637 (The contents of the value stack is shown in [], with the top
3638 at the right; 'tb' is trace-back info, 'val' the exception's
3639 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003640
3641 Value stack Label Instruction Argument
3642 [] SETUP_EXCEPT L1
3643 [] <code for S>
3644 [] POP_BLOCK
3645 [] JUMP_FORWARD L0
3646
Guido van Rossum3f5da241990-12-20 15:06:42 +00003647 [tb, val, exc] L1: DUP )
3648 [tb, val, exc, exc] <evaluate E1> )
3649 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3650 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3651 [tb, val, exc, 1] POP )
3652 [tb, val, exc] POP
3653 [tb, val] <assign to V1> (or POP if no V1)
3654 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003655 [] <code for S1>
3656 JUMP_FORWARD L0
3657
Guido van Rossum3f5da241990-12-20 15:06:42 +00003658 [tb, val, exc, 0] L2: POP
3659 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003660 .............................etc.......................
3661
Guido van Rossum3f5da241990-12-20 15:06:42 +00003662 [tb, val, exc, 0] Ln+1: POP
3663 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003664
3665 [] L0: <next statement>
3666
3667 Of course, parts are not generated if Vi or Ei is not present.
3668*/
3669
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003670static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003671com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003672{
3673 int except_anchor = 0;
3674 int end_anchor = 0;
3675 int else_anchor = 0;
3676 int i;
3677 node *ch;
3678
3679 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3680 block_push(c, SETUP_EXCEPT);
3681 com_node(c, CHILD(n, 2));
3682 com_addbyte(c, POP_BLOCK);
3683 block_pop(c, SETUP_EXCEPT);
3684 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3685 com_backpatch(c, except_anchor);
3686 for (i = 3;
3687 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3688 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003689 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003690 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003691 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003692 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003693 break;
3694 }
3695 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003696 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003697 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003698 if (NCH(ch) > 1) {
3699 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003700 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003701 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003702 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003703 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003704 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3705 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003706 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003707 }
3708 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003709 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003710 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003711 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003712 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003713 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003714 com_pop(c, 1);
3715 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003716 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003717 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003718 com_node(c, CHILD(n, i+2));
3719 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3720 if (except_anchor) {
3721 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003722 /* We come in with [tb, val, exc, 0] on the
3723 stack; one pop and it's the same as
3724 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003725 com_addbyte(c, POP_TOP);
3726 }
3727 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003728 /* We actually come in here with [tb, val, exc] but the
3729 END_FINALLY will zap those and jump around.
3730 The c_stacklevel does not reflect them so we need not pop
3731 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003732 com_addbyte(c, END_FINALLY);
3733 com_backpatch(c, else_anchor);
3734 if (i < NCH(n))
3735 com_node(c, CHILD(n, i+2));
3736 com_backpatch(c, end_anchor);
3737}
3738
3739static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003740com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003741{
3742 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003743 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003744
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003745 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3746 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003747 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003748 com_addbyte(c, POP_BLOCK);
3749 block_pop(c, SETUP_FINALLY);
3750 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003751 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003752 /* While the generated code pushes only one item,
3753 the try-finally handling can enter here with
3754 up to three items. OK, here are the details:
3755 3 for an exception, 2 for RETURN, 1 for BREAK. */
3756 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003757 com_backpatch(c, finally_anchor);
3758 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003759 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003760 com_node(c, ch);
3761 com_addbyte(c, END_FINALLY);
3762 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003763 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003764}
3765
3766static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003767com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003768{
3769 REQ(n, try_stmt);
3770 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3771 | 'try' ':' suite 'finally' ':' suite */
3772 if (TYPE(CHILD(n, 3)) != except_clause)
3773 com_try_finally(c, n);
3774 else
3775 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003776}
3777
Guido van Rossum8b993a91997-01-17 21:04:03 +00003778static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003779get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003780{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003781 int i;
3782
Guido van Rossum8b993a91997-01-17 21:04:03 +00003783 /* Label to avoid tail recursion */
3784 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003785 switch (TYPE(n)) {
3786
3787 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003788 if (NCH(n) == 1) {
3789 n = CHILD(n, 0);
3790 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003791 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003792 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003793 case file_input:
3794 for (i = 0; i < NCH(n); i++) {
3795 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003796 if (TYPE(ch) == stmt) {
3797 n = ch;
3798 goto next;
3799 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003800 }
3801 break;
3802
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003803 case stmt:
3804 case simple_stmt:
3805 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003806 n = CHILD(n, 0);
3807 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003808
3809 case expr_stmt:
3810 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003811 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003812 case test:
3813 case and_test:
3814 case not_test:
3815 case comparison:
3816 case expr:
3817 case xor_expr:
3818 case and_expr:
3819 case shift_expr:
3820 case arith_expr:
3821 case term:
3822 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003823 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003824 if (NCH(n) == 1) {
3825 n = CHILD(n, 0);
3826 goto next;
3827 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003828 break;
3829
3830 case atom:
3831 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003832 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003833 break;
3834
3835 }
3836 return NULL;
3837}
3838
Guido van Rossum79f25d91997-04-29 20:08:16 +00003839static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003840get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003841{
Guido van Rossum541563e1999-01-28 15:08:09 +00003842 /* Don't generate doc-strings if run with -OO */
3843 if (Py_OptimizeFlag > 1)
3844 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003845 n = get_rawdocstring(n);
3846 if (n == NULL)
3847 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003848 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003849}
3850
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003851static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003852com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003853{
3854 REQ(n, suite);
3855 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3856 if (NCH(n) == 1) {
3857 com_node(c, CHILD(n, 0));
3858 }
3859 else {
3860 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003861 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003862 node *ch = CHILD(n, i);
3863 if (TYPE(ch) == stmt)
3864 com_node(c, ch);
3865 }
3866 }
3867}
3868
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003869/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003870static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003871com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003872{
3873 int i = c->c_nblocks;
3874 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3875 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3876 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003877 else if (i <= 0) {
3878 /* at the outer level */
3879 com_error(c, PyExc_SyntaxError,
3880 "'continue' not properly in loop");
3881 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003882 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003883 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003884 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003885 if (c->c_block[j] == SETUP_LOOP)
3886 break;
3887 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003888 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003889 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003890 for (; i > j; --i) {
3891 if (c->c_block[i] == SETUP_EXCEPT ||
3892 c->c_block[i] == SETUP_FINALLY) {
3893 com_addoparg(c, CONTINUE_LOOP,
3894 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003895 return;
3896 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003897 if (c->c_block[i] == END_FINALLY) {
3898 com_error(c, PyExc_SyntaxError,
3899 "'continue' not supported inside 'finally' clause");
3900 return;
3901 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003902 }
3903 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003904 com_error(c, PyExc_SyntaxError,
3905 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003906 }
3907 /* XXX Could allow it inside a 'finally' clause
3908 XXX if we could pop the exception still on the stack */
3909}
3910
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003911/* Return the number of default values in the argument list.
3912
3913 If a non-default argument follows a default argument, set an
3914 exception and return -1.
3915*/
3916
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003917static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003918com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003919{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003920 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003921 if (TYPE(n) == lambdef) {
3922 /* lambdef: 'lambda' [varargslist] ':' test */
3923 n = CHILD(n, 1);
3924 }
3925 else {
3926 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3927 n = CHILD(n, 2);
3928 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3929 n = CHILD(n, 1);
3930 }
3931 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003932 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003933 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003934 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003935 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3936 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003937 ndefs = 0;
3938 for (i = 0; i < nch; i++) {
3939 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003940 if (TYPE(CHILD(n, i)) == STAR ||
3941 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003942 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003943 i++;
3944 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003945 t = RPAR; /* Anything except EQUAL or COMMA */
3946 else
3947 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003948 if (t == EQUAL) {
3949 i++;
3950 ndefs++;
3951 com_node(c, CHILD(n, i));
3952 i++;
3953 if (i >= nch)
3954 break;
3955 t = TYPE(CHILD(n, i));
3956 }
3957 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003958 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003959 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003960 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003961 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003962 return -1;
3963 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003964 }
3965 if (t != COMMA)
3966 break;
3967 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003968 return ndefs;
3969}
3970
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003971static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003972com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003973{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003974 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003975 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003976 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003977 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003978 if (ndefs < 0)
3979 return;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003980 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3981 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003982 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003983 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003984 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003985 c->c_errors++;
3986 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003987 int closure = com_make_closure(c, (PyCodeObject *)co);
3988 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003989 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003990 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003991 if (closure)
3992 com_addoparg(c, MAKE_CLOSURE, ndefs);
3993 else
3994 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003995 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003996 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003997 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003998 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003999 }
4000}
4001
4002static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004003com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004004{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004005 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004006 REQ(n, testlist);
4007 /* testlist: test (',' test)* [','] */
4008 for (i = 0; i < NCH(n); i += 2)
4009 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004010 i = (NCH(n)+1) / 2;
4011 com_addoparg(c, BUILD_TUPLE, i);
4012 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004013}
4014
4015static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004016com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004017{
Guido van Rossum25831651993-05-19 14:50:45 +00004018 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004019 PyObject *v;
4020 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004021 char *name;
4022
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004023 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004024 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004025 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004026 c->c_errors++;
4027 return;
4028 }
4029 /* Push the class name on the stack */
4030 i = com_addconst(c, v);
4031 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004032 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004033 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004034 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004035 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004036 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004037 com_push(c, 1);
4038 }
Guido van Rossum25831651993-05-19 14:50:45 +00004039 else
4040 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004041 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004042 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004043 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004044 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004045 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004046 c->c_errors++;
4047 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004048 int closure = com_make_closure(c, co);
4049 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004050 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004051 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004052 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004053 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004054 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004055 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004056 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004057 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004058 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004059 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004060 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004061 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004062 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004063 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004064}
4065
4066static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004067com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004068{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004069 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004070 if (c->c_errors)
4071 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004072 switch (TYPE(n)) {
4073
4074 /* Definition nodes */
4075
4076 case funcdef:
4077 com_funcdef(c, n);
4078 break;
4079 case classdef:
4080 com_classdef(c, n);
4081 break;
4082
4083 /* Trivial parse tree nodes */
4084
4085 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004086 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004087 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004088 n = CHILD(n, 0);
4089 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004090
4091 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004092 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004093 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004094 {
4095 int i;
4096 for (i = 0; i < NCH(n)-1; i += 2)
4097 com_node(c, CHILD(n, i));
4098 }
4099 break;
4100
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004101 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004102 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004103 n = CHILD(n, 0);
4104 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004105
4106 /* Statement nodes */
4107
4108 case expr_stmt:
4109 com_expr_stmt(c, n);
4110 break;
4111 case print_stmt:
4112 com_print_stmt(c, n);
4113 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004114 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004115 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004116 break;
4117 case pass_stmt:
4118 break;
4119 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004120 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004121 com_error(c, PyExc_SyntaxError,
4122 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004123 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004124 com_addbyte(c, BREAK_LOOP);
4125 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004126 case continue_stmt:
4127 com_continue_stmt(c, n);
4128 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004129 case return_stmt:
4130 com_return_stmt(c, n);
4131 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004132 case yield_stmt:
4133 com_yield_stmt(c, n);
4134 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004135 case raise_stmt:
4136 com_raise_stmt(c, n);
4137 break;
4138 case import_stmt:
4139 com_import_stmt(c, n);
4140 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004141 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004142 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004143 case exec_stmt:
4144 com_exec_stmt(c, n);
4145 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004146 case assert_stmt:
4147 com_assert_stmt(c, n);
4148 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004149 case if_stmt:
4150 com_if_stmt(c, n);
4151 break;
4152 case while_stmt:
4153 com_while_stmt(c, n);
4154 break;
4155 case for_stmt:
4156 com_for_stmt(c, n);
4157 break;
4158 case try_stmt:
4159 com_try_stmt(c, n);
4160 break;
4161 case suite:
4162 com_suite(c, n);
4163 break;
4164
4165 /* Expression nodes */
4166
4167 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004168 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004169 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004170 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004171 break;
4172 case test:
4173 com_test(c, n);
4174 break;
4175 case and_test:
4176 com_and_test(c, n);
4177 break;
4178 case not_test:
4179 com_not_test(c, n);
4180 break;
4181 case comparison:
4182 com_comparison(c, n);
4183 break;
4184 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004185 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004186 break;
4187 case expr:
4188 com_expr(c, n);
4189 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004190 case xor_expr:
4191 com_xor_expr(c, n);
4192 break;
4193 case and_expr:
4194 com_and_expr(c, n);
4195 break;
4196 case shift_expr:
4197 com_shift_expr(c, n);
4198 break;
4199 case arith_expr:
4200 com_arith_expr(c, n);
4201 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004202 case term:
4203 com_term(c, n);
4204 break;
4205 case factor:
4206 com_factor(c, n);
4207 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004208 case power:
4209 com_power(c, n);
4210 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004211 case atom:
4212 com_atom(c, n);
4213 break;
4214
4215 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004216 com_error(c, PyExc_SystemError,
4217 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004218 }
4219}
4220
Tim Petersdbd9ba62000-07-09 03:09:57 +00004221static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004222
4223static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004224com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004225{
4226 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4227 if (TYPE(CHILD(n, 0)) == LPAR)
4228 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004229 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004230 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004231 com_pop(c, 1);
4232 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004233}
4234
4235static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004236com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004237{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004238 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004239 if (NCH(n) == 1) {
4240 com_fpdef(c, CHILD(n, 0));
4241 }
4242 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004243 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004244 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004245 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004246 for (i = 0; i < NCH(n); i += 2)
4247 com_fpdef(c, CHILD(n, i));
4248 }
4249}
4250
4251static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004252com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004253{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004254 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004255 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004256 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004257 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004258 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004259 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004260 nch = NCH(n);
4261 /* Enter all arguments in table of locals */
4262 for (i = 0, narg = 0; i < nch; i++) {
4263 node *ch = CHILD(n, i);
4264 node *fp;
4265 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004266 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004267 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4268 fp = CHILD(ch, 0);
4269 if (TYPE(fp) != NAME) {
4270 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4271 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004272 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004273 narg++;
4274 /* all name updates handled by symtable */
4275 if (++i >= nch)
4276 break;
4277 ch = CHILD(n, i);
4278 if (TYPE(ch) == EQUAL)
4279 i += 2;
4280 else
4281 REQ(ch, COMMA);
4282 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004283 if (complex) {
4284 /* Generate code for complex arguments only after
4285 having counted the simple arguments */
4286 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004287 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004288 node *ch = CHILD(n, i);
4289 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004290 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004291 break;
4292 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4293 fp = CHILD(ch, 0);
4294 if (TYPE(fp) != NAME) {
4295 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004296 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004297 com_fpdef(c, ch);
4298 }
4299 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004300 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004301 break;
4302 ch = CHILD(n, i);
4303 if (TYPE(ch) == EQUAL)
4304 i += 2;
4305 else
4306 REQ(ch, COMMA);
4307 }
4308 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004309}
4310
4311static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004312com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004313{
4314 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004315 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004316 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004317 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004318 if (doc != NULL) {
4319 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004320 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004321 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004322 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004323 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004324 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004325 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004326 for (i = 0; i < NCH(n); i++) {
4327 node *ch = CHILD(n, i);
4328 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4329 com_node(c, ch);
4330 }
4331}
4332
4333/* Top-level compile-node interface */
4334
4335static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004336compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004337{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004338 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004339 node *ch;
4340 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00004341 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004342 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004343 if (doc != NULL) {
4344 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004345 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004346 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004347 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004348 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004349 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
4350 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004351 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004352 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004353 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004354 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004355 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004356 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004357 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4358 com_push(c, 1);
4359 com_addbyte(c, RETURN_VALUE);
4360 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004361}
4362
4363static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004364compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004365{
Guido van Rossum590baa41993-11-30 13:40:46 +00004366 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004367 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004368 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004369
4370 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004371 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004372 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004373 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004374 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004375 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004376 else
4377 ch = CHILD(n, 2);
4378 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004379 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004380 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004381}
4382
4383static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004384compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004385{
4386 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004387 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004388 REQ(n, classdef);
4389 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4390 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004391 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004392 /* Initialize local __module__ from global __name__ */
4393 com_addop_name(c, LOAD_GLOBAL, "__name__");
4394 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004395 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004396 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004397 if (doc != NULL) {
4398 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004399 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004400 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004401 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004402 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004403 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004404 }
4405 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004406 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004407 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00004408 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004409 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004410 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004411 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004412 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004413}
4414
4415static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00004416compile_generator_expression(struct compiling *c, node *n)
4417{
4418 /* testlist_gexp: test gen_for */
4419 /* argument: test gen_for */
4420 REQ(CHILD(n, 0), test);
4421 REQ(CHILD(n, 1), gen_for);
4422
4423 c->c_name = "<generator expression>";
4424 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
4425
4426 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4427 com_push(c, 1);
4428 com_addbyte(c, RETURN_VALUE);
4429 com_pop(c, 1);
4430}
4431
4432static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004433compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004434{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004435 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004436
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004437 switch (TYPE(n)) {
4438
Guido van Rossum4c417781991-01-21 16:09:22 +00004439 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004440 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004441 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004442 n = CHILD(n, 0);
4443 if (TYPE(n) != NEWLINE)
4444 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004445 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004446 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4447 com_push(c, 1);
4448 com_addbyte(c, RETURN_VALUE);
4449 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004450 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004451 break;
4452
Guido van Rossum4c417781991-01-21 16:09:22 +00004453 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004454 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004455 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004456 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4457 com_push(c, 1);
4458 com_addbyte(c, RETURN_VALUE);
4459 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004460 break;
4461
Guido van Rossum590baa41993-11-30 13:40:46 +00004462 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004463 com_node(c, CHILD(n, 0));
4464 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004465 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004466 break;
4467
Guido van Rossum590baa41993-11-30 13:40:46 +00004468 case lambdef: /* anonymous function definition */
4469 compile_lambdef(c, n);
4470 break;
4471
Guido van Rossum4c417781991-01-21 16:09:22 +00004472 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004473 compile_funcdef(c, n);
4474 break;
4475
Guido van Rossum4c417781991-01-21 16:09:22 +00004476 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004477 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004478 break;
4479
Raymond Hettinger354433a2004-05-19 08:20:33 +00004480 case testlist_gexp: /* A generator expression */
4481 case argument: /* A generator expression */
4482 compile_generator_expression(c, n);
4483 break;
4484
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004485 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004486 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004487 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004488 }
4489}
4490
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004491static PyObject *
4492dict_keys_inorder(PyObject *dict, int offset)
4493{
4494 PyObject *tuple, *k, *v;
4495 int i, pos = 0, size = PyDict_Size(dict);
4496
4497 tuple = PyTuple_New(size);
4498 if (tuple == NULL)
4499 return NULL;
4500 while (PyDict_Next(dict, &pos, &k, &v)) {
4501 i = PyInt_AS_LONG(v);
4502 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004503 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004504 PyTuple_SET_ITEM(tuple, i - offset, k);
4505 }
4506 return tuple;
4507}
4508
Guido van Rossum79f25d91997-04-29 20:08:16 +00004509PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004510PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004511{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004512 return PyNode_CompileFlags(n, filename, NULL);
4513}
4514
4515PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004516PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004517{
4518 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004519}
4520
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004521struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004522PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004523{
4524 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004525 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004526
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004527 ff = PyNode_Future(n, filename);
4528 if (ff == NULL)
4529 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004530 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00004531 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004532 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004533 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004534 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004535 return st;
4536}
4537
Guido van Rossum79f25d91997-04-29 20:08:16 +00004538static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004539icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004540{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004541 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004542}
4543
Guido van Rossum79f25d91997-04-29 20:08:16 +00004544static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004545jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004546 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004547{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004548 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004549 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004550 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004551 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004552 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4553 sc.c_encoding = "utf-8";
4554 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004555 sc.c_encoding = STR(n);
4556 n = CHILD(n, 0);
4557 } else {
4558 sc.c_encoding = NULL;
4559 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004560 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004561 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004562 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004563 /* c_symtable still points to parent's symbols */
4564 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004565 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004566 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004567 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004568 if (base->c_encoding != NULL) {
4569 assert(sc.c_encoding == NULL);
4570 sc.c_encoding = base->c_encoding;
4571 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004572 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004573 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004574 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004575 if (sc.c_future == NULL) {
4576 com_free(&sc);
4577 return NULL;
4578 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004579 if (flags) {
4580 int merged = sc.c_future->ff_features |
4581 flags->cf_flags;
4582 sc.c_future->ff_features = merged;
4583 flags->cf_flags = merged;
4584 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004585 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
4586 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004587 com_free(&sc);
4588 return NULL;
4589 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004590 /* reset symbol table for second pass */
4591 sc.c_symtable->st_nscopes = 1;
4592 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004593 }
4594 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004595 if (symtable_load_symbols(&sc) < 0) {
4596 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004597 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004598 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004599 compile_node(&sc, n);
4600 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004601 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004602 PyObject *consts, *names, *varnames, *filename, *name,
4603 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004604 consts = PyList_AsTuple(sc.c_consts);
4605 names = PyList_AsTuple(sc.c_names);
4606 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004607 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4608 freevars = dict_keys_inorder(sc.c_freevars,
4609 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004610 filename = PyString_InternFromString(sc.c_filename);
4611 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004612 if (!PyErr_Occurred())
4613 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004614 sc.c_nlocals,
4615 sc.c_maxstacklevel,
4616 sc.c_flags,
4617 sc.c_code,
4618 consts,
4619 names,
4620 varnames,
4621 freevars,
4622 cellvars,
4623 filename,
4624 name,
4625 sc.c_firstlineno,
4626 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004627 Py_XDECREF(consts);
4628 Py_XDECREF(names);
4629 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004630 Py_XDECREF(freevars);
4631 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004632 Py_XDECREF(filename);
4633 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004634 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004635 else if (!PyErr_Occurred()) {
4636 /* This could happen if someone called PyErr_Clear() after an
4637 error was reported above. That's not supposed to happen,
4638 but I just plugged one case and I'm not sure there can't be
4639 others. In that case, raise SystemError so that at least
4640 it gets reported instead dumping core. */
4641 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4642 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004643 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004644 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004645 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004646 sc.c_symtable = NULL;
4647 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004648 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004649 return co;
4650}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004651
4652int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004653PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004654{
4655 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004656 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004657 int line = co->co_firstlineno;
4658 int addr = 0;
4659 while (--size >= 0) {
4660 addr += *p++;
4661 if (addr > addrq)
4662 break;
4663 line += *p++;
4664 }
4665 return line;
4666}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004667
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004668/* The test for LOCAL must come before the test for FREE in order to
4669 handle classes where name is both local and free. The local var is
4670 a method and the free var is a free var referenced within a method.
4671*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004672
4673static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004674get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004675{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004676 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004677 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004678
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004679 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4680 return CELL;
4681 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4682 return LOCAL;
4683 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4684 return FREE;
4685 v = PyDict_GetItemString(c->c_globals, name);
4686 if (v) {
4687 if (v == Py_None)
4688 return GLOBAL_EXPLICIT;
4689 else {
4690 return GLOBAL_IMPLICIT;
4691 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004692 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004693 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004694 "unknown scope for %.100s in %.100s(%s) "
4695 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4696 name, c->c_name,
4697 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4698 c->c_filename,
4699 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4700 PyObject_REPR(c->c_locals),
4701 PyObject_REPR(c->c_globals)
4702 );
4703
4704 Py_FatalError(buf);
4705 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004706}
4707
Guido van Rossum207fda62001-03-02 03:30:41 +00004708/* Helper functions to issue warnings */
4709
4710static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004711issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004712{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004713 if (PyErr_Occurred()) {
4714 /* This can happen because symtable_node continues
4715 processing even after raising a SyntaxError.
4716 Calling PyErr_WarnExplicit now would clobber the
4717 pending exception; instead we fail and let that
4718 exception propagate.
4719 */
4720 return -1;
4721 }
Guido van Rossum207fda62001-03-02 03:30:41 +00004722 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4723 lineno, NULL, NULL) < 0) {
4724 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4725 PyErr_SetString(PyExc_SyntaxError, msg);
4726 PyErr_SyntaxLocation(filename, lineno);
4727 }
4728 return -1;
4729 }
4730 return 0;
4731}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004732
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004733static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004734symtable_warn(struct symtable *st, char *msg)
4735{
Guido van Rossum207fda62001-03-02 03:30:41 +00004736 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004737 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004738 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004739 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004740 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004741}
4742
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004743/* Helper function for setting lineno and filename */
4744
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004745static struct symtable *
4746symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004747{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004748 struct symtable *st;
4749
4750 st = symtable_init();
4751 if (st == NULL)
4752 return NULL;
4753 st->st_future = ff;
4754 st->st_filename = filename;
4755 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
4756 if (st->st_errors > 0)
4757 goto fail;
4758 symtable_node(st, n);
4759 if (st->st_errors > 0)
4760 goto fail;
4761 return st;
4762 fail:
4763 if (!PyErr_Occurred()) {
4764 /* This could happen because after a syntax error is
4765 detected, the symbol-table-building continues for
4766 a while, and PyErr_Clear() might erroneously be
4767 called during that process. One such case has been
4768 fixed, but there might be more (now or later).
4769 */
4770 PyErr_SetString(PyExc_SystemError, "lost exception");
4771 }
4772 st->st_future = NULL;
4773 st->st_filename = NULL;
4774 PySymtable_Free(st);
4775 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004776}
4777
4778static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004779symtable_init_compiling_symbols(struct compiling *c)
4780{
4781 PyObject *varnames;
4782
4783 varnames = c->c_symtable->st_cur->ste_varnames;
4784 if (varnames == NULL) {
4785 varnames = PyList_New(0);
4786 if (varnames == NULL)
4787 return -1;
4788 c->c_symtable->st_cur->ste_varnames = varnames;
4789 Py_INCREF(varnames);
4790 } else
4791 Py_INCREF(varnames);
4792 c->c_varnames = varnames;
4793
4794 c->c_globals = PyDict_New();
4795 if (c->c_globals == NULL)
4796 return -1;
4797 c->c_freevars = PyDict_New();
4798 if (c->c_freevars == NULL)
4799 return -1;
4800 c->c_cellvars = PyDict_New();
4801 if (c->c_cellvars == NULL)
4802 return -1;
4803 return 0;
4804}
4805
4806struct symbol_info {
4807 int si_nlocals;
4808 int si_ncells;
4809 int si_nfrees;
4810 int si_nimplicit;
4811};
4812
4813static void
4814symtable_init_info(struct symbol_info *si)
4815{
4816 si->si_nlocals = 0;
4817 si->si_ncells = 0;
4818 si->si_nfrees = 0;
4819 si->si_nimplicit = 0;
4820}
4821
4822static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004823symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004824 struct symbol_info *si)
4825{
4826 PyObject *dict, *v;
4827
4828 /* Seperate logic for DEF_FREE. If it occurs in a function,
4829 it indicates a local that we must allocate storage for (a
4830 cell var). If it occurs in a class, then the class has a
4831 method and a free variable with the same name.
4832 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004833 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004834 /* If it isn't declared locally, it can't be a cell. */
4835 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4836 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004837 v = PyInt_FromLong(si->si_ncells++);
4838 dict = c->c_cellvars;
4839 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004840 /* If it is free anyway, then there is no need to do
4841 anything here.
4842 */
4843 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004844 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004845 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004846 v = PyInt_FromLong(si->si_nfrees++);
4847 dict = c->c_freevars;
4848 }
4849 if (v == NULL)
4850 return -1;
4851 if (PyDict_SetItem(dict, name, v) < 0) {
4852 Py_DECREF(v);
4853 return -1;
4854 }
4855 Py_DECREF(v);
4856 return 0;
4857}
4858
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004859/* If a variable is a cell and an argument, make sure that appears in
4860 co_cellvars before any variable to its right in varnames.
4861*/
4862
4863
4864static int
4865symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4866 PyObject *varnames, int flags)
4867{
Tim Petersb39903b2003-03-24 17:22:24 +00004868 PyObject *v = NULL;
4869 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004870 int i, pos;
4871
4872 if (flags & CO_VARARGS)
4873 argcount++;
4874 if (flags & CO_VARKEYWORDS)
4875 argcount++;
4876 for (i = argcount; --i >= 0; ) {
4877 v = PyList_GET_ITEM(varnames, i);
4878 if (PyDict_GetItem(*cellvars, v)) {
4879 if (list == NULL) {
4880 list = PyList_New(1);
4881 if (list == NULL)
4882 return -1;
4883 PyList_SET_ITEM(list, 0, v);
4884 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004885 } else {
4886 if (PyList_Insert(list, 0, v) < 0) {
4887 Py_DECREF(list);
4888 return -1;
4889 }
4890 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004891 }
4892 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00004893 if (list == NULL)
4894 return 0;
4895
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004896 /* There are cellvars that are also arguments. Create a dict
4897 to replace cellvars and put the args at the front.
4898 */
4899 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004900 if (d == NULL)
4901 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004902 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4903 v = PyInt_FromLong(i);
4904 if (v == NULL)
4905 goto fail;
4906 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4907 goto fail;
4908 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4909 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00004910 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004911 }
4912 pos = 0;
4913 i = PyList_GET_SIZE(list);
4914 Py_DECREF(list);
4915 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4916 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004917 if (w == NULL)
4918 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004919 if (PyDict_SetItem(d, v, w) < 0) {
4920 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00004921 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004922 goto fail;
4923 }
4924 Py_DECREF(w);
4925 }
4926 Py_DECREF(*cellvars);
4927 *cellvars = d;
4928 return 1;
4929 fail:
4930 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00004931 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004932 return -1;
4933}
4934
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004935static int
4936symtable_freevar_offsets(PyObject *freevars, int offset)
4937{
4938 PyObject *name, *v;
4939 int pos;
4940
4941 /* The cell vars are the first elements of the closure,
4942 followed by the free vars. Update the offsets in
4943 c_freevars to account for number of cellvars. */
4944 pos = 0;
4945 while (PyDict_Next(freevars, &pos, &name, &v)) {
4946 int i = PyInt_AS_LONG(v) + offset;
4947 PyObject *o = PyInt_FromLong(i);
4948 if (o == NULL)
4949 return -1;
4950 if (PyDict_SetItem(freevars, name, o) < 0) {
4951 Py_DECREF(o);
4952 return -1;
4953 }
4954 Py_DECREF(o);
4955 }
4956 return 0;
4957}
4958
4959static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004960symtable_check_unoptimized(struct compiling *c,
4961 PySymtableEntryObject *ste,
4962 struct symbol_info *si)
4963{
4964 char buf[300];
4965
4966 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4967 || (ste->ste_nested && si->si_nimplicit)))
4968 return 0;
4969
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004970#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4971
4972#define ILLEGAL_IS "is a nested function"
4973
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004974#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004975"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004976
4977#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004978"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004979
4980#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00004981"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004982"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004983
4984 /* XXX perhaps the linenos for these opt-breaking statements
4985 should be stored so the exception can point to them. */
4986
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004987 if (ste->ste_child_free) {
4988 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004989 PyOS_snprintf(buf, sizeof(buf),
4990 ILLEGAL_IMPORT_STAR,
4991 PyString_AS_STRING(ste->ste_name),
4992 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004993 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004994 PyOS_snprintf(buf, sizeof(buf),
4995 ILLEGAL_BARE_EXEC,
4996 PyString_AS_STRING(ste->ste_name),
4997 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004998 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004999 PyOS_snprintf(buf, sizeof(buf),
5000 ILLEGAL_EXEC_AND_IMPORT_STAR,
5001 PyString_AS_STRING(ste->ste_name),
5002 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005003 }
5004 } else {
5005 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005006 PyOS_snprintf(buf, sizeof(buf),
5007 ILLEGAL_IMPORT_STAR,
5008 PyString_AS_STRING(ste->ste_name),
5009 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005010 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005011 PyOS_snprintf(buf, sizeof(buf),
5012 ILLEGAL_BARE_EXEC,
5013 PyString_AS_STRING(ste->ste_name),
5014 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005015 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005016 PyOS_snprintf(buf, sizeof(buf),
5017 ILLEGAL_EXEC_AND_IMPORT_STAR,
5018 PyString_AS_STRING(ste->ste_name),
5019 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005020 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005021 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005022
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005023 PyErr_SetString(PyExc_SyntaxError, buf);
5024 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5025 ste->ste_opt_lineno);
5026 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005027}
5028
5029static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005030symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5031 struct symbol_info *si)
5032{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005033 if (c->c_future)
5034 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005035 if (ste->ste_generator)
5036 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005037 if (ste->ste_type != TYPE_MODULE)
5038 c->c_flags |= CO_NEWLOCALS;
5039 if (ste->ste_type == TYPE_FUNCTION) {
5040 c->c_nlocals = si->si_nlocals;
5041 if (ste->ste_optimized == 0)
5042 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005043 else if (ste->ste_optimized != OPT_EXEC)
5044 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005045 }
5046 return 0;
5047}
5048
5049static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005050symtable_error(struct symtable *st, int lineno)
5051{
5052 if (lineno == 0)
5053 lineno = st->st_cur->ste_lineno;
5054 PyErr_SyntaxLocation(st->st_filename, lineno);
5055 st->st_errors++;
5056 return -1;
5057}
5058
5059static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005060symtable_load_symbols(struct compiling *c)
5061{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005062 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005063 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005064 PyObject *name, *varnames, *v;
5065 int i, flags, pos;
5066 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005067
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005068 v = NULL;
5069
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005070 if (symtable_init_compiling_symbols(c) < 0)
5071 goto fail;
5072 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005073 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005074 si.si_nlocals = PyList_GET_SIZE(varnames);
5075 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005076
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005077 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005078 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005079 if (v == NULL)
5080 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005081 if (PyDict_SetItem(c->c_locals,
5082 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005083 goto fail;
5084 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005085 }
5086
5087 /* XXX The cases below define the rules for whether a name is
5088 local or global. The logic could probably be clearer. */
5089 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005090 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5091 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005092
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005093 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005094 /* undo the original DEF_FREE */
5095 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005096
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005097 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005098 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005099 2. Free variables in methods that are also class
5100 variables or declared global.
5101 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005102 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005103 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005104
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005105 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005106 c->c_argcount--;
5107 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005108 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005109 c->c_argcount--;
5110 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005111 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005112 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005113 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005114 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005115 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005116 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005117 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005118 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005119 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005120 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5121 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005122 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005123 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005124 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005125 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005126 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005127 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005128 if (v == NULL)
5129 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005130 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005131 goto fail;
5132 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005133 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005134 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005135 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005136 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005137 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005138 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005139 if (v == NULL)
5140 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005141 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005142 goto fail;
5143 Py_DECREF(v);
5144 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005145 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005146 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005147 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005148 goto fail;
5149 if (st->st_nscopes != 1) {
5150 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005151 if (v == NULL)
5152 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005153 if (PyDict_SetItem(st->st_global,
5154 name, v))
5155 goto fail;
5156 Py_DECREF(v);
5157 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005158 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005159 }
5160 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005161 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5162
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005163 if (si.si_ncells > 1) { /* one cell is always in order */
5164 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5165 c->c_varnames, c->c_flags) < 0)
5166 return -1;
5167 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005168 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5169 return -1;
5170 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005171 fail:
5172 /* is this always the right thing to do? */
5173 Py_XDECREF(v);
5174 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005175}
5176
5177static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005178symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005179{
5180 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005181
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005182 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005183 if (st == NULL)
5184 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005185 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005186
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005187 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005188 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005189 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005190 goto fail;
5191 if ((st->st_symbols = PyDict_New()) == NULL)
5192 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005193 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005194 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005195 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005196 st->st_private = NULL;
5197 return st;
5198 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005199 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005200 return NULL;
5201}
5202
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005203void
5204PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005205{
5206 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005207 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005208 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005209 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005210}
5211
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005212/* When the compiler exits a scope, it must should update the scope's
5213 free variable information with the list of free variables in its
5214 children.
5215
5216 Variables that are free in children and defined in the current
5217 scope are cellvars.
5218
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005219 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005220 false), free variables in children that are not defined here are
5221 implicit globals.
5222
5223*/
5224
5225static int
5226symtable_update_free_vars(struct symtable *st)
5227{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005228 int i, j, def;
5229 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005230 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005231
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005232 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005233 def = DEF_FREE_CLASS;
5234 else
5235 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005236 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005237 int pos = 0;
5238
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005239 if (list && PyList_SetSlice(list, 0,
5240 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005241 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005242 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005243 PyList_GET_ITEM(ste->ste_children, i);
5244 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005245 int flags = PyInt_AS_LONG(o);
5246 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005247 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005248 if (list == NULL) {
5249 list = PyList_New(0);
5250 if (list == NULL)
5251 return -1;
5252 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005253 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005254 if (PyList_Append(list, name) < 0) {
5255 Py_DECREF(list);
5256 return -1;
5257 }
5258 }
5259 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005260 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005261 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005262 v = PyDict_GetItem(ste->ste_symbols, name);
5263 /* If a name N is declared global in scope A and
5264 referenced in scope B contained (perhaps
5265 indirectly) in A and there are no scopes
5266 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005267 is global in B. Unless A is a class scope,
5268 because class scopes are not considered for
5269 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005270 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005271 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005272 int flags = PyInt_AS_LONG(v);
5273 if (flags & DEF_GLOBAL) {
5274 symtable_undo_free(st, child->ste_id,
5275 name);
5276 continue;
5277 }
5278 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005279 if (ste->ste_nested) {
5280 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005281 name, def) < 0) {
5282 Py_DECREF(list);
5283 return -1;
5284 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005285 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005286 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005287 name) < 0) {
5288 Py_DECREF(list);
5289 return -1;
5290 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005291 }
5292 }
5293 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005294
5295 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005296 return 0;
5297}
5298
5299/* If the current scope is a non-nested class or if name is not
5300 defined in the current, non-nested scope, then it is an implicit
5301 global in all nested scopes.
5302*/
5303
5304static int
5305symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5306{
5307 PyObject *o;
5308 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005309 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005310
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005311 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005312 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005313 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005314 if (o == NULL)
5315 return symtable_undo_free(st, child, name);
5316 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005317
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005318 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005319 return symtable_undo_free(st, child, name);
5320 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005321 return symtable_add_def_o(st, ste->ste_symbols,
5322 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005323}
5324
5325static int
5326symtable_undo_free(struct symtable *st, PyObject *id,
5327 PyObject *name)
5328{
5329 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005330 PyObject *info;
5331 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005332
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005333 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5334 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005335 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005336
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005337 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005338 if (info == NULL)
5339 return 0;
5340 v = PyInt_AS_LONG(info);
5341 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005342 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005343 DEF_FREE_GLOBAL) < 0)
5344 return -1;
5345 } else
5346 /* If the name is defined here or declared global,
5347 then the recursion stops. */
5348 return 0;
5349
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005350 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5351 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005352 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005353 PyList_GET_ITEM(ste->ste_children, i);
5354 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005355 if (x < 0)
5356 return x;
5357 }
5358 return 0;
5359}
5360
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005361/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5362 This reference is released when the scope is exited, via the DECREF
5363 in symtable_exit_scope().
5364*/
5365
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005366static int
5367symtable_exit_scope(struct symtable *st)
5368{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005369 int end;
5370
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005371 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005372 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005373 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005374 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005375 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5376 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005377 if (PySequence_DelItem(st->st_stack, end) < 0)
5378 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005379 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005380}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005381
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005382static void
5383symtable_enter_scope(struct symtable *st, char *name, int type,
5384 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005385{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005386 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005387
5388 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005389 prev = st->st_cur;
5390 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005391 st->st_errors++;
5392 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005393 }
5394 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005395 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005396 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005397 if (st->st_cur == NULL) {
5398 st->st_errors++;
5399 return;
5400 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005401 if (strcmp(name, TOP) == 0)
5402 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005403 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005404 if (PyList_Append(prev->ste_children,
5405 (PyObject *)st->st_cur) < 0)
5406 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005407 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005408}
5409
5410static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005411symtable_lookup(struct symtable *st, char *name)
5412{
5413 char buffer[MANGLE_LEN];
5414 PyObject *v;
5415 int flags;
5416
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005417 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005418 name = buffer;
5419 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5420 if (v == NULL) {
5421 if (PyErr_Occurred())
5422 return -1;
5423 else
5424 return 0;
5425 }
5426
5427 flags = PyInt_AS_LONG(v);
5428 return flags;
5429}
5430
5431static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005432symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005433{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005434 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005435 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005436 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005437
Guido van Rossumb7164622002-08-16 02:48:11 +00005438 /* Warn about None, except inside a tuple (where the assignment
5439 code already issues a warning). */
5440 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5441 *name == 'N' && strcmp(name, "None") == 0)
5442 {
5443 if (symtable_warn(st, "argument named None"))
5444 return -1;
5445 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005446 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005447 name = buffer;
5448 if ((s = PyString_InternFromString(name)) == NULL)
5449 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005450 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5451 Py_DECREF(s);
5452 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005453}
5454
5455/* Must only be called with mangled names */
5456
5457static int
5458symtable_add_def_o(struct symtable *st, PyObject *dict,
5459 PyObject *name, int flag)
5460{
5461 PyObject *o;
5462 int val;
5463
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005464 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005465 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005466 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005467 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005468 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005469 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005470 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005471 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005472 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005473 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005474 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005475 if (o == NULL)
5476 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005477 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005478 Py_DECREF(o);
5479 return -1;
5480 }
5481 Py_DECREF(o);
5482
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005483 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005484 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005485 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005486 } else if (flag & DEF_GLOBAL) {
5487 /* XXX need to update DEF_GLOBAL for other flags too;
5488 perhaps only DEF_FREE_GLOBAL */
5489 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005490 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005491 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005492 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005493 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005494 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005495 if (o == NULL)
5496 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005497 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005498 Py_DECREF(o);
5499 return -1;
5500 }
5501 Py_DECREF(o);
5502 }
5503 return 0;
5504}
5505
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005506#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005507
Tim Peters08a898f2001-06-28 01:52:22 +00005508/* Look for a yield stmt under n. Return 1 if found, else 0.
5509 This hack is used to look inside "if 0:" blocks (which are normally
5510 ignored) in case those are the only places a yield occurs (so that this
5511 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005512static int
5513look_for_yield(node *n)
5514{
5515 int i;
5516
5517 for (i = 0; i < NCH(n); ++i) {
5518 node *kid = CHILD(n, i);
5519
5520 switch (TYPE(kid)) {
5521
5522 case classdef:
5523 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005524 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005525 /* Stuff in nested functions and classes can't make
5526 the parent a generator. */
5527 return 0;
5528
5529 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00005530 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005531
5532 default:
5533 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00005534 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005535 }
5536 }
5537 return 0;
5538}
5539
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005540static void
5541symtable_node(struct symtable *st, node *n)
5542{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005543 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005544
5545 loop:
5546 switch (TYPE(n)) {
5547 case funcdef: {
5548 char *func_name = STR(CHILD(n, 1));
5549 symtable_add_def(st, func_name, DEF_LOCAL);
5550 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005551 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005552 symtable_funcdef(st, n);
5553 symtable_exit_scope(st);
5554 break;
5555 }
5556 case lambdef:
5557 if (NCH(n) == 4)
5558 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005559 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005560 symtable_funcdef(st, n);
5561 symtable_exit_scope(st);
5562 break;
5563 case classdef: {
5564 char *tmp, *class_name = STR(CHILD(n, 1));
5565 symtable_add_def(st, class_name, DEF_LOCAL);
5566 if (TYPE(CHILD(n, 2)) == LPAR) {
5567 node *bases = CHILD(n, 3);
5568 int i;
5569 for (i = 0; i < NCH(bases); i += 2) {
5570 symtable_node(st, CHILD(bases, i));
5571 }
5572 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005573 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005574 tmp = st->st_private;
5575 st->st_private = class_name;
5576 symtable_node(st, CHILD(n, NCH(n) - 1));
5577 st->st_private = tmp;
5578 symtable_exit_scope(st);
5579 break;
5580 }
5581 case if_stmt:
5582 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005583 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5584 if (st->st_cur->ste_generator == 0)
5585 st->st_cur->ste_generator =
5586 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005587 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005588 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005589 symtable_node(st, CHILD(n, i + 1));
5590 symtable_node(st, CHILD(n, i + 3));
5591 }
5592 if (i + 2 < NCH(n))
5593 symtable_node(st, CHILD(n, i + 2));
5594 break;
5595 case global_stmt:
5596 symtable_global(st, n);
5597 break;
5598 case import_stmt:
5599 symtable_import(st, n);
5600 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005601 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005602 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005603 symtable_node(st, CHILD(n, 1));
5604 if (NCH(n) > 2)
5605 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005606 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005607 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005608 st->st_cur->ste_opt_lineno = n->n_lineno;
5609 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005610 if (NCH(n) > 4)
5611 symtable_node(st, CHILD(n, 5));
5612 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005613
5614 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005615 case assert_stmt:
5616 if (Py_OptimizeFlag)
5617 return;
5618 if (NCH(n) == 2) {
5619 n = CHILD(n, 1);
5620 goto loop;
5621 } else {
5622 symtable_node(st, CHILD(n, 1));
5623 n = CHILD(n, 3);
5624 goto loop;
5625 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005626 case except_clause:
5627 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005628 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005629 if (NCH(n) > 1) {
5630 n = CHILD(n, 1);
5631 goto loop;
5632 }
5633 break;
5634 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005635 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005636 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005637 case yield_stmt:
5638 st->st_cur->ste_generator = 1;
5639 n = CHILD(n, 1);
5640 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005641 case expr_stmt:
5642 if (NCH(n) == 1)
5643 n = CHILD(n, 0);
5644 else {
5645 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005646 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005647 symtable_node(st, CHILD(n, 2));
5648 break;
5649 } else {
5650 int i;
5651 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005652 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005653 n = CHILD(n, NCH(n) - 1);
5654 }
5655 }
5656 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005657 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005658 /* only occurs when there are multiple for loops
5659 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005660 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005661 if (TYPE(n) == list_for)
5662 symtable_list_for(st, n);
5663 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005664 REQ(n, list_if);
5665 symtable_node(st, CHILD(n, 1));
5666 if (NCH(n) == 3) {
5667 n = CHILD(n, 2);
5668 goto loop;
5669 }
5670 }
5671 break;
5672 case for_stmt:
5673 symtable_assign(st, CHILD(n, 1), 0);
5674 for (i = 3; i < NCH(n); ++i)
5675 if (TYPE(CHILD(n, i)) >= single_input)
5676 symtable_node(st, CHILD(n, i));
5677 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00005678 case arglist:
5679 if (NCH(n) > 1)
5680 for (i = 0; i < NCH(n); ++i) {
5681 node *ch = CHILD(n, i);
5682 if (TYPE(ch) == argument && NCH(ch) == 2 &&
5683 TYPE(CHILD(ch, 1)) == gen_for) {
5684 PyErr_SetString(PyExc_SyntaxError,
5685 "invalid syntax");
5686 symtable_error(st, n->n_lineno);
5687 return;
5688 }
5689 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005690 /* The remaining cases fall through to default except in
5691 special circumstances. This requires the individual cases
5692 to be coded with great care, even though they look like
5693 rather innocuous. Each case must double-check TYPE(n).
5694 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005695 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005696 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005697 n = CHILD(n, 2);
5698 goto loop;
5699 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00005700 else if (TYPE(n) == argument && NCH(n) == 2 &&
5701 TYPE(CHILD(n, 1)) == gen_for) {
5702 symtable_generator_expression(st, n);
5703 break;
5704 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005705 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005706 case listmaker:
5707 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005708 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005709 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005710 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005711 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00005712 case testlist_gexp:
5713 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
5714 symtable_generator_expression(st, n);
5715 break;
5716 }
5717 /* fall through */
5718
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005719 case atom:
5720 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5721 symtable_add_use(st, STR(CHILD(n, 0)));
5722 break;
5723 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005724 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005725 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005726 /* Walk over every non-token child with a special case
5727 for one child.
5728 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005729 if (NCH(n) == 1) {
5730 n = CHILD(n, 0);
5731 goto loop;
5732 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005733 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005734 if (TYPE(CHILD(n, i)) >= single_input)
5735 symtable_node(st, CHILD(n, i));
5736 }
5737}
5738
5739static void
5740symtable_funcdef(struct symtable *st, node *n)
5741{
5742 node *body;
5743
5744 if (TYPE(n) == lambdef) {
5745 if (NCH(n) == 4)
5746 symtable_params(st, CHILD(n, 1));
5747 } else
5748 symtable_params(st, CHILD(n, 2));
5749 body = CHILD(n, NCH(n) - 1);
5750 symtable_node(st, body);
5751}
5752
5753/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00005754 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005755 which are references in the defining scope. symtable_params()
5756 parses the parameter names, which are defined in the function's
5757 body.
5758
5759 varargslist:
5760 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5761 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5762*/
5763
5764static void
5765symtable_default_args(struct symtable *st, node *n)
5766{
5767 node *c;
5768 int i;
5769
5770 if (TYPE(n) == parameters) {
5771 n = CHILD(n, 1);
5772 if (TYPE(n) == RPAR)
5773 return;
5774 }
5775 REQ(n, varargslist);
5776 for (i = 0; i < NCH(n); i += 2) {
5777 c = CHILD(n, i);
5778 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5779 break;
5780 }
5781 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5782 symtable_node(st, CHILD(n, i));
5783 }
5784}
5785
5786static void
5787symtable_params(struct symtable *st, node *n)
5788{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005789 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00005790 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005791
5792 if (TYPE(n) == parameters) {
5793 n = CHILD(n, 1);
5794 if (TYPE(n) == RPAR)
5795 return;
5796 }
5797 REQ(n, varargslist);
5798 for (i = 0; i < NCH(n); i += 2) {
5799 c = CHILD(n, i);
5800 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5801 ext = 1;
5802 break;
5803 }
5804 if (TYPE(c) == test) {
5805 continue;
5806 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00005807 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005808 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00005809 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005810 char nbuf[30];
5811 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005812 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005813 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005814 }
5815 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005816 if (ext) {
5817 c = CHILD(n, i);
5818 if (TYPE(c) == STAR) {
5819 i++;
5820 symtable_add_def(st, STR(CHILD(n, i)),
5821 DEF_PARAM | DEF_STAR);
5822 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005823 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005824 c = NULL;
5825 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005826 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005827 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005828 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005829 i++;
5830 symtable_add_def(st, STR(CHILD(n, i)),
5831 DEF_PARAM | DEF_DOUBLESTAR);
5832 }
5833 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005834 if (complex >= 0) {
5835 int j;
5836 for (j = 0; j <= complex; j++) {
5837 c = CHILD(n, j);
5838 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005839 c = CHILD(n, ++j);
5840 else if (TYPE(c) == EQUAL)
5841 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005842 if (TYPE(CHILD(c, 0)) == LPAR)
5843 symtable_params_fplist(st, CHILD(c, 1));
5844 }
5845 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005846}
5847
5848static void
5849symtable_params_fplist(struct symtable *st, node *n)
5850{
5851 int i;
5852 node *c;
5853
5854 REQ(n, fplist);
5855 for (i = 0; i < NCH(n); i += 2) {
5856 c = CHILD(n, i);
5857 REQ(c, fpdef);
5858 if (NCH(c) == 1)
5859 symtable_add_def(st, STR(CHILD(c, 0)),
5860 DEF_PARAM | DEF_INTUPLE);
5861 else
5862 symtable_params_fplist(st, CHILD(c, 1));
5863 }
5864
5865}
5866
5867static void
5868symtable_global(struct symtable *st, node *n)
5869{
5870 int i;
5871
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005872 /* XXX It might be helpful to warn about module-level global
5873 statements, but it's hard to tell the difference between
5874 module-level and a string passed to exec.
5875 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005876
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005877 for (i = 1; i < NCH(n); i += 2) {
5878 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005879 int flags;
5880
5881 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005882 if (flags < 0)
5883 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005884 if (flags && flags != DEF_GLOBAL) {
5885 char buf[500];
5886 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005887 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005888 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00005889 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005890 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005891 }
5892 else {
5893 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005894 PyOS_snprintf(buf, sizeof(buf),
5895 GLOBAL_AFTER_ASSIGN,
5896 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005897 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005898 PyOS_snprintf(buf, sizeof(buf),
5899 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005900 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005901 }
5902 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005903 symtable_add_def(st, name, DEF_GLOBAL);
5904 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005905}
5906
5907static void
5908symtable_list_comprehension(struct symtable *st, node *n)
5909{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005910 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005911 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005912
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005913 REQ(n, listmaker);
5914 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
5915 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005916 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005917 symtable_list_for(st, CHILD(n, 1));
5918 symtable_node(st, CHILD(n, 0));
5919 --st->st_cur->ste_tmpname;
5920}
5921
5922static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00005923symtable_generator_expression(struct symtable *st, node *n)
5924{
5925 /* testlist_gexp: test gen_for */
5926 REQ(CHILD(n, 0), test);
5927 REQ(CHILD(n, 1), gen_for);
5928
5929 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
5930 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
5931
5932 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
5933
5934 symtable_gen_for(st, CHILD(n, 1), 1);
5935 symtable_node(st, CHILD(n, 0));
5936 symtable_exit_scope(st);
5937
5938 /* for outmost iterable precomputation */
5939 symtable_node(st, CHILD(CHILD(n, 1), 3));
5940}
5941
5942static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005943symtable_list_for(struct symtable *st, node *n)
5944{
5945 REQ(n, list_for);
5946 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005947 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005948 symtable_node(st, CHILD(n, 3));
5949 if (NCH(n) == 5)
5950 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005951}
5952
5953static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00005954symtable_gen_for(struct symtable *st, node *n, int is_outmost)
5955{
5956 REQ(n, gen_for);
5957
5958 /* gen_for: for v in test [gen_iter] */
5959 symtable_assign(st, CHILD(n, 1), 0);
5960 if (is_outmost)
5961 symtable_add_use(st, "[outmost-iterable]");
5962 else
5963 symtable_node(st, CHILD(n, 3));
5964
5965 if (NCH(n) == 5)
5966 symtable_gen_iter(st, CHILD(n, 4));
5967}
5968
5969static void
5970symtable_gen_iter(struct symtable *st, node *n)
5971{
5972 REQ(n, gen_iter);
5973
5974 n = CHILD(n, 0);
5975 if (TYPE(n) == gen_for)
5976 symtable_gen_for(st, n, 0);
5977 else {
5978 REQ(n, gen_if);
5979 symtable_node(st, CHILD(n, 1));
5980
5981 if (NCH(n) == 3)
5982 symtable_gen_iter(st, CHILD(n, 2));
5983 }
5984}
5985
5986static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005987symtable_import(struct symtable *st, node *n)
5988{
5989 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005990 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005991 | 'from' dotted_name 'import'
5992 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005993 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005994 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005995 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005996 node *dotname = CHILD(n, 1);
5997 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5998 /* check for bogus imports */
5999 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6000 PyErr_SetString(PyExc_SyntaxError,
6001 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006002 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006003 return;
6004 }
6005 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006006 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006007 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006008 if (symtable_warn(st,
6009 "import * only allowed at module level") < 0)
6010 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006011 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006012 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006013 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006014 } else {
6015 for (i = 3; i < NCH(n); i += 2) {
6016 node *c = CHILD(n, i);
6017 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006018 symtable_assign(st, CHILD(c, 2),
6019 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006020 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006021 symtable_assign(st, CHILD(c, 0),
6022 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006023 }
6024 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006025 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006026 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006027 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006028 }
6029 }
6030}
6031
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006032/* The third argument to symatble_assign() is a flag to be passed to
6033 symtable_add_def() if it is eventually called. The flag is useful
6034 to specify the particular type of assignment that should be
6035 recorded, e.g. an assignment caused by import.
6036 */
6037
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006038static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006039symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006040{
6041 node *tmp;
6042 int i;
6043
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006044 loop:
6045 switch (TYPE(n)) {
6046 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006047 /* invalid assignment, e.g. lambda x:x=2. The next
6048 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006049 return;
6050 case power:
6051 if (NCH(n) > 2) {
6052 for (i = 2; i < NCH(n); ++i)
6053 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6054 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006055 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006056 if (NCH(n) > 1) {
6057 symtable_node(st, CHILD(n, 0));
6058 symtable_node(st, CHILD(n, 1));
6059 } else {
6060 n = CHILD(n, 0);
6061 goto loop;
6062 }
6063 return;
6064 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006065 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6066 /* XXX This is an error, but the next pass
6067 will catch it. */
6068 return;
6069 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006070 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006071 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006072 }
6073 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006074 case testlist_gexp:
6075 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6076 /* XXX This is an error, but the next pass
6077 will catch it. */
6078 return;
6079 } else {
6080 for (i = 0; i < NCH(n); i += 2)
6081 symtable_assign(st, CHILD(n, i), def_flag);
6082 }
6083 return;
6084
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006085 case exprlist:
6086 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006087 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006088 if (NCH(n) == 1) {
6089 n = CHILD(n, 0);
6090 goto loop;
6091 }
6092 else {
6093 int i;
6094 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006095 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006096 return;
6097 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006098 case atom:
6099 tmp = CHILD(n, 0);
6100 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6101 n = CHILD(n, 1);
6102 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006103 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006104 if (strcmp(STR(tmp), "__debug__") == 0) {
6105 PyErr_SetString(PyExc_SyntaxError,
6106 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006107 symtable_error(st, n->n_lineno);
6108 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006109 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006110 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006111 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006112 return;
6113 case dotted_as_name:
6114 if (NCH(n) == 3)
6115 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006116 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006117 else
6118 symtable_add_def(st,
6119 STR(CHILD(CHILD(n,
6120 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006121 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006122 return;
6123 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006124 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006125 return;
6126 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006127 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006128 return;
6129 default:
6130 if (NCH(n) == 0)
6131 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006132 if (NCH(n) == 1) {
6133 n = CHILD(n, 0);
6134 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006135 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006136 /* Should only occur for errors like x + 1 = 1,
6137 which will be caught in the next pass. */
6138 for (i = 0; i < NCH(n); ++i)
6139 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006140 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006141 }
6142}