blob: f58fb83efce916b9046ce2092056f5da7e321976 [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
330
331static PyObject *
332optimize_code(PyObject *code, PyObject* consts)
333{
334 int i, j, codelen;
335 int tgt, tgttgt, opcode;
336 unsigned char *codestr;
337
338 /* Make a modifiable copy of the code string */
339 if (!PyString_Check(code))
340 goto exitUnchanged;
341 codelen = PyString_Size(code);
342 codestr = PyMem_Malloc(codelen);
Raymond Hettingerf4cf76d2003-04-24 05:45:23 +0000343 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000344 goto exitUnchanged;
345 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
346 assert(PyTuple_Check(consts));
347
Raymond Hettingerf4cf76d2003-04-24 05:45:23 +0000348 for (i=0 ; i<codelen-7 ; i += HAS_ARG(codestr[i]) ? 3 : 1) {
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000349 opcode = codestr[i];
350 switch (opcode) {
351
352 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP.
353 Note, only the first opcode is changed, the others still
354 perform normally if they happen to be jump targets. */
355 case LOAD_CONST:
356 j = GETARG(codestr, i);
357 if (codestr[i+3] != JUMP_IF_FALSE ||
358 codestr[i+6] != POP_TOP ||
359 !PyObject_IsTrue(PyTuple_GET_ITEM(consts, j)))
360 continue;
361 codestr[i] = JUMP_FORWARD;
362 SETARG(codestr, i, 4);
363 break;
364
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000365 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000366 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000367 case JUMP_FORWARD:
368 case JUMP_IF_FALSE:
369 case JUMP_IF_TRUE:
370 case JUMP_ABSOLUTE:
371 case CONTINUE_LOOP:
372 case SETUP_LOOP:
373 case SETUP_EXCEPT:
374 case SETUP_FINALLY:
375 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerf4cf76d2003-04-24 05:45:23 +0000376 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000377 continue;
378 tgttgt = GETJUMPTGT(codestr, tgt);
379 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
380 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000381 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000382 tgttgt -= i + 3; /* Calc relative jump addr */
383 if (tgttgt < 0) /* No backward relative jumps */
384 continue;
385 codestr[i] = opcode;
386 SETARG(codestr, i, tgttgt);
387 break;
388
389 case EXTENDED_ARG:
390 PyMem_Free(codestr);
391 goto exitUnchanged;
392 }
393 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000394 code = PyString_FromStringAndSize((char *)codestr, codelen);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000395 PyMem_Free(codestr);
396 return code;
397
398exitUnchanged:
399 Py_INCREF(code);
400 return code;
401}
402
Guido van Rossum79f25d91997-04-29 20:08:16 +0000403PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000404PyCode_New(int argcount, int nlocals, int stacksize, int flags,
405 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000406 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
407 PyObject *filename, PyObject *name, int firstlineno,
408 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000409{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000410 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000411 int i;
412 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000413 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000414 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000415 consts == NULL || !PyTuple_Check(consts) ||
416 names == NULL || !PyTuple_Check(names) ||
417 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000418 freevars == NULL || !PyTuple_Check(freevars) ||
419 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000420 name == NULL || !PyString_Check(name) ||
421 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000422 lnotab == NULL || !PyString_Check(lnotab) ||
423 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000424 PyErr_BadInternalCall();
425 return NULL;
426 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000427 intern_strings(names);
428 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000429 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000430 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000431 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000432 for (i = PyTuple_Size(consts); --i >= 0; ) {
433 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000434 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000435 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000436 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000437 continue;
438 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000439 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000440 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000441 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000442 co->co_argcount = argcount;
443 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000444 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000445 co->co_flags = flags;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000446 co->co_code = optimize_code(code, consts);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000447 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000448 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000449 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000450 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000451 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000452 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000453 Py_INCREF(freevars);
454 co->co_freevars = freevars;
455 Py_INCREF(cellvars);
456 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000457 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000458 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000459 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000460 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000461 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000462 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000463 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000464 if (PyTuple_GET_SIZE(freevars) == 0 &&
465 PyTuple_GET_SIZE(cellvars) == 0)
466 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000467 }
468 return co;
469}
470
471
472/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000473
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000474/* The compiler uses two passes to generate bytecodes. The first pass
475 builds the symbol table. The second pass generates the bytecode.
476
477 The first pass uses a single symtable struct. The second pass uses
478 a compiling struct for each code block. The compiling structs
479 share a reference to the symtable.
480
481 The two passes communicate via symtable_load_symbols() and via
482 is_local() and is_global(). The former initializes several slots
483 in the compiling struct: c_varnames, c_locals, c_nlocals,
484 c_argcount, c_globals, and c_flags.
485*/
486
Tim Peters2a7f3842001-06-09 09:26:21 +0000487/* All about c_lnotab.
488
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000489c_lnotab is an array of unsigned bytes disguised as a Python string. Since
490version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
491mapped to source code line #s via c_lnotab instead.
492
Tim Peters2a7f3842001-06-09 09:26:21 +0000493The array is conceptually a list of
494 (bytecode offset increment, line number increment)
495pairs. The details are important and delicate, best illustrated by example:
496
497 byte code offset source code line number
498 0 1
499 6 2
500 50 7
501 350 307
502 361 308
503
504The first trick is that these numbers aren't stored, only the increments
505from one row to the next (this doesn't really work, but it's a start):
506
507 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
508
509The second trick is that an unsigned byte can't hold negative values, or
510values larger than 255, so (a) there's a deep assumption that byte code
511offsets and their corresponding line #s both increase monotonically, and (b)
512if at least one column jumps by more than 255 from one row to the next, more
513than one pair is written to the table. In case #b, there's no way to know
514from looking at the table later how many were written. That's the delicate
515part. A user of c_lnotab desiring to find the source line number
516corresponding to a bytecode address A should do something like this
517
518 lineno = addr = 0
519 for addr_incr, line_incr in c_lnotab:
520 addr += addr_incr
521 if addr > A:
522 return lineno
523 lineno += line_incr
524
525In order for this to work, when the addr field increments by more than 255,
526the line # increment in each pair generated must be 0 until the remaining addr
527increment is < 256. So, in the example above, com_set_lineno should not (as
528was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
529255, 0, 45, 255, 0, 45.
530*/
531
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000532struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000533 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000534 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000535 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000536 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000537 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +0000538 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000539 PyObject *c_locals; /* dictionary (value=localID) */
540 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000541 PyObject *c_freevars; /* dictionary (value=None) */
542 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000543 int c_nlocals; /* index of next local */
544 int c_argcount; /* number of top-level arguments */
545 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000546 int c_nexti; /* index into c_code */
547 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000548 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000549 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000550 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000551 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000552 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000553 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +0000554 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000555 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000556 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000557 int c_stacklevel; /* Current stack level */
558 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000559 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000560 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000561 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000562 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000563 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000564 int c_nested; /* Is block nested funcdef or lamdef? */
565 int c_closure; /* Is nested w/freevars? */
566 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000567 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000568 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000569};
570
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000571static int
572is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000573{
574 if ((v & (USE | DEF_FREE))
575 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
576 return 1;
577 if (v & DEF_FREE_CLASS)
578 return 1;
579 return 0;
580}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000581
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000582static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000583com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000584{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000585 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
586
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000587 if (c == NULL) {
588 /* Error occurred via symtable call to
589 is_constant_false */
590 PyErr_SetString(exc, msg);
591 return;
592 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000593 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000594 if (c->c_lineno < 1 || c->c_interactive) {
595 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000596 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000597 return;
598 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000599 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000600 if (v == NULL)
601 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000602
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000603 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000604 if (line == NULL) {
605 Py_INCREF(Py_None);
606 line = Py_None;
607 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000608 if (exc == PyExc_SyntaxError) {
609 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
610 Py_None, line);
611 if (t == NULL)
612 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000613 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000614 if (w == NULL)
615 goto exit;
616 PyErr_SetObject(exc, w);
617 } else {
618 /* Make sure additional exceptions are printed with
619 file and line, also. */
620 PyErr_SetObject(exc, v);
621 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
622 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000623 exit:
624 Py_XDECREF(t);
625 Py_XDECREF(v);
626 Py_XDECREF(w);
627 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000628}
629
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000630/* Interface to the block stack */
631
632static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000633block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000634{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000635 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000636 com_error(c, PyExc_SystemError,
637 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000638 }
639 else {
640 c->c_block[c->c_nblocks++] = type;
641 }
642}
643
644static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000645block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000646{
647 if (c->c_nblocks > 0)
648 c->c_nblocks--;
649 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000650 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000651 }
652}
653
Guido van Rossum681d79a1995-07-18 14:51:37 +0000654/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000655
Martin v. Löwis95292d62002-12-11 14:04:59 +0000656static int issue_warning(const char *, const char *, int);
657static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000658static void com_free(struct compiling *);
659static void com_push(struct compiling *, int);
660static void com_pop(struct compiling *, int);
661static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000662static void com_node(struct compiling *, node *);
663static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000664static void com_addbyte(struct compiling *, int);
665static void com_addint(struct compiling *, int);
666static void com_addoparg(struct compiling *, int, int);
667static void com_addfwref(struct compiling *, int, int *);
668static void com_backpatch(struct compiling *, int);
669static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
670static int com_addconst(struct compiling *, PyObject *);
671static int com_addname(struct compiling *, PyObject *);
672static void com_addopname(struct compiling *, int, node *);
673static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000674static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000675static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000676static void com_assign(struct compiling *, node *, int, node *);
677static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000678static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +0000679static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000680 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000681static PyObject *parsestrplus(struct compiling*, node *);
682static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000683static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000684
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000685static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000686
687/* symtable operations */
Jeremy Hylton1955fcf2003-07-15 20:23:26 +0000688static struct symtable *symtable_build(node *, PyFutureFeatures *,
689 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000690static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000691static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000692static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000693static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000694static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000695static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000696
697static void symtable_node(struct symtable *, node *);
698static void symtable_funcdef(struct symtable *, node *);
699static void symtable_default_args(struct symtable *, node *);
700static void symtable_params(struct symtable *, node *);
701static void symtable_params_fplist(struct symtable *, node *n);
702static void symtable_global(struct symtable *, node *);
703static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000704static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000705static void symtable_list_comprehension(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +0000706static void symtable_list_for(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000707
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000708static int symtable_update_free_vars(struct symtable *);
709static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
710static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
711
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000712/* helper */
713static void
714do_pad(int pad)
715{
716 int i;
717 for (i = 0; i < pad; ++i)
718 fprintf(stderr, " ");
719}
720
721static void
722dump(node *n, int pad, int depth)
723{
724 int i;
725 if (depth == 0)
726 return;
727 do_pad(pad);
728 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
729 if (depth > 0)
730 depth--;
731 for (i = 0; i < NCH(n); ++i)
732 dump(CHILD(n, i), pad + 1, depth);
733}
734
735#define DUMP(N) dump(N, 0, -1)
736
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000737static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000738com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000739{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000740 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000741 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
742 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000743 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000744 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000745 goto fail;
746 if ((c->c_const_dict = PyDict_New()) == NULL)
747 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000748 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000749 goto fail;
750 if ((c->c_name_dict = PyDict_New()) == NULL)
751 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000752 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000753 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000754 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
755 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000756 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000757 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000758 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000759 c->c_freevars = NULL;
760 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000761 c->c_nlocals = 0;
762 c->c_argcount = 0;
763 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000764 c->c_nexti = 0;
765 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000766 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000767 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000768 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000769 c->c_begin = 0;
770 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000771 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000772 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000773 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000774 c->c_stacklevel = 0;
775 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000776 c->c_firstlineno = 0;
777 c->c_last_addr = 0;
778 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000779 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000780 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000781 c->c_nested = 0;
782 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000783 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000784 return 1;
785
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000786 fail:
787 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000788 return 0;
789}
790
791static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000792com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000793{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000794 Py_XDECREF(c->c_code);
795 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000796 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000797 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000798 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000799 Py_XDECREF(c->c_globals);
800 Py_XDECREF(c->c_locals);
801 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000802 Py_XDECREF(c->c_freevars);
803 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000804 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000805 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +0000806 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000807}
808
809static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000810com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000811{
812 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000813 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +0000814 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000815 /*
816 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
817 c->c_filename, c->c_name, c->c_lineno,
818 c->c_nexti, c->c_stacklevel, n);
819 */
820 }
Guido van Rossum8b993a91997-01-17 21:04:03 +0000821}
822
823static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000824com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000825{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000826 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000827 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000828 else
829 c->c_stacklevel -= n;
830}
831
832static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000833com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000834{
835 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000836 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000837 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000838 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000839}
840
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000841static int
842com_check_size(PyObject **s, int offset)
843{
844 int len = PyString_GET_SIZE(*s);
845 if (offset >= len)
846 return _PyString_Resize(s, len * 2);
847 return 0;
848}
849
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000850static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000851com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000852{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000853 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000854 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +0000855 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000856 if (com_check_size(&c->c_code, c->c_nexti)) {
857 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000858 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000859 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000860 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000861}
862
863static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000864com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000865{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000866 com_addbyte(c, x & 0xff);
867 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000868}
869
870static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000871com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000872{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000873 char *p;
874 if (c->c_lnotab == NULL)
875 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000876 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
877 c->c_errors++;
878 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000879 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000880 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000881 *p++ = addr;
882 *p++ = line;
883 c->c_lnotab_next += 2;
884}
885
886static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000887com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000888{
889 c->c_lineno = lineno;
890 if (c->c_firstlineno == 0) {
891 c->c_firstlineno = c->c_last_line = lineno;
892 }
893 else {
894 int incr_addr = c->c_nexti - c->c_last_addr;
895 int incr_line = lineno - c->c_last_line;
Tim Peters2a7f3842001-06-09 09:26:21 +0000896 while (incr_addr > 255) {
897 com_add_lnotab(c, 255, 0);
898 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000899 }
Tim Peters2a7f3842001-06-09 09:26:21 +0000900 while (incr_line > 255) {
901 com_add_lnotab(c, incr_addr, 255);
902 incr_line -=255;
903 incr_addr = 0;
904 }
905 if (incr_addr > 0 || incr_line > 0)
906 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000907 c->c_last_addr = c->c_nexti;
908 c->c_last_line = lineno;
909 }
910}
911
912static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000913com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000914{
Fred Drakeef8ace32000-08-24 00:32:09 +0000915 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +0000916 if (extended_arg){
917 com_addbyte(c, EXTENDED_ARG);
918 com_addint(c, extended_arg);
919 arg &= 0xffff;
920 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000921 com_addbyte(c, op);
922 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000923}
924
925static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000926com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000927{
928 /* Compile a forward reference for backpatching */
929 int here;
930 int anchor;
931 com_addbyte(c, op);
932 here = c->c_nexti;
933 anchor = *p_anchor;
934 *p_anchor = here;
935 com_addint(c, anchor == 0 ? 0 : here - anchor);
936}
937
938static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000939com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000940{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000941 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000942 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000943 int dist;
944 int prev;
945 for (;;) {
946 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000947 prev = code[anchor] + (code[anchor+1] << 8);
948 dist = target - (anchor+2);
949 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000950 dist >>= 8;
951 code[anchor+1] = dist;
952 dist >>= 8;
953 if (dist) {
954 com_error(c, PyExc_SystemError,
955 "com_backpatch: offset too large");
956 break;
957 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000958 if (!prev)
959 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000960 anchor -= prev;
961 }
962}
963
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000964/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000965
966static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000967com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000968{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000969 PyObject *w, *t, *np=NULL;
970 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000971
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000972 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000973 if (t == NULL)
974 goto fail;
975 w = PyDict_GetItem(dict, t);
976 if (w != NULL) {
977 n = PyInt_AsLong(w);
978 } else {
979 n = PyList_Size(list);
980 np = PyInt_FromLong(n);
981 if (np == NULL)
982 goto fail;
983 if (PyList_Append(list, v) != 0)
984 goto fail;
985 if (PyDict_SetItem(dict, t, np) != 0)
986 goto fail;
987 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000988 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000989 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000990 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000991 fail:
992 Py_XDECREF(np);
993 Py_XDECREF(t);
994 c->c_errors++;
995 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000996}
997
998static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000999com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001000{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001001 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001002}
1003
1004static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001005com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001006{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001007 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001008}
1009
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001010int
1011_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001012{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001013 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001014 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001015 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001016 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1017 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001018 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001019 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001020 return 0; /* Don't mangle __extremely_long_names */
1021 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1022 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001023 /* Strip leading underscores from class name */
1024 while (*p == '_')
1025 p++;
1026 if (*p == '\0')
1027 return 0; /* Don't mangle if class is just underscores */
1028 plen = strlen(p);
1029 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001030 plen = maxlen-nlen-2; /* Truncate class name if too long */
1031 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001032 buffer[0] = '_';
1033 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001034 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001035 return 1;
1036}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001037
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001038static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001039com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001040{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001041 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001042 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001043 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001044
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001045 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001046 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001047 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001048 c->c_errors++;
1049 i = 255;
1050 }
1051 else {
1052 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001053 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001054 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001055 com_addoparg(c, op, i);
1056}
1057
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001058#define NAME_LOCAL 0
1059#define NAME_GLOBAL 1
1060#define NAME_DEFAULT 2
1061#define NAME_CLOSURE 3
1062
1063static int
1064com_lookup_arg(PyObject *dict, PyObject *name)
1065{
1066 PyObject *v = PyDict_GetItem(dict, name);
1067 if (v == NULL)
1068 return -1;
1069 else
1070 return PyInt_AS_LONG(v);
1071}
1072
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001073static int
1074none_assignment_check(struct compiling *c, char *name, int assigning)
1075{
1076 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1077 char *msg;
1078 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001079 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001080 else
1081 msg = "deleting None";
1082 if (issue_warning(msg, c->c_filename, c->c_lineno) < 0) {
1083 c->c_errors++;
1084 return -1;
1085 }
1086 }
1087 return 0;
1088}
1089
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001090static void
1091com_addop_varname(struct compiling *c, int kind, char *name)
1092{
1093 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001094 int i, reftype;
1095 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001096 int op = STOP_CODE;
1097 char buffer[MANGLE_LEN];
1098
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001099 if (kind != VAR_LOAD &&
1100 none_assignment_check(c, name, kind == VAR_STORE))
1101 {
1102 c->c_errors++;
1103 i = 255;
1104 goto done;
1105 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001106 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001107 name = buffer;
1108 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1109 c->c_errors++;
1110 i = 255;
1111 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001112 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001113
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001114 reftype = get_ref_type(c, name);
1115 switch (reftype) {
1116 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001117 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001118 scope = NAME_LOCAL;
1119 break;
1120 case GLOBAL_EXPLICIT:
1121 scope = NAME_GLOBAL;
1122 break;
1123 case GLOBAL_IMPLICIT:
1124 if (c->c_flags & CO_OPTIMIZED)
1125 scope = NAME_GLOBAL;
1126 break;
1127 case FREE:
1128 case CELL:
1129 scope = NAME_CLOSURE;
1130 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001131 }
1132
1133 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001134 if (scope == NAME_LOCAL)
1135 i = com_lookup_arg(c->c_locals, v);
1136 else if (reftype == FREE)
1137 i = com_lookup_arg(c->c_freevars, v);
1138 else if (reftype == CELL)
1139 i = com_lookup_arg(c->c_cellvars, v);
1140 if (i == -1) {
1141 c->c_errors++; /* XXX no exception set */
1142 i = 255;
1143 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001144 }
1145 Py_DECREF(v);
1146
1147 switch (kind) {
1148 case VAR_LOAD:
1149 switch (scope) {
1150 case NAME_LOCAL:
1151 op = LOAD_FAST;
1152 break;
1153 case NAME_GLOBAL:
1154 op = LOAD_GLOBAL;
1155 break;
1156 case NAME_DEFAULT:
1157 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001158 break;
1159 case NAME_CLOSURE:
1160 op = LOAD_DEREF;
1161 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001162 }
1163 break;
1164 case VAR_STORE:
1165 switch (scope) {
1166 case NAME_LOCAL:
1167 op = STORE_FAST;
1168 break;
1169 case NAME_GLOBAL:
1170 op = STORE_GLOBAL;
1171 break;
1172 case NAME_DEFAULT:
1173 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001174 break;
1175 case NAME_CLOSURE:
1176 op = STORE_DEREF;
1177 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001178 }
1179 break;
1180 case VAR_DELETE:
1181 switch (scope) {
1182 case NAME_LOCAL:
1183 op = DELETE_FAST;
1184 break;
1185 case NAME_GLOBAL:
1186 op = DELETE_GLOBAL;
1187 break;
1188 case NAME_DEFAULT:
1189 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001190 break;
1191 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001192 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001193 PyOS_snprintf(buf, sizeof(buf),
1194 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001195 com_error(c, PyExc_SyntaxError, buf);
1196 i = 255;
1197 break;
1198 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001199 }
1200 break;
1201 }
1202done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001203 com_addoparg(c, op, i);
1204}
1205
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001206static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001207com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001208{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001209 char *name;
1210 char buffer[1000];
1211 /* XXX it is possible to write this code without the 1000
1212 chars on the total length of dotted names, I just can't be
1213 bothered right now */
1214 if (TYPE(n) == STAR)
1215 name = "*";
1216 else if (TYPE(n) == dotted_name) {
1217 char *p = buffer;
1218 int i;
1219 name = buffer;
1220 for (i = 0; i < NCH(n); i += 2) {
1221 char *s = STR(CHILD(n, i));
1222 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001223 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001224 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001225 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001226 break;
1227 }
1228 if (p != buffer)
1229 *p++ = '.';
1230 strcpy(p, s);
1231 p = strchr(p, '\0');
1232 }
1233 }
1234 else {
1235 REQ(n, NAME);
1236 name = STR(n);
1237 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001238 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001239}
1240
Guido van Rossum79f25d91997-04-29 20:08:16 +00001241static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001242parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001243{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001244 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001245 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001246 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001247#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001248 int imflag;
1249#endif
1250
Guido van Rossum282914b1991-04-04 10:42:56 +00001251 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001252 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001253#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001254 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001255#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001256 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001257 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001258 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001259 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001260 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001261 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001262 }
1263 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001264 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001265 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001266 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001267 if (errno != 0)
1268 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001269 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001270 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001271 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001272#ifndef WITHOUT_COMPLEX
1273 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001274 Py_complex z;
1275 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001276 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001277 z.imag = atof(s);
1278 PyFPE_END_PROTECT(z)
1279 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001280 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001281 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001282#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001283 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001284 PyFPE_START_PROTECT("atof", return 0)
1285 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001286 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001287 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001288 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001289}
1290
Guido van Rossum79f25d91997-04-29 20:08:16 +00001291static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001292decode_utf8(char **sPtr, char *end, char* encoding)
1293{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001294#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001295 Py_FatalError("decode_utf8 should not be called in this build.");
1296 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001297#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001298 PyObject *u, *v;
1299 char *s, *t;
1300 t = s = *sPtr;
1301 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1302 while (s < end && (*s & 0x80)) s++;
1303 *sPtr = s;
1304 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1305 if (u == NULL)
1306 return NULL;
1307 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1308 Py_DECREF(u);
1309 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001310#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001311}
1312
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001313/* compiler.transformer.Transformer.decode_literal depends on what
1314 might seem like minor details of this function -- changes here
1315 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001316static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001317parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001318{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001319 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001320 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001321 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001322 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001323 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001324 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001325 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001326
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001327 if (isalpha(quote) || quote == '_') {
1328 if (quote == 'u' || quote == 'U') {
1329 quote = *++s;
1330 unicode = 1;
1331 }
1332 if (quote == 'r' || quote == 'R') {
1333 quote = *++s;
1334 rawmode = 1;
1335 }
1336 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001337 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001338 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001339 return NULL;
1340 }
1341 s++;
1342 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001343 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001344 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001345 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001346 return NULL;
1347 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001348 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001349 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001350 return NULL;
1351 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001352 if (len >= 4 && s[0] == quote && s[1] == quote) {
1353 s += 2;
1354 len -= 2;
1355 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001356 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001357 return NULL;
1358 }
1359 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001360#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001361 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001362 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001363 char *buf;
1364 char *p;
1365 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001366 if (encoding == NULL) {
1367 buf = s;
1368 u = NULL;
1369 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1370 buf = s;
1371 u = NULL;
1372 } else {
1373 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1374 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1375 if (u == NULL)
1376 return NULL;
1377 p = buf = PyString_AsString(u);
1378 end = s + len;
1379 while (s < end) {
1380 if (*s == '\\') {
1381 *p++ = *s++;
1382 if (*s & 0x80) {
1383 strcpy(p, "u005c");
1384 p += 5;
1385 }
1386 }
1387 if (*s & 0x80) { /* XXX inefficient */
1388 char *r;
1389 int rn, i;
1390 w = decode_utf8(&s, end, "utf-16-be");
1391 if (w == NULL) {
1392 Py_DECREF(u);
1393 return NULL;
1394 }
1395 r = PyString_AsString(w);
1396 rn = PyString_Size(w);
1397 assert(rn % 2 == 0);
1398 for (i = 0; i < rn; i += 2) {
1399 sprintf(p, "\\u%02x%02x",
1400 r[i + 0] & 0xFF,
1401 r[i + 1] & 0xFF);
1402 p += 6;
1403 }
1404 Py_DECREF(w);
1405 } else {
1406 *p++ = *s++;
1407 }
1408 }
1409 len = p - buf;
1410 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001411 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001412 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001413 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001414 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1415 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001416 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001417 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001418 return v;
1419
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001420 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001421#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001422 need_encoding = (encoding != NULL &&
1423 strcmp(encoding, "utf-8") != 0 &&
1424 strcmp(encoding, "iso-8859-1") != 0);
1425 if (rawmode || strchr(s, '\\') == NULL) {
1426 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001427#ifndef Py_USING_UNICODE
1428 /* This should not happen - we never see any other
1429 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001430 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001431#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001432 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1433 if (u == NULL)
1434 return NULL;
1435 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1436 Py_DECREF(u);
1437 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001438#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001439 } else {
1440 return PyString_FromStringAndSize(s, len);
1441 }
1442 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001443
1444 v = PyString_DecodeEscape(s, len, NULL, unicode,
1445 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001446 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001447 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001448 return v;
1449}
1450
Guido van Rossum79f25d91997-04-29 20:08:16 +00001451static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001452parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001453{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001454 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001455 int i;
1456 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001457 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001458 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001459 for (i = 1; i < NCH(n); i++) {
1460 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001461 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001462 if (s == NULL)
1463 goto onError;
1464 if (PyString_Check(v) && PyString_Check(s)) {
1465 PyString_ConcatAndDel(&v, s);
1466 if (v == NULL)
1467 goto onError;
1468 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001469#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001470 else {
1471 PyObject *temp;
1472 temp = PyUnicode_Concat(v, s);
1473 Py_DECREF(s);
1474 if (temp == NULL)
1475 goto onError;
1476 Py_DECREF(v);
1477 v = temp;
1478 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001479#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001480 }
1481 }
1482 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001483
1484 onError:
1485 Py_XDECREF(v);
1486 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001487}
1488
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001489static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001490com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001491{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001492 int anchor = 0;
1493 int save_begin = c->c_begin;
1494
1495 /* list_iter: for v in expr [list_iter] */
1496 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001497 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001498 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001499 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001500 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001501 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001502 c->c_loops++;
1503 com_list_iter(c, n, e, t);
1504 c->c_loops--;
1505 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1506 c->c_begin = save_begin;
1507 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001508 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001509}
1510
1511static void
1512com_list_if(struct compiling *c, node *n, node *e, char *t)
1513{
1514 int anchor = 0;
1515 int a = 0;
1516 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001517 com_node(c, CHILD(n, 1));
1518 com_addfwref(c, JUMP_IF_FALSE, &a);
1519 com_addbyte(c, POP_TOP);
1520 com_pop(c, 1);
1521 com_list_iter(c, n, e, t);
1522 com_addfwref(c, JUMP_FORWARD, &anchor);
1523 com_backpatch(c, a);
1524 /* We jump here with an extra entry which we now pop */
1525 com_addbyte(c, POP_TOP);
1526 com_backpatch(c, anchor);
1527}
1528
1529static void
1530com_list_iter(struct compiling *c,
1531 node *p, /* parent of list_iter node */
1532 node *e, /* element expression node */
1533 char *t /* name of result list temp local */)
1534{
1535 /* list_iter is the last child in a listmaker, list_for, or list_if */
1536 node *n = CHILD(p, NCH(p)-1);
1537 if (TYPE(n) == list_iter) {
1538 n = CHILD(n, 0);
1539 switch (TYPE(n)) {
1540 case list_for:
1541 com_list_for(c, n, e, t);
1542 break;
1543 case list_if:
1544 com_list_if(c, n, e, t);
1545 break;
1546 default:
1547 com_error(c, PyExc_SystemError,
1548 "invalid list_iter node type");
1549 }
1550 }
1551 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001552 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001553 com_push(c, 1);
1554 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001555 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001556 com_pop(c, 2);
1557 }
1558}
1559
1560static void
1561com_list_comprehension(struct compiling *c, node *n)
1562{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001563 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001564 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001565
1566 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001567 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001568 com_addoparg(c, BUILD_LIST, 0);
1569 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1570 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001571 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001572 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001573 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001574 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001575 --c->c_tmpname;
1576}
1577
1578static void
1579com_listmaker(struct compiling *c, node *n)
1580{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001581 /* listmaker: test ( list_for | (',' test)* [','] ) */
1582 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001583 com_list_comprehension(c, n);
1584 else {
1585 int len = 0;
1586 int i;
1587 for (i = 0; i < NCH(n); i += 2, len++)
1588 com_node(c, CHILD(n, i));
1589 com_addoparg(c, BUILD_LIST, len);
1590 com_pop(c, len-1);
1591 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001592}
1593
1594static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001595com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001596{
1597 int i;
1598 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1599 for (i = 0; i+2 < NCH(n); i += 4) {
1600 /* We must arrange things just right for STORE_SUBSCR.
1601 It wants the stack to look like (value) (dict) (key) */
1602 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001603 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001604 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00001605 com_node(c, CHILD(n, i+2)); /* value */
1606 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001607 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001608 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001609 }
1610}
1611
1612static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001613com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001614{
1615 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001616 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001617 int i;
1618 REQ(n, atom);
1619 ch = CHILD(n, 0);
1620 switch (TYPE(ch)) {
1621 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001622 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001623 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001624 com_push(c, 1);
1625 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001626 else
1627 com_node(c, CHILD(n, 1));
1628 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001629 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001630 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001631 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001632 com_push(c, 1);
1633 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001634 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001635 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001636 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001637 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001638 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001639 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001640 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001641 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001642 break;
1643 case BACKQUOTE:
1644 com_node(c, CHILD(n, 1));
1645 com_addbyte(c, UNARY_CONVERT);
1646 break;
1647 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001648 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001649 i = 255;
1650 }
1651 else {
1652 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001653 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001654 }
1655 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001656 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001657 break;
1658 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001659 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001660 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001661 c->c_errors++;
1662 i = 255;
1663 }
1664 else {
1665 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001666 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001667 }
1668 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001669 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001670 break;
1671 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001672 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001673 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001674 break;
1675 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001676 com_error(c, PyExc_SystemError,
1677 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001678 }
1679}
1680
1681static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001682com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001683{
1684 if (NCH(n) == 1) {
1685 com_addbyte(c, op);
1686 }
1687 else if (NCH(n) == 2) {
1688 if (TYPE(CHILD(n, 0)) != COLON) {
1689 com_node(c, CHILD(n, 0));
1690 com_addbyte(c, op+1);
1691 }
1692 else {
1693 com_node(c, CHILD(n, 1));
1694 com_addbyte(c, op+2);
1695 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001696 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001697 }
1698 else {
1699 com_node(c, CHILD(n, 0));
1700 com_node(c, CHILD(n, 2));
1701 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001702 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001703 }
1704}
1705
Guido van Rossum635abd21997-01-06 22:56:52 +00001706static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001707com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1708{
1709 if (NCH(n) == 1) {
1710 com_addbyte(c, DUP_TOP);
1711 com_push(c, 1);
1712 com_addbyte(c, SLICE);
1713 com_node(c, augn);
1714 com_addbyte(c, opcode);
1715 com_pop(c, 1);
1716 com_addbyte(c, ROT_TWO);
1717 com_addbyte(c, STORE_SLICE);
1718 com_pop(c, 2);
1719 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1720 com_node(c, CHILD(n, 0));
1721 com_addoparg(c, DUP_TOPX, 2);
1722 com_push(c, 2);
1723 com_addbyte(c, SLICE+1);
1724 com_pop(c, 1);
1725 com_node(c, augn);
1726 com_addbyte(c, opcode);
1727 com_pop(c, 1);
1728 com_addbyte(c, ROT_THREE);
1729 com_addbyte(c, STORE_SLICE+1);
1730 com_pop(c, 3);
1731 } else if (NCH(n) == 2) {
1732 com_node(c, CHILD(n, 1));
1733 com_addoparg(c, DUP_TOPX, 2);
1734 com_push(c, 2);
1735 com_addbyte(c, SLICE+2);
1736 com_pop(c, 1);
1737 com_node(c, augn);
1738 com_addbyte(c, opcode);
1739 com_pop(c, 1);
1740 com_addbyte(c, ROT_THREE);
1741 com_addbyte(c, STORE_SLICE+2);
1742 com_pop(c, 3);
1743 } else {
1744 com_node(c, CHILD(n, 0));
1745 com_node(c, CHILD(n, 2));
1746 com_addoparg(c, DUP_TOPX, 3);
1747 com_push(c, 3);
1748 com_addbyte(c, SLICE+3);
1749 com_pop(c, 2);
1750 com_node(c, augn);
1751 com_addbyte(c, opcode);
1752 com_pop(c, 1);
1753 com_addbyte(c, ROT_FOUR);
1754 com_addbyte(c, STORE_SLICE+3);
1755 com_pop(c, 4);
1756 }
1757}
1758
1759static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001760com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001761{
1762 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001763 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001764 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001765 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001766 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001767 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001768 }
1769 else {
1770 com_node(c, CHILD(n, 0));
1771 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001772 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001773 }
1774 m = n;
1775 do {
1776 m = CHILD(m, 0);
1777 } while (NCH(m) == 1);
1778 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001779 /* f(lambda x: x[0] = 3) ends up getting parsed with
1780 * LHS test = lambda x: x[0], and RHS test = 3.
1781 * SF bug 132313 points out that complaining about a keyword
1782 * then is very confusing.
1783 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001784 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001785 TYPE(m) == lambdef ?
1786 "lambda cannot contain assignment" :
1787 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001788 }
1789 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001790 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00001791 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00001792 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001793 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001794 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001795 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001796 else if (*pkeywords == NULL) {
1797 c->c_errors++;
1798 Py_DECREF(v);
1799 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001800 if (PyDict_GetItem(*pkeywords, v) != NULL)
1801 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001802 "duplicate keyword argument");
1803 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001804 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001805 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001806 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001807 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001808 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001809 }
1810 }
1811 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001812}
1813
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001814static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001815com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001816{
1817 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001818 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001819 }
1820 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001821 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001822 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001823 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001824 int star_flag = 0;
1825 int starstar_flag = 0;
1826 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001827 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001828 na = 0;
1829 nk = 0;
1830 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001831 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001832 if (TYPE(ch) == STAR ||
1833 TYPE(ch) == DOUBLESTAR)
1834 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001835 if (ch->n_lineno != lineno) {
1836 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001837 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00001838 }
1839 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001840 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001841 na++;
1842 else
1843 nk++;
1844 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001845 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001846 while (i < NCH(n)) {
1847 node *tok = CHILD(n, i);
1848 node *ch = CHILD(n, i+1);
1849 i += 3;
1850 switch (TYPE(tok)) {
1851 case STAR: star_flag = 1; break;
1852 case DOUBLESTAR: starstar_flag = 1; break;
1853 }
1854 com_node(c, ch);
1855 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001856 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001857 com_error(c, PyExc_SyntaxError,
1858 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001859 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001860 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001861 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001862 star_flag + (starstar_flag << 1);
1863 else
1864 opcode = CALL_FUNCTION;
1865 com_addoparg(c, opcode, na | (nk << 8));
1866 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001867 }
1868}
1869
1870static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001871com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001872{
1873 com_addopname(c, LOAD_ATTR, n);
1874}
1875
1876static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001877com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001878{
1879 int i=0;
1880 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001881 node *ch;
1882
1883 /* first argument */
1884 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001885 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001886 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001887 i++;
1888 }
1889 else {
1890 com_node(c, CHILD(n,i));
1891 i++;
1892 REQ(CHILD(n,i),COLON);
1893 i++;
1894 }
1895 /* second argument */
1896 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1897 com_node(c, CHILD(n,i));
1898 i++;
1899 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001900 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001901 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001902 com_push(c, 1);
1903 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001904 /* remaining arguments */
1905 for (; i < NCH(n); i++) {
1906 ns++;
1907 ch=CHILD(n,i);
1908 REQ(ch, sliceop);
1909 if (NCH(ch) == 1) {
1910 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001911 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001912 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001913 }
1914 else
1915 com_node(c, CHILD(ch,1));
1916 }
1917 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001918 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001919}
1920
1921static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001922com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001923{
1924 node *ch;
1925 REQ(n, subscript);
1926 ch = CHILD(n,0);
1927 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001928 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001929 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001930 com_push(c, 1);
1931 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001932 else {
1933 /* check for slice */
1934 if ((TYPE(ch) == COLON || NCH(n) > 1))
1935 com_sliceobj(c, n);
1936 else {
1937 REQ(ch, test);
1938 com_node(c, ch);
1939 }
1940 }
1941}
1942
1943static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001944com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001945{
1946 int i, op;
1947 REQ(n, subscriptlist);
1948 /* Check to make backward compatible slice behavior for '[i:j]' */
1949 if (NCH(n) == 1) {
1950 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001951 /* 'Basic' slice, should have exactly one colon. */
1952 if ((TYPE(CHILD(sub, 0)) == COLON
1953 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1954 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1955 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001956 switch (assigning) {
1957 case OP_DELETE:
1958 op = DELETE_SLICE;
1959 break;
1960 case OP_ASSIGN:
1961 op = STORE_SLICE;
1962 break;
1963 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001964 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001965 break;
1966 default:
1967 com_augassign_slice(c, sub, assigning, augn);
1968 return;
1969 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001970 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001971 if (op == STORE_SLICE)
1972 com_pop(c, 2);
1973 else if (op == DELETE_SLICE)
1974 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001975 return;
1976 }
1977 }
1978 /* Else normal subscriptlist. Compile each subscript. */
1979 for (i = 0; i < NCH(n); i += 2)
1980 com_subscript(c, CHILD(n, i));
1981 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001982 if (NCH(n) > 1) {
1983 i = (NCH(n)+1) / 2;
1984 com_addoparg(c, BUILD_TUPLE, i);
1985 com_pop(c, i-1);
1986 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001987 switch (assigning) {
1988 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001989 op = DELETE_SUBSCR;
1990 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001991 break;
1992 default:
1993 case OP_ASSIGN:
1994 op = STORE_SUBSCR;
1995 i = 3;
1996 break;
1997 case OP_APPLY:
1998 op = BINARY_SUBSCR;
1999 i = 1;
2000 break;
2001 }
2002 if (assigning > OP_APPLY) {
2003 com_addoparg(c, DUP_TOPX, 2);
2004 com_push(c, 2);
2005 com_addbyte(c, BINARY_SUBSCR);
2006 com_pop(c, 1);
2007 com_node(c, augn);
2008 com_addbyte(c, assigning);
2009 com_pop(c, 1);
2010 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002011 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002012 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002013 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002014}
2015
2016static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002017com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002018{
2019 REQ(n, trailer);
2020 switch (TYPE(CHILD(n, 0))) {
2021 case LPAR:
2022 com_call_function(c, CHILD(n, 1));
2023 break;
2024 case DOT:
2025 com_select_member(c, CHILD(n, 1));
2026 break;
2027 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002028 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002029 break;
2030 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002031 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002032 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002033 }
2034}
2035
2036static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002037com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002038{
2039 int i;
2040 REQ(n, power);
2041 com_atom(c, CHILD(n, 0));
2042 for (i = 1; i < NCH(n); i++) {
2043 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2044 com_factor(c, CHILD(n, i+1));
2045 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002046 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002047 break;
2048 }
2049 else
2050 com_apply_trailer(c, CHILD(n, i));
2051 }
2052}
2053
2054static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002055com_invert_constant(struct compiling *c, node *n)
2056{
2057 /* Compute the inverse of int and longs and use them directly,
2058 but be prepared to generate code for all other
2059 possibilities (invalid numbers, floats, complex).
2060 */
2061 PyObject *num, *inv = NULL;
2062 int i;
2063
2064 REQ(n, NUMBER);
2065 num = parsenumber(c, STR(n));
2066 if (num == NULL)
2067 i = 255;
2068 else {
2069 inv = PyNumber_Invert(num);
2070 if (inv == NULL) {
2071 PyErr_Clear();
2072 i = com_addconst(c, num);
2073 } else {
2074 i = com_addconst(c, inv);
2075 Py_DECREF(inv);
2076 }
2077 Py_DECREF(num);
2078 }
2079 com_addoparg(c, LOAD_CONST, i);
2080 com_push(c, 1);
2081 if (num != NULL && inv == NULL)
2082 com_addbyte(c, UNARY_INVERT);
2083}
2084
Tim Peters51e26512001-09-07 08:45:55 +00002085static int
2086is_float_zero(const char *p)
2087{
2088 int found_radix_point = 0;
2089 int ch;
2090 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2091 switch (ch) {
2092 case '0':
2093 /* no reason to believe it's not 0 -- continue */
2094 break;
2095
2096 case 'e': case 'E': case 'j': case 'J':
2097 /* If this was a hex constant, we already would have
2098 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2099 must be an exponent marker, and we haven't yet
2100 seen a non-zero digit, and it doesn't matter what
2101 the exponent is then. For 'j' or 'J' similarly,
2102 except that this is an imaginary 0 then. */
2103 return 1;
2104
2105 case '.':
2106 found_radix_point = 1;
2107 break;
2108
2109 default:
2110 return 0;
2111 }
2112 }
2113 return found_radix_point;
2114}
2115
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002116static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002117com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002118{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002119 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002120 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002121 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002122 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002123 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002124 approriate value as a constant. If the value is negative,
2125 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002126 negative in the 0th position -- unless we're doing unary minus
2127 of a floating zero! In that case the sign is significant, but
2128 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002129 */
2130 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002131 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002132 && TYPE((pfactor = CHILD(n, 1))) == factor
2133 && NCH(pfactor) == 1
2134 && TYPE((ppower = CHILD(pfactor, 0))) == power
2135 && NCH(ppower) == 1
2136 && TYPE((patom = CHILD(ppower, 0))) == atom
2137 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002138 && !(childtype == MINUS &&
2139 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002140 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002141 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002142 return;
2143 }
2144 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002145 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002146 if (s == NULL) {
2147 com_error(c, PyExc_MemoryError, "");
2148 com_addbyte(c, 255);
2149 return;
2150 }
2151 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002152 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002153 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002154 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002155 }
Tim Peters51e26512001-09-07 08:45:55 +00002156 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002157 }
2158 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002159 com_factor(c, CHILD(n, 1));
2160 com_addbyte(c, UNARY_POSITIVE);
2161 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002162 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002163 com_factor(c, CHILD(n, 1));
2164 com_addbyte(c, UNARY_NEGATIVE);
2165 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002166 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002167 com_factor(c, CHILD(n, 1));
2168 com_addbyte(c, UNARY_INVERT);
2169 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002170 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002171 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002172 }
2173}
2174
2175static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002176com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002177{
2178 int i;
2179 int op;
2180 REQ(n, term);
2181 com_factor(c, CHILD(n, 0));
2182 for (i = 2; i < NCH(n); i += 2) {
2183 com_factor(c, CHILD(n, i));
2184 switch (TYPE(CHILD(n, i-1))) {
2185 case STAR:
2186 op = BINARY_MULTIPLY;
2187 break;
2188 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002189 if (c->c_flags & CO_FUTURE_DIVISION)
2190 op = BINARY_TRUE_DIVIDE;
2191 else
2192 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002193 break;
2194 case PERCENT:
2195 op = BINARY_MODULO;
2196 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002197 case DOUBLESLASH:
2198 op = BINARY_FLOOR_DIVIDE;
2199 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002200 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002201 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002202 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002203 op = 255;
2204 }
2205 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002206 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002207 }
2208}
2209
2210static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002211com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002212{
2213 int i;
2214 int op;
2215 REQ(n, arith_expr);
2216 com_term(c, CHILD(n, 0));
2217 for (i = 2; i < NCH(n); i += 2) {
2218 com_term(c, CHILD(n, i));
2219 switch (TYPE(CHILD(n, i-1))) {
2220 case PLUS:
2221 op = BINARY_ADD;
2222 break;
2223 case MINUS:
2224 op = BINARY_SUBTRACT;
2225 break;
2226 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002227 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002228 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002229 op = 255;
2230 }
2231 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002232 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002233 }
2234}
2235
2236static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002237com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002238{
2239 int i;
2240 int op;
2241 REQ(n, shift_expr);
2242 com_arith_expr(c, CHILD(n, 0));
2243 for (i = 2; i < NCH(n); i += 2) {
2244 com_arith_expr(c, CHILD(n, i));
2245 switch (TYPE(CHILD(n, i-1))) {
2246 case LEFTSHIFT:
2247 op = BINARY_LSHIFT;
2248 break;
2249 case RIGHTSHIFT:
2250 op = BINARY_RSHIFT;
2251 break;
2252 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002253 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002254 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002255 op = 255;
2256 }
2257 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002258 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002259 }
2260}
2261
2262static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002263com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002264{
2265 int i;
2266 int op;
2267 REQ(n, and_expr);
2268 com_shift_expr(c, CHILD(n, 0));
2269 for (i = 2; i < NCH(n); i += 2) {
2270 com_shift_expr(c, CHILD(n, i));
2271 if (TYPE(CHILD(n, i-1)) == AMPER) {
2272 op = BINARY_AND;
2273 }
2274 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002275 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002276 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002277 op = 255;
2278 }
2279 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002280 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002281 }
2282}
2283
2284static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002285com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002286{
2287 int i;
2288 int op;
2289 REQ(n, xor_expr);
2290 com_and_expr(c, CHILD(n, 0));
2291 for (i = 2; i < NCH(n); i += 2) {
2292 com_and_expr(c, CHILD(n, i));
2293 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2294 op = BINARY_XOR;
2295 }
2296 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002297 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002298 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002299 op = 255;
2300 }
2301 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002302 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002303 }
2304}
2305
2306static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002307com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002308{
2309 int i;
2310 int op;
2311 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002312 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002313 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002314 com_xor_expr(c, CHILD(n, i));
2315 if (TYPE(CHILD(n, i-1)) == VBAR) {
2316 op = BINARY_OR;
2317 }
2318 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002319 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002320 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002321 op = 255;
2322 }
2323 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002324 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002325 }
2326}
2327
2328static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002329cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002330{
2331 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00002332 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002333 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2334 if (NCH(n) == 1) {
2335 n = CHILD(n, 0);
2336 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002337 case LESS: return PyCmp_LT;
2338 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00002339 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00002340 case LESSEQUAL: return PyCmp_LE;
2341 case GREATEREQUAL: return PyCmp_GE;
2342 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2343 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2344 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002345 }
2346 }
2347 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002348 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002349 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002350 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002351 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002352 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002353 }
2354 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002355 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002356}
2357
2358static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002359com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002360{
2361 int i;
2362 enum cmp_op op;
2363 int anchor;
2364 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2365 com_expr(c, CHILD(n, 0));
2366 if (NCH(n) == 1)
2367 return;
2368
2369 /****************************************************************
2370 The following code is generated for all but the last
2371 comparison in a chain:
2372
2373 label: on stack: opcode: jump to:
2374
2375 a <code to load b>
2376 a, b DUP_TOP
2377 a, b, b ROT_THREE
2378 b, a, b COMPARE_OP
2379 b, 0-or-1 JUMP_IF_FALSE L1
2380 b, 1 POP_TOP
2381 b
2382
2383 We are now ready to repeat this sequence for the next
2384 comparison in the chain.
2385
2386 For the last we generate:
2387
2388 b <code to load c>
2389 b, c COMPARE_OP
2390 0-or-1
2391
2392 If there were any jumps to L1 (i.e., there was more than one
2393 comparison), we generate:
2394
2395 0-or-1 JUMP_FORWARD L2
2396 L1: b, 0 ROT_TWO
2397 0, b POP_TOP
2398 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002399 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002400 ****************************************************************/
2401
2402 anchor = 0;
2403
2404 for (i = 2; i < NCH(n); i += 2) {
2405 com_expr(c, CHILD(n, i));
2406 if (i+2 < NCH(n)) {
2407 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002408 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002409 com_addbyte(c, ROT_THREE);
2410 }
2411 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002412 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002413 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002414 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002415 }
2416 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002417 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002418 if (i+2 < NCH(n)) {
2419 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2420 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002421 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002422 }
2423 }
2424
2425 if (anchor) {
2426 int anchor2 = 0;
2427 com_addfwref(c, JUMP_FORWARD, &anchor2);
2428 com_backpatch(c, anchor);
2429 com_addbyte(c, ROT_TWO);
2430 com_addbyte(c, POP_TOP);
2431 com_backpatch(c, anchor2);
2432 }
2433}
2434
2435static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002436com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002437{
2438 REQ(n, not_test); /* 'not' not_test | comparison */
2439 if (NCH(n) == 1) {
2440 com_comparison(c, CHILD(n, 0));
2441 }
2442 else {
2443 com_not_test(c, CHILD(n, 1));
2444 com_addbyte(c, UNARY_NOT);
2445 }
2446}
2447
2448static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002449com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002450{
2451 int i;
2452 int anchor;
2453 REQ(n, and_test); /* not_test ('and' not_test)* */
2454 anchor = 0;
2455 i = 0;
2456 for (;;) {
2457 com_not_test(c, CHILD(n, i));
2458 if ((i += 2) >= NCH(n))
2459 break;
2460 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2461 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002462 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002463 }
2464 if (anchor)
2465 com_backpatch(c, anchor);
2466}
2467
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002468static int
2469com_make_closure(struct compiling *c, PyCodeObject *co)
2470{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002471 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002472 if (free == 0)
2473 return 0;
2474 for (i = 0; i < free; ++i) {
2475 /* Bypass com_addop_varname because it will generate
2476 LOAD_DEREF but LOAD_CLOSURE is needed.
2477 */
2478 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2479 int arg, reftype;
2480
2481 /* Special case: If a class contains a method with a
2482 free variable that has the same name as a method,
2483 the name will be considered free *and* local in the
2484 class. It should be handled by the closure, as
2485 well as by the normal name loookup logic.
2486 */
2487 reftype = get_ref_type(c, PyString_AS_STRING(name));
2488 if (reftype == CELL)
2489 arg = com_lookup_arg(c->c_cellvars, name);
2490 else /* (reftype == FREE) */
2491 arg = com_lookup_arg(c->c_freevars, name);
2492 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002493 fprintf(stderr, "lookup %s in %s %d %d\n"
2494 "freevars of %s: %s\n",
2495 PyObject_REPR(name),
2496 c->c_name,
2497 reftype, arg,
2498 PyString_AS_STRING(co->co_name),
2499 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002500 Py_FatalError("com_make_closure()");
2501 }
2502 com_addoparg(c, LOAD_CLOSURE, arg);
2503
2504 }
2505 com_push(c, free);
2506 return 1;
2507}
2508
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002509static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002510com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002511{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002512 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002513 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002514 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002515 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002516 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002517 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2518 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002519 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002520 if (co == NULL) {
2521 c->c_errors++;
2522 return;
2523 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002524 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002525 i = com_addconst(c, (PyObject *)co);
2526 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002527 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002528 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002529 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002530 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002531 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002532 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002533 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002534 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002535 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002536 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002537 else {
2538 int anchor = 0;
2539 int i = 0;
2540 for (;;) {
2541 com_and_test(c, CHILD(n, i));
2542 if ((i += 2) >= NCH(n))
2543 break;
2544 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2545 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002546 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002547 }
2548 if (anchor)
2549 com_backpatch(c, anchor);
2550 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002551}
2552
2553static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002554com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002555{
2556 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002557 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002558 com_node(c, CHILD(n, 0));
2559 }
2560 else {
2561 int i;
2562 int len;
2563 len = (NCH(n) + 1) / 2;
2564 for (i = 0; i < NCH(n); i += 2)
2565 com_node(c, CHILD(n, i));
2566 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002567 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002568 }
2569}
2570
2571
2572/* Begin of assignment compilation */
2573
Thomas Wouters434d0822000-08-24 20:11:32 +00002574
2575static void
2576com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2577{
2578 com_addbyte(c, DUP_TOP);
2579 com_push(c, 1);
2580 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002581 com_node(c, augn);
2582 com_addbyte(c, opcode);
2583 com_pop(c, 1);
2584 com_addbyte(c, ROT_TWO);
2585 com_addopname(c, STORE_ATTR, n);
2586 com_pop(c, 2);
2587}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002588
2589static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002590com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002591{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00002592 if (none_assignment_check(c, STR(n), assigning))
2593 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002594 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002595 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002596}
2597
2598static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002599com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002600{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002601 REQ(n, trailer);
2602 switch (TYPE(CHILD(n, 0))) {
2603 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002604 if (assigning == OP_DELETE)
2605 com_error(c, PyExc_SyntaxError,
2606 "can't delete function call");
2607 else
2608 com_error(c, PyExc_SyntaxError,
2609 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002610 break;
2611 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002612 if (assigning > OP_APPLY)
2613 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2614 else
2615 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002616 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002617 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002618 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002619 break;
2620 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002621 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002622 }
2623}
2624
2625static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002626com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002627{
2628 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002629 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002630 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002631 if (assigning) {
2632 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002633 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002634 com_push(c, i-1);
2635 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002636 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002637 com_assign(c, CHILD(n, i), assigning, NULL);
2638}
2639
2640static void
2641com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2642{
2643 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002644 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002645 com_push(c, 1);
2646 com_node(c, augn);
2647 com_addbyte(c, opcode);
2648 com_pop(c, 1);
2649 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002650}
2651
2652static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002653com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002654{
2655 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002656 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002657 if (assigning)
2658 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002659}
2660
2661static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002662com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002663{
2664 /* Loop to avoid trivial recursion */
2665 for (;;) {
2666 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002667
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002668 case exprlist:
2669 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002670 case testlist1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002671 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002672 if (assigning > OP_APPLY) {
2673 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002674 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002675 return;
2676 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002677 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002678 return;
2679 }
2680 n = CHILD(n, 0);
2681 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002682
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002683 case test:
2684 case and_test:
2685 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002686 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002687 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002688 case xor_expr:
2689 case and_expr:
2690 case shift_expr:
2691 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002692 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002693 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002694 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002695 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002696 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002697 return;
2698 }
2699 n = CHILD(n, 0);
2700 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002701
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002702 case power: /* atom trailer* ('**' power)*
2703 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002704 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002705 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002706 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002707 return;
2708 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002709 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002710 int i;
2711 com_node(c, CHILD(n, 0));
2712 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002713 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002714 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002715 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002716 return;
2717 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002718 com_apply_trailer(c, CHILD(n, i));
2719 } /* NB i is still alive */
2720 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002721 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002722 return;
2723 }
2724 n = CHILD(n, 0);
2725 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002726
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002727 case atom:
2728 switch (TYPE(CHILD(n, 0))) {
2729 case LPAR:
2730 n = CHILD(n, 1);
2731 if (TYPE(n) == RPAR) {
2732 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002733 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002734 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002735 return;
2736 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002737 if (assigning > OP_APPLY) {
2738 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00002739 "augmented assign to tuple literal not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002740 return;
2741 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002742 break;
2743 case LSQB:
2744 n = CHILD(n, 1);
2745 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002746 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002747 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002748 return;
2749 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002750 if (assigning > OP_APPLY) {
2751 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00002752 "augmented assign to list literal not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002753 return;
2754 }
2755 if (NCH(n) > 1
2756 && TYPE(CHILD(n, 1)) == list_for) {
2757 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002758 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002759 return;
2760 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002761 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002762 return;
2763 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002764 if (assigning > OP_APPLY)
2765 com_augassign_name(c, CHILD(n, 0),
2766 assigning, augn);
2767 else
2768 com_assign_name(c, CHILD(n, 0),
2769 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002770 return;
2771 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002772 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002773 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002774 return;
2775 }
2776 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002777
2778 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002779 com_error(c, PyExc_SyntaxError,
2780 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002781 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002782
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002783 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002784 com_error(c, PyExc_SystemError,
2785 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002786 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002787
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002788 }
2789 }
2790}
Guido van Rossum7c531111997-03-11 18:42:21 +00002791
Thomas Wouters434d0822000-08-24 20:11:32 +00002792static void
2793com_augassign(struct compiling *c, node *n)
2794{
2795 int opcode;
2796
2797 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2798 case '+': opcode = INPLACE_ADD; break;
2799 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002800 case '/':
2801 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
2802 opcode = INPLACE_FLOOR_DIVIDE;
2803 else if (c->c_flags & CO_FUTURE_DIVISION)
2804 opcode = INPLACE_TRUE_DIVIDE;
2805 else
2806 opcode = INPLACE_DIVIDE;
2807 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00002808 case '%': opcode = INPLACE_MODULO; break;
2809 case '<': opcode = INPLACE_LSHIFT; break;
2810 case '>': opcode = INPLACE_RSHIFT; break;
2811 case '&': opcode = INPLACE_AND; break;
2812 case '^': opcode = INPLACE_XOR; break;
2813 case '|': opcode = INPLACE_OR; break;
2814 case '*':
2815 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2816 opcode = INPLACE_POWER;
2817 else
2818 opcode = INPLACE_MULTIPLY;
2819 break;
2820 default:
2821 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2822 return;
2823 }
2824 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2825}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002826
2827static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002828com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002829{
Thomas Wouters434d0822000-08-24 20:11:32 +00002830 REQ(n, expr_stmt);
2831 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002832 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002833 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002834 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002835 if (NCH(n) == 1) {
2836 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002837 if (c->c_interactive)
2838 com_addbyte(c, PRINT_EXPR);
2839 else
2840 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002841 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002842 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002843 else if (TYPE(CHILD(n,1)) == augassign)
2844 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002845 else {
2846 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002847 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002848 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002849 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002850 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002851 com_push(c, 1);
2852 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002853 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002854 }
2855 }
2856}
2857
2858static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002859com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002860{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002861 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002862 int i;
2863 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002864 if (Py_OptimizeFlag)
2865 return;
2866 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00002867
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002868 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00002869 raise AssertionError [, <message>]
2870
2871 where <message> is the second test, if present.
2872 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002873 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002874 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002875 com_addbyte(c, POP_TOP);
2876 com_pop(c, 1);
2877 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002878 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002879 com_push(c, 1);
2880 i = NCH(n)/2; /* Either 2 or 4 */
2881 if (i > 1)
2882 com_node(c, CHILD(n, 3));
2883 com_addoparg(c, RAISE_VARARGS, i);
2884 com_pop(c, i);
2885 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002886 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002887 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002888 com_addbyte(c, POP_TOP);
2889}
2890
2891static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002892com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002893{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002894 int i = 1;
2895 node* stream = NULL;
2896
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002897 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002898
2899 /* are we using the extended print form? */
2900 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2901 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002902 com_node(c, stream);
2903 /* stack: [...] => [... stream] */
2904 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002905 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2906 i = 4;
2907 else
2908 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002909 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002910 for (; i < NCH(n); i += 2) {
2911 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002912 com_addbyte(c, DUP_TOP);
2913 /* stack: [stream] => [stream stream] */
2914 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002915 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002916 /* stack: [stream stream] => [stream stream obj] */
2917 com_addbyte(c, ROT_TWO);
2918 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002919 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002920 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002921 com_pop(c, 2);
2922 }
2923 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002924 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002925 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002926 com_addbyte(c, PRINT_ITEM);
2927 com_pop(c, 1);
2928 }
2929 }
2930 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002931 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002932 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002933 /* must pop the extra stream object off the stack */
2934 com_addbyte(c, POP_TOP);
2935 /* stack: [... stream] => [...] */
2936 com_pop(c, 1);
2937 }
2938 }
2939 else {
2940 if (stream != NULL) {
2941 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002942 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002943 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002944 com_pop(c, 1);
2945 }
2946 else
2947 com_addbyte(c, PRINT_NEWLINE);
2948 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002949}
2950
2951static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002952com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002953{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002954 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002955 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002956 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002957 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002958 if (c->c_flags & CO_GENERATOR) {
2959 if (NCH(n) > 1) {
2960 com_error(c, PyExc_SyntaxError,
2961 "'return' with argument inside generator");
2962 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002963 }
2964 if (NCH(n) < 2) {
2965 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002966 com_push(c, 1);
2967 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002968 else
2969 com_node(c, CHILD(n, 1));
2970 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00002971 com_pop(c, 1);
2972}
2973
2974static void
2975com_yield_stmt(struct compiling *c, node *n)
2976{
Tim Peters95c80f82001-06-23 02:07:08 +00002977 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00002978 REQ(n, yield_stmt); /* 'yield' testlist */
2979 if (!c->c_infunction) {
2980 com_error(c, PyExc_SyntaxError, "'yield' outside function");
2981 }
Tim Peters95c80f82001-06-23 02:07:08 +00002982
2983 for (i = 0; i < c->c_nblocks; ++i) {
2984 if (c->c_block[i] == SETUP_FINALLY) {
2985 com_error(c, PyExc_SyntaxError,
2986 "'yield' not allowed in a 'try' block "
2987 "with a 'finally' clause");
2988 return;
2989 }
2990 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002991 com_node(c, CHILD(n, 1));
2992 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002993 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002994}
2995
2996static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002997com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002998{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002999 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003000 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3001 if (NCH(n) > 1) {
3002 com_node(c, CHILD(n, 1));
3003 if (NCH(n) > 3) {
3004 com_node(c, CHILD(n, 3));
3005 if (NCH(n) > 5)
3006 com_node(c, CHILD(n, 5));
3007 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003008 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003009 i = NCH(n)/2;
3010 com_addoparg(c, RAISE_VARARGS, i);
3011 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003012}
3013
3014static void
Thomas Wouters52152252000-08-17 22:55:00 +00003015com_from_import(struct compiling *c, node *n)
3016{
3017 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3018 com_push(c, 1);
3019 if (NCH(n) > 1) {
3020 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3021 com_error(c, PyExc_SyntaxError, "invalid syntax");
3022 return;
3023 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003024 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003025 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003026 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003027 com_pop(c, 1);
3028}
3029
3030static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003031com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003032{
3033 int i;
3034 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003035 /* 'import' dotted_name (',' dotted_name)* |
3036 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003037 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00003038 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003039 /* 'from' dotted_name 'import' ... */
3040 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003041
3042 if (TYPE(CHILD(n, 3)) == STAR) {
3043 tup = Py_BuildValue("(s)", "*");
3044 } else {
3045 tup = PyTuple_New((NCH(n) - 2)/2);
3046 for (i = 3; i < NCH(n); i += 2) {
3047 PyTuple_SET_ITEM(tup, (i-3)/2,
Guido van Rossum633d90c2002-12-23 16:51:42 +00003048 PyString_FromString(STR(
3049 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003050 }
3051 }
3052 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003053 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003054 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003055 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00003056 if (TYPE(CHILD(n, 3)) == STAR)
3057 com_addbyte(c, IMPORT_STAR);
3058 else {
3059 for (i = 3; i < NCH(n); i += 2)
3060 com_from_import(c, CHILD(n, i));
3061 com_addbyte(c, POP_TOP);
3062 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003063 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003064 }
3065 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003066 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003067 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003068 node *subn = CHILD(n, i);
3069 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003070 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003071 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003072 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003073 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003074 int j;
3075 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003076 com_error(c, PyExc_SyntaxError,
3077 "invalid syntax");
3078 return;
3079 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003080 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3081 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003082 CHILD(CHILD(subn, 0),
3083 j));
3084 com_addop_varname(c, VAR_STORE,
3085 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003086 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003087 com_addop_varname(c, VAR_STORE,
3088 STR(CHILD(CHILD(subn, 0),
3089 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003090 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003091 }
3092 }
3093}
3094
3095static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003096com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003097{
3098 REQ(n, exec_stmt);
3099 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3100 com_node(c, CHILD(n, 1));
3101 if (NCH(n) >= 4)
3102 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003103 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003104 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003105 com_push(c, 1);
3106 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003107 if (NCH(n) >= 6)
3108 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003109 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003110 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003111 com_push(c, 1);
3112 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003113 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003114 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003115}
3116
Guido van Rossum7c531111997-03-11 18:42:21 +00003117static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003118is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003119{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003120 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003121 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003122 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003123
3124 /* Label to avoid tail recursion */
3125 next:
3126 switch (TYPE(n)) {
3127
3128 case suite:
3129 if (NCH(n) == 1) {
3130 n = CHILD(n, 0);
3131 goto next;
3132 }
3133 /* Fall through */
3134 case file_input:
3135 for (i = 0; i < NCH(n); i++) {
3136 node *ch = CHILD(n, i);
3137 if (TYPE(ch) == stmt) {
3138 n = ch;
3139 goto next;
3140 }
3141 }
3142 break;
3143
3144 case stmt:
3145 case simple_stmt:
3146 case small_stmt:
3147 n = CHILD(n, 0);
3148 goto next;
3149
3150 case expr_stmt:
3151 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003152 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003153 case test:
3154 case and_test:
3155 case not_test:
3156 case comparison:
3157 case expr:
3158 case xor_expr:
3159 case and_expr:
3160 case shift_expr:
3161 case arith_expr:
3162 case term:
3163 case factor:
3164 case power:
3165 case atom:
3166 if (NCH(n) == 1) {
3167 n = CHILD(n, 0);
3168 goto next;
3169 }
3170 break;
3171
3172 case NAME:
3173 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3174 return 1;
3175 break;
3176
3177 case NUMBER:
3178 v = parsenumber(c, STR(n));
3179 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003180 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003181 break;
3182 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003183 i = PyObject_IsTrue(v);
3184 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003185 return i == 0;
3186
3187 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003188 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003189 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003190 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003191 break;
3192 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003193 i = PyObject_IsTrue(v);
3194 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003195 return i == 0;
3196
3197 }
3198 return 0;
3199}
3200
Tim Peters08a898f2001-06-28 01:52:22 +00003201
3202/* Look under n for a return stmt with an expression.
3203 * This hack is used to find illegal returns under "if 0:" blocks in
3204 * functions already known to be generators (as determined by the symtable
3205 * pass).
3206 * Return the offending return node if found, else NULL.
3207 */
3208static node *
3209look_for_offending_return(node *n)
3210{
3211 int i;
3212
3213 for (i = 0; i < NCH(n); ++i) {
3214 node *kid = CHILD(n, i);
3215
3216 switch (TYPE(kid)) {
3217 case classdef:
3218 case funcdef:
3219 case lambdef:
3220 /* Stuff in nested functions & classes doesn't
3221 affect the code block we started in. */
3222 return NULL;
3223
3224 case return_stmt:
3225 if (NCH(kid) > 1)
3226 return kid;
3227 break;
3228
3229 default: {
3230 node *bad = look_for_offending_return(kid);
3231 if (bad != NULL)
3232 return bad;
3233 }
3234 }
3235 }
3236
3237 return NULL;
3238}
3239
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003240static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003241com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003242{
3243 int i;
3244 int anchor = 0;
3245 REQ(n, if_stmt);
3246 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3247 for (i = 0; i+3 < NCH(n); i+=4) {
3248 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003249 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003250 if (is_constant_false(c, ch)) {
3251 /* We're going to skip this block. However, if this
3252 is a generator, we have to check the dead code
3253 anyway to make sure there aren't any return stmts
3254 with expressions, in the same scope. */
3255 if (c->c_flags & CO_GENERATOR) {
3256 node *p = look_for_offending_return(n);
3257 if (p != NULL) {
3258 int savelineno = c->c_lineno;
3259 c->c_lineno = p->n_lineno;
3260 com_error(c, PyExc_SyntaxError,
3261 "'return' with argument "
3262 "inside generator");
3263 c->c_lineno = savelineno;
3264 }
3265 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003266 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003267 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003268 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003269 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003270 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003271 com_addfwref(c, JUMP_IF_FALSE, &a);
3272 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003273 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003274 com_node(c, CHILD(n, i+3));
3275 com_addfwref(c, JUMP_FORWARD, &anchor);
3276 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003277 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003278 com_addbyte(c, POP_TOP);
3279 }
3280 if (i+2 < NCH(n))
3281 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003282 if (anchor)
3283 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003284}
3285
3286static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003287com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003288{
3289 int break_anchor = 0;
3290 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003291 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003292 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3293 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003294 block_push(c, SETUP_LOOP);
3295 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003296 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003297 com_node(c, CHILD(n, 1));
3298 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3299 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003300 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003301 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003302 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003303 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003304 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3305 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003306 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003307 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003308 com_addbyte(c, POP_TOP);
3309 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003310 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003311 if (NCH(n) > 4)
3312 com_node(c, CHILD(n, 6));
3313 com_backpatch(c, break_anchor);
3314}
3315
3316static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003317com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003318{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003319 int break_anchor = 0;
3320 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003321 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003322 REQ(n, for_stmt);
3323 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3324 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003325 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003326 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003327 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003328 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00003329 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003330 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003331 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003332 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003333 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003334 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003335 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003336 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3337 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003338 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003339 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003340 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003341 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003342 if (NCH(n) > 8)
3343 com_node(c, CHILD(n, 8));
3344 com_backpatch(c, break_anchor);
3345}
3346
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003347/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003348
3349 SETUP_FINALLY L
3350 <code for S>
3351 POP_BLOCK
3352 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003353 L: <code for Sf>
3354 END_FINALLY
3355
3356 The special instructions use the block stack. Each block
3357 stack entry contains the instruction that created it (here
3358 SETUP_FINALLY), the level of the value stack at the time the
3359 block stack entry was created, and a label (here L).
3360
3361 SETUP_FINALLY:
3362 Pushes the current value stack level and the label
3363 onto the block stack.
3364 POP_BLOCK:
3365 Pops en entry from the block stack, and pops the value
3366 stack until its level is the same as indicated on the
3367 block stack. (The label is ignored.)
3368 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003369 Pops a variable number of entries from the *value* stack
3370 and re-raises the exception they specify. The number of
3371 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003372
3373 The block stack is unwound when an exception is raised:
3374 when a SETUP_FINALLY entry is found, the exception is pushed
3375 onto the value stack (and the exception condition is cleared),
3376 and the interpreter jumps to the label gotten from the block
3377 stack.
3378
3379 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003380 (The contents of the value stack is shown in [], with the top
3381 at the right; 'tb' is trace-back info, 'val' the exception's
3382 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003383
3384 Value stack Label Instruction Argument
3385 [] SETUP_EXCEPT L1
3386 [] <code for S>
3387 [] POP_BLOCK
3388 [] JUMP_FORWARD L0
3389
Guido van Rossum3f5da241990-12-20 15:06:42 +00003390 [tb, val, exc] L1: DUP )
3391 [tb, val, exc, exc] <evaluate E1> )
3392 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3393 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3394 [tb, val, exc, 1] POP )
3395 [tb, val, exc] POP
3396 [tb, val] <assign to V1> (or POP if no V1)
3397 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003398 [] <code for S1>
3399 JUMP_FORWARD L0
3400
Guido van Rossum3f5da241990-12-20 15:06:42 +00003401 [tb, val, exc, 0] L2: POP
3402 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003403 .............................etc.......................
3404
Guido van Rossum3f5da241990-12-20 15:06:42 +00003405 [tb, val, exc, 0] Ln+1: POP
3406 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003407
3408 [] L0: <next statement>
3409
3410 Of course, parts are not generated if Vi or Ei is not present.
3411*/
3412
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003413static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003414com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003415{
3416 int except_anchor = 0;
3417 int end_anchor = 0;
3418 int else_anchor = 0;
3419 int i;
3420 node *ch;
3421
3422 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3423 block_push(c, SETUP_EXCEPT);
3424 com_node(c, CHILD(n, 2));
3425 com_addbyte(c, POP_BLOCK);
3426 block_pop(c, SETUP_EXCEPT);
3427 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3428 com_backpatch(c, except_anchor);
3429 for (i = 3;
3430 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3431 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003432 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003433 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003434 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003435 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003436 break;
3437 }
3438 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003439 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003440 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003441 if (NCH(ch) > 1) {
3442 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003443 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003444 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003445 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003446 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003447 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3448 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003449 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003450 }
3451 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003452 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003453 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003454 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003455 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003456 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003457 com_pop(c, 1);
3458 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003459 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003460 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003461 com_node(c, CHILD(n, i+2));
3462 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3463 if (except_anchor) {
3464 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003465 /* We come in with [tb, val, exc, 0] on the
3466 stack; one pop and it's the same as
3467 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003468 com_addbyte(c, POP_TOP);
3469 }
3470 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003471 /* We actually come in here with [tb, val, exc] but the
3472 END_FINALLY will zap those and jump around.
3473 The c_stacklevel does not reflect them so we need not pop
3474 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003475 com_addbyte(c, END_FINALLY);
3476 com_backpatch(c, else_anchor);
3477 if (i < NCH(n))
3478 com_node(c, CHILD(n, i+2));
3479 com_backpatch(c, end_anchor);
3480}
3481
3482static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003483com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003484{
3485 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003486 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003487
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003488 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3489 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003490 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003491 com_addbyte(c, POP_BLOCK);
3492 block_pop(c, SETUP_FINALLY);
3493 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003494 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003495 /* While the generated code pushes only one item,
3496 the try-finally handling can enter here with
3497 up to three items. OK, here are the details:
3498 3 for an exception, 2 for RETURN, 1 for BREAK. */
3499 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003500 com_backpatch(c, finally_anchor);
3501 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003502 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003503 com_node(c, ch);
3504 com_addbyte(c, END_FINALLY);
3505 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003506 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003507}
3508
3509static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003510com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003511{
3512 REQ(n, try_stmt);
3513 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3514 | 'try' ':' suite 'finally' ':' suite */
3515 if (TYPE(CHILD(n, 3)) != except_clause)
3516 com_try_finally(c, n);
3517 else
3518 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003519}
3520
Guido van Rossum8b993a91997-01-17 21:04:03 +00003521static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003522get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003523{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003524 int i;
3525
Guido van Rossum8b993a91997-01-17 21:04:03 +00003526 /* Label to avoid tail recursion */
3527 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003528 switch (TYPE(n)) {
3529
3530 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003531 if (NCH(n) == 1) {
3532 n = CHILD(n, 0);
3533 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003534 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003535 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003536 case file_input:
3537 for (i = 0; i < NCH(n); i++) {
3538 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003539 if (TYPE(ch) == stmt) {
3540 n = ch;
3541 goto next;
3542 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003543 }
3544 break;
3545
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003546 case stmt:
3547 case simple_stmt:
3548 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003549 n = CHILD(n, 0);
3550 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003551
3552 case expr_stmt:
3553 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003554 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003555 case test:
3556 case and_test:
3557 case not_test:
3558 case comparison:
3559 case expr:
3560 case xor_expr:
3561 case and_expr:
3562 case shift_expr:
3563 case arith_expr:
3564 case term:
3565 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003566 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003567 if (NCH(n) == 1) {
3568 n = CHILD(n, 0);
3569 goto next;
3570 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003571 break;
3572
3573 case atom:
3574 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003575 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003576 break;
3577
3578 }
3579 return NULL;
3580}
3581
Guido van Rossum79f25d91997-04-29 20:08:16 +00003582static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003583get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003584{
Guido van Rossum541563e1999-01-28 15:08:09 +00003585 /* Don't generate doc-strings if run with -OO */
3586 if (Py_OptimizeFlag > 1)
3587 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003588 n = get_rawdocstring(n);
3589 if (n == NULL)
3590 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003591 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003592}
3593
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003594static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003595com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003596{
3597 REQ(n, suite);
3598 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3599 if (NCH(n) == 1) {
3600 com_node(c, CHILD(n, 0));
3601 }
3602 else {
3603 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003604 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003605 node *ch = CHILD(n, i);
3606 if (TYPE(ch) == stmt)
3607 com_node(c, ch);
3608 }
3609 }
3610}
3611
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003612/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003613static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003614com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003615{
3616 int i = c->c_nblocks;
3617 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3618 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3619 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003620 else if (i <= 0) {
3621 /* at the outer level */
3622 com_error(c, PyExc_SyntaxError,
3623 "'continue' not properly in loop");
3624 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003625 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003626 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003627 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003628 if (c->c_block[j] == SETUP_LOOP)
3629 break;
3630 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003631 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003632 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003633 for (; i > j; --i) {
3634 if (c->c_block[i] == SETUP_EXCEPT ||
3635 c->c_block[i] == SETUP_FINALLY) {
3636 com_addoparg(c, CONTINUE_LOOP,
3637 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003638 return;
3639 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003640 if (c->c_block[i] == END_FINALLY) {
3641 com_error(c, PyExc_SyntaxError,
3642 "'continue' not supported inside 'finally' clause");
3643 return;
3644 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003645 }
3646 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003647 com_error(c, PyExc_SyntaxError,
3648 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003649 }
3650 /* XXX Could allow it inside a 'finally' clause
3651 XXX if we could pop the exception still on the stack */
3652}
3653
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003654/* Return the number of default values in the argument list.
3655
3656 If a non-default argument follows a default argument, set an
3657 exception and return -1.
3658*/
3659
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003660static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003661com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003662{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003663 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003664 if (TYPE(n) == lambdef) {
3665 /* lambdef: 'lambda' [varargslist] ':' test */
3666 n = CHILD(n, 1);
3667 }
3668 else {
3669 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3670 n = CHILD(n, 2);
3671 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3672 n = CHILD(n, 1);
3673 }
3674 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003675 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003676 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003677 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003678 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3679 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003680 ndefs = 0;
3681 for (i = 0; i < nch; i++) {
3682 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003683 if (TYPE(CHILD(n, i)) == STAR ||
3684 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003685 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003686 i++;
3687 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003688 t = RPAR; /* Anything except EQUAL or COMMA */
3689 else
3690 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003691 if (t == EQUAL) {
3692 i++;
3693 ndefs++;
3694 com_node(c, CHILD(n, i));
3695 i++;
3696 if (i >= nch)
3697 break;
3698 t = TYPE(CHILD(n, i));
3699 }
3700 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003701 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003702 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003703 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003704 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003705 return -1;
3706 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003707 }
3708 if (t != COMMA)
3709 break;
3710 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003711 return ndefs;
3712}
3713
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003714static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003715com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003716{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003717 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003718 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003719 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003720 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003721 if (ndefs < 0)
3722 return;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003723 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3724 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003725 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003726 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003727 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003728 c->c_errors++;
3729 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003730 int closure = com_make_closure(c, (PyCodeObject *)co);
3731 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003732 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003733 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003734 if (closure)
3735 com_addoparg(c, MAKE_CLOSURE, ndefs);
3736 else
3737 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003738 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003739 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003740 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003741 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003742 }
3743}
3744
3745static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003746com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003747{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003748 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003749 REQ(n, testlist);
3750 /* testlist: test (',' test)* [','] */
3751 for (i = 0; i < NCH(n); i += 2)
3752 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003753 i = (NCH(n)+1) / 2;
3754 com_addoparg(c, BUILD_TUPLE, i);
3755 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003756}
3757
3758static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003759com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003760{
Guido van Rossum25831651993-05-19 14:50:45 +00003761 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003762 PyObject *v;
3763 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003764 char *name;
3765
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003766 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003767 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003768 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003769 c->c_errors++;
3770 return;
3771 }
3772 /* Push the class name on the stack */
3773 i = com_addconst(c, v);
3774 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003775 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003776 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003777 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003778 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003779 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003780 com_push(c, 1);
3781 }
Guido van Rossum25831651993-05-19 14:50:45 +00003782 else
3783 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003784 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003785 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003786 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003787 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003788 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003789 c->c_errors++;
3790 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003791 int closure = com_make_closure(c, co);
3792 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003793 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003794 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003795 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003796 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003797 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003798 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003799 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003800 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003801 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003802 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003803 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003804 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003805 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003806 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003807}
3808
3809static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003810com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003811{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003812 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003813 if (c->c_errors)
3814 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003815 switch (TYPE(n)) {
3816
3817 /* Definition nodes */
3818
3819 case funcdef:
3820 com_funcdef(c, n);
3821 break;
3822 case classdef:
3823 com_classdef(c, n);
3824 break;
3825
3826 /* Trivial parse tree nodes */
3827
3828 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003829 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003830 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003831 n = CHILD(n, 0);
3832 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003833
3834 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003835 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003836 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003837 {
3838 int i;
3839 for (i = 0; i < NCH(n)-1; i += 2)
3840 com_node(c, CHILD(n, i));
3841 }
3842 break;
3843
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003844 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003845 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003846 n = CHILD(n, 0);
3847 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003848
3849 /* Statement nodes */
3850
3851 case expr_stmt:
3852 com_expr_stmt(c, n);
3853 break;
3854 case print_stmt:
3855 com_print_stmt(c, n);
3856 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003857 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003858 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003859 break;
3860 case pass_stmt:
3861 break;
3862 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003863 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003864 com_error(c, PyExc_SyntaxError,
3865 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003866 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003867 com_addbyte(c, BREAK_LOOP);
3868 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003869 case continue_stmt:
3870 com_continue_stmt(c, n);
3871 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003872 case return_stmt:
3873 com_return_stmt(c, n);
3874 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003875 case yield_stmt:
3876 com_yield_stmt(c, n);
3877 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003878 case raise_stmt:
3879 com_raise_stmt(c, n);
3880 break;
3881 case import_stmt:
3882 com_import_stmt(c, n);
3883 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003884 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003885 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003886 case exec_stmt:
3887 com_exec_stmt(c, n);
3888 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003889 case assert_stmt:
3890 com_assert_stmt(c, n);
3891 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003892 case if_stmt:
3893 com_if_stmt(c, n);
3894 break;
3895 case while_stmt:
3896 com_while_stmt(c, n);
3897 break;
3898 case for_stmt:
3899 com_for_stmt(c, n);
3900 break;
3901 case try_stmt:
3902 com_try_stmt(c, n);
3903 break;
3904 case suite:
3905 com_suite(c, n);
3906 break;
3907
3908 /* Expression nodes */
3909
3910 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003911 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00003912 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003913 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003914 break;
3915 case test:
3916 com_test(c, n);
3917 break;
3918 case and_test:
3919 com_and_test(c, n);
3920 break;
3921 case not_test:
3922 com_not_test(c, n);
3923 break;
3924 case comparison:
3925 com_comparison(c, n);
3926 break;
3927 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003928 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003929 break;
3930 case expr:
3931 com_expr(c, n);
3932 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003933 case xor_expr:
3934 com_xor_expr(c, n);
3935 break;
3936 case and_expr:
3937 com_and_expr(c, n);
3938 break;
3939 case shift_expr:
3940 com_shift_expr(c, n);
3941 break;
3942 case arith_expr:
3943 com_arith_expr(c, n);
3944 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003945 case term:
3946 com_term(c, n);
3947 break;
3948 case factor:
3949 com_factor(c, n);
3950 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003951 case power:
3952 com_power(c, n);
3953 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003954 case atom:
3955 com_atom(c, n);
3956 break;
3957
3958 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003959 com_error(c, PyExc_SystemError,
3960 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003961 }
3962}
3963
Tim Petersdbd9ba62000-07-09 03:09:57 +00003964static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003965
3966static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003967com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003968{
3969 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3970 if (TYPE(CHILD(n, 0)) == LPAR)
3971 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003972 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003973 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003974 com_pop(c, 1);
3975 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003976}
3977
3978static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003979com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003980{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003981 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003982 if (NCH(n) == 1) {
3983 com_fpdef(c, CHILD(n, 0));
3984 }
3985 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003986 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003987 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003988 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003989 for (i = 0; i < NCH(n); i += 2)
3990 com_fpdef(c, CHILD(n, i));
3991 }
3992}
3993
3994static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003995com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003996{
Guido van Rossum633d90c2002-12-23 16:51:42 +00003997 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003998 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00003999 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004000 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004001 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004002 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004003 nch = NCH(n);
4004 /* Enter all arguments in table of locals */
4005 for (i = 0, narg = 0; i < nch; i++) {
4006 node *ch = CHILD(n, i);
4007 node *fp;
4008 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004009 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004010 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4011 fp = CHILD(ch, 0);
4012 if (TYPE(fp) != NAME) {
4013 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4014 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004015 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004016 narg++;
4017 /* all name updates handled by symtable */
4018 if (++i >= nch)
4019 break;
4020 ch = CHILD(n, i);
4021 if (TYPE(ch) == EQUAL)
4022 i += 2;
4023 else
4024 REQ(ch, COMMA);
4025 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004026 if (complex) {
4027 /* Generate code for complex arguments only after
4028 having counted the simple arguments */
4029 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004030 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004031 node *ch = CHILD(n, i);
4032 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004033 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004034 break;
4035 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4036 fp = CHILD(ch, 0);
4037 if (TYPE(fp) != NAME) {
4038 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004039 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004040 com_fpdef(c, ch);
4041 }
4042 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004043 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004044 break;
4045 ch = CHILD(n, i);
4046 if (TYPE(ch) == EQUAL)
4047 i += 2;
4048 else
4049 REQ(ch, COMMA);
4050 }
4051 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004052}
4053
4054static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004055com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004056{
4057 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004058 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004059 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004060 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004061 if (doc != NULL) {
4062 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004063 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004064 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004065 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004066 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004067 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004068 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004069 for (i = 0; i < NCH(n); i++) {
4070 node *ch = CHILD(n, i);
4071 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4072 com_node(c, ch);
4073 }
4074}
4075
4076/* Top-level compile-node interface */
4077
4078static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004079compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004080{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004081 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004082 node *ch;
4083 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00004084 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004085 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004086 if (doc != NULL) {
4087 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004088 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004089 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004090 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004091 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004092 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
4093 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004094 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004095 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004096 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004097 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004098 c->c_infunction = 0;
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004099 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4100 com_push(c, 1);
4101 com_addbyte(c, RETURN_VALUE);
4102 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004103}
4104
4105static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004106compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004107{
Guido van Rossum590baa41993-11-30 13:40:46 +00004108 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004109 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004110 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004111
4112 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004113 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004114 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004115 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004116 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004117 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004118 else
4119 ch = CHILD(n, 2);
4120 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004121 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004122 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004123}
4124
4125static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004126compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004127{
4128 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004129 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004130 REQ(n, classdef);
4131 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4132 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004133 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004134 /* Initialize local __module__ from global __name__ */
4135 com_addop_name(c, LOAD_GLOBAL, "__name__");
4136 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004137 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004138 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004139 if (doc != NULL) {
4140 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004141 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004142 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004143 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004144 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004145 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004146 }
4147 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004148 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004149 com_node(c, ch);
4150 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004151 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004152 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004153 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004154}
4155
4156static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004157compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004158{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004159 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004160
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004161 switch (TYPE(n)) {
4162
Guido van Rossum4c417781991-01-21 16:09:22 +00004163 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004164 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004165 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004166 n = CHILD(n, 0);
4167 if (TYPE(n) != NEWLINE)
4168 com_node(c, n);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004169 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4170 com_push(c, 1);
4171 com_addbyte(c, RETURN_VALUE);
4172 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004173 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004174 break;
4175
Guido van Rossum4c417781991-01-21 16:09:22 +00004176 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004177 com_file_input(c, n);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004178 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4179 com_push(c, 1);
4180 com_addbyte(c, RETURN_VALUE);
4181 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004182 break;
4183
Guido van Rossum590baa41993-11-30 13:40:46 +00004184 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004185 com_node(c, CHILD(n, 0));
4186 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004187 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004188 break;
4189
Guido van Rossum590baa41993-11-30 13:40:46 +00004190 case lambdef: /* anonymous function definition */
4191 compile_lambdef(c, n);
4192 break;
4193
Guido van Rossum4c417781991-01-21 16:09:22 +00004194 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004195 compile_funcdef(c, n);
4196 break;
4197
Guido van Rossum4c417781991-01-21 16:09:22 +00004198 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004199 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004200 break;
4201
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004202 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004203 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004204 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004205 }
4206}
4207
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004208static PyObject *
4209dict_keys_inorder(PyObject *dict, int offset)
4210{
4211 PyObject *tuple, *k, *v;
4212 int i, pos = 0, size = PyDict_Size(dict);
4213
4214 tuple = PyTuple_New(size);
4215 if (tuple == NULL)
4216 return NULL;
4217 while (PyDict_Next(dict, &pos, &k, &v)) {
4218 i = PyInt_AS_LONG(v);
4219 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004220 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004221 PyTuple_SET_ITEM(tuple, i - offset, k);
4222 }
4223 return tuple;
4224}
4225
Guido van Rossum79f25d91997-04-29 20:08:16 +00004226PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004227PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004228{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004229 return PyNode_CompileFlags(n, filename, NULL);
4230}
4231
4232PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004233PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004234{
4235 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004236}
4237
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004238struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004239PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004240{
4241 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004242 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004243
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004244 ff = PyNode_Future(n, filename);
4245 if (ff == NULL)
4246 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004247 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00004248 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004249 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004250 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004251 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004252 return st;
4253}
4254
Guido van Rossum79f25d91997-04-29 20:08:16 +00004255static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004256icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004257{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004258 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004259}
4260
Guido van Rossum79f25d91997-04-29 20:08:16 +00004261static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004262jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004263 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004264{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004265 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004266 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004267 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004268 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004269 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4270 sc.c_encoding = "utf-8";
4271 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004272 sc.c_encoding = STR(n);
4273 n = CHILD(n, 0);
4274 } else {
4275 sc.c_encoding = NULL;
4276 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004277 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004278 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004279 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004280 /* c_symtable still points to parent's symbols */
4281 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004282 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004283 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004284 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004285 if (base->c_encoding != NULL) {
4286 assert(sc.c_encoding == NULL);
4287 sc.c_encoding = base->c_encoding;
4288 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004289 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004290 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004291 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004292 if (sc.c_future == NULL) {
4293 com_free(&sc);
4294 return NULL;
4295 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004296 if (flags) {
4297 int merged = sc.c_future->ff_features |
4298 flags->cf_flags;
4299 sc.c_future->ff_features = merged;
4300 flags->cf_flags = merged;
4301 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004302 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
4303 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004304 com_free(&sc);
4305 return NULL;
4306 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004307 /* reset symbol table for second pass */
4308 sc.c_symtable->st_nscopes = 1;
4309 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004310 }
4311 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004312 if (symtable_load_symbols(&sc) < 0) {
4313 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004314 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004315 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004316 compile_node(&sc, n);
4317 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004318 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004319 PyObject *consts, *names, *varnames, *filename, *name,
4320 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004321 consts = PyList_AsTuple(sc.c_consts);
4322 names = PyList_AsTuple(sc.c_names);
4323 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004324 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4325 freevars = dict_keys_inorder(sc.c_freevars,
4326 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004327 filename = PyString_InternFromString(sc.c_filename);
4328 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004329 if (!PyErr_Occurred())
4330 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004331 sc.c_nlocals,
4332 sc.c_maxstacklevel,
4333 sc.c_flags,
4334 sc.c_code,
4335 consts,
4336 names,
4337 varnames,
4338 freevars,
4339 cellvars,
4340 filename,
4341 name,
4342 sc.c_firstlineno,
4343 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004344 Py_XDECREF(consts);
4345 Py_XDECREF(names);
4346 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004347 Py_XDECREF(freevars);
4348 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004349 Py_XDECREF(filename);
4350 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004351 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004352 else if (!PyErr_Occurred()) {
4353 /* This could happen if someone called PyErr_Clear() after an
4354 error was reported above. That's not supposed to happen,
4355 but I just plugged one case and I'm not sure there can't be
4356 others. In that case, raise SystemError so that at least
4357 it gets reported instead dumping core. */
4358 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4359 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004360 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004361 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004362 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004363 sc.c_symtable = NULL;
4364 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004365 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004366 return co;
4367}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004368
4369int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004370PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004371{
4372 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004373 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004374 int line = co->co_firstlineno;
4375 int addr = 0;
4376 while (--size >= 0) {
4377 addr += *p++;
4378 if (addr > addrq)
4379 break;
4380 line += *p++;
4381 }
4382 return line;
4383}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004384
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004385/* The test for LOCAL must come before the test for FREE in order to
4386 handle classes where name is both local and free. The local var is
4387 a method and the free var is a free var referenced within a method.
4388*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004389
4390static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004391get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004392{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004393 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004394 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004395
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004396 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4397 return CELL;
4398 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4399 return LOCAL;
4400 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4401 return FREE;
4402 v = PyDict_GetItemString(c->c_globals, name);
4403 if (v) {
4404 if (v == Py_None)
4405 return GLOBAL_EXPLICIT;
4406 else {
4407 return GLOBAL_IMPLICIT;
4408 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004409 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004410 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004411 "unknown scope for %.100s in %.100s(%s) "
4412 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4413 name, c->c_name,
4414 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4415 c->c_filename,
4416 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4417 PyObject_REPR(c->c_locals),
4418 PyObject_REPR(c->c_globals)
4419 );
4420
4421 Py_FatalError(buf);
4422 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004423}
4424
Guido van Rossum207fda62001-03-02 03:30:41 +00004425/* Helper functions to issue warnings */
4426
4427static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004428issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004429{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004430 if (PyErr_Occurred()) {
4431 /* This can happen because symtable_node continues
4432 processing even after raising a SyntaxError.
4433 Calling PyErr_WarnExplicit now would clobber the
4434 pending exception; instead we fail and let that
4435 exception propagate.
4436 */
4437 return -1;
4438 }
Guido van Rossum207fda62001-03-02 03:30:41 +00004439 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4440 lineno, NULL, NULL) < 0) {
4441 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4442 PyErr_SetString(PyExc_SyntaxError, msg);
4443 PyErr_SyntaxLocation(filename, lineno);
4444 }
4445 return -1;
4446 }
4447 return 0;
4448}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004449
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004450static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004451symtable_warn(struct symtable *st, char *msg)
4452{
Guido van Rossum207fda62001-03-02 03:30:41 +00004453 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004454 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004455 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004456 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004457 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004458}
4459
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004460/* Helper function for setting lineno and filename */
4461
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004462static struct symtable *
4463symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004464{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004465 struct symtable *st;
4466
4467 st = symtable_init();
4468 if (st == NULL)
4469 return NULL;
4470 st->st_future = ff;
4471 st->st_filename = filename;
4472 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
4473 if (st->st_errors > 0)
4474 goto fail;
4475 symtable_node(st, n);
4476 if (st->st_errors > 0)
4477 goto fail;
4478 return st;
4479 fail:
4480 if (!PyErr_Occurred()) {
4481 /* This could happen because after a syntax error is
4482 detected, the symbol-table-building continues for
4483 a while, and PyErr_Clear() might erroneously be
4484 called during that process. One such case has been
4485 fixed, but there might be more (now or later).
4486 */
4487 PyErr_SetString(PyExc_SystemError, "lost exception");
4488 }
4489 st->st_future = NULL;
4490 st->st_filename = NULL;
4491 PySymtable_Free(st);
4492 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004493}
4494
4495static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004496symtable_init_compiling_symbols(struct compiling *c)
4497{
4498 PyObject *varnames;
4499
4500 varnames = c->c_symtable->st_cur->ste_varnames;
4501 if (varnames == NULL) {
4502 varnames = PyList_New(0);
4503 if (varnames == NULL)
4504 return -1;
4505 c->c_symtable->st_cur->ste_varnames = varnames;
4506 Py_INCREF(varnames);
4507 } else
4508 Py_INCREF(varnames);
4509 c->c_varnames = varnames;
4510
4511 c->c_globals = PyDict_New();
4512 if (c->c_globals == NULL)
4513 return -1;
4514 c->c_freevars = PyDict_New();
4515 if (c->c_freevars == NULL)
4516 return -1;
4517 c->c_cellvars = PyDict_New();
4518 if (c->c_cellvars == NULL)
4519 return -1;
4520 return 0;
4521}
4522
4523struct symbol_info {
4524 int si_nlocals;
4525 int si_ncells;
4526 int si_nfrees;
4527 int si_nimplicit;
4528};
4529
4530static void
4531symtable_init_info(struct symbol_info *si)
4532{
4533 si->si_nlocals = 0;
4534 si->si_ncells = 0;
4535 si->si_nfrees = 0;
4536 si->si_nimplicit = 0;
4537}
4538
4539static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004540symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004541 struct symbol_info *si)
4542{
4543 PyObject *dict, *v;
4544
4545 /* Seperate logic for DEF_FREE. If it occurs in a function,
4546 it indicates a local that we must allocate storage for (a
4547 cell var). If it occurs in a class, then the class has a
4548 method and a free variable with the same name.
4549 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004550 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004551 /* If it isn't declared locally, it can't be a cell. */
4552 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4553 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004554 v = PyInt_FromLong(si->si_ncells++);
4555 dict = c->c_cellvars;
4556 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004557 /* If it is free anyway, then there is no need to do
4558 anything here.
4559 */
4560 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004561 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004562 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004563 v = PyInt_FromLong(si->si_nfrees++);
4564 dict = c->c_freevars;
4565 }
4566 if (v == NULL)
4567 return -1;
4568 if (PyDict_SetItem(dict, name, v) < 0) {
4569 Py_DECREF(v);
4570 return -1;
4571 }
4572 Py_DECREF(v);
4573 return 0;
4574}
4575
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004576/* If a variable is a cell and an argument, make sure that appears in
4577 co_cellvars before any variable to its right in varnames.
4578*/
4579
4580
4581static int
4582symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4583 PyObject *varnames, int flags)
4584{
Tim Petersb39903b2003-03-24 17:22:24 +00004585 PyObject *v = NULL;
4586 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004587 int i, pos;
4588
4589 if (flags & CO_VARARGS)
4590 argcount++;
4591 if (flags & CO_VARKEYWORDS)
4592 argcount++;
4593 for (i = argcount; --i >= 0; ) {
4594 v = PyList_GET_ITEM(varnames, i);
4595 if (PyDict_GetItem(*cellvars, v)) {
4596 if (list == NULL) {
4597 list = PyList_New(1);
4598 if (list == NULL)
4599 return -1;
4600 PyList_SET_ITEM(list, 0, v);
4601 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004602 } else {
4603 if (PyList_Insert(list, 0, v) < 0) {
4604 Py_DECREF(list);
4605 return -1;
4606 }
4607 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004608 }
4609 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00004610 if (list == NULL)
4611 return 0;
4612
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004613 /* There are cellvars that are also arguments. Create a dict
4614 to replace cellvars and put the args at the front.
4615 */
4616 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004617 if (d == NULL)
4618 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004619 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4620 v = PyInt_FromLong(i);
4621 if (v == NULL)
4622 goto fail;
4623 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4624 goto fail;
4625 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4626 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00004627 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004628 }
4629 pos = 0;
4630 i = PyList_GET_SIZE(list);
4631 Py_DECREF(list);
4632 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4633 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004634 if (w == NULL)
4635 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004636 if (PyDict_SetItem(d, v, w) < 0) {
4637 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00004638 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004639 goto fail;
4640 }
4641 Py_DECREF(w);
4642 }
4643 Py_DECREF(*cellvars);
4644 *cellvars = d;
4645 return 1;
4646 fail:
4647 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00004648 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004649 return -1;
4650}
4651
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004652static int
4653symtable_freevar_offsets(PyObject *freevars, int offset)
4654{
4655 PyObject *name, *v;
4656 int pos;
4657
4658 /* The cell vars are the first elements of the closure,
4659 followed by the free vars. Update the offsets in
4660 c_freevars to account for number of cellvars. */
4661 pos = 0;
4662 while (PyDict_Next(freevars, &pos, &name, &v)) {
4663 int i = PyInt_AS_LONG(v) + offset;
4664 PyObject *o = PyInt_FromLong(i);
4665 if (o == NULL)
4666 return -1;
4667 if (PyDict_SetItem(freevars, name, o) < 0) {
4668 Py_DECREF(o);
4669 return -1;
4670 }
4671 Py_DECREF(o);
4672 }
4673 return 0;
4674}
4675
4676static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004677symtable_check_unoptimized(struct compiling *c,
4678 PySymtableEntryObject *ste,
4679 struct symbol_info *si)
4680{
4681 char buf[300];
4682
4683 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4684 || (ste->ste_nested && si->si_nimplicit)))
4685 return 0;
4686
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004687#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4688
4689#define ILLEGAL_IS "is a nested function"
4690
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004691#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004692"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004693
4694#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004695"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004696
4697#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00004698"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004699"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004700
4701 /* XXX perhaps the linenos for these opt-breaking statements
4702 should be stored so the exception can point to them. */
4703
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004704 if (ste->ste_child_free) {
4705 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004706 PyOS_snprintf(buf, sizeof(buf),
4707 ILLEGAL_IMPORT_STAR,
4708 PyString_AS_STRING(ste->ste_name),
4709 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004710 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004711 PyOS_snprintf(buf, sizeof(buf),
4712 ILLEGAL_BARE_EXEC,
4713 PyString_AS_STRING(ste->ste_name),
4714 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004715 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004716 PyOS_snprintf(buf, sizeof(buf),
4717 ILLEGAL_EXEC_AND_IMPORT_STAR,
4718 PyString_AS_STRING(ste->ste_name),
4719 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004720 }
4721 } else {
4722 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004723 PyOS_snprintf(buf, sizeof(buf),
4724 ILLEGAL_IMPORT_STAR,
4725 PyString_AS_STRING(ste->ste_name),
4726 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004727 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004728 PyOS_snprintf(buf, sizeof(buf),
4729 ILLEGAL_BARE_EXEC,
4730 PyString_AS_STRING(ste->ste_name),
4731 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004732 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004733 PyOS_snprintf(buf, sizeof(buf),
4734 ILLEGAL_EXEC_AND_IMPORT_STAR,
4735 PyString_AS_STRING(ste->ste_name),
4736 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004737 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004738 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004739
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004740 PyErr_SetString(PyExc_SyntaxError, buf);
4741 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4742 ste->ste_opt_lineno);
4743 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004744}
4745
4746static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004747symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4748 struct symbol_info *si)
4749{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004750 if (c->c_future)
4751 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004752 if (ste->ste_generator)
4753 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004754 if (ste->ste_type != TYPE_MODULE)
4755 c->c_flags |= CO_NEWLOCALS;
4756 if (ste->ste_type == TYPE_FUNCTION) {
4757 c->c_nlocals = si->si_nlocals;
4758 if (ste->ste_optimized == 0)
4759 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004760 else if (ste->ste_optimized != OPT_EXEC)
4761 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004762 }
4763 return 0;
4764}
4765
4766static int
Jeremy Hylton98326132003-09-22 04:26:44 +00004767symtable_error(struct symtable *st, int lineno)
4768{
4769 if (lineno == 0)
4770 lineno = st->st_cur->ste_lineno;
4771 PyErr_SyntaxLocation(st->st_filename, lineno);
4772 st->st_errors++;
4773 return -1;
4774}
4775
4776static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004777symtable_load_symbols(struct compiling *c)
4778{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004779 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004780 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004781 PyObject *name, *varnames, *v;
4782 int i, flags, pos;
4783 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004784
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004785 v = NULL;
4786
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004787 if (symtable_init_compiling_symbols(c) < 0)
4788 goto fail;
4789 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004790 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004791 si.si_nlocals = PyList_GET_SIZE(varnames);
4792 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004793
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004794 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004795 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004796 if (v == NULL)
4797 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004798 if (PyDict_SetItem(c->c_locals,
4799 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004800 goto fail;
4801 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004802 }
4803
4804 /* XXX The cases below define the rules for whether a name is
4805 local or global. The logic could probably be clearer. */
4806 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004807 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4808 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004809
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004810 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004811 /* undo the original DEF_FREE */
4812 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004813
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004814 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004815 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004816 2. Free variables in methods that are also class
4817 variables or declared global.
4818 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004819 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004820 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004821
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004822 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004823 c->c_argcount--;
4824 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004825 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004826 c->c_argcount--;
4827 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004828 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004829 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004830 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004831 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00004832 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004833 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00004834 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004835 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004836 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004837 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4838 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004839 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004840 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00004841 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004842 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004843 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004844 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004845 if (v == NULL)
4846 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004847 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004848 goto fail;
4849 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004850 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004851 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004852 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004853 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004854 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004855 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004856 if (v == NULL)
4857 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004858 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004859 goto fail;
4860 Py_DECREF(v);
4861 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004862 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004863 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00004864 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004865 goto fail;
4866 if (st->st_nscopes != 1) {
4867 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004868 if (v == NULL)
4869 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004870 if (PyDict_SetItem(st->st_global,
4871 name, v))
4872 goto fail;
4873 Py_DECREF(v);
4874 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004875 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004876 }
4877 }
4878
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004879 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4880
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004881 if (si.si_ncells > 1) { /* one cell is always in order */
4882 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4883 c->c_varnames, c->c_flags) < 0)
4884 return -1;
4885 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004886 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4887 return -1;
4888 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004889 fail:
4890 /* is this always the right thing to do? */
4891 Py_XDECREF(v);
4892 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004893}
4894
4895static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004896symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004897{
4898 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004899
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004900 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004901 if (st == NULL)
4902 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004903 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00004904
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004905 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004906 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004907 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004908 goto fail;
4909 if ((st->st_symbols = PyDict_New()) == NULL)
4910 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004911 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004912 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004913 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004914 st->st_private = NULL;
4915 return st;
4916 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004917 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004918 return NULL;
4919}
4920
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004921void
4922PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004923{
4924 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004925 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004926 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004927 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004928}
4929
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004930/* When the compiler exits a scope, it must should update the scope's
4931 free variable information with the list of free variables in its
4932 children.
4933
4934 Variables that are free in children and defined in the current
4935 scope are cellvars.
4936
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004937 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004938 false), free variables in children that are not defined here are
4939 implicit globals.
4940
4941*/
4942
4943static int
4944symtable_update_free_vars(struct symtable *st)
4945{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004946 int i, j, def;
4947 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004948 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004949
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004950 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004951 def = DEF_FREE_CLASS;
4952 else
4953 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004954 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004955 int pos = 0;
4956
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00004957 if (list && PyList_SetSlice(list, 0,
4958 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004959 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00004960 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004961 PyList_GET_ITEM(ste->ste_children, i);
4962 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004963 int flags = PyInt_AS_LONG(o);
4964 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004965 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004966 if (list == NULL) {
4967 list = PyList_New(0);
4968 if (list == NULL)
4969 return -1;
4970 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004971 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004972 if (PyList_Append(list, name) < 0) {
4973 Py_DECREF(list);
4974 return -1;
4975 }
4976 }
4977 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004978 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004979 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004980 v = PyDict_GetItem(ste->ste_symbols, name);
4981 /* If a name N is declared global in scope A and
4982 referenced in scope B contained (perhaps
4983 indirectly) in A and there are no scopes
4984 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004985 is global in B. Unless A is a class scope,
4986 because class scopes are not considered for
4987 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004988 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004989 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004990 int flags = PyInt_AS_LONG(v);
4991 if (flags & DEF_GLOBAL) {
4992 symtable_undo_free(st, child->ste_id,
4993 name);
4994 continue;
4995 }
4996 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004997 if (ste->ste_nested) {
4998 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004999 name, def) < 0) {
5000 Py_DECREF(list);
5001 return -1;
5002 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005003 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005004 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005005 name) < 0) {
5006 Py_DECREF(list);
5007 return -1;
5008 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005009 }
5010 }
5011 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005012
5013 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005014 return 0;
5015}
5016
5017/* If the current scope is a non-nested class or if name is not
5018 defined in the current, non-nested scope, then it is an implicit
5019 global in all nested scopes.
5020*/
5021
5022static int
5023symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5024{
5025 PyObject *o;
5026 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005027 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005028
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005029 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005030 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005031 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005032 if (o == NULL)
5033 return symtable_undo_free(st, child, name);
5034 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005035
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005036 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005037 return symtable_undo_free(st, child, name);
5038 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005039 return symtable_add_def_o(st, ste->ste_symbols,
5040 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005041}
5042
5043static int
5044symtable_undo_free(struct symtable *st, PyObject *id,
5045 PyObject *name)
5046{
5047 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005048 PyObject *info;
5049 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005050
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005051 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5052 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005053 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005054
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005055 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005056 if (info == NULL)
5057 return 0;
5058 v = PyInt_AS_LONG(info);
5059 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005060 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005061 DEF_FREE_GLOBAL) < 0)
5062 return -1;
5063 } else
5064 /* If the name is defined here or declared global,
5065 then the recursion stops. */
5066 return 0;
5067
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005068 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5069 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005070 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005071 PyList_GET_ITEM(ste->ste_children, i);
5072 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005073 if (x < 0)
5074 return x;
5075 }
5076 return 0;
5077}
5078
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005079/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5080 This reference is released when the scope is exited, via the DECREF
5081 in symtable_exit_scope().
5082*/
5083
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005084static int
5085symtable_exit_scope(struct symtable *st)
5086{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005087 int end;
5088
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005089 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005090 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005091 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005092 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005093 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5094 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005095 if (PySequence_DelItem(st->st_stack, end) < 0)
5096 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005097 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005098}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005099
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005100static void
5101symtable_enter_scope(struct symtable *st, char *name, int type,
5102 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005103{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005104 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005105
5106 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005107 prev = st->st_cur;
5108 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005109 st->st_errors++;
5110 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005111 }
5112 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005113 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005114 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005115 if (st->st_cur == NULL) {
5116 st->st_errors++;
5117 return;
5118 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005119 if (strcmp(name, TOP) == 0)
5120 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005121 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005122 if (PyList_Append(prev->ste_children,
5123 (PyObject *)st->st_cur) < 0)
5124 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005125 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005126}
5127
5128static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005129symtable_lookup(struct symtable *st, char *name)
5130{
5131 char buffer[MANGLE_LEN];
5132 PyObject *v;
5133 int flags;
5134
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005135 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005136 name = buffer;
5137 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5138 if (v == NULL) {
5139 if (PyErr_Occurred())
5140 return -1;
5141 else
5142 return 0;
5143 }
5144
5145 flags = PyInt_AS_LONG(v);
5146 return flags;
5147}
5148
5149static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005150symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005151{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005152 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005153 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005154 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005155
Guido van Rossumb7164622002-08-16 02:48:11 +00005156 /* Warn about None, except inside a tuple (where the assignment
5157 code already issues a warning). */
5158 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5159 *name == 'N' && strcmp(name, "None") == 0)
5160 {
5161 if (symtable_warn(st, "argument named None"))
5162 return -1;
5163 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005164 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005165 name = buffer;
5166 if ((s = PyString_InternFromString(name)) == NULL)
5167 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005168 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5169 Py_DECREF(s);
5170 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005171}
5172
5173/* Must only be called with mangled names */
5174
5175static int
5176symtable_add_def_o(struct symtable *st, PyObject *dict,
5177 PyObject *name, int flag)
5178{
5179 PyObject *o;
5180 int val;
5181
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005182 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005183 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005184 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005185 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005186 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005187 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005188 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005189 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005190 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005191 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005192 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005193 if (o == NULL)
5194 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005195 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005196 Py_DECREF(o);
5197 return -1;
5198 }
5199 Py_DECREF(o);
5200
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005201 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005202 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005203 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005204 } else if (flag & DEF_GLOBAL) {
5205 /* XXX need to update DEF_GLOBAL for other flags too;
5206 perhaps only DEF_FREE_GLOBAL */
5207 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005208 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005209 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005210 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005211 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005212 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005213 if (o == NULL)
5214 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005215 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005216 Py_DECREF(o);
5217 return -1;
5218 }
5219 Py_DECREF(o);
5220 }
5221 return 0;
5222}
5223
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005224#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005225
Tim Peters08a898f2001-06-28 01:52:22 +00005226/* Look for a yield stmt under n. Return 1 if found, else 0.
5227 This hack is used to look inside "if 0:" blocks (which are normally
5228 ignored) in case those are the only places a yield occurs (so that this
5229 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005230static int
5231look_for_yield(node *n)
5232{
5233 int i;
5234
5235 for (i = 0; i < NCH(n); ++i) {
5236 node *kid = CHILD(n, i);
5237
5238 switch (TYPE(kid)) {
5239
5240 case classdef:
5241 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005242 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005243 /* Stuff in nested functions and classes can't make
5244 the parent a generator. */
5245 return 0;
5246
5247 case yield_stmt:
5248 return 1;
5249
5250 default:
5251 if (look_for_yield(kid))
5252 return 1;
5253 }
5254 }
5255 return 0;
5256}
5257
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005258static void
5259symtable_node(struct symtable *st, node *n)
5260{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005261 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005262
5263 loop:
5264 switch (TYPE(n)) {
5265 case funcdef: {
5266 char *func_name = STR(CHILD(n, 1));
5267 symtable_add_def(st, func_name, DEF_LOCAL);
5268 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005269 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005270 symtable_funcdef(st, n);
5271 symtable_exit_scope(st);
5272 break;
5273 }
5274 case lambdef:
5275 if (NCH(n) == 4)
5276 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005277 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005278 symtable_funcdef(st, n);
5279 symtable_exit_scope(st);
5280 break;
5281 case classdef: {
5282 char *tmp, *class_name = STR(CHILD(n, 1));
5283 symtable_add_def(st, class_name, DEF_LOCAL);
5284 if (TYPE(CHILD(n, 2)) == LPAR) {
5285 node *bases = CHILD(n, 3);
5286 int i;
5287 for (i = 0; i < NCH(bases); i += 2) {
5288 symtable_node(st, CHILD(bases, i));
5289 }
5290 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005291 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005292 tmp = st->st_private;
5293 st->st_private = class_name;
5294 symtable_node(st, CHILD(n, NCH(n) - 1));
5295 st->st_private = tmp;
5296 symtable_exit_scope(st);
5297 break;
5298 }
5299 case if_stmt:
5300 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005301 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5302 if (st->st_cur->ste_generator == 0)
5303 st->st_cur->ste_generator =
5304 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005305 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005306 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005307 symtable_node(st, CHILD(n, i + 1));
5308 symtable_node(st, CHILD(n, i + 3));
5309 }
5310 if (i + 2 < NCH(n))
5311 symtable_node(st, CHILD(n, i + 2));
5312 break;
5313 case global_stmt:
5314 symtable_global(st, n);
5315 break;
5316 case import_stmt:
5317 symtable_import(st, n);
5318 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005319 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005320 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005321 symtable_node(st, CHILD(n, 1));
5322 if (NCH(n) > 2)
5323 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005324 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005325 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005326 st->st_cur->ste_opt_lineno = n->n_lineno;
5327 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005328 if (NCH(n) > 4)
5329 symtable_node(st, CHILD(n, 5));
5330 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005331
5332 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005333 case assert_stmt:
5334 if (Py_OptimizeFlag)
5335 return;
5336 if (NCH(n) == 2) {
5337 n = CHILD(n, 1);
5338 goto loop;
5339 } else {
5340 symtable_node(st, CHILD(n, 1));
5341 n = CHILD(n, 3);
5342 goto loop;
5343 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005344 case except_clause:
5345 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005346 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005347 if (NCH(n) > 1) {
5348 n = CHILD(n, 1);
5349 goto loop;
5350 }
5351 break;
5352 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005353 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005354 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005355 case yield_stmt:
5356 st->st_cur->ste_generator = 1;
5357 n = CHILD(n, 1);
5358 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005359 case expr_stmt:
5360 if (NCH(n) == 1)
5361 n = CHILD(n, 0);
5362 else {
5363 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005364 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005365 symtable_node(st, CHILD(n, 2));
5366 break;
5367 } else {
5368 int i;
5369 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005370 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005371 n = CHILD(n, NCH(n) - 1);
5372 }
5373 }
5374 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005375 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005376 /* only occurs when there are multiple for loops
5377 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005378 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005379 if (TYPE(n) == list_for)
5380 symtable_list_for(st, n);
5381 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005382 REQ(n, list_if);
5383 symtable_node(st, CHILD(n, 1));
5384 if (NCH(n) == 3) {
5385 n = CHILD(n, 2);
5386 goto loop;
5387 }
5388 }
5389 break;
5390 case for_stmt:
5391 symtable_assign(st, CHILD(n, 1), 0);
5392 for (i = 3; i < NCH(n); ++i)
5393 if (TYPE(CHILD(n, i)) >= single_input)
5394 symtable_node(st, CHILD(n, i));
5395 break;
5396 /* The remaining cases fall through to default except in
5397 special circumstances. This requires the individual cases
5398 to be coded with great care, even though they look like
5399 rather innocuous. Each case must double-check TYPE(n).
5400 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005401 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005402 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005403 n = CHILD(n, 2);
5404 goto loop;
5405 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005406 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005407 case listmaker:
5408 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005409 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005410 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005411 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005412 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005413 case atom:
5414 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5415 symtable_add_use(st, STR(CHILD(n, 0)));
5416 break;
5417 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005418 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005419 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005420 /* Walk over every non-token child with a special case
5421 for one child.
5422 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005423 if (NCH(n) == 1) {
5424 n = CHILD(n, 0);
5425 goto loop;
5426 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005427 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005428 if (TYPE(CHILD(n, i)) >= single_input)
5429 symtable_node(st, CHILD(n, i));
5430 }
5431}
5432
5433static void
5434symtable_funcdef(struct symtable *st, node *n)
5435{
5436 node *body;
5437
5438 if (TYPE(n) == lambdef) {
5439 if (NCH(n) == 4)
5440 symtable_params(st, CHILD(n, 1));
5441 } else
5442 symtable_params(st, CHILD(n, 2));
5443 body = CHILD(n, NCH(n) - 1);
5444 symtable_node(st, body);
5445}
5446
5447/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00005448 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005449 which are references in the defining scope. symtable_params()
5450 parses the parameter names, which are defined in the function's
5451 body.
5452
5453 varargslist:
5454 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5455 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5456*/
5457
5458static void
5459symtable_default_args(struct symtable *st, node *n)
5460{
5461 node *c;
5462 int i;
5463
5464 if (TYPE(n) == parameters) {
5465 n = CHILD(n, 1);
5466 if (TYPE(n) == RPAR)
5467 return;
5468 }
5469 REQ(n, varargslist);
5470 for (i = 0; i < NCH(n); i += 2) {
5471 c = CHILD(n, i);
5472 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5473 break;
5474 }
5475 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5476 symtable_node(st, CHILD(n, i));
5477 }
5478}
5479
5480static void
5481symtable_params(struct symtable *st, node *n)
5482{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005483 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00005484 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005485
5486 if (TYPE(n) == parameters) {
5487 n = CHILD(n, 1);
5488 if (TYPE(n) == RPAR)
5489 return;
5490 }
5491 REQ(n, varargslist);
5492 for (i = 0; i < NCH(n); i += 2) {
5493 c = CHILD(n, i);
5494 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5495 ext = 1;
5496 break;
5497 }
5498 if (TYPE(c) == test) {
5499 continue;
5500 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00005501 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005502 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00005503 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005504 char nbuf[30];
5505 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005506 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005507 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005508 }
5509 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005510 if (ext) {
5511 c = CHILD(n, i);
5512 if (TYPE(c) == STAR) {
5513 i++;
5514 symtable_add_def(st, STR(CHILD(n, i)),
5515 DEF_PARAM | DEF_STAR);
5516 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005517 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005518 c = NULL;
5519 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005520 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005521 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005522 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005523 i++;
5524 symtable_add_def(st, STR(CHILD(n, i)),
5525 DEF_PARAM | DEF_DOUBLESTAR);
5526 }
5527 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005528 if (complex >= 0) {
5529 int j;
5530 for (j = 0; j <= complex; j++) {
5531 c = CHILD(n, j);
5532 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005533 c = CHILD(n, ++j);
5534 else if (TYPE(c) == EQUAL)
5535 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005536 if (TYPE(CHILD(c, 0)) == LPAR)
5537 symtable_params_fplist(st, CHILD(c, 1));
5538 }
5539 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005540}
5541
5542static void
5543symtable_params_fplist(struct symtable *st, node *n)
5544{
5545 int i;
5546 node *c;
5547
5548 REQ(n, fplist);
5549 for (i = 0; i < NCH(n); i += 2) {
5550 c = CHILD(n, i);
5551 REQ(c, fpdef);
5552 if (NCH(c) == 1)
5553 symtable_add_def(st, STR(CHILD(c, 0)),
5554 DEF_PARAM | DEF_INTUPLE);
5555 else
5556 symtable_params_fplist(st, CHILD(c, 1));
5557 }
5558
5559}
5560
5561static void
5562symtable_global(struct symtable *st, node *n)
5563{
5564 int i;
5565
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005566 /* XXX It might be helpful to warn about module-level global
5567 statements, but it's hard to tell the difference between
5568 module-level and a string passed to exec.
5569 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005570
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005571 for (i = 1; i < NCH(n); i += 2) {
5572 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005573 int flags;
5574
5575 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005576 if (flags < 0)
5577 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005578 if (flags && flags != DEF_GLOBAL) {
5579 char buf[500];
5580 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005581 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005582 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00005583 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005584 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005585 }
5586 else {
5587 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005588 PyOS_snprintf(buf, sizeof(buf),
5589 GLOBAL_AFTER_ASSIGN,
5590 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005591 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005592 PyOS_snprintf(buf, sizeof(buf),
5593 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005594 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005595 }
5596 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005597 symtable_add_def(st, name, DEF_GLOBAL);
5598 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005599}
5600
5601static void
5602symtable_list_comprehension(struct symtable *st, node *n)
5603{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005604 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005605 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005606
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005607 REQ(n, listmaker);
5608 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
5609 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005610 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005611 symtable_list_for(st, CHILD(n, 1));
5612 symtable_node(st, CHILD(n, 0));
5613 --st->st_cur->ste_tmpname;
5614}
5615
5616static void
5617symtable_list_for(struct symtable *st, node *n)
5618{
5619 REQ(n, list_for);
5620 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005621 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005622 symtable_node(st, CHILD(n, 3));
5623 if (NCH(n) == 5)
5624 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005625}
5626
5627static void
5628symtable_import(struct symtable *st, node *n)
5629{
5630 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005631 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005632 | 'from' dotted_name 'import'
5633 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005634 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005635 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005636 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005637 node *dotname = CHILD(n, 1);
5638 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5639 /* check for bogus imports */
5640 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5641 PyErr_SetString(PyExc_SyntaxError,
5642 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00005643 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005644 return;
5645 }
5646 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005647 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005648 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005649 if (symtable_warn(st,
5650 "import * only allowed at module level") < 0)
5651 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005652 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005653 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005654 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005655 } else {
5656 for (i = 3; i < NCH(n); i += 2) {
5657 node *c = CHILD(n, i);
5658 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005659 symtable_assign(st, CHILD(c, 2),
5660 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005661 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005662 symtable_assign(st, CHILD(c, 0),
5663 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005664 }
5665 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005666 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005667 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005668 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005669 }
5670 }
5671}
5672
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005673/* The third argument to symatble_assign() is a flag to be passed to
5674 symtable_add_def() if it is eventually called. The flag is useful
5675 to specify the particular type of assignment that should be
5676 recorded, e.g. an assignment caused by import.
5677 */
5678
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005679static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005680symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005681{
5682 node *tmp;
5683 int i;
5684
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005685 loop:
5686 switch (TYPE(n)) {
5687 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005688 /* invalid assignment, e.g. lambda x:x=2. The next
5689 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005690 return;
5691 case power:
5692 if (NCH(n) > 2) {
5693 for (i = 2; i < NCH(n); ++i)
5694 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5695 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005696 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005697 if (NCH(n) > 1) {
5698 symtable_node(st, CHILD(n, 0));
5699 symtable_node(st, CHILD(n, 1));
5700 } else {
5701 n = CHILD(n, 0);
5702 goto loop;
5703 }
5704 return;
5705 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005706 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5707 /* XXX This is an error, but the next pass
5708 will catch it. */
5709 return;
5710 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005711 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005712 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005713 }
5714 return;
5715 case exprlist:
5716 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00005717 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005718 if (NCH(n) == 1) {
5719 n = CHILD(n, 0);
5720 goto loop;
5721 }
5722 else {
5723 int i;
5724 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005725 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005726 return;
5727 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005728 case atom:
5729 tmp = CHILD(n, 0);
5730 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5731 n = CHILD(n, 1);
5732 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005733 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00005734 if (strcmp(STR(tmp), "__debug__") == 0) {
5735 PyErr_SetString(PyExc_SyntaxError,
5736 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00005737 symtable_error(st, n->n_lineno);
5738 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00005739 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005740 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005741 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005742 return;
5743 case dotted_as_name:
5744 if (NCH(n) == 3)
5745 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005746 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005747 else
5748 symtable_add_def(st,
5749 STR(CHILD(CHILD(n,
5750 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005751 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005752 return;
5753 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005754 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005755 return;
5756 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005757 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005758 return;
5759 default:
5760 if (NCH(n) == 0)
5761 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005762 if (NCH(n) == 1) {
5763 n = CHILD(n, 0);
5764 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005765 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005766 /* Should only occur for errors like x + 1 = 1,
5767 which will be caught in the next pass. */
5768 for (i = 0; i < NCH(n); ++i)
5769 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005770 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005771 }
5772}