blob: 328c57bb0fd9527ee2747d96c28e51f42518d760 [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 */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000632 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000633 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000634 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000635 int c_nested; /* Is block nested funcdef or lamdef? */
636 int c_closure; /* Is nested w/freevars? */
637 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000638 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000639 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000640};
641
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000642static int
643is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000644{
645 if ((v & (USE | DEF_FREE))
646 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
647 return 1;
648 if (v & DEF_FREE_CLASS)
649 return 1;
650 return 0;
651}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000652
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000653static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000654com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000655{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000656 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
657
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000658 if (c == NULL) {
659 /* Error occurred via symtable call to
660 is_constant_false */
661 PyErr_SetString(exc, msg);
662 return;
663 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000664 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000665 if (c->c_lineno < 1 || c->c_interactive) {
666 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000667 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000668 return;
669 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000670 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000671 if (v == NULL)
672 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000673
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000674 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000675 if (line == NULL) {
676 Py_INCREF(Py_None);
677 line = Py_None;
678 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000679 if (exc == PyExc_SyntaxError) {
680 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
681 Py_None, line);
682 if (t == NULL)
683 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000684 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000685 if (w == NULL)
686 goto exit;
687 PyErr_SetObject(exc, w);
688 } else {
689 /* Make sure additional exceptions are printed with
690 file and line, also. */
691 PyErr_SetObject(exc, v);
692 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
693 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000694 exit:
695 Py_XDECREF(t);
696 Py_XDECREF(v);
697 Py_XDECREF(w);
698 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000699}
700
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000701/* Interface to the block stack */
702
703static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000704block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000705{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000706 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000707 com_error(c, PyExc_SystemError,
708 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000709 }
710 else {
711 c->c_block[c->c_nblocks++] = type;
712 }
713}
714
715static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000716block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000717{
718 if (c->c_nblocks > 0)
719 c->c_nblocks--;
720 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000721 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000722 }
723}
724
Guido van Rossum681d79a1995-07-18 14:51:37 +0000725/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000726
Martin v. Löwis95292d62002-12-11 14:04:59 +0000727static int issue_warning(const char *, const char *, int);
728static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000729static void com_free(struct compiling *);
730static void com_push(struct compiling *, int);
731static void com_pop(struct compiling *, int);
732static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000733static void com_node(struct compiling *, node *);
734static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000735static void com_addbyte(struct compiling *, int);
736static void com_addint(struct compiling *, int);
737static void com_addoparg(struct compiling *, int, int);
738static void com_addfwref(struct compiling *, int, int *);
739static void com_backpatch(struct compiling *, int);
740static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
741static int com_addconst(struct compiling *, PyObject *);
742static int com_addname(struct compiling *, PyObject *);
743static void com_addopname(struct compiling *, int, node *);
744static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000745static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000746static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000747static void com_assign(struct compiling *, node *, int, node *);
748static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000749static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +0000750static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000751 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000752static PyObject *parsestrplus(struct compiling*, node *);
753static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000754static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000755
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000756static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000757
758/* symtable operations */
Jeremy Hylton1955fcf2003-07-15 20:23:26 +0000759static struct symtable *symtable_build(node *, PyFutureFeatures *,
760 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000761static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000762static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000763static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000764static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000765static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000766static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000767
768static void symtable_node(struct symtable *, node *);
769static void symtable_funcdef(struct symtable *, node *);
770static void symtable_default_args(struct symtable *, node *);
771static void symtable_params(struct symtable *, node *);
772static void symtable_params_fplist(struct symtable *, node *n);
773static void symtable_global(struct symtable *, node *);
774static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000775static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000776static void symtable_list_comprehension(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +0000777static void symtable_list_for(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000778
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000779static int symtable_update_free_vars(struct symtable *);
780static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
781static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
782
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000783/* helper */
784static void
785do_pad(int pad)
786{
787 int i;
788 for (i = 0; i < pad; ++i)
789 fprintf(stderr, " ");
790}
791
792static void
793dump(node *n, int pad, int depth)
794{
795 int i;
796 if (depth == 0)
797 return;
798 do_pad(pad);
799 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
800 if (depth > 0)
801 depth--;
802 for (i = 0; i < NCH(n); ++i)
803 dump(CHILD(n, i), pad + 1, depth);
804}
805
806#define DUMP(N) dump(N, 0, -1)
807
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000808static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000809com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000810{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000811 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000812 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
813 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000814 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000815 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000816 goto fail;
817 if ((c->c_const_dict = PyDict_New()) == NULL)
818 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000819 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000820 goto fail;
821 if ((c->c_name_dict = PyDict_New()) == NULL)
822 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000823 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000824 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000825 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
826 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000827 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000828 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000829 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000830 c->c_freevars = NULL;
831 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000832 c->c_nlocals = 0;
833 c->c_argcount = 0;
834 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000835 c->c_nexti = 0;
836 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000837 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000838 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000839 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000840 c->c_begin = 0;
841 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000842 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000843 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000844 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000845 c->c_stacklevel = 0;
846 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000847 c->c_firstlineno = 0;
848 c->c_last_addr = 0;
849 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000850 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000851 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000852 c->c_nested = 0;
853 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000854 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000855 return 1;
856
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000857 fail:
858 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000859 return 0;
860}
861
862static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000863com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000864{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000865 Py_XDECREF(c->c_code);
866 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000867 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000868 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000869 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000870 Py_XDECREF(c->c_globals);
871 Py_XDECREF(c->c_locals);
872 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000873 Py_XDECREF(c->c_freevars);
874 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000875 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000876 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +0000877 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000878}
879
880static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000881com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000882{
883 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000884 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +0000885 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000886 /*
887 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
888 c->c_filename, c->c_name, c->c_lineno,
889 c->c_nexti, c->c_stacklevel, n);
890 */
891 }
Guido van Rossum8b993a91997-01-17 21:04:03 +0000892}
893
894static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000895com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000896{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000897 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000898 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000899 else
900 c->c_stacklevel -= n;
901}
902
903static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000904com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000905{
906 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000907 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000908 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000909 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000910}
911
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000912static int
913com_check_size(PyObject **s, int offset)
914{
915 int len = PyString_GET_SIZE(*s);
916 if (offset >= len)
917 return _PyString_Resize(s, len * 2);
918 return 0;
919}
920
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000921static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000922com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000923{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000924 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000925 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +0000926 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000927 if (com_check_size(&c->c_code, c->c_nexti)) {
928 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000929 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000930 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000931 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000932}
933
934static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000935com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000936{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000937 com_addbyte(c, x & 0xff);
938 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000939}
940
941static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000942com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000943{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000944 char *p;
945 if (c->c_lnotab == NULL)
946 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000947 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
948 c->c_errors++;
949 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000950 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000951 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000952 *p++ = addr;
953 *p++ = line;
954 c->c_lnotab_next += 2;
955}
956
957static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000958com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000959{
960 c->c_lineno = lineno;
961 if (c->c_firstlineno == 0) {
962 c->c_firstlineno = c->c_last_line = lineno;
963 }
964 else {
965 int incr_addr = c->c_nexti - c->c_last_addr;
966 int incr_line = lineno - c->c_last_line;
Tim Peters2a7f3842001-06-09 09:26:21 +0000967 while (incr_addr > 255) {
968 com_add_lnotab(c, 255, 0);
969 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000970 }
Tim Peters2a7f3842001-06-09 09:26:21 +0000971 while (incr_line > 255) {
972 com_add_lnotab(c, incr_addr, 255);
973 incr_line -=255;
974 incr_addr = 0;
975 }
976 if (incr_addr > 0 || incr_line > 0)
977 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000978 c->c_last_addr = c->c_nexti;
979 c->c_last_line = lineno;
980 }
981}
982
983static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000984com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000985{
Fred Drakeef8ace32000-08-24 00:32:09 +0000986 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +0000987 if (extended_arg){
988 com_addbyte(c, EXTENDED_ARG);
989 com_addint(c, extended_arg);
990 arg &= 0xffff;
991 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000992 com_addbyte(c, op);
993 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000994}
995
996static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000997com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000998{
999 /* Compile a forward reference for backpatching */
1000 int here;
1001 int anchor;
1002 com_addbyte(c, op);
1003 here = c->c_nexti;
1004 anchor = *p_anchor;
1005 *p_anchor = here;
1006 com_addint(c, anchor == 0 ? 0 : here - anchor);
1007}
1008
1009static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001010com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001011{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001012 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001013 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001014 int dist;
1015 int prev;
1016 for (;;) {
1017 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001018 prev = code[anchor] + (code[anchor+1] << 8);
1019 dist = target - (anchor+2);
1020 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001021 dist >>= 8;
1022 code[anchor+1] = dist;
1023 dist >>= 8;
1024 if (dist) {
1025 com_error(c, PyExc_SystemError,
1026 "com_backpatch: offset too large");
1027 break;
1028 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001029 if (!prev)
1030 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001031 anchor -= prev;
1032 }
1033}
1034
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001035/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001036
1037static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001038com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001039{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001040 PyObject *w, *t, *np=NULL;
1041 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001042
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001043 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001044 if (t == NULL)
1045 goto fail;
1046 w = PyDict_GetItem(dict, t);
1047 if (w != NULL) {
1048 n = PyInt_AsLong(w);
1049 } else {
1050 n = PyList_Size(list);
1051 np = PyInt_FromLong(n);
1052 if (np == NULL)
1053 goto fail;
1054 if (PyList_Append(list, v) != 0)
1055 goto fail;
1056 if (PyDict_SetItem(dict, t, np) != 0)
1057 goto fail;
1058 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001059 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001060 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001061 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001062 fail:
1063 Py_XDECREF(np);
1064 Py_XDECREF(t);
1065 c->c_errors++;
1066 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001067}
1068
1069static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001070com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001071{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001072 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001073}
1074
1075static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001076com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001077{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001078 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001079}
1080
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001081int
1082_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001083{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001084 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001085 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001086 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001087 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1088 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001089 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001090 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001091 return 0; /* Don't mangle __extremely_long_names */
1092 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1093 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001094 /* Strip leading underscores from class name */
1095 while (*p == '_')
1096 p++;
1097 if (*p == '\0')
1098 return 0; /* Don't mangle if class is just underscores */
1099 plen = strlen(p);
1100 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001101 plen = maxlen-nlen-2; /* Truncate class name if too long */
1102 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001103 buffer[0] = '_';
1104 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001105 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001106 return 1;
1107}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001108
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001109static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001110com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001111{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001112 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001113 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001114 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001115
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001116 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001117 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001118 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001119 c->c_errors++;
1120 i = 255;
1121 }
1122 else {
1123 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001124 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001125 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001126 com_addoparg(c, op, i);
1127}
1128
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001129#define NAME_LOCAL 0
1130#define NAME_GLOBAL 1
1131#define NAME_DEFAULT 2
1132#define NAME_CLOSURE 3
1133
1134static int
1135com_lookup_arg(PyObject *dict, PyObject *name)
1136{
1137 PyObject *v = PyDict_GetItem(dict, name);
1138 if (v == NULL)
1139 return -1;
1140 else
1141 return PyInt_AS_LONG(v);
1142}
1143
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001144static int
1145none_assignment_check(struct compiling *c, char *name, int assigning)
1146{
1147 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1148 char *msg;
1149 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001150 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001151 else
1152 msg = "deleting None";
1153 if (issue_warning(msg, c->c_filename, c->c_lineno) < 0) {
1154 c->c_errors++;
1155 return -1;
1156 }
1157 }
1158 return 0;
1159}
1160
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001161static void
1162com_addop_varname(struct compiling *c, int kind, char *name)
1163{
1164 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001165 int i, reftype;
1166 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001167 int op = STOP_CODE;
1168 char buffer[MANGLE_LEN];
1169
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001170 if (kind != VAR_LOAD &&
1171 none_assignment_check(c, name, kind == VAR_STORE))
1172 {
1173 c->c_errors++;
1174 i = 255;
1175 goto done;
1176 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001177 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001178 name = buffer;
1179 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1180 c->c_errors++;
1181 i = 255;
1182 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001183 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001184
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001185 reftype = get_ref_type(c, name);
1186 switch (reftype) {
1187 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001188 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001189 scope = NAME_LOCAL;
1190 break;
1191 case GLOBAL_EXPLICIT:
1192 scope = NAME_GLOBAL;
1193 break;
1194 case GLOBAL_IMPLICIT:
1195 if (c->c_flags & CO_OPTIMIZED)
1196 scope = NAME_GLOBAL;
1197 break;
1198 case FREE:
1199 case CELL:
1200 scope = NAME_CLOSURE;
1201 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001202 }
1203
1204 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001205 if (scope == NAME_LOCAL)
1206 i = com_lookup_arg(c->c_locals, v);
1207 else if (reftype == FREE)
1208 i = com_lookup_arg(c->c_freevars, v);
1209 else if (reftype == CELL)
1210 i = com_lookup_arg(c->c_cellvars, v);
1211 if (i == -1) {
1212 c->c_errors++; /* XXX no exception set */
1213 i = 255;
1214 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001215 }
1216 Py_DECREF(v);
1217
1218 switch (kind) {
1219 case VAR_LOAD:
1220 switch (scope) {
1221 case NAME_LOCAL:
1222 op = LOAD_FAST;
1223 break;
1224 case NAME_GLOBAL:
1225 op = LOAD_GLOBAL;
1226 break;
1227 case NAME_DEFAULT:
1228 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001229 break;
1230 case NAME_CLOSURE:
1231 op = LOAD_DEREF;
1232 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001233 }
1234 break;
1235 case VAR_STORE:
1236 switch (scope) {
1237 case NAME_LOCAL:
1238 op = STORE_FAST;
1239 break;
1240 case NAME_GLOBAL:
1241 op = STORE_GLOBAL;
1242 break;
1243 case NAME_DEFAULT:
1244 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001245 break;
1246 case NAME_CLOSURE:
1247 op = STORE_DEREF;
1248 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001249 }
1250 break;
1251 case VAR_DELETE:
1252 switch (scope) {
1253 case NAME_LOCAL:
1254 op = DELETE_FAST;
1255 break;
1256 case NAME_GLOBAL:
1257 op = DELETE_GLOBAL;
1258 break;
1259 case NAME_DEFAULT:
1260 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001261 break;
1262 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001263 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001264 PyOS_snprintf(buf, sizeof(buf),
1265 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001266 com_error(c, PyExc_SyntaxError, buf);
1267 i = 255;
1268 break;
1269 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001270 }
1271 break;
1272 }
1273done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001274 com_addoparg(c, op, i);
1275}
1276
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001277static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001278com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001279{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001280 char *name;
1281 char buffer[1000];
1282 /* XXX it is possible to write this code without the 1000
1283 chars on the total length of dotted names, I just can't be
1284 bothered right now */
1285 if (TYPE(n) == STAR)
1286 name = "*";
1287 else if (TYPE(n) == dotted_name) {
1288 char *p = buffer;
1289 int i;
1290 name = buffer;
1291 for (i = 0; i < NCH(n); i += 2) {
1292 char *s = STR(CHILD(n, i));
1293 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001294 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001295 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001296 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001297 break;
1298 }
1299 if (p != buffer)
1300 *p++ = '.';
1301 strcpy(p, s);
1302 p = strchr(p, '\0');
1303 }
1304 }
1305 else {
1306 REQ(n, NAME);
1307 name = STR(n);
1308 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001309 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001310}
1311
Guido van Rossum79f25d91997-04-29 20:08:16 +00001312static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001313parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001314{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001315 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001316 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001317 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001318#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001319 int imflag;
1320#endif
1321
Guido van Rossum282914b1991-04-04 10:42:56 +00001322 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001323 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001324#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001325 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001326#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001327 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001328 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001329 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001330 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001331 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001332 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001333 }
1334 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001335 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001336 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001337 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001338 if (errno != 0)
1339 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001340 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001341 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001342 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001343#ifndef WITHOUT_COMPLEX
1344 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001345 Py_complex z;
1346 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001347 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001348 z.imag = atof(s);
1349 PyFPE_END_PROTECT(z)
1350 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001351 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001352 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001353#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001354 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001355 PyFPE_START_PROTECT("atof", return 0)
1356 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001357 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001358 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001359 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001360}
1361
Guido van Rossum79f25d91997-04-29 20:08:16 +00001362static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001363decode_utf8(char **sPtr, char *end, char* encoding)
1364{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001365#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001366 Py_FatalError("decode_utf8 should not be called in this build.");
1367 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001368#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001369 PyObject *u, *v;
1370 char *s, *t;
1371 t = s = *sPtr;
1372 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1373 while (s < end && (*s & 0x80)) s++;
1374 *sPtr = s;
1375 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1376 if (u == NULL)
1377 return NULL;
1378 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1379 Py_DECREF(u);
1380 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001381#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001382}
1383
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001384/* compiler.transformer.Transformer.decode_literal depends on what
1385 might seem like minor details of this function -- changes here
1386 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001387static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001388parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001389{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001390 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001391 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001392 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001393 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001394 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001395 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001396 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001397
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001398 if (isalpha(quote) || quote == '_') {
1399 if (quote == 'u' || quote == 'U') {
1400 quote = *++s;
1401 unicode = 1;
1402 }
1403 if (quote == 'r' || quote == 'R') {
1404 quote = *++s;
1405 rawmode = 1;
1406 }
1407 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001408 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001409 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001410 return NULL;
1411 }
1412 s++;
1413 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001414 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001415 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001416 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001417 return NULL;
1418 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001419 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001420 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001421 return NULL;
1422 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001423 if (len >= 4 && s[0] == quote && s[1] == quote) {
1424 s += 2;
1425 len -= 2;
1426 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001427 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001428 return NULL;
1429 }
1430 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001431#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001432 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001433 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001434 char *buf;
1435 char *p;
1436 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001437 if (encoding == NULL) {
1438 buf = s;
1439 u = NULL;
1440 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1441 buf = s;
1442 u = NULL;
1443 } else {
1444 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1445 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1446 if (u == NULL)
1447 return NULL;
1448 p = buf = PyString_AsString(u);
1449 end = s + len;
1450 while (s < end) {
1451 if (*s == '\\') {
1452 *p++ = *s++;
1453 if (*s & 0x80) {
1454 strcpy(p, "u005c");
1455 p += 5;
1456 }
1457 }
1458 if (*s & 0x80) { /* XXX inefficient */
1459 char *r;
1460 int rn, i;
1461 w = decode_utf8(&s, end, "utf-16-be");
1462 if (w == NULL) {
1463 Py_DECREF(u);
1464 return NULL;
1465 }
1466 r = PyString_AsString(w);
1467 rn = PyString_Size(w);
1468 assert(rn % 2 == 0);
1469 for (i = 0; i < rn; i += 2) {
1470 sprintf(p, "\\u%02x%02x",
1471 r[i + 0] & 0xFF,
1472 r[i + 1] & 0xFF);
1473 p += 6;
1474 }
1475 Py_DECREF(w);
1476 } else {
1477 *p++ = *s++;
1478 }
1479 }
1480 len = p - buf;
1481 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001482 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001483 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001484 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001485 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1486 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001487 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001488 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001489 return v;
1490
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001491 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001492#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001493 need_encoding = (encoding != NULL &&
1494 strcmp(encoding, "utf-8") != 0 &&
1495 strcmp(encoding, "iso-8859-1") != 0);
1496 if (rawmode || strchr(s, '\\') == NULL) {
1497 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001498#ifndef Py_USING_UNICODE
1499 /* This should not happen - we never see any other
1500 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001501 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001502#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001503 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1504 if (u == NULL)
1505 return NULL;
1506 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1507 Py_DECREF(u);
1508 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001509#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001510 } else {
1511 return PyString_FromStringAndSize(s, len);
1512 }
1513 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001514
1515 v = PyString_DecodeEscape(s, len, NULL, unicode,
1516 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001517 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001518 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001519 return v;
1520}
1521
Guido van Rossum79f25d91997-04-29 20:08:16 +00001522static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001523parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001524{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001525 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001526 int i;
1527 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001528 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001529 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001530 for (i = 1; i < NCH(n); i++) {
1531 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001532 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001533 if (s == NULL)
1534 goto onError;
1535 if (PyString_Check(v) && PyString_Check(s)) {
1536 PyString_ConcatAndDel(&v, s);
1537 if (v == NULL)
1538 goto onError;
1539 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001540#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001541 else {
1542 PyObject *temp;
1543 temp = PyUnicode_Concat(v, s);
1544 Py_DECREF(s);
1545 if (temp == NULL)
1546 goto onError;
1547 Py_DECREF(v);
1548 v = temp;
1549 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001550#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001551 }
1552 }
1553 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001554
1555 onError:
1556 Py_XDECREF(v);
1557 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001558}
1559
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001560static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001561com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001562{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001563 int anchor = 0;
1564 int save_begin = c->c_begin;
1565
1566 /* list_iter: for v in expr [list_iter] */
1567 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001568 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001569 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001570 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001571 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001572 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001573 c->c_loops++;
1574 com_list_iter(c, n, e, t);
1575 c->c_loops--;
1576 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1577 c->c_begin = save_begin;
1578 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001579 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001580}
1581
1582static void
1583com_list_if(struct compiling *c, node *n, node *e, char *t)
1584{
1585 int anchor = 0;
1586 int a = 0;
1587 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001588 com_node(c, CHILD(n, 1));
1589 com_addfwref(c, JUMP_IF_FALSE, &a);
1590 com_addbyte(c, POP_TOP);
1591 com_pop(c, 1);
1592 com_list_iter(c, n, e, t);
1593 com_addfwref(c, JUMP_FORWARD, &anchor);
1594 com_backpatch(c, a);
1595 /* We jump here with an extra entry which we now pop */
1596 com_addbyte(c, POP_TOP);
1597 com_backpatch(c, anchor);
1598}
1599
1600static void
1601com_list_iter(struct compiling *c,
1602 node *p, /* parent of list_iter node */
1603 node *e, /* element expression node */
1604 char *t /* name of result list temp local */)
1605{
1606 /* list_iter is the last child in a listmaker, list_for, or list_if */
1607 node *n = CHILD(p, NCH(p)-1);
1608 if (TYPE(n) == list_iter) {
1609 n = CHILD(n, 0);
1610 switch (TYPE(n)) {
1611 case list_for:
1612 com_list_for(c, n, e, t);
1613 break;
1614 case list_if:
1615 com_list_if(c, n, e, t);
1616 break;
1617 default:
1618 com_error(c, PyExc_SystemError,
1619 "invalid list_iter node type");
1620 }
1621 }
1622 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001623 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001624 com_push(c, 1);
1625 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001626 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001627 com_pop(c, 2);
1628 }
1629}
1630
1631static void
1632com_list_comprehension(struct compiling *c, node *n)
1633{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001634 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001635 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001636
1637 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001638 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001639 com_addoparg(c, BUILD_LIST, 0);
1640 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1641 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001642 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001643 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001644 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001645 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001646 --c->c_tmpname;
1647}
1648
1649static void
1650com_listmaker(struct compiling *c, node *n)
1651{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001652 /* listmaker: test ( list_for | (',' test)* [','] ) */
1653 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001654 com_list_comprehension(c, n);
1655 else {
1656 int len = 0;
1657 int i;
1658 for (i = 0; i < NCH(n); i += 2, len++)
1659 com_node(c, CHILD(n, i));
1660 com_addoparg(c, BUILD_LIST, len);
1661 com_pop(c, len-1);
1662 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001663}
1664
1665static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001666com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001667{
1668 int i;
1669 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1670 for (i = 0; i+2 < NCH(n); i += 4) {
1671 /* We must arrange things just right for STORE_SUBSCR.
1672 It wants the stack to look like (value) (dict) (key) */
1673 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001674 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001675 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00001676 com_node(c, CHILD(n, i+2)); /* value */
1677 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001678 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001679 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001680 }
1681}
1682
1683static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001684com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001685{
1686 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001687 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001688 int i;
1689 REQ(n, atom);
1690 ch = CHILD(n, 0);
1691 switch (TYPE(ch)) {
1692 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001693 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001694 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001695 com_push(c, 1);
1696 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001697 else
1698 com_node(c, CHILD(n, 1));
1699 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001700 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001701 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001702 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001703 com_push(c, 1);
1704 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001705 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001706 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001707 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001708 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001709 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001710 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001711 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001712 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001713 break;
1714 case BACKQUOTE:
1715 com_node(c, CHILD(n, 1));
1716 com_addbyte(c, UNARY_CONVERT);
1717 break;
1718 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001719 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001720 i = 255;
1721 }
1722 else {
1723 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001724 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001725 }
1726 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001727 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001728 break;
1729 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001730 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001731 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001732 c->c_errors++;
1733 i = 255;
1734 }
1735 else {
1736 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001737 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001738 }
1739 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001740 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001741 break;
1742 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001743 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001744 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001745 break;
1746 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001747 com_error(c, PyExc_SystemError,
1748 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001749 }
1750}
1751
1752static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001753com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001754{
1755 if (NCH(n) == 1) {
1756 com_addbyte(c, op);
1757 }
1758 else if (NCH(n) == 2) {
1759 if (TYPE(CHILD(n, 0)) != COLON) {
1760 com_node(c, CHILD(n, 0));
1761 com_addbyte(c, op+1);
1762 }
1763 else {
1764 com_node(c, CHILD(n, 1));
1765 com_addbyte(c, op+2);
1766 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001767 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001768 }
1769 else {
1770 com_node(c, CHILD(n, 0));
1771 com_node(c, CHILD(n, 2));
1772 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001773 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001774 }
1775}
1776
Guido van Rossum635abd21997-01-06 22:56:52 +00001777static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001778com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1779{
1780 if (NCH(n) == 1) {
1781 com_addbyte(c, DUP_TOP);
1782 com_push(c, 1);
1783 com_addbyte(c, SLICE);
1784 com_node(c, augn);
1785 com_addbyte(c, opcode);
1786 com_pop(c, 1);
1787 com_addbyte(c, ROT_TWO);
1788 com_addbyte(c, STORE_SLICE);
1789 com_pop(c, 2);
1790 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1791 com_node(c, CHILD(n, 0));
1792 com_addoparg(c, DUP_TOPX, 2);
1793 com_push(c, 2);
1794 com_addbyte(c, SLICE+1);
1795 com_pop(c, 1);
1796 com_node(c, augn);
1797 com_addbyte(c, opcode);
1798 com_pop(c, 1);
1799 com_addbyte(c, ROT_THREE);
1800 com_addbyte(c, STORE_SLICE+1);
1801 com_pop(c, 3);
1802 } else if (NCH(n) == 2) {
1803 com_node(c, CHILD(n, 1));
1804 com_addoparg(c, DUP_TOPX, 2);
1805 com_push(c, 2);
1806 com_addbyte(c, SLICE+2);
1807 com_pop(c, 1);
1808 com_node(c, augn);
1809 com_addbyte(c, opcode);
1810 com_pop(c, 1);
1811 com_addbyte(c, ROT_THREE);
1812 com_addbyte(c, STORE_SLICE+2);
1813 com_pop(c, 3);
1814 } else {
1815 com_node(c, CHILD(n, 0));
1816 com_node(c, CHILD(n, 2));
1817 com_addoparg(c, DUP_TOPX, 3);
1818 com_push(c, 3);
1819 com_addbyte(c, SLICE+3);
1820 com_pop(c, 2);
1821 com_node(c, augn);
1822 com_addbyte(c, opcode);
1823 com_pop(c, 1);
1824 com_addbyte(c, ROT_FOUR);
1825 com_addbyte(c, STORE_SLICE+3);
1826 com_pop(c, 4);
1827 }
1828}
1829
1830static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001831com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001832{
1833 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001834 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001835 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001836 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001837 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001838 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001839 }
1840 else {
1841 com_node(c, CHILD(n, 0));
1842 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001843 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001844 }
1845 m = n;
1846 do {
1847 m = CHILD(m, 0);
1848 } while (NCH(m) == 1);
1849 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001850 /* f(lambda x: x[0] = 3) ends up getting parsed with
1851 * LHS test = lambda x: x[0], and RHS test = 3.
1852 * SF bug 132313 points out that complaining about a keyword
1853 * then is very confusing.
1854 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001855 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001856 TYPE(m) == lambdef ?
1857 "lambda cannot contain assignment" :
1858 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001859 }
1860 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001861 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00001862 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00001863 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001864 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001865 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001866 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001867 else if (*pkeywords == NULL) {
1868 c->c_errors++;
1869 Py_DECREF(v);
1870 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001871 if (PyDict_GetItem(*pkeywords, v) != NULL)
1872 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001873 "duplicate keyword argument");
1874 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001875 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001876 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001877 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001878 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001879 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001880 }
1881 }
1882 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001883}
1884
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001885static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001886com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001887{
1888 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001889 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001890 }
1891 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001892 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001893 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001894 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001895 int star_flag = 0;
1896 int starstar_flag = 0;
1897 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001898 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001899 na = 0;
1900 nk = 0;
1901 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001902 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001903 if (TYPE(ch) == STAR ||
1904 TYPE(ch) == DOUBLESTAR)
1905 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001906 if (ch->n_lineno != lineno) {
1907 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001908 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00001909 }
1910 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001911 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001912 na++;
1913 else
1914 nk++;
1915 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001916 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001917 while (i < NCH(n)) {
1918 node *tok = CHILD(n, i);
1919 node *ch = CHILD(n, i+1);
1920 i += 3;
1921 switch (TYPE(tok)) {
1922 case STAR: star_flag = 1; break;
1923 case DOUBLESTAR: starstar_flag = 1; break;
1924 }
1925 com_node(c, ch);
1926 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001927 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001928 com_error(c, PyExc_SyntaxError,
1929 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001930 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001931 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001932 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001933 star_flag + (starstar_flag << 1);
1934 else
1935 opcode = CALL_FUNCTION;
1936 com_addoparg(c, opcode, na | (nk << 8));
1937 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001938 }
1939}
1940
1941static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001942com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001943{
1944 com_addopname(c, LOAD_ATTR, n);
1945}
1946
1947static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001948com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001949{
1950 int i=0;
1951 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001952 node *ch;
1953
1954 /* first argument */
1955 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001956 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001957 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001958 i++;
1959 }
1960 else {
1961 com_node(c, CHILD(n,i));
1962 i++;
1963 REQ(CHILD(n,i),COLON);
1964 i++;
1965 }
1966 /* second argument */
1967 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1968 com_node(c, CHILD(n,i));
1969 i++;
1970 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001971 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001972 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001973 com_push(c, 1);
1974 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001975 /* remaining arguments */
1976 for (; i < NCH(n); i++) {
1977 ns++;
1978 ch=CHILD(n,i);
1979 REQ(ch, sliceop);
1980 if (NCH(ch) == 1) {
1981 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001982 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001983 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001984 }
1985 else
1986 com_node(c, CHILD(ch,1));
1987 }
1988 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001989 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001990}
1991
1992static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001993com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001994{
1995 node *ch;
1996 REQ(n, subscript);
1997 ch = CHILD(n,0);
1998 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001999 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002000 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002001 com_push(c, 1);
2002 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002003 else {
2004 /* check for slice */
2005 if ((TYPE(ch) == COLON || NCH(n) > 1))
2006 com_sliceobj(c, n);
2007 else {
2008 REQ(ch, test);
2009 com_node(c, ch);
2010 }
2011 }
2012}
2013
2014static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002015com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002016{
2017 int i, op;
2018 REQ(n, subscriptlist);
2019 /* Check to make backward compatible slice behavior for '[i:j]' */
2020 if (NCH(n) == 1) {
2021 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002022 /* 'Basic' slice, should have exactly one colon. */
2023 if ((TYPE(CHILD(sub, 0)) == COLON
2024 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2025 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2026 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002027 switch (assigning) {
2028 case OP_DELETE:
2029 op = DELETE_SLICE;
2030 break;
2031 case OP_ASSIGN:
2032 op = STORE_SLICE;
2033 break;
2034 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002035 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002036 break;
2037 default:
2038 com_augassign_slice(c, sub, assigning, augn);
2039 return;
2040 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002041 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002042 if (op == STORE_SLICE)
2043 com_pop(c, 2);
2044 else if (op == DELETE_SLICE)
2045 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002046 return;
2047 }
2048 }
2049 /* Else normal subscriptlist. Compile each subscript. */
2050 for (i = 0; i < NCH(n); i += 2)
2051 com_subscript(c, CHILD(n, i));
2052 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002053 if (NCH(n) > 1) {
2054 i = (NCH(n)+1) / 2;
2055 com_addoparg(c, BUILD_TUPLE, i);
2056 com_pop(c, i-1);
2057 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002058 switch (assigning) {
2059 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002060 op = DELETE_SUBSCR;
2061 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002062 break;
2063 default:
2064 case OP_ASSIGN:
2065 op = STORE_SUBSCR;
2066 i = 3;
2067 break;
2068 case OP_APPLY:
2069 op = BINARY_SUBSCR;
2070 i = 1;
2071 break;
2072 }
2073 if (assigning > OP_APPLY) {
2074 com_addoparg(c, DUP_TOPX, 2);
2075 com_push(c, 2);
2076 com_addbyte(c, BINARY_SUBSCR);
2077 com_pop(c, 1);
2078 com_node(c, augn);
2079 com_addbyte(c, assigning);
2080 com_pop(c, 1);
2081 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002082 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002083 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002084 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002085}
2086
2087static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002088com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002089{
2090 REQ(n, trailer);
2091 switch (TYPE(CHILD(n, 0))) {
2092 case LPAR:
2093 com_call_function(c, CHILD(n, 1));
2094 break;
2095 case DOT:
2096 com_select_member(c, CHILD(n, 1));
2097 break;
2098 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002099 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002100 break;
2101 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002102 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002103 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002104 }
2105}
2106
2107static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002108com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002109{
2110 int i;
2111 REQ(n, power);
2112 com_atom(c, CHILD(n, 0));
2113 for (i = 1; i < NCH(n); i++) {
2114 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2115 com_factor(c, CHILD(n, i+1));
2116 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002117 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002118 break;
2119 }
2120 else
2121 com_apply_trailer(c, CHILD(n, i));
2122 }
2123}
2124
2125static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002126com_invert_constant(struct compiling *c, node *n)
2127{
2128 /* Compute the inverse of int and longs and use them directly,
2129 but be prepared to generate code for all other
2130 possibilities (invalid numbers, floats, complex).
2131 */
2132 PyObject *num, *inv = NULL;
2133 int i;
2134
2135 REQ(n, NUMBER);
2136 num = parsenumber(c, STR(n));
2137 if (num == NULL)
2138 i = 255;
2139 else {
2140 inv = PyNumber_Invert(num);
2141 if (inv == NULL) {
2142 PyErr_Clear();
2143 i = com_addconst(c, num);
2144 } else {
2145 i = com_addconst(c, inv);
2146 Py_DECREF(inv);
2147 }
2148 Py_DECREF(num);
2149 }
2150 com_addoparg(c, LOAD_CONST, i);
2151 com_push(c, 1);
2152 if (num != NULL && inv == NULL)
2153 com_addbyte(c, UNARY_INVERT);
2154}
2155
Tim Peters51e26512001-09-07 08:45:55 +00002156static int
2157is_float_zero(const char *p)
2158{
2159 int found_radix_point = 0;
2160 int ch;
2161 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2162 switch (ch) {
2163 case '0':
2164 /* no reason to believe it's not 0 -- continue */
2165 break;
2166
2167 case 'e': case 'E': case 'j': case 'J':
2168 /* If this was a hex constant, we already would have
2169 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2170 must be an exponent marker, and we haven't yet
2171 seen a non-zero digit, and it doesn't matter what
2172 the exponent is then. For 'j' or 'J' similarly,
2173 except that this is an imaginary 0 then. */
2174 return 1;
2175
2176 case '.':
2177 found_radix_point = 1;
2178 break;
2179
2180 default:
2181 return 0;
2182 }
2183 }
2184 return found_radix_point;
2185}
2186
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002187static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002188com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002189{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002190 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002191 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002192 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002193 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002194 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002195 approriate value as a constant. If the value is negative,
2196 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002197 negative in the 0th position -- unless we're doing unary minus
2198 of a floating zero! In that case the sign is significant, but
2199 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002200 */
2201 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002202 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002203 && TYPE((pfactor = CHILD(n, 1))) == factor
2204 && NCH(pfactor) == 1
2205 && TYPE((ppower = CHILD(pfactor, 0))) == power
2206 && NCH(ppower) == 1
2207 && TYPE((patom = CHILD(ppower, 0))) == atom
2208 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002209 && !(childtype == MINUS &&
2210 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002211 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002212 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002213 return;
2214 }
2215 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002216 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002217 if (s == NULL) {
2218 com_error(c, PyExc_MemoryError, "");
2219 com_addbyte(c, 255);
2220 return;
2221 }
2222 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002223 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002224 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002225 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002226 }
Tim Peters51e26512001-09-07 08:45:55 +00002227 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002228 }
2229 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002230 com_factor(c, CHILD(n, 1));
2231 com_addbyte(c, UNARY_POSITIVE);
2232 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002233 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002234 com_factor(c, CHILD(n, 1));
2235 com_addbyte(c, UNARY_NEGATIVE);
2236 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002237 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002238 com_factor(c, CHILD(n, 1));
2239 com_addbyte(c, UNARY_INVERT);
2240 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002241 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002242 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002243 }
2244}
2245
2246static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002247com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002248{
2249 int i;
2250 int op;
2251 REQ(n, term);
2252 com_factor(c, CHILD(n, 0));
2253 for (i = 2; i < NCH(n); i += 2) {
2254 com_factor(c, CHILD(n, i));
2255 switch (TYPE(CHILD(n, i-1))) {
2256 case STAR:
2257 op = BINARY_MULTIPLY;
2258 break;
2259 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002260 if (c->c_flags & CO_FUTURE_DIVISION)
2261 op = BINARY_TRUE_DIVIDE;
2262 else
2263 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002264 break;
2265 case PERCENT:
2266 op = BINARY_MODULO;
2267 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002268 case DOUBLESLASH:
2269 op = BINARY_FLOOR_DIVIDE;
2270 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002271 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002272 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002273 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002274 op = 255;
2275 }
2276 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002277 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002278 }
2279}
2280
2281static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002282com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002283{
2284 int i;
2285 int op;
2286 REQ(n, arith_expr);
2287 com_term(c, CHILD(n, 0));
2288 for (i = 2; i < NCH(n); i += 2) {
2289 com_term(c, CHILD(n, i));
2290 switch (TYPE(CHILD(n, i-1))) {
2291 case PLUS:
2292 op = BINARY_ADD;
2293 break;
2294 case MINUS:
2295 op = BINARY_SUBTRACT;
2296 break;
2297 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002298 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002299 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002300 op = 255;
2301 }
2302 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002303 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002304 }
2305}
2306
2307static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002308com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002309{
2310 int i;
2311 int op;
2312 REQ(n, shift_expr);
2313 com_arith_expr(c, CHILD(n, 0));
2314 for (i = 2; i < NCH(n); i += 2) {
2315 com_arith_expr(c, CHILD(n, i));
2316 switch (TYPE(CHILD(n, i-1))) {
2317 case LEFTSHIFT:
2318 op = BINARY_LSHIFT;
2319 break;
2320 case RIGHTSHIFT:
2321 op = BINARY_RSHIFT;
2322 break;
2323 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002324 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002325 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002326 op = 255;
2327 }
2328 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002329 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002330 }
2331}
2332
2333static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002334com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002335{
2336 int i;
2337 int op;
2338 REQ(n, and_expr);
2339 com_shift_expr(c, CHILD(n, 0));
2340 for (i = 2; i < NCH(n); i += 2) {
2341 com_shift_expr(c, CHILD(n, i));
2342 if (TYPE(CHILD(n, i-1)) == AMPER) {
2343 op = BINARY_AND;
2344 }
2345 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002346 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002347 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002348 op = 255;
2349 }
2350 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002351 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002352 }
2353}
2354
2355static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002356com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002357{
2358 int i;
2359 int op;
2360 REQ(n, xor_expr);
2361 com_and_expr(c, CHILD(n, 0));
2362 for (i = 2; i < NCH(n); i += 2) {
2363 com_and_expr(c, CHILD(n, i));
2364 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2365 op = BINARY_XOR;
2366 }
2367 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002368 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002369 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002370 op = 255;
2371 }
2372 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002373 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002374 }
2375}
2376
2377static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002378com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002379{
2380 int i;
2381 int op;
2382 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002383 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002384 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002385 com_xor_expr(c, CHILD(n, i));
2386 if (TYPE(CHILD(n, i-1)) == VBAR) {
2387 op = BINARY_OR;
2388 }
2389 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002390 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002391 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002392 op = 255;
2393 }
2394 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002395 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002396 }
2397}
2398
2399static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002400cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002401{
2402 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00002403 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002404 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2405 if (NCH(n) == 1) {
2406 n = CHILD(n, 0);
2407 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002408 case LESS: return PyCmp_LT;
2409 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00002410 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00002411 case LESSEQUAL: return PyCmp_LE;
2412 case GREATEREQUAL: return PyCmp_GE;
2413 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2414 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2415 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002416 }
2417 }
2418 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002419 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002420 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002421 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002422 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002423 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002424 }
2425 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002426 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002427}
2428
2429static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002430com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002431{
2432 int i;
2433 enum cmp_op op;
2434 int anchor;
2435 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2436 com_expr(c, CHILD(n, 0));
2437 if (NCH(n) == 1)
2438 return;
2439
2440 /****************************************************************
2441 The following code is generated for all but the last
2442 comparison in a chain:
2443
2444 label: on stack: opcode: jump to:
2445
2446 a <code to load b>
2447 a, b DUP_TOP
2448 a, b, b ROT_THREE
2449 b, a, b COMPARE_OP
2450 b, 0-or-1 JUMP_IF_FALSE L1
2451 b, 1 POP_TOP
2452 b
2453
2454 We are now ready to repeat this sequence for the next
2455 comparison in the chain.
2456
2457 For the last we generate:
2458
2459 b <code to load c>
2460 b, c COMPARE_OP
2461 0-or-1
2462
2463 If there were any jumps to L1 (i.e., there was more than one
2464 comparison), we generate:
2465
2466 0-or-1 JUMP_FORWARD L2
2467 L1: b, 0 ROT_TWO
2468 0, b POP_TOP
2469 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002470 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002471 ****************************************************************/
2472
2473 anchor = 0;
2474
2475 for (i = 2; i < NCH(n); i += 2) {
2476 com_expr(c, CHILD(n, i));
2477 if (i+2 < NCH(n)) {
2478 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002479 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002480 com_addbyte(c, ROT_THREE);
2481 }
2482 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002483 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002484 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002485 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002486 }
2487 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002488 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002489 if (i+2 < NCH(n)) {
2490 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2491 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002492 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002493 }
2494 }
2495
2496 if (anchor) {
2497 int anchor2 = 0;
2498 com_addfwref(c, JUMP_FORWARD, &anchor2);
2499 com_backpatch(c, anchor);
2500 com_addbyte(c, ROT_TWO);
2501 com_addbyte(c, POP_TOP);
2502 com_backpatch(c, anchor2);
2503 }
2504}
2505
2506static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002507com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002508{
2509 REQ(n, not_test); /* 'not' not_test | comparison */
2510 if (NCH(n) == 1) {
2511 com_comparison(c, CHILD(n, 0));
2512 }
2513 else {
2514 com_not_test(c, CHILD(n, 1));
2515 com_addbyte(c, UNARY_NOT);
2516 }
2517}
2518
2519static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002520com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002521{
2522 int i;
2523 int anchor;
2524 REQ(n, and_test); /* not_test ('and' not_test)* */
2525 anchor = 0;
2526 i = 0;
2527 for (;;) {
2528 com_not_test(c, CHILD(n, i));
2529 if ((i += 2) >= NCH(n))
2530 break;
2531 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2532 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002533 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002534 }
2535 if (anchor)
2536 com_backpatch(c, anchor);
2537}
2538
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002539static int
2540com_make_closure(struct compiling *c, PyCodeObject *co)
2541{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002542 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002543 if (free == 0)
2544 return 0;
2545 for (i = 0; i < free; ++i) {
2546 /* Bypass com_addop_varname because it will generate
2547 LOAD_DEREF but LOAD_CLOSURE is needed.
2548 */
2549 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2550 int arg, reftype;
2551
2552 /* Special case: If a class contains a method with a
2553 free variable that has the same name as a method,
2554 the name will be considered free *and* local in the
2555 class. It should be handled by the closure, as
2556 well as by the normal name loookup logic.
2557 */
2558 reftype = get_ref_type(c, PyString_AS_STRING(name));
2559 if (reftype == CELL)
2560 arg = com_lookup_arg(c->c_cellvars, name);
2561 else /* (reftype == FREE) */
2562 arg = com_lookup_arg(c->c_freevars, name);
2563 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002564 fprintf(stderr, "lookup %s in %s %d %d\n"
2565 "freevars of %s: %s\n",
2566 PyObject_REPR(name),
2567 c->c_name,
2568 reftype, arg,
2569 PyString_AS_STRING(co->co_name),
2570 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002571 Py_FatalError("com_make_closure()");
2572 }
2573 com_addoparg(c, LOAD_CLOSURE, arg);
2574
2575 }
2576 com_push(c, free);
2577 return 1;
2578}
2579
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002580static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002581com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002582{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002583 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002584 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002585 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002586 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002587 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002588 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2589 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002590 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002591 if (co == NULL) {
2592 c->c_errors++;
2593 return;
2594 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002595 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002596 i = com_addconst(c, (PyObject *)co);
2597 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002598 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002599 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002600 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002601 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002602 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002603 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002604 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002605 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002606 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002607 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002608 else {
2609 int anchor = 0;
2610 int i = 0;
2611 for (;;) {
2612 com_and_test(c, CHILD(n, i));
2613 if ((i += 2) >= NCH(n))
2614 break;
2615 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2616 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002617 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002618 }
2619 if (anchor)
2620 com_backpatch(c, anchor);
2621 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002622}
2623
2624static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002625com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002626{
2627 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002628 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002629 com_node(c, CHILD(n, 0));
2630 }
2631 else {
2632 int i;
2633 int len;
2634 len = (NCH(n) + 1) / 2;
2635 for (i = 0; i < NCH(n); i += 2)
2636 com_node(c, CHILD(n, i));
2637 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002638 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002639 }
2640}
2641
2642
2643/* Begin of assignment compilation */
2644
Thomas Wouters434d0822000-08-24 20:11:32 +00002645
2646static void
2647com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2648{
2649 com_addbyte(c, DUP_TOP);
2650 com_push(c, 1);
2651 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002652 com_node(c, augn);
2653 com_addbyte(c, opcode);
2654 com_pop(c, 1);
2655 com_addbyte(c, ROT_TWO);
2656 com_addopname(c, STORE_ATTR, n);
2657 com_pop(c, 2);
2658}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002659
2660static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002661com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002662{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00002663 if (none_assignment_check(c, STR(n), assigning))
2664 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002665 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002666 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002667}
2668
2669static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002670com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002671{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002672 REQ(n, trailer);
2673 switch (TYPE(CHILD(n, 0))) {
2674 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002675 if (assigning == OP_DELETE)
2676 com_error(c, PyExc_SyntaxError,
2677 "can't delete function call");
2678 else
2679 com_error(c, PyExc_SyntaxError,
2680 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002681 break;
2682 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002683 if (assigning > OP_APPLY)
2684 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2685 else
2686 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002687 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002688 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002689 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002690 break;
2691 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002692 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002693 }
2694}
2695
2696static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002697com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002698{
2699 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002700 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002701 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002702 if (assigning) {
2703 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002704 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002705 com_push(c, i-1);
2706 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002707 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002708 com_assign(c, CHILD(n, i), assigning, NULL);
2709}
2710
2711static void
2712com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2713{
2714 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002715 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002716 com_push(c, 1);
2717 com_node(c, augn);
2718 com_addbyte(c, opcode);
2719 com_pop(c, 1);
2720 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002721}
2722
2723static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002724com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002725{
2726 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002727 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002728 if (assigning)
2729 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002730}
2731
2732static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002733com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002734{
2735 /* Loop to avoid trivial recursion */
2736 for (;;) {
2737 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002738
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002739 case exprlist:
2740 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002741 case testlist1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002742 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002743 if (assigning > OP_APPLY) {
2744 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002745 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002746 return;
2747 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002748 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002749 return;
2750 }
2751 n = CHILD(n, 0);
2752 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002753
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002754 case test:
2755 case and_test:
2756 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002757 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002758 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002759 case xor_expr:
2760 case and_expr:
2761 case shift_expr:
2762 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002763 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002764 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002765 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002766 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002767 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002768 return;
2769 }
2770 n = CHILD(n, 0);
2771 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002772
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002773 case power: /* atom trailer* ('**' power)*
2774 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002775 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002776 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002777 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002778 return;
2779 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002780 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002781 int i;
2782 com_node(c, CHILD(n, 0));
2783 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002784 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002785 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002786 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002787 return;
2788 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002789 com_apply_trailer(c, CHILD(n, i));
2790 } /* NB i is still alive */
2791 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002792 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002793 return;
2794 }
2795 n = CHILD(n, 0);
2796 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002797
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002798 case atom:
2799 switch (TYPE(CHILD(n, 0))) {
2800 case LPAR:
2801 n = CHILD(n, 1);
2802 if (TYPE(n) == RPAR) {
2803 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002804 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002805 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002806 return;
2807 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002808 if (assigning > OP_APPLY) {
2809 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00002810 "augmented assign to tuple literal not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002811 return;
2812 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002813 break;
2814 case LSQB:
2815 n = CHILD(n, 1);
2816 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002817 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002818 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002819 return;
2820 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002821 if (assigning > OP_APPLY) {
2822 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00002823 "augmented assign to list literal not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002824 return;
2825 }
2826 if (NCH(n) > 1
2827 && TYPE(CHILD(n, 1)) == list_for) {
2828 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002829 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002830 return;
2831 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002832 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002833 return;
2834 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002835 if (assigning > OP_APPLY)
2836 com_augassign_name(c, CHILD(n, 0),
2837 assigning, augn);
2838 else
2839 com_assign_name(c, CHILD(n, 0),
2840 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002841 return;
2842 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002843 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002844 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002845 return;
2846 }
2847 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002848
2849 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002850 com_error(c, PyExc_SyntaxError,
2851 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002852 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002853
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002854 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002855 com_error(c, PyExc_SystemError,
2856 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002857 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002858
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002859 }
2860 }
2861}
Guido van Rossum7c531111997-03-11 18:42:21 +00002862
Thomas Wouters434d0822000-08-24 20:11:32 +00002863static void
2864com_augassign(struct compiling *c, node *n)
2865{
2866 int opcode;
2867
2868 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2869 case '+': opcode = INPLACE_ADD; break;
2870 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002871 case '/':
2872 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
2873 opcode = INPLACE_FLOOR_DIVIDE;
2874 else if (c->c_flags & CO_FUTURE_DIVISION)
2875 opcode = INPLACE_TRUE_DIVIDE;
2876 else
2877 opcode = INPLACE_DIVIDE;
2878 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00002879 case '%': opcode = INPLACE_MODULO; break;
2880 case '<': opcode = INPLACE_LSHIFT; break;
2881 case '>': opcode = INPLACE_RSHIFT; break;
2882 case '&': opcode = INPLACE_AND; break;
2883 case '^': opcode = INPLACE_XOR; break;
2884 case '|': opcode = INPLACE_OR; break;
2885 case '*':
2886 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2887 opcode = INPLACE_POWER;
2888 else
2889 opcode = INPLACE_MULTIPLY;
2890 break;
2891 default:
2892 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2893 return;
2894 }
2895 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2896}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002897
2898static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002899com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002900{
Thomas Wouters434d0822000-08-24 20:11:32 +00002901 REQ(n, expr_stmt);
2902 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002903 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002904 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002905 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002906 if (NCH(n) == 1) {
2907 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002908 if (c->c_interactive)
2909 com_addbyte(c, PRINT_EXPR);
2910 else
2911 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002912 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002913 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002914 else if (TYPE(CHILD(n,1)) == augassign)
2915 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002916 else {
2917 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002918 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002919 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002920 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002921 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002922 com_push(c, 1);
2923 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002924 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002925 }
2926 }
2927}
2928
2929static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002930com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002931{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002932 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002933 int i;
2934 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002935 if (Py_OptimizeFlag)
2936 return;
2937 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00002938
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002939 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00002940 raise AssertionError [, <message>]
2941
2942 where <message> is the second test, if present.
2943 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002944 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002945 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002946 com_addbyte(c, POP_TOP);
2947 com_pop(c, 1);
2948 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002949 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002950 com_push(c, 1);
2951 i = NCH(n)/2; /* Either 2 or 4 */
2952 if (i > 1)
2953 com_node(c, CHILD(n, 3));
2954 com_addoparg(c, RAISE_VARARGS, i);
2955 com_pop(c, i);
2956 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002957 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002958 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002959 com_addbyte(c, POP_TOP);
2960}
2961
2962static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002963com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002964{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002965 int i = 1;
2966 node* stream = NULL;
2967
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002968 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002969
2970 /* are we using the extended print form? */
2971 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2972 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002973 com_node(c, stream);
2974 /* stack: [...] => [... stream] */
2975 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002976 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2977 i = 4;
2978 else
2979 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002980 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002981 for (; i < NCH(n); i += 2) {
2982 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002983 com_addbyte(c, DUP_TOP);
2984 /* stack: [stream] => [stream stream] */
2985 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002986 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002987 /* stack: [stream stream] => [stream stream obj] */
2988 com_addbyte(c, ROT_TWO);
2989 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002990 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002991 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002992 com_pop(c, 2);
2993 }
2994 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002995 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002996 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002997 com_addbyte(c, PRINT_ITEM);
2998 com_pop(c, 1);
2999 }
3000 }
3001 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003002 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003003 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003004 /* must pop the extra stream object off the stack */
3005 com_addbyte(c, POP_TOP);
3006 /* stack: [... stream] => [...] */
3007 com_pop(c, 1);
3008 }
3009 }
3010 else {
3011 if (stream != NULL) {
3012 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003013 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003014 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003015 com_pop(c, 1);
3016 }
3017 else
3018 com_addbyte(c, PRINT_NEWLINE);
3019 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003020}
3021
3022static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003023com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003024{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003025 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003026 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003027 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003028 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003029 if (c->c_flags & CO_GENERATOR) {
3030 if (NCH(n) > 1) {
3031 com_error(c, PyExc_SyntaxError,
3032 "'return' with argument inside generator");
3033 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003034 }
3035 if (NCH(n) < 2) {
3036 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003037 com_push(c, 1);
3038 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003039 else
3040 com_node(c, CHILD(n, 1));
3041 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003042 com_pop(c, 1);
3043}
3044
3045static void
3046com_yield_stmt(struct compiling *c, node *n)
3047{
Tim Peters95c80f82001-06-23 02:07:08 +00003048 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003049 REQ(n, yield_stmt); /* 'yield' testlist */
3050 if (!c->c_infunction) {
3051 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3052 }
Tim Peters95c80f82001-06-23 02:07:08 +00003053
3054 for (i = 0; i < c->c_nblocks; ++i) {
3055 if (c->c_block[i] == SETUP_FINALLY) {
3056 com_error(c, PyExc_SyntaxError,
3057 "'yield' not allowed in a 'try' block "
3058 "with a 'finally' clause");
3059 return;
3060 }
3061 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003062 com_node(c, CHILD(n, 1));
3063 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003064 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003065}
3066
3067static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003068com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003069{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003070 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003071 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3072 if (NCH(n) > 1) {
3073 com_node(c, CHILD(n, 1));
3074 if (NCH(n) > 3) {
3075 com_node(c, CHILD(n, 3));
3076 if (NCH(n) > 5)
3077 com_node(c, CHILD(n, 5));
3078 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003079 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003080 i = NCH(n)/2;
3081 com_addoparg(c, RAISE_VARARGS, i);
3082 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003083}
3084
3085static void
Thomas Wouters52152252000-08-17 22:55:00 +00003086com_from_import(struct compiling *c, node *n)
3087{
3088 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3089 com_push(c, 1);
3090 if (NCH(n) > 1) {
3091 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3092 com_error(c, PyExc_SyntaxError, "invalid syntax");
3093 return;
3094 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003095 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003096 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003097 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003098 com_pop(c, 1);
3099}
3100
3101static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003102com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003103{
3104 int i;
3105 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003106 /* 'import' dotted_name (',' dotted_name)* |
3107 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003108 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00003109 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003110 /* 'from' dotted_name 'import' ... */
3111 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003112
3113 if (TYPE(CHILD(n, 3)) == STAR) {
3114 tup = Py_BuildValue("(s)", "*");
3115 } else {
3116 tup = PyTuple_New((NCH(n) - 2)/2);
3117 for (i = 3; i < NCH(n); i += 2) {
3118 PyTuple_SET_ITEM(tup, (i-3)/2,
Guido van Rossum633d90c2002-12-23 16:51:42 +00003119 PyString_FromString(STR(
3120 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003121 }
3122 }
3123 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003124 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003125 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003126 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00003127 if (TYPE(CHILD(n, 3)) == STAR)
3128 com_addbyte(c, IMPORT_STAR);
3129 else {
3130 for (i = 3; i < NCH(n); i += 2)
3131 com_from_import(c, CHILD(n, i));
3132 com_addbyte(c, POP_TOP);
3133 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003134 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003135 }
3136 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003137 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003138 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003139 node *subn = CHILD(n, i);
3140 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003141 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003142 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003143 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003144 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003145 int j;
3146 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003147 com_error(c, PyExc_SyntaxError,
3148 "invalid syntax");
3149 return;
3150 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003151 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3152 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003153 CHILD(CHILD(subn, 0),
3154 j));
3155 com_addop_varname(c, VAR_STORE,
3156 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003157 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003158 com_addop_varname(c, VAR_STORE,
3159 STR(CHILD(CHILD(subn, 0),
3160 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003161 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003162 }
3163 }
3164}
3165
3166static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003167com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003168{
3169 REQ(n, exec_stmt);
3170 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3171 com_node(c, CHILD(n, 1));
3172 if (NCH(n) >= 4)
3173 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003174 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003175 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003176 com_push(c, 1);
3177 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003178 if (NCH(n) >= 6)
3179 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003180 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003181 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003182 com_push(c, 1);
3183 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003184 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003185 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003186}
3187
Guido van Rossum7c531111997-03-11 18:42:21 +00003188static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003189is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003190{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003191 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003192 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003193 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003194
3195 /* Label to avoid tail recursion */
3196 next:
3197 switch (TYPE(n)) {
3198
3199 case suite:
3200 if (NCH(n) == 1) {
3201 n = CHILD(n, 0);
3202 goto next;
3203 }
3204 /* Fall through */
3205 case file_input:
3206 for (i = 0; i < NCH(n); i++) {
3207 node *ch = CHILD(n, i);
3208 if (TYPE(ch) == stmt) {
3209 n = ch;
3210 goto next;
3211 }
3212 }
3213 break;
3214
3215 case stmt:
3216 case simple_stmt:
3217 case small_stmt:
3218 n = CHILD(n, 0);
3219 goto next;
3220
3221 case expr_stmt:
3222 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003223 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003224 case test:
3225 case and_test:
3226 case not_test:
3227 case comparison:
3228 case expr:
3229 case xor_expr:
3230 case and_expr:
3231 case shift_expr:
3232 case arith_expr:
3233 case term:
3234 case factor:
3235 case power:
3236 case atom:
3237 if (NCH(n) == 1) {
3238 n = CHILD(n, 0);
3239 goto next;
3240 }
3241 break;
3242
3243 case NAME:
3244 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3245 return 1;
3246 break;
3247
3248 case NUMBER:
3249 v = parsenumber(c, STR(n));
3250 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003251 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003252 break;
3253 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003254 i = PyObject_IsTrue(v);
3255 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003256 return i == 0;
3257
3258 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003259 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003260 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003261 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003262 break;
3263 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003264 i = PyObject_IsTrue(v);
3265 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003266 return i == 0;
3267
3268 }
3269 return 0;
3270}
3271
Tim Peters08a898f2001-06-28 01:52:22 +00003272
3273/* Look under n for a return stmt with an expression.
3274 * This hack is used to find illegal returns under "if 0:" blocks in
3275 * functions already known to be generators (as determined by the symtable
3276 * pass).
3277 * Return the offending return node if found, else NULL.
3278 */
3279static node *
3280look_for_offending_return(node *n)
3281{
3282 int i;
3283
3284 for (i = 0; i < NCH(n); ++i) {
3285 node *kid = CHILD(n, i);
3286
3287 switch (TYPE(kid)) {
3288 case classdef:
3289 case funcdef:
3290 case lambdef:
3291 /* Stuff in nested functions & classes doesn't
3292 affect the code block we started in. */
3293 return NULL;
3294
3295 case return_stmt:
3296 if (NCH(kid) > 1)
3297 return kid;
3298 break;
3299
3300 default: {
3301 node *bad = look_for_offending_return(kid);
3302 if (bad != NULL)
3303 return bad;
3304 }
3305 }
3306 }
3307
3308 return NULL;
3309}
3310
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003311static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003312com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003313{
3314 int i;
3315 int anchor = 0;
3316 REQ(n, if_stmt);
3317 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3318 for (i = 0; i+3 < NCH(n); i+=4) {
3319 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003320 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003321 if (is_constant_false(c, ch)) {
3322 /* We're going to skip this block. However, if this
3323 is a generator, we have to check the dead code
3324 anyway to make sure there aren't any return stmts
3325 with expressions, in the same scope. */
3326 if (c->c_flags & CO_GENERATOR) {
3327 node *p = look_for_offending_return(n);
3328 if (p != NULL) {
3329 int savelineno = c->c_lineno;
3330 c->c_lineno = p->n_lineno;
3331 com_error(c, PyExc_SyntaxError,
3332 "'return' with argument "
3333 "inside generator");
3334 c->c_lineno = savelineno;
3335 }
3336 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003337 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003338 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003339 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003340 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003341 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003342 com_addfwref(c, JUMP_IF_FALSE, &a);
3343 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003344 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003345 com_node(c, CHILD(n, i+3));
3346 com_addfwref(c, JUMP_FORWARD, &anchor);
3347 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003348 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003349 com_addbyte(c, POP_TOP);
3350 }
3351 if (i+2 < NCH(n))
3352 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003353 if (anchor)
3354 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003355}
3356
3357static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003358com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003359{
3360 int break_anchor = 0;
3361 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003362 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003363 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3364 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003365 block_push(c, SETUP_LOOP);
3366 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003367 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003368 com_node(c, CHILD(n, 1));
3369 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3370 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003371 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003372 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003373 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003374 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003375 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3376 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003377 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003378 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003379 com_addbyte(c, POP_TOP);
3380 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003381 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003382 if (NCH(n) > 4)
3383 com_node(c, CHILD(n, 6));
3384 com_backpatch(c, break_anchor);
3385}
3386
3387static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003388com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003389{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003390 int break_anchor = 0;
3391 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003392 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003393 REQ(n, for_stmt);
3394 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3395 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003396 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003397 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003398 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003399 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00003400 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003401 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003402 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003403 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003404 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003405 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003406 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003407 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3408 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003409 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003410 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003411 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003412 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003413 if (NCH(n) > 8)
3414 com_node(c, CHILD(n, 8));
3415 com_backpatch(c, break_anchor);
3416}
3417
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003418/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003419
3420 SETUP_FINALLY L
3421 <code for S>
3422 POP_BLOCK
3423 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003424 L: <code for Sf>
3425 END_FINALLY
3426
3427 The special instructions use the block stack. Each block
3428 stack entry contains the instruction that created it (here
3429 SETUP_FINALLY), the level of the value stack at the time the
3430 block stack entry was created, and a label (here L).
3431
3432 SETUP_FINALLY:
3433 Pushes the current value stack level and the label
3434 onto the block stack.
3435 POP_BLOCK:
3436 Pops en entry from the block stack, and pops the value
3437 stack until its level is the same as indicated on the
3438 block stack. (The label is ignored.)
3439 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003440 Pops a variable number of entries from the *value* stack
3441 and re-raises the exception they specify. The number of
3442 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003443
3444 The block stack is unwound when an exception is raised:
3445 when a SETUP_FINALLY entry is found, the exception is pushed
3446 onto the value stack (and the exception condition is cleared),
3447 and the interpreter jumps to the label gotten from the block
3448 stack.
3449
3450 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003451 (The contents of the value stack is shown in [], with the top
3452 at the right; 'tb' is trace-back info, 'val' the exception's
3453 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003454
3455 Value stack Label Instruction Argument
3456 [] SETUP_EXCEPT L1
3457 [] <code for S>
3458 [] POP_BLOCK
3459 [] JUMP_FORWARD L0
3460
Guido van Rossum3f5da241990-12-20 15:06:42 +00003461 [tb, val, exc] L1: DUP )
3462 [tb, val, exc, exc] <evaluate E1> )
3463 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3464 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3465 [tb, val, exc, 1] POP )
3466 [tb, val, exc] POP
3467 [tb, val] <assign to V1> (or POP if no V1)
3468 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003469 [] <code for S1>
3470 JUMP_FORWARD L0
3471
Guido van Rossum3f5da241990-12-20 15:06:42 +00003472 [tb, val, exc, 0] L2: POP
3473 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003474 .............................etc.......................
3475
Guido van Rossum3f5da241990-12-20 15:06:42 +00003476 [tb, val, exc, 0] Ln+1: POP
3477 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003478
3479 [] L0: <next statement>
3480
3481 Of course, parts are not generated if Vi or Ei is not present.
3482*/
3483
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003484static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003485com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003486{
3487 int except_anchor = 0;
3488 int end_anchor = 0;
3489 int else_anchor = 0;
3490 int i;
3491 node *ch;
3492
3493 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3494 block_push(c, SETUP_EXCEPT);
3495 com_node(c, CHILD(n, 2));
3496 com_addbyte(c, POP_BLOCK);
3497 block_pop(c, SETUP_EXCEPT);
3498 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3499 com_backpatch(c, except_anchor);
3500 for (i = 3;
3501 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3502 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003503 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003504 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003505 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003506 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003507 break;
3508 }
3509 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003510 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003511 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003512 if (NCH(ch) > 1) {
3513 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003514 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003515 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003516 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003517 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003518 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3519 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003520 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003521 }
3522 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003523 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003524 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003525 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003526 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003527 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003528 com_pop(c, 1);
3529 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003530 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003531 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003532 com_node(c, CHILD(n, i+2));
3533 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3534 if (except_anchor) {
3535 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003536 /* We come in with [tb, val, exc, 0] on the
3537 stack; one pop and it's the same as
3538 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003539 com_addbyte(c, POP_TOP);
3540 }
3541 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003542 /* We actually come in here with [tb, val, exc] but the
3543 END_FINALLY will zap those and jump around.
3544 The c_stacklevel does not reflect them so we need not pop
3545 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003546 com_addbyte(c, END_FINALLY);
3547 com_backpatch(c, else_anchor);
3548 if (i < NCH(n))
3549 com_node(c, CHILD(n, i+2));
3550 com_backpatch(c, end_anchor);
3551}
3552
3553static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003554com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003555{
3556 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003557 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003558
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003559 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3560 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003561 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003562 com_addbyte(c, POP_BLOCK);
3563 block_pop(c, SETUP_FINALLY);
3564 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003565 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003566 /* While the generated code pushes only one item,
3567 the try-finally handling can enter here with
3568 up to three items. OK, here are the details:
3569 3 for an exception, 2 for RETURN, 1 for BREAK. */
3570 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003571 com_backpatch(c, finally_anchor);
3572 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003573 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003574 com_node(c, ch);
3575 com_addbyte(c, END_FINALLY);
3576 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003577 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003578}
3579
3580static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003581com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003582{
3583 REQ(n, try_stmt);
3584 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3585 | 'try' ':' suite 'finally' ':' suite */
3586 if (TYPE(CHILD(n, 3)) != except_clause)
3587 com_try_finally(c, n);
3588 else
3589 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003590}
3591
Guido van Rossum8b993a91997-01-17 21:04:03 +00003592static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003593get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003594{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003595 int i;
3596
Guido van Rossum8b993a91997-01-17 21:04:03 +00003597 /* Label to avoid tail recursion */
3598 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003599 switch (TYPE(n)) {
3600
3601 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003602 if (NCH(n) == 1) {
3603 n = CHILD(n, 0);
3604 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003605 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003606 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003607 case file_input:
3608 for (i = 0; i < NCH(n); i++) {
3609 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003610 if (TYPE(ch) == stmt) {
3611 n = ch;
3612 goto next;
3613 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003614 }
3615 break;
3616
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003617 case stmt:
3618 case simple_stmt:
3619 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003620 n = CHILD(n, 0);
3621 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003622
3623 case expr_stmt:
3624 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003625 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003626 case test:
3627 case and_test:
3628 case not_test:
3629 case comparison:
3630 case expr:
3631 case xor_expr:
3632 case and_expr:
3633 case shift_expr:
3634 case arith_expr:
3635 case term:
3636 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003637 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003638 if (NCH(n) == 1) {
3639 n = CHILD(n, 0);
3640 goto next;
3641 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003642 break;
3643
3644 case atom:
3645 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003646 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003647 break;
3648
3649 }
3650 return NULL;
3651}
3652
Guido van Rossum79f25d91997-04-29 20:08:16 +00003653static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003654get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003655{
Guido van Rossum541563e1999-01-28 15:08:09 +00003656 /* Don't generate doc-strings if run with -OO */
3657 if (Py_OptimizeFlag > 1)
3658 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003659 n = get_rawdocstring(n);
3660 if (n == NULL)
3661 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003662 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003663}
3664
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003665static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003666com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003667{
3668 REQ(n, suite);
3669 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3670 if (NCH(n) == 1) {
3671 com_node(c, CHILD(n, 0));
3672 }
3673 else {
3674 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003675 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003676 node *ch = CHILD(n, i);
3677 if (TYPE(ch) == stmt)
3678 com_node(c, ch);
3679 }
3680 }
3681}
3682
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003683/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003684static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003685com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003686{
3687 int i = c->c_nblocks;
3688 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3689 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3690 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003691 else if (i <= 0) {
3692 /* at the outer level */
3693 com_error(c, PyExc_SyntaxError,
3694 "'continue' not properly in loop");
3695 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003696 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003697 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003698 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003699 if (c->c_block[j] == SETUP_LOOP)
3700 break;
3701 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003702 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003703 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003704 for (; i > j; --i) {
3705 if (c->c_block[i] == SETUP_EXCEPT ||
3706 c->c_block[i] == SETUP_FINALLY) {
3707 com_addoparg(c, CONTINUE_LOOP,
3708 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003709 return;
3710 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003711 if (c->c_block[i] == END_FINALLY) {
3712 com_error(c, PyExc_SyntaxError,
3713 "'continue' not supported inside 'finally' clause");
3714 return;
3715 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003716 }
3717 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003718 com_error(c, PyExc_SyntaxError,
3719 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003720 }
3721 /* XXX Could allow it inside a 'finally' clause
3722 XXX if we could pop the exception still on the stack */
3723}
3724
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003725/* Return the number of default values in the argument list.
3726
3727 If a non-default argument follows a default argument, set an
3728 exception and return -1.
3729*/
3730
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003731static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003732com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003733{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003734 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003735 if (TYPE(n) == lambdef) {
3736 /* lambdef: 'lambda' [varargslist] ':' test */
3737 n = CHILD(n, 1);
3738 }
3739 else {
3740 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3741 n = CHILD(n, 2);
3742 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3743 n = CHILD(n, 1);
3744 }
3745 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003746 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003747 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003748 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003749 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3750 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003751 ndefs = 0;
3752 for (i = 0; i < nch; i++) {
3753 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003754 if (TYPE(CHILD(n, i)) == STAR ||
3755 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003756 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003757 i++;
3758 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003759 t = RPAR; /* Anything except EQUAL or COMMA */
3760 else
3761 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003762 if (t == EQUAL) {
3763 i++;
3764 ndefs++;
3765 com_node(c, CHILD(n, i));
3766 i++;
3767 if (i >= nch)
3768 break;
3769 t = TYPE(CHILD(n, i));
3770 }
3771 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003772 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003773 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003774 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003775 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003776 return -1;
3777 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003778 }
3779 if (t != COMMA)
3780 break;
3781 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003782 return ndefs;
3783}
3784
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003785static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003786com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003787{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003788 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003789 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003790 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003791 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003792 if (ndefs < 0)
3793 return;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003794 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3795 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003796 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003797 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003798 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003799 c->c_errors++;
3800 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003801 int closure = com_make_closure(c, (PyCodeObject *)co);
3802 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003803 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003804 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003805 if (closure)
3806 com_addoparg(c, MAKE_CLOSURE, ndefs);
3807 else
3808 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003809 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003810 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003811 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003812 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003813 }
3814}
3815
3816static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003817com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003818{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003819 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003820 REQ(n, testlist);
3821 /* testlist: test (',' test)* [','] */
3822 for (i = 0; i < NCH(n); i += 2)
3823 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003824 i = (NCH(n)+1) / 2;
3825 com_addoparg(c, BUILD_TUPLE, i);
3826 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003827}
3828
3829static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003830com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003831{
Guido van Rossum25831651993-05-19 14:50:45 +00003832 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003833 PyObject *v;
3834 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003835 char *name;
3836
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003837 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003838 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003839 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003840 c->c_errors++;
3841 return;
3842 }
3843 /* Push the class name on the stack */
3844 i = com_addconst(c, v);
3845 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003846 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003847 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003848 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003849 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003850 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003851 com_push(c, 1);
3852 }
Guido van Rossum25831651993-05-19 14:50:45 +00003853 else
3854 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003855 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003856 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003857 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003858 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003859 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003860 c->c_errors++;
3861 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003862 int closure = com_make_closure(c, co);
3863 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003864 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003865 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003866 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003867 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003868 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003869 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003870 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003871 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003872 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003873 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003874 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003875 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003876 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003877 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003878}
3879
3880static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003881com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003882{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003883 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003884 if (c->c_errors)
3885 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003886 switch (TYPE(n)) {
3887
3888 /* Definition nodes */
3889
3890 case funcdef:
3891 com_funcdef(c, n);
3892 break;
3893 case classdef:
3894 com_classdef(c, n);
3895 break;
3896
3897 /* Trivial parse tree nodes */
3898
3899 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003900 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003901 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003902 n = CHILD(n, 0);
3903 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003904
3905 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003906 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003907 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003908 {
3909 int i;
3910 for (i = 0; i < NCH(n)-1; i += 2)
3911 com_node(c, CHILD(n, i));
3912 }
3913 break;
3914
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003915 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003916 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003917 n = CHILD(n, 0);
3918 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003919
3920 /* Statement nodes */
3921
3922 case expr_stmt:
3923 com_expr_stmt(c, n);
3924 break;
3925 case print_stmt:
3926 com_print_stmt(c, n);
3927 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003928 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003929 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003930 break;
3931 case pass_stmt:
3932 break;
3933 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003934 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003935 com_error(c, PyExc_SyntaxError,
3936 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003937 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003938 com_addbyte(c, BREAK_LOOP);
3939 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003940 case continue_stmt:
3941 com_continue_stmt(c, n);
3942 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003943 case return_stmt:
3944 com_return_stmt(c, n);
3945 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003946 case yield_stmt:
3947 com_yield_stmt(c, n);
3948 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003949 case raise_stmt:
3950 com_raise_stmt(c, n);
3951 break;
3952 case import_stmt:
3953 com_import_stmt(c, n);
3954 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003955 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003956 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003957 case exec_stmt:
3958 com_exec_stmt(c, n);
3959 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003960 case assert_stmt:
3961 com_assert_stmt(c, n);
3962 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003963 case if_stmt:
3964 com_if_stmt(c, n);
3965 break;
3966 case while_stmt:
3967 com_while_stmt(c, n);
3968 break;
3969 case for_stmt:
3970 com_for_stmt(c, n);
3971 break;
3972 case try_stmt:
3973 com_try_stmt(c, n);
3974 break;
3975 case suite:
3976 com_suite(c, n);
3977 break;
3978
3979 /* Expression nodes */
3980
3981 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003982 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00003983 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003984 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003985 break;
3986 case test:
3987 com_test(c, n);
3988 break;
3989 case and_test:
3990 com_and_test(c, n);
3991 break;
3992 case not_test:
3993 com_not_test(c, n);
3994 break;
3995 case comparison:
3996 com_comparison(c, n);
3997 break;
3998 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003999 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004000 break;
4001 case expr:
4002 com_expr(c, n);
4003 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004004 case xor_expr:
4005 com_xor_expr(c, n);
4006 break;
4007 case and_expr:
4008 com_and_expr(c, n);
4009 break;
4010 case shift_expr:
4011 com_shift_expr(c, n);
4012 break;
4013 case arith_expr:
4014 com_arith_expr(c, n);
4015 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004016 case term:
4017 com_term(c, n);
4018 break;
4019 case factor:
4020 com_factor(c, n);
4021 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004022 case power:
4023 com_power(c, n);
4024 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004025 case atom:
4026 com_atom(c, n);
4027 break;
4028
4029 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004030 com_error(c, PyExc_SystemError,
4031 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004032 }
4033}
4034
Tim Petersdbd9ba62000-07-09 03:09:57 +00004035static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004036
4037static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004038com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004039{
4040 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4041 if (TYPE(CHILD(n, 0)) == LPAR)
4042 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004043 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004044 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004045 com_pop(c, 1);
4046 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004047}
4048
4049static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004050com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004051{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004052 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004053 if (NCH(n) == 1) {
4054 com_fpdef(c, CHILD(n, 0));
4055 }
4056 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004057 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004058 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004059 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004060 for (i = 0; i < NCH(n); i += 2)
4061 com_fpdef(c, CHILD(n, i));
4062 }
4063}
4064
4065static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004066com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004067{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004068 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004069 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004070 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004071 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004072 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004073 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004074 nch = NCH(n);
4075 /* Enter all arguments in table of locals */
4076 for (i = 0, narg = 0; i < nch; i++) {
4077 node *ch = CHILD(n, i);
4078 node *fp;
4079 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004080 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004081 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4082 fp = CHILD(ch, 0);
4083 if (TYPE(fp) != NAME) {
4084 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4085 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004086 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004087 narg++;
4088 /* all name updates handled by symtable */
4089 if (++i >= nch)
4090 break;
4091 ch = CHILD(n, i);
4092 if (TYPE(ch) == EQUAL)
4093 i += 2;
4094 else
4095 REQ(ch, COMMA);
4096 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004097 if (complex) {
4098 /* Generate code for complex arguments only after
4099 having counted the simple arguments */
4100 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004101 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004102 node *ch = CHILD(n, i);
4103 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004104 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004105 break;
4106 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4107 fp = CHILD(ch, 0);
4108 if (TYPE(fp) != NAME) {
4109 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004110 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004111 com_fpdef(c, ch);
4112 }
4113 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004114 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004115 break;
4116 ch = CHILD(n, i);
4117 if (TYPE(ch) == EQUAL)
4118 i += 2;
4119 else
4120 REQ(ch, COMMA);
4121 }
4122 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004123}
4124
4125static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004126com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004127{
4128 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004129 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004130 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004131 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004132 if (doc != NULL) {
4133 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004134 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004135 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004136 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004137 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004138 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004139 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004140 for (i = 0; i < NCH(n); i++) {
4141 node *ch = CHILD(n, i);
4142 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4143 com_node(c, ch);
4144 }
4145}
4146
4147/* Top-level compile-node interface */
4148
4149static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004150compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004151{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004152 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004153 node *ch;
4154 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00004155 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004156 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004157 if (doc != NULL) {
4158 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004159 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004160 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004161 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004162 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004163 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
4164 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004165 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004166 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004167 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004168 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004169 c->c_infunction = 0;
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004170 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4171 com_push(c, 1);
4172 com_addbyte(c, RETURN_VALUE);
4173 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004174}
4175
4176static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004177compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004178{
Guido van Rossum590baa41993-11-30 13:40:46 +00004179 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004180 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004181 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004182
4183 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004184 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004185 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004186 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004187 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004188 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004189 else
4190 ch = CHILD(n, 2);
4191 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004192 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004193 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004194}
4195
4196static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004197compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004198{
4199 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004200 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004201 REQ(n, classdef);
4202 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4203 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004204 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004205 /* Initialize local __module__ from global __name__ */
4206 com_addop_name(c, LOAD_GLOBAL, "__name__");
4207 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004208 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004209 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004210 if (doc != NULL) {
4211 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004212 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004213 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004214 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004215 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004216 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004217 }
4218 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004219 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004220 com_node(c, ch);
4221 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004222 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004223 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004224 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004225}
4226
4227static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004228compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004229{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004230 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004231
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004232 switch (TYPE(n)) {
4233
Guido van Rossum4c417781991-01-21 16:09:22 +00004234 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004235 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004236 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004237 n = CHILD(n, 0);
4238 if (TYPE(n) != NEWLINE)
4239 com_node(c, n);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004240 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4241 com_push(c, 1);
4242 com_addbyte(c, RETURN_VALUE);
4243 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004244 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004245 break;
4246
Guido van Rossum4c417781991-01-21 16:09:22 +00004247 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004248 com_file_input(c, n);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004249 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4250 com_push(c, 1);
4251 com_addbyte(c, RETURN_VALUE);
4252 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004253 break;
4254
Guido van Rossum590baa41993-11-30 13:40:46 +00004255 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004256 com_node(c, CHILD(n, 0));
4257 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004258 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004259 break;
4260
Guido van Rossum590baa41993-11-30 13:40:46 +00004261 case lambdef: /* anonymous function definition */
4262 compile_lambdef(c, n);
4263 break;
4264
Guido van Rossum4c417781991-01-21 16:09:22 +00004265 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004266 compile_funcdef(c, n);
4267 break;
4268
Guido van Rossum4c417781991-01-21 16:09:22 +00004269 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004270 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004271 break;
4272
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004273 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004274 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004275 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004276 }
4277}
4278
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004279static PyObject *
4280dict_keys_inorder(PyObject *dict, int offset)
4281{
4282 PyObject *tuple, *k, *v;
4283 int i, pos = 0, size = PyDict_Size(dict);
4284
4285 tuple = PyTuple_New(size);
4286 if (tuple == NULL)
4287 return NULL;
4288 while (PyDict_Next(dict, &pos, &k, &v)) {
4289 i = PyInt_AS_LONG(v);
4290 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004291 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004292 PyTuple_SET_ITEM(tuple, i - offset, k);
4293 }
4294 return tuple;
4295}
4296
Guido van Rossum79f25d91997-04-29 20:08:16 +00004297PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004298PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004299{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004300 return PyNode_CompileFlags(n, filename, NULL);
4301}
4302
4303PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004304PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004305{
4306 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004307}
4308
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004309struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004310PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004311{
4312 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004313 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004314
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004315 ff = PyNode_Future(n, filename);
4316 if (ff == NULL)
4317 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004318 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00004319 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004320 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004321 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004322 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004323 return st;
4324}
4325
Guido van Rossum79f25d91997-04-29 20:08:16 +00004326static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004327icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004328{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004329 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004330}
4331
Guido van Rossum79f25d91997-04-29 20:08:16 +00004332static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004333jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004334 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004335{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004336 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004337 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004338 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004339 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004340 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4341 sc.c_encoding = "utf-8";
4342 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004343 sc.c_encoding = STR(n);
4344 n = CHILD(n, 0);
4345 } else {
4346 sc.c_encoding = NULL;
4347 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004348 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004349 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004350 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004351 /* c_symtable still points to parent's symbols */
4352 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004353 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004354 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004355 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004356 if (base->c_encoding != NULL) {
4357 assert(sc.c_encoding == NULL);
4358 sc.c_encoding = base->c_encoding;
4359 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004360 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004361 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004362 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004363 if (sc.c_future == NULL) {
4364 com_free(&sc);
4365 return NULL;
4366 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004367 if (flags) {
4368 int merged = sc.c_future->ff_features |
4369 flags->cf_flags;
4370 sc.c_future->ff_features = merged;
4371 flags->cf_flags = merged;
4372 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004373 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
4374 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004375 com_free(&sc);
4376 return NULL;
4377 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004378 /* reset symbol table for second pass */
4379 sc.c_symtable->st_nscopes = 1;
4380 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004381 }
4382 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004383 if (symtable_load_symbols(&sc) < 0) {
4384 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004385 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004386 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004387 compile_node(&sc, n);
4388 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004389 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004390 PyObject *consts, *names, *varnames, *filename, *name,
4391 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004392 consts = PyList_AsTuple(sc.c_consts);
4393 names = PyList_AsTuple(sc.c_names);
4394 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004395 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4396 freevars = dict_keys_inorder(sc.c_freevars,
4397 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004398 filename = PyString_InternFromString(sc.c_filename);
4399 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004400 if (!PyErr_Occurred())
4401 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004402 sc.c_nlocals,
4403 sc.c_maxstacklevel,
4404 sc.c_flags,
4405 sc.c_code,
4406 consts,
4407 names,
4408 varnames,
4409 freevars,
4410 cellvars,
4411 filename,
4412 name,
4413 sc.c_firstlineno,
4414 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004415 Py_XDECREF(consts);
4416 Py_XDECREF(names);
4417 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004418 Py_XDECREF(freevars);
4419 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004420 Py_XDECREF(filename);
4421 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004422 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004423 else if (!PyErr_Occurred()) {
4424 /* This could happen if someone called PyErr_Clear() after an
4425 error was reported above. That's not supposed to happen,
4426 but I just plugged one case and I'm not sure there can't be
4427 others. In that case, raise SystemError so that at least
4428 it gets reported instead dumping core. */
4429 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4430 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004431 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004432 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004433 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004434 sc.c_symtable = NULL;
4435 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004436 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004437 return co;
4438}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004439
4440int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004441PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004442{
4443 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004444 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004445 int line = co->co_firstlineno;
4446 int addr = 0;
4447 while (--size >= 0) {
4448 addr += *p++;
4449 if (addr > addrq)
4450 break;
4451 line += *p++;
4452 }
4453 return line;
4454}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004455
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004456/* The test for LOCAL must come before the test for FREE in order to
4457 handle classes where name is both local and free. The local var is
4458 a method and the free var is a free var referenced within a method.
4459*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004460
4461static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004462get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004463{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004464 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004465 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004466
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004467 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4468 return CELL;
4469 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4470 return LOCAL;
4471 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4472 return FREE;
4473 v = PyDict_GetItemString(c->c_globals, name);
4474 if (v) {
4475 if (v == Py_None)
4476 return GLOBAL_EXPLICIT;
4477 else {
4478 return GLOBAL_IMPLICIT;
4479 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004480 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004481 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004482 "unknown scope for %.100s in %.100s(%s) "
4483 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4484 name, c->c_name,
4485 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4486 c->c_filename,
4487 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4488 PyObject_REPR(c->c_locals),
4489 PyObject_REPR(c->c_globals)
4490 );
4491
4492 Py_FatalError(buf);
4493 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004494}
4495
Guido van Rossum207fda62001-03-02 03:30:41 +00004496/* Helper functions to issue warnings */
4497
4498static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004499issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004500{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004501 if (PyErr_Occurred()) {
4502 /* This can happen because symtable_node continues
4503 processing even after raising a SyntaxError.
4504 Calling PyErr_WarnExplicit now would clobber the
4505 pending exception; instead we fail and let that
4506 exception propagate.
4507 */
4508 return -1;
4509 }
Guido van Rossum207fda62001-03-02 03:30:41 +00004510 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4511 lineno, NULL, NULL) < 0) {
4512 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4513 PyErr_SetString(PyExc_SyntaxError, msg);
4514 PyErr_SyntaxLocation(filename, lineno);
4515 }
4516 return -1;
4517 }
4518 return 0;
4519}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004520
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004521static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004522symtable_warn(struct symtable *st, char *msg)
4523{
Guido van Rossum207fda62001-03-02 03:30:41 +00004524 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004525 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004526 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004527 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004528 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004529}
4530
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004531/* Helper function for setting lineno and filename */
4532
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004533static struct symtable *
4534symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004535{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004536 struct symtable *st;
4537
4538 st = symtable_init();
4539 if (st == NULL)
4540 return NULL;
4541 st->st_future = ff;
4542 st->st_filename = filename;
4543 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
4544 if (st->st_errors > 0)
4545 goto fail;
4546 symtable_node(st, n);
4547 if (st->st_errors > 0)
4548 goto fail;
4549 return st;
4550 fail:
4551 if (!PyErr_Occurred()) {
4552 /* This could happen because after a syntax error is
4553 detected, the symbol-table-building continues for
4554 a while, and PyErr_Clear() might erroneously be
4555 called during that process. One such case has been
4556 fixed, but there might be more (now or later).
4557 */
4558 PyErr_SetString(PyExc_SystemError, "lost exception");
4559 }
4560 st->st_future = NULL;
4561 st->st_filename = NULL;
4562 PySymtable_Free(st);
4563 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004564}
4565
4566static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004567symtable_init_compiling_symbols(struct compiling *c)
4568{
4569 PyObject *varnames;
4570
4571 varnames = c->c_symtable->st_cur->ste_varnames;
4572 if (varnames == NULL) {
4573 varnames = PyList_New(0);
4574 if (varnames == NULL)
4575 return -1;
4576 c->c_symtable->st_cur->ste_varnames = varnames;
4577 Py_INCREF(varnames);
4578 } else
4579 Py_INCREF(varnames);
4580 c->c_varnames = varnames;
4581
4582 c->c_globals = PyDict_New();
4583 if (c->c_globals == NULL)
4584 return -1;
4585 c->c_freevars = PyDict_New();
4586 if (c->c_freevars == NULL)
4587 return -1;
4588 c->c_cellvars = PyDict_New();
4589 if (c->c_cellvars == NULL)
4590 return -1;
4591 return 0;
4592}
4593
4594struct symbol_info {
4595 int si_nlocals;
4596 int si_ncells;
4597 int si_nfrees;
4598 int si_nimplicit;
4599};
4600
4601static void
4602symtable_init_info(struct symbol_info *si)
4603{
4604 si->si_nlocals = 0;
4605 si->si_ncells = 0;
4606 si->si_nfrees = 0;
4607 si->si_nimplicit = 0;
4608}
4609
4610static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004611symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004612 struct symbol_info *si)
4613{
4614 PyObject *dict, *v;
4615
4616 /* Seperate logic for DEF_FREE. If it occurs in a function,
4617 it indicates a local that we must allocate storage for (a
4618 cell var). If it occurs in a class, then the class has a
4619 method and a free variable with the same name.
4620 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004621 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004622 /* If it isn't declared locally, it can't be a cell. */
4623 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4624 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004625 v = PyInt_FromLong(si->si_ncells++);
4626 dict = c->c_cellvars;
4627 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004628 /* If it is free anyway, then there is no need to do
4629 anything here.
4630 */
4631 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004632 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004633 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004634 v = PyInt_FromLong(si->si_nfrees++);
4635 dict = c->c_freevars;
4636 }
4637 if (v == NULL)
4638 return -1;
4639 if (PyDict_SetItem(dict, name, v) < 0) {
4640 Py_DECREF(v);
4641 return -1;
4642 }
4643 Py_DECREF(v);
4644 return 0;
4645}
4646
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004647/* If a variable is a cell and an argument, make sure that appears in
4648 co_cellvars before any variable to its right in varnames.
4649*/
4650
4651
4652static int
4653symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4654 PyObject *varnames, int flags)
4655{
Tim Petersb39903b2003-03-24 17:22:24 +00004656 PyObject *v = NULL;
4657 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004658 int i, pos;
4659
4660 if (flags & CO_VARARGS)
4661 argcount++;
4662 if (flags & CO_VARKEYWORDS)
4663 argcount++;
4664 for (i = argcount; --i >= 0; ) {
4665 v = PyList_GET_ITEM(varnames, i);
4666 if (PyDict_GetItem(*cellvars, v)) {
4667 if (list == NULL) {
4668 list = PyList_New(1);
4669 if (list == NULL)
4670 return -1;
4671 PyList_SET_ITEM(list, 0, v);
4672 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004673 } else {
4674 if (PyList_Insert(list, 0, v) < 0) {
4675 Py_DECREF(list);
4676 return -1;
4677 }
4678 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004679 }
4680 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00004681 if (list == NULL)
4682 return 0;
4683
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004684 /* There are cellvars that are also arguments. Create a dict
4685 to replace cellvars and put the args at the front.
4686 */
4687 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004688 if (d == NULL)
4689 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004690 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4691 v = PyInt_FromLong(i);
4692 if (v == NULL)
4693 goto fail;
4694 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4695 goto fail;
4696 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4697 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00004698 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004699 }
4700 pos = 0;
4701 i = PyList_GET_SIZE(list);
4702 Py_DECREF(list);
4703 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4704 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004705 if (w == NULL)
4706 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004707 if (PyDict_SetItem(d, v, w) < 0) {
4708 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00004709 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004710 goto fail;
4711 }
4712 Py_DECREF(w);
4713 }
4714 Py_DECREF(*cellvars);
4715 *cellvars = d;
4716 return 1;
4717 fail:
4718 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00004719 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004720 return -1;
4721}
4722
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004723static int
4724symtable_freevar_offsets(PyObject *freevars, int offset)
4725{
4726 PyObject *name, *v;
4727 int pos;
4728
4729 /* The cell vars are the first elements of the closure,
4730 followed by the free vars. Update the offsets in
4731 c_freevars to account for number of cellvars. */
4732 pos = 0;
4733 while (PyDict_Next(freevars, &pos, &name, &v)) {
4734 int i = PyInt_AS_LONG(v) + offset;
4735 PyObject *o = PyInt_FromLong(i);
4736 if (o == NULL)
4737 return -1;
4738 if (PyDict_SetItem(freevars, name, o) < 0) {
4739 Py_DECREF(o);
4740 return -1;
4741 }
4742 Py_DECREF(o);
4743 }
4744 return 0;
4745}
4746
4747static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004748symtable_check_unoptimized(struct compiling *c,
4749 PySymtableEntryObject *ste,
4750 struct symbol_info *si)
4751{
4752 char buf[300];
4753
4754 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4755 || (ste->ste_nested && si->si_nimplicit)))
4756 return 0;
4757
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004758#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4759
4760#define ILLEGAL_IS "is a nested function"
4761
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004762#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004763"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004764
4765#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004766"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004767
4768#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00004769"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004770"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004771
4772 /* XXX perhaps the linenos for these opt-breaking statements
4773 should be stored so the exception can point to them. */
4774
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004775 if (ste->ste_child_free) {
4776 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004777 PyOS_snprintf(buf, sizeof(buf),
4778 ILLEGAL_IMPORT_STAR,
4779 PyString_AS_STRING(ste->ste_name),
4780 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004781 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004782 PyOS_snprintf(buf, sizeof(buf),
4783 ILLEGAL_BARE_EXEC,
4784 PyString_AS_STRING(ste->ste_name),
4785 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004786 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004787 PyOS_snprintf(buf, sizeof(buf),
4788 ILLEGAL_EXEC_AND_IMPORT_STAR,
4789 PyString_AS_STRING(ste->ste_name),
4790 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004791 }
4792 } else {
4793 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004794 PyOS_snprintf(buf, sizeof(buf),
4795 ILLEGAL_IMPORT_STAR,
4796 PyString_AS_STRING(ste->ste_name),
4797 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004798 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004799 PyOS_snprintf(buf, sizeof(buf),
4800 ILLEGAL_BARE_EXEC,
4801 PyString_AS_STRING(ste->ste_name),
4802 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004803 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004804 PyOS_snprintf(buf, sizeof(buf),
4805 ILLEGAL_EXEC_AND_IMPORT_STAR,
4806 PyString_AS_STRING(ste->ste_name),
4807 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004808 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004809 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004810
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004811 PyErr_SetString(PyExc_SyntaxError, buf);
4812 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4813 ste->ste_opt_lineno);
4814 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004815}
4816
4817static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004818symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4819 struct symbol_info *si)
4820{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004821 if (c->c_future)
4822 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004823 if (ste->ste_generator)
4824 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004825 if (ste->ste_type != TYPE_MODULE)
4826 c->c_flags |= CO_NEWLOCALS;
4827 if (ste->ste_type == TYPE_FUNCTION) {
4828 c->c_nlocals = si->si_nlocals;
4829 if (ste->ste_optimized == 0)
4830 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004831 else if (ste->ste_optimized != OPT_EXEC)
4832 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004833 }
4834 return 0;
4835}
4836
4837static int
Jeremy Hylton98326132003-09-22 04:26:44 +00004838symtable_error(struct symtable *st, int lineno)
4839{
4840 if (lineno == 0)
4841 lineno = st->st_cur->ste_lineno;
4842 PyErr_SyntaxLocation(st->st_filename, lineno);
4843 st->st_errors++;
4844 return -1;
4845}
4846
4847static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004848symtable_load_symbols(struct compiling *c)
4849{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004850 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004851 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004852 PyObject *name, *varnames, *v;
4853 int i, flags, pos;
4854 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004855
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004856 v = NULL;
4857
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004858 if (symtable_init_compiling_symbols(c) < 0)
4859 goto fail;
4860 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004861 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004862 si.si_nlocals = PyList_GET_SIZE(varnames);
4863 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004864
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004865 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004866 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004867 if (v == NULL)
4868 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004869 if (PyDict_SetItem(c->c_locals,
4870 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004871 goto fail;
4872 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004873 }
4874
4875 /* XXX The cases below define the rules for whether a name is
4876 local or global. The logic could probably be clearer. */
4877 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004878 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4879 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004880
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004881 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004882 /* undo the original DEF_FREE */
4883 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004884
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004885 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004886 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004887 2. Free variables in methods that are also class
4888 variables or declared global.
4889 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004890 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004891 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004892
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004893 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004894 c->c_argcount--;
4895 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004896 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004897 c->c_argcount--;
4898 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004899 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004900 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004901 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004902 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00004903 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004904 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00004905 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004906 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004907 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004908 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4909 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004910 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004911 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00004912 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004913 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004914 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004915 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004916 if (v == NULL)
4917 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004918 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004919 goto fail;
4920 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004921 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004922 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004923 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004924 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004925 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004926 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004927 if (v == NULL)
4928 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004929 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004930 goto fail;
4931 Py_DECREF(v);
4932 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004933 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004934 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00004935 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004936 goto fail;
4937 if (st->st_nscopes != 1) {
4938 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004939 if (v == NULL)
4940 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004941 if (PyDict_SetItem(st->st_global,
4942 name, v))
4943 goto fail;
4944 Py_DECREF(v);
4945 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004946 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004947 }
4948 }
4949
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004950 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4951
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004952 if (si.si_ncells > 1) { /* one cell is always in order */
4953 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4954 c->c_varnames, c->c_flags) < 0)
4955 return -1;
4956 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004957 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4958 return -1;
4959 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004960 fail:
4961 /* is this always the right thing to do? */
4962 Py_XDECREF(v);
4963 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004964}
4965
4966static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004967symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004968{
4969 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004970
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004971 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004972 if (st == NULL)
4973 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004974 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00004975
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004976 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004977 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004978 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004979 goto fail;
4980 if ((st->st_symbols = PyDict_New()) == NULL)
4981 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004982 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004983 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004984 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004985 st->st_private = NULL;
4986 return st;
4987 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004988 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004989 return NULL;
4990}
4991
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004992void
4993PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004994{
4995 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004996 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004997 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004998 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004999}
5000
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005001/* When the compiler exits a scope, it must should update the scope's
5002 free variable information with the list of free variables in its
5003 children.
5004
5005 Variables that are free in children and defined in the current
5006 scope are cellvars.
5007
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005008 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005009 false), free variables in children that are not defined here are
5010 implicit globals.
5011
5012*/
5013
5014static int
5015symtable_update_free_vars(struct symtable *st)
5016{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005017 int i, j, def;
5018 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005019 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005020
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005021 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005022 def = DEF_FREE_CLASS;
5023 else
5024 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005025 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005026 int pos = 0;
5027
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005028 if (list && PyList_SetSlice(list, 0,
5029 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005030 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005031 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005032 PyList_GET_ITEM(ste->ste_children, i);
5033 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005034 int flags = PyInt_AS_LONG(o);
5035 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005036 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005037 if (list == NULL) {
5038 list = PyList_New(0);
5039 if (list == NULL)
5040 return -1;
5041 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005042 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005043 if (PyList_Append(list, name) < 0) {
5044 Py_DECREF(list);
5045 return -1;
5046 }
5047 }
5048 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005049 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005050 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005051 v = PyDict_GetItem(ste->ste_symbols, name);
5052 /* If a name N is declared global in scope A and
5053 referenced in scope B contained (perhaps
5054 indirectly) in A and there are no scopes
5055 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005056 is global in B. Unless A is a class scope,
5057 because class scopes are not considered for
5058 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005059 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005060 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005061 int flags = PyInt_AS_LONG(v);
5062 if (flags & DEF_GLOBAL) {
5063 symtable_undo_free(st, child->ste_id,
5064 name);
5065 continue;
5066 }
5067 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005068 if (ste->ste_nested) {
5069 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005070 name, def) < 0) {
5071 Py_DECREF(list);
5072 return -1;
5073 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005074 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005075 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005076 name) < 0) {
5077 Py_DECREF(list);
5078 return -1;
5079 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005080 }
5081 }
5082 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005083
5084 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005085 return 0;
5086}
5087
5088/* If the current scope is a non-nested class or if name is not
5089 defined in the current, non-nested scope, then it is an implicit
5090 global in all nested scopes.
5091*/
5092
5093static int
5094symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5095{
5096 PyObject *o;
5097 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005098 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005099
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005100 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005101 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005102 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005103 if (o == NULL)
5104 return symtable_undo_free(st, child, name);
5105 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005106
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005107 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005108 return symtable_undo_free(st, child, name);
5109 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005110 return symtable_add_def_o(st, ste->ste_symbols,
5111 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005112}
5113
5114static int
5115symtable_undo_free(struct symtable *st, PyObject *id,
5116 PyObject *name)
5117{
5118 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005119 PyObject *info;
5120 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005121
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005122 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5123 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005124 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005125
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005126 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005127 if (info == NULL)
5128 return 0;
5129 v = PyInt_AS_LONG(info);
5130 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005131 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005132 DEF_FREE_GLOBAL) < 0)
5133 return -1;
5134 } else
5135 /* If the name is defined here or declared global,
5136 then the recursion stops. */
5137 return 0;
5138
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005139 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5140 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005141 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005142 PyList_GET_ITEM(ste->ste_children, i);
5143 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005144 if (x < 0)
5145 return x;
5146 }
5147 return 0;
5148}
5149
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005150/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5151 This reference is released when the scope is exited, via the DECREF
5152 in symtable_exit_scope().
5153*/
5154
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005155static int
5156symtable_exit_scope(struct symtable *st)
5157{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005158 int end;
5159
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005160 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005161 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005162 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005163 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005164 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5165 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005166 if (PySequence_DelItem(st->st_stack, end) < 0)
5167 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005168 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005169}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005170
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005171static void
5172symtable_enter_scope(struct symtable *st, char *name, int type,
5173 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005174{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005175 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005176
5177 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005178 prev = st->st_cur;
5179 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005180 st->st_errors++;
5181 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005182 }
5183 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005184 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005185 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005186 if (st->st_cur == NULL) {
5187 st->st_errors++;
5188 return;
5189 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005190 if (strcmp(name, TOP) == 0)
5191 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005192 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005193 if (PyList_Append(prev->ste_children,
5194 (PyObject *)st->st_cur) < 0)
5195 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005196 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005197}
5198
5199static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005200symtable_lookup(struct symtable *st, char *name)
5201{
5202 char buffer[MANGLE_LEN];
5203 PyObject *v;
5204 int flags;
5205
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005206 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005207 name = buffer;
5208 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5209 if (v == NULL) {
5210 if (PyErr_Occurred())
5211 return -1;
5212 else
5213 return 0;
5214 }
5215
5216 flags = PyInt_AS_LONG(v);
5217 return flags;
5218}
5219
5220static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005221symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005222{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005223 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005224 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005225 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005226
Guido van Rossumb7164622002-08-16 02:48:11 +00005227 /* Warn about None, except inside a tuple (where the assignment
5228 code already issues a warning). */
5229 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5230 *name == 'N' && strcmp(name, "None") == 0)
5231 {
5232 if (symtable_warn(st, "argument named None"))
5233 return -1;
5234 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005235 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005236 name = buffer;
5237 if ((s = PyString_InternFromString(name)) == NULL)
5238 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005239 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5240 Py_DECREF(s);
5241 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005242}
5243
5244/* Must only be called with mangled names */
5245
5246static int
5247symtable_add_def_o(struct symtable *st, PyObject *dict,
5248 PyObject *name, int flag)
5249{
5250 PyObject *o;
5251 int val;
5252
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005253 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005254 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005255 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005256 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005257 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005258 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005259 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005260 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005261 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005262 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005263 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005264 if (o == NULL)
5265 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005266 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005267 Py_DECREF(o);
5268 return -1;
5269 }
5270 Py_DECREF(o);
5271
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005272 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005273 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005274 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005275 } else if (flag & DEF_GLOBAL) {
5276 /* XXX need to update DEF_GLOBAL for other flags too;
5277 perhaps only DEF_FREE_GLOBAL */
5278 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005279 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005280 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005281 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005282 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005283 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005284 if (o == NULL)
5285 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005286 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005287 Py_DECREF(o);
5288 return -1;
5289 }
5290 Py_DECREF(o);
5291 }
5292 return 0;
5293}
5294
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005295#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005296
Tim Peters08a898f2001-06-28 01:52:22 +00005297/* Look for a yield stmt under n. Return 1 if found, else 0.
5298 This hack is used to look inside "if 0:" blocks (which are normally
5299 ignored) in case those are the only places a yield occurs (so that this
5300 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005301static int
5302look_for_yield(node *n)
5303{
5304 int i;
5305
5306 for (i = 0; i < NCH(n); ++i) {
5307 node *kid = CHILD(n, i);
5308
5309 switch (TYPE(kid)) {
5310
5311 case classdef:
5312 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005313 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005314 /* Stuff in nested functions and classes can't make
5315 the parent a generator. */
5316 return 0;
5317
5318 case yield_stmt:
5319 return 1;
5320
5321 default:
5322 if (look_for_yield(kid))
5323 return 1;
5324 }
5325 }
5326 return 0;
5327}
5328
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005329static void
5330symtable_node(struct symtable *st, node *n)
5331{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005332 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005333
5334 loop:
5335 switch (TYPE(n)) {
5336 case funcdef: {
5337 char *func_name = STR(CHILD(n, 1));
5338 symtable_add_def(st, func_name, DEF_LOCAL);
5339 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005340 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005341 symtable_funcdef(st, n);
5342 symtable_exit_scope(st);
5343 break;
5344 }
5345 case lambdef:
5346 if (NCH(n) == 4)
5347 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005348 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005349 symtable_funcdef(st, n);
5350 symtable_exit_scope(st);
5351 break;
5352 case classdef: {
5353 char *tmp, *class_name = STR(CHILD(n, 1));
5354 symtable_add_def(st, class_name, DEF_LOCAL);
5355 if (TYPE(CHILD(n, 2)) == LPAR) {
5356 node *bases = CHILD(n, 3);
5357 int i;
5358 for (i = 0; i < NCH(bases); i += 2) {
5359 symtable_node(st, CHILD(bases, i));
5360 }
5361 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005362 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005363 tmp = st->st_private;
5364 st->st_private = class_name;
5365 symtable_node(st, CHILD(n, NCH(n) - 1));
5366 st->st_private = tmp;
5367 symtable_exit_scope(st);
5368 break;
5369 }
5370 case if_stmt:
5371 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005372 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5373 if (st->st_cur->ste_generator == 0)
5374 st->st_cur->ste_generator =
5375 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005376 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005377 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005378 symtable_node(st, CHILD(n, i + 1));
5379 symtable_node(st, CHILD(n, i + 3));
5380 }
5381 if (i + 2 < NCH(n))
5382 symtable_node(st, CHILD(n, i + 2));
5383 break;
5384 case global_stmt:
5385 symtable_global(st, n);
5386 break;
5387 case import_stmt:
5388 symtable_import(st, n);
5389 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005390 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005391 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005392 symtable_node(st, CHILD(n, 1));
5393 if (NCH(n) > 2)
5394 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005395 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005396 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005397 st->st_cur->ste_opt_lineno = n->n_lineno;
5398 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005399 if (NCH(n) > 4)
5400 symtable_node(st, CHILD(n, 5));
5401 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005402
5403 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005404 case assert_stmt:
5405 if (Py_OptimizeFlag)
5406 return;
5407 if (NCH(n) == 2) {
5408 n = CHILD(n, 1);
5409 goto loop;
5410 } else {
5411 symtable_node(st, CHILD(n, 1));
5412 n = CHILD(n, 3);
5413 goto loop;
5414 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005415 case except_clause:
5416 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005417 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005418 if (NCH(n) > 1) {
5419 n = CHILD(n, 1);
5420 goto loop;
5421 }
5422 break;
5423 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005424 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005425 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005426 case yield_stmt:
5427 st->st_cur->ste_generator = 1;
5428 n = CHILD(n, 1);
5429 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005430 case expr_stmt:
5431 if (NCH(n) == 1)
5432 n = CHILD(n, 0);
5433 else {
5434 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005435 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005436 symtable_node(st, CHILD(n, 2));
5437 break;
5438 } else {
5439 int i;
5440 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005441 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005442 n = CHILD(n, NCH(n) - 1);
5443 }
5444 }
5445 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005446 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005447 /* only occurs when there are multiple for loops
5448 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005449 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005450 if (TYPE(n) == list_for)
5451 symtable_list_for(st, n);
5452 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005453 REQ(n, list_if);
5454 symtable_node(st, CHILD(n, 1));
5455 if (NCH(n) == 3) {
5456 n = CHILD(n, 2);
5457 goto loop;
5458 }
5459 }
5460 break;
5461 case for_stmt:
5462 symtable_assign(st, CHILD(n, 1), 0);
5463 for (i = 3; i < NCH(n); ++i)
5464 if (TYPE(CHILD(n, i)) >= single_input)
5465 symtable_node(st, CHILD(n, i));
5466 break;
5467 /* The remaining cases fall through to default except in
5468 special circumstances. This requires the individual cases
5469 to be coded with great care, even though they look like
5470 rather innocuous. Each case must double-check TYPE(n).
5471 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005472 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005473 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005474 n = CHILD(n, 2);
5475 goto loop;
5476 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005477 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005478 case listmaker:
5479 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005480 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005481 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005482 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005483 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005484 case atom:
5485 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5486 symtable_add_use(st, STR(CHILD(n, 0)));
5487 break;
5488 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005489 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005490 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005491 /* Walk over every non-token child with a special case
5492 for one child.
5493 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005494 if (NCH(n) == 1) {
5495 n = CHILD(n, 0);
5496 goto loop;
5497 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005498 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005499 if (TYPE(CHILD(n, i)) >= single_input)
5500 symtable_node(st, CHILD(n, i));
5501 }
5502}
5503
5504static void
5505symtable_funcdef(struct symtable *st, node *n)
5506{
5507 node *body;
5508
5509 if (TYPE(n) == lambdef) {
5510 if (NCH(n) == 4)
5511 symtable_params(st, CHILD(n, 1));
5512 } else
5513 symtable_params(st, CHILD(n, 2));
5514 body = CHILD(n, NCH(n) - 1);
5515 symtable_node(st, body);
5516}
5517
5518/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00005519 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005520 which are references in the defining scope. symtable_params()
5521 parses the parameter names, which are defined in the function's
5522 body.
5523
5524 varargslist:
5525 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5526 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5527*/
5528
5529static void
5530symtable_default_args(struct symtable *st, node *n)
5531{
5532 node *c;
5533 int i;
5534
5535 if (TYPE(n) == parameters) {
5536 n = CHILD(n, 1);
5537 if (TYPE(n) == RPAR)
5538 return;
5539 }
5540 REQ(n, varargslist);
5541 for (i = 0; i < NCH(n); i += 2) {
5542 c = CHILD(n, i);
5543 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5544 break;
5545 }
5546 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5547 symtable_node(st, CHILD(n, i));
5548 }
5549}
5550
5551static void
5552symtable_params(struct symtable *st, node *n)
5553{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005554 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00005555 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005556
5557 if (TYPE(n) == parameters) {
5558 n = CHILD(n, 1);
5559 if (TYPE(n) == RPAR)
5560 return;
5561 }
5562 REQ(n, varargslist);
5563 for (i = 0; i < NCH(n); i += 2) {
5564 c = CHILD(n, i);
5565 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5566 ext = 1;
5567 break;
5568 }
5569 if (TYPE(c) == test) {
5570 continue;
5571 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00005572 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005573 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00005574 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005575 char nbuf[30];
5576 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005577 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005578 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005579 }
5580 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005581 if (ext) {
5582 c = CHILD(n, i);
5583 if (TYPE(c) == STAR) {
5584 i++;
5585 symtable_add_def(st, STR(CHILD(n, i)),
5586 DEF_PARAM | DEF_STAR);
5587 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005588 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005589 c = NULL;
5590 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005591 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005592 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005593 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005594 i++;
5595 symtable_add_def(st, STR(CHILD(n, i)),
5596 DEF_PARAM | DEF_DOUBLESTAR);
5597 }
5598 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005599 if (complex >= 0) {
5600 int j;
5601 for (j = 0; j <= complex; j++) {
5602 c = CHILD(n, j);
5603 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005604 c = CHILD(n, ++j);
5605 else if (TYPE(c) == EQUAL)
5606 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005607 if (TYPE(CHILD(c, 0)) == LPAR)
5608 symtable_params_fplist(st, CHILD(c, 1));
5609 }
5610 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005611}
5612
5613static void
5614symtable_params_fplist(struct symtable *st, node *n)
5615{
5616 int i;
5617 node *c;
5618
5619 REQ(n, fplist);
5620 for (i = 0; i < NCH(n); i += 2) {
5621 c = CHILD(n, i);
5622 REQ(c, fpdef);
5623 if (NCH(c) == 1)
5624 symtable_add_def(st, STR(CHILD(c, 0)),
5625 DEF_PARAM | DEF_INTUPLE);
5626 else
5627 symtable_params_fplist(st, CHILD(c, 1));
5628 }
5629
5630}
5631
5632static void
5633symtable_global(struct symtable *st, node *n)
5634{
5635 int i;
5636
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005637 /* XXX It might be helpful to warn about module-level global
5638 statements, but it's hard to tell the difference between
5639 module-level and a string passed to exec.
5640 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005641
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005642 for (i = 1; i < NCH(n); i += 2) {
5643 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005644 int flags;
5645
5646 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005647 if (flags < 0)
5648 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005649 if (flags && flags != DEF_GLOBAL) {
5650 char buf[500];
5651 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005652 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005653 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00005654 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005655 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005656 }
5657 else {
5658 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005659 PyOS_snprintf(buf, sizeof(buf),
5660 GLOBAL_AFTER_ASSIGN,
5661 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005662 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005663 PyOS_snprintf(buf, sizeof(buf),
5664 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005665 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005666 }
5667 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005668 symtable_add_def(st, name, DEF_GLOBAL);
5669 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005670}
5671
5672static void
5673symtable_list_comprehension(struct symtable *st, node *n)
5674{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005675 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005676 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005677
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005678 REQ(n, listmaker);
5679 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
5680 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005681 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005682 symtable_list_for(st, CHILD(n, 1));
5683 symtable_node(st, CHILD(n, 0));
5684 --st->st_cur->ste_tmpname;
5685}
5686
5687static void
5688symtable_list_for(struct symtable *st, node *n)
5689{
5690 REQ(n, list_for);
5691 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005692 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005693 symtable_node(st, CHILD(n, 3));
5694 if (NCH(n) == 5)
5695 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005696}
5697
5698static void
5699symtable_import(struct symtable *st, node *n)
5700{
5701 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005702 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005703 | 'from' dotted_name 'import'
5704 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005705 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005706 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005707 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005708 node *dotname = CHILD(n, 1);
5709 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5710 /* check for bogus imports */
5711 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5712 PyErr_SetString(PyExc_SyntaxError,
5713 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00005714 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005715 return;
5716 }
5717 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005718 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005719 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005720 if (symtable_warn(st,
5721 "import * only allowed at module level") < 0)
5722 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005723 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005724 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005725 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005726 } else {
5727 for (i = 3; i < NCH(n); i += 2) {
5728 node *c = CHILD(n, i);
5729 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005730 symtable_assign(st, CHILD(c, 2),
5731 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005732 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005733 symtable_assign(st, CHILD(c, 0),
5734 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005735 }
5736 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005737 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005738 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005739 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005740 }
5741 }
5742}
5743
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005744/* The third argument to symatble_assign() is a flag to be passed to
5745 symtable_add_def() if it is eventually called. The flag is useful
5746 to specify the particular type of assignment that should be
5747 recorded, e.g. an assignment caused by import.
5748 */
5749
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005750static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005751symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005752{
5753 node *tmp;
5754 int i;
5755
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005756 loop:
5757 switch (TYPE(n)) {
5758 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005759 /* invalid assignment, e.g. lambda x:x=2. The next
5760 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005761 return;
5762 case power:
5763 if (NCH(n) > 2) {
5764 for (i = 2; i < NCH(n); ++i)
5765 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5766 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005767 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005768 if (NCH(n) > 1) {
5769 symtable_node(st, CHILD(n, 0));
5770 symtable_node(st, CHILD(n, 1));
5771 } else {
5772 n = CHILD(n, 0);
5773 goto loop;
5774 }
5775 return;
5776 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005777 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5778 /* XXX This is an error, but the next pass
5779 will catch it. */
5780 return;
5781 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005782 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005783 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005784 }
5785 return;
5786 case exprlist:
5787 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00005788 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005789 if (NCH(n) == 1) {
5790 n = CHILD(n, 0);
5791 goto loop;
5792 }
5793 else {
5794 int i;
5795 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005796 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005797 return;
5798 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005799 case atom:
5800 tmp = CHILD(n, 0);
5801 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5802 n = CHILD(n, 1);
5803 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005804 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00005805 if (strcmp(STR(tmp), "__debug__") == 0) {
5806 PyErr_SetString(PyExc_SyntaxError,
5807 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00005808 symtable_error(st, n->n_lineno);
5809 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00005810 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005811 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005812 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005813 return;
5814 case dotted_as_name:
5815 if (NCH(n) == 3)
5816 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005817 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005818 else
5819 symtable_add_def(st,
5820 STR(CHILD(CHILD(n,
5821 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005822 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005823 return;
5824 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005825 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005826 return;
5827 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005828 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005829 return;
5830 default:
5831 if (NCH(n) == 0)
5832 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005833 if (NCH(n) == 1) {
5834 n = CHILD(n, 0);
5835 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005836 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005837 /* Should only occur for errors like x + 1 = 1,
5838 which will be caught in the next pass. */
5839 for (i = 0; i < NCH(n); ++i)
5840 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005841 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005842 }
5843}