blob: 04d8b65f4b4ff5f311662f28482f7afafbe5f3a0 [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);
1555 com_addoparg(c, CALL_FUNCTION, 1);
1556 com_addbyte(c, POP_TOP);
1557 com_pop(c, 2);
1558 }
1559}
1560
1561static void
1562com_list_comprehension(struct compiling *c, node *n)
1563{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001564 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001565 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001566
1567 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001568 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001569 com_addoparg(c, BUILD_LIST, 0);
1570 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1571 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001572 com_addop_name(c, LOAD_ATTR, "append");
1573 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001574 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001575 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001576 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001577 --c->c_tmpname;
1578}
1579
1580static void
1581com_listmaker(struct compiling *c, node *n)
1582{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001583 /* listmaker: test ( list_for | (',' test)* [','] ) */
1584 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001585 com_list_comprehension(c, n);
1586 else {
1587 int len = 0;
1588 int i;
1589 for (i = 0; i < NCH(n); i += 2, len++)
1590 com_node(c, CHILD(n, i));
1591 com_addoparg(c, BUILD_LIST, len);
1592 com_pop(c, len-1);
1593 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001594}
1595
1596static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001597com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001598{
1599 int i;
1600 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1601 for (i = 0; i+2 < NCH(n); i += 4) {
1602 /* We must arrange things just right for STORE_SUBSCR.
1603 It wants the stack to look like (value) (dict) (key) */
1604 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001605 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001606 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00001607 com_node(c, CHILD(n, i+2)); /* value */
1608 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001609 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001610 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001611 }
1612}
1613
1614static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001615com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001616{
1617 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001618 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001619 int i;
1620 REQ(n, atom);
1621 ch = CHILD(n, 0);
1622 switch (TYPE(ch)) {
1623 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001624 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001625 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001626 com_push(c, 1);
1627 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001628 else
1629 com_node(c, CHILD(n, 1));
1630 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001631 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001632 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001633 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001634 com_push(c, 1);
1635 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001636 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001637 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001638 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001639 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001640 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001641 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001642 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001643 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001644 break;
1645 case BACKQUOTE:
1646 com_node(c, CHILD(n, 1));
1647 com_addbyte(c, UNARY_CONVERT);
1648 break;
1649 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001650 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001651 i = 255;
1652 }
1653 else {
1654 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001655 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001656 }
1657 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001658 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001659 break;
1660 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001661 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001662 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001663 c->c_errors++;
1664 i = 255;
1665 }
1666 else {
1667 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001668 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001669 }
1670 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001671 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001672 break;
1673 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001674 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001675 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001676 break;
1677 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001678 com_error(c, PyExc_SystemError,
1679 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001680 }
1681}
1682
1683static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001684com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001685{
1686 if (NCH(n) == 1) {
1687 com_addbyte(c, op);
1688 }
1689 else if (NCH(n) == 2) {
1690 if (TYPE(CHILD(n, 0)) != COLON) {
1691 com_node(c, CHILD(n, 0));
1692 com_addbyte(c, op+1);
1693 }
1694 else {
1695 com_node(c, CHILD(n, 1));
1696 com_addbyte(c, op+2);
1697 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001698 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001699 }
1700 else {
1701 com_node(c, CHILD(n, 0));
1702 com_node(c, CHILD(n, 2));
1703 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001704 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001705 }
1706}
1707
Guido van Rossum635abd21997-01-06 22:56:52 +00001708static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001709com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1710{
1711 if (NCH(n) == 1) {
1712 com_addbyte(c, DUP_TOP);
1713 com_push(c, 1);
1714 com_addbyte(c, SLICE);
1715 com_node(c, augn);
1716 com_addbyte(c, opcode);
1717 com_pop(c, 1);
1718 com_addbyte(c, ROT_TWO);
1719 com_addbyte(c, STORE_SLICE);
1720 com_pop(c, 2);
1721 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1722 com_node(c, CHILD(n, 0));
1723 com_addoparg(c, DUP_TOPX, 2);
1724 com_push(c, 2);
1725 com_addbyte(c, SLICE+1);
1726 com_pop(c, 1);
1727 com_node(c, augn);
1728 com_addbyte(c, opcode);
1729 com_pop(c, 1);
1730 com_addbyte(c, ROT_THREE);
1731 com_addbyte(c, STORE_SLICE+1);
1732 com_pop(c, 3);
1733 } else if (NCH(n) == 2) {
1734 com_node(c, CHILD(n, 1));
1735 com_addoparg(c, DUP_TOPX, 2);
1736 com_push(c, 2);
1737 com_addbyte(c, SLICE+2);
1738 com_pop(c, 1);
1739 com_node(c, augn);
1740 com_addbyte(c, opcode);
1741 com_pop(c, 1);
1742 com_addbyte(c, ROT_THREE);
1743 com_addbyte(c, STORE_SLICE+2);
1744 com_pop(c, 3);
1745 } else {
1746 com_node(c, CHILD(n, 0));
1747 com_node(c, CHILD(n, 2));
1748 com_addoparg(c, DUP_TOPX, 3);
1749 com_push(c, 3);
1750 com_addbyte(c, SLICE+3);
1751 com_pop(c, 2);
1752 com_node(c, augn);
1753 com_addbyte(c, opcode);
1754 com_pop(c, 1);
1755 com_addbyte(c, ROT_FOUR);
1756 com_addbyte(c, STORE_SLICE+3);
1757 com_pop(c, 4);
1758 }
1759}
1760
1761static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001762com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001763{
1764 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001765 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001766 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001767 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001768 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001769 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001770 }
1771 else {
1772 com_node(c, CHILD(n, 0));
1773 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001774 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001775 }
1776 m = n;
1777 do {
1778 m = CHILD(m, 0);
1779 } while (NCH(m) == 1);
1780 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001781 /* f(lambda x: x[0] = 3) ends up getting parsed with
1782 * LHS test = lambda x: x[0], and RHS test = 3.
1783 * SF bug 132313 points out that complaining about a keyword
1784 * then is very confusing.
1785 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001786 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001787 TYPE(m) == lambdef ?
1788 "lambda cannot contain assignment" :
1789 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001790 }
1791 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001792 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00001793 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00001794 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001795 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001796 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001797 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001798 else if (*pkeywords == NULL) {
1799 c->c_errors++;
1800 Py_DECREF(v);
1801 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001802 if (PyDict_GetItem(*pkeywords, v) != NULL)
1803 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001804 "duplicate keyword argument");
1805 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001806 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001807 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001808 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001809 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001810 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001811 }
1812 }
1813 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001814}
1815
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001816static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001817com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001818{
1819 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001820 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001821 }
1822 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001823 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001824 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001825 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001826 int star_flag = 0;
1827 int starstar_flag = 0;
1828 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001829 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001830 na = 0;
1831 nk = 0;
1832 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001833 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001834 if (TYPE(ch) == STAR ||
1835 TYPE(ch) == DOUBLESTAR)
1836 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001837 if (ch->n_lineno != lineno) {
1838 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001839 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00001840 }
1841 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001842 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001843 na++;
1844 else
1845 nk++;
1846 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001847 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001848 while (i < NCH(n)) {
1849 node *tok = CHILD(n, i);
1850 node *ch = CHILD(n, i+1);
1851 i += 3;
1852 switch (TYPE(tok)) {
1853 case STAR: star_flag = 1; break;
1854 case DOUBLESTAR: starstar_flag = 1; break;
1855 }
1856 com_node(c, ch);
1857 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001858 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001859 com_error(c, PyExc_SyntaxError,
1860 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001861 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001862 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001863 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001864 star_flag + (starstar_flag << 1);
1865 else
1866 opcode = CALL_FUNCTION;
1867 com_addoparg(c, opcode, na | (nk << 8));
1868 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001869 }
1870}
1871
1872static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001873com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001874{
1875 com_addopname(c, LOAD_ATTR, n);
1876}
1877
1878static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001879com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001880{
1881 int i=0;
1882 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001883 node *ch;
1884
1885 /* first argument */
1886 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001887 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001888 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001889 i++;
1890 }
1891 else {
1892 com_node(c, CHILD(n,i));
1893 i++;
1894 REQ(CHILD(n,i),COLON);
1895 i++;
1896 }
1897 /* second argument */
1898 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1899 com_node(c, CHILD(n,i));
1900 i++;
1901 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001902 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001903 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001904 com_push(c, 1);
1905 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001906 /* remaining arguments */
1907 for (; i < NCH(n); i++) {
1908 ns++;
1909 ch=CHILD(n,i);
1910 REQ(ch, sliceop);
1911 if (NCH(ch) == 1) {
1912 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001913 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001914 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001915 }
1916 else
1917 com_node(c, CHILD(ch,1));
1918 }
1919 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001920 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001921}
1922
1923static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001924com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001925{
1926 node *ch;
1927 REQ(n, subscript);
1928 ch = CHILD(n,0);
1929 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001930 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001931 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001932 com_push(c, 1);
1933 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001934 else {
1935 /* check for slice */
1936 if ((TYPE(ch) == COLON || NCH(n) > 1))
1937 com_sliceobj(c, n);
1938 else {
1939 REQ(ch, test);
1940 com_node(c, ch);
1941 }
1942 }
1943}
1944
1945static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001946com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001947{
1948 int i, op;
1949 REQ(n, subscriptlist);
1950 /* Check to make backward compatible slice behavior for '[i:j]' */
1951 if (NCH(n) == 1) {
1952 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001953 /* 'Basic' slice, should have exactly one colon. */
1954 if ((TYPE(CHILD(sub, 0)) == COLON
1955 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1956 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1957 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001958 switch (assigning) {
1959 case OP_DELETE:
1960 op = DELETE_SLICE;
1961 break;
1962 case OP_ASSIGN:
1963 op = STORE_SLICE;
1964 break;
1965 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001966 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001967 break;
1968 default:
1969 com_augassign_slice(c, sub, assigning, augn);
1970 return;
1971 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001972 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001973 if (op == STORE_SLICE)
1974 com_pop(c, 2);
1975 else if (op == DELETE_SLICE)
1976 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001977 return;
1978 }
1979 }
1980 /* Else normal subscriptlist. Compile each subscript. */
1981 for (i = 0; i < NCH(n); i += 2)
1982 com_subscript(c, CHILD(n, i));
1983 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001984 if (NCH(n) > 1) {
1985 i = (NCH(n)+1) / 2;
1986 com_addoparg(c, BUILD_TUPLE, i);
1987 com_pop(c, i-1);
1988 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001989 switch (assigning) {
1990 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001991 op = DELETE_SUBSCR;
1992 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001993 break;
1994 default:
1995 case OP_ASSIGN:
1996 op = STORE_SUBSCR;
1997 i = 3;
1998 break;
1999 case OP_APPLY:
2000 op = BINARY_SUBSCR;
2001 i = 1;
2002 break;
2003 }
2004 if (assigning > OP_APPLY) {
2005 com_addoparg(c, DUP_TOPX, 2);
2006 com_push(c, 2);
2007 com_addbyte(c, BINARY_SUBSCR);
2008 com_pop(c, 1);
2009 com_node(c, augn);
2010 com_addbyte(c, assigning);
2011 com_pop(c, 1);
2012 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002013 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002014 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002015 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002016}
2017
2018static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002019com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002020{
2021 REQ(n, trailer);
2022 switch (TYPE(CHILD(n, 0))) {
2023 case LPAR:
2024 com_call_function(c, CHILD(n, 1));
2025 break;
2026 case DOT:
2027 com_select_member(c, CHILD(n, 1));
2028 break;
2029 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002030 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002031 break;
2032 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002033 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002034 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002035 }
2036}
2037
2038static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002039com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002040{
2041 int i;
2042 REQ(n, power);
2043 com_atom(c, CHILD(n, 0));
2044 for (i = 1; i < NCH(n); i++) {
2045 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2046 com_factor(c, CHILD(n, i+1));
2047 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002048 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002049 break;
2050 }
2051 else
2052 com_apply_trailer(c, CHILD(n, i));
2053 }
2054}
2055
2056static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002057com_invert_constant(struct compiling *c, node *n)
2058{
2059 /* Compute the inverse of int and longs and use them directly,
2060 but be prepared to generate code for all other
2061 possibilities (invalid numbers, floats, complex).
2062 */
2063 PyObject *num, *inv = NULL;
2064 int i;
2065
2066 REQ(n, NUMBER);
2067 num = parsenumber(c, STR(n));
2068 if (num == NULL)
2069 i = 255;
2070 else {
2071 inv = PyNumber_Invert(num);
2072 if (inv == NULL) {
2073 PyErr_Clear();
2074 i = com_addconst(c, num);
2075 } else {
2076 i = com_addconst(c, inv);
2077 Py_DECREF(inv);
2078 }
2079 Py_DECREF(num);
2080 }
2081 com_addoparg(c, LOAD_CONST, i);
2082 com_push(c, 1);
2083 if (num != NULL && inv == NULL)
2084 com_addbyte(c, UNARY_INVERT);
2085}
2086
Tim Peters51e26512001-09-07 08:45:55 +00002087static int
2088is_float_zero(const char *p)
2089{
2090 int found_radix_point = 0;
2091 int ch;
2092 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2093 switch (ch) {
2094 case '0':
2095 /* no reason to believe it's not 0 -- continue */
2096 break;
2097
2098 case 'e': case 'E': case 'j': case 'J':
2099 /* If this was a hex constant, we already would have
2100 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2101 must be an exponent marker, and we haven't yet
2102 seen a non-zero digit, and it doesn't matter what
2103 the exponent is then. For 'j' or 'J' similarly,
2104 except that this is an imaginary 0 then. */
2105 return 1;
2106
2107 case '.':
2108 found_radix_point = 1;
2109 break;
2110
2111 default:
2112 return 0;
2113 }
2114 }
2115 return found_radix_point;
2116}
2117
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002118static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002119com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002120{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002121 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002122 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002123 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002124 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002125 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002126 approriate value as a constant. If the value is negative,
2127 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002128 negative in the 0th position -- unless we're doing unary minus
2129 of a floating zero! In that case the sign is significant, but
2130 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002131 */
2132 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002133 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002134 && TYPE((pfactor = CHILD(n, 1))) == factor
2135 && NCH(pfactor) == 1
2136 && TYPE((ppower = CHILD(pfactor, 0))) == power
2137 && NCH(ppower) == 1
2138 && TYPE((patom = CHILD(ppower, 0))) == atom
2139 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002140 && !(childtype == MINUS &&
2141 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002142 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002143 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002144 return;
2145 }
2146 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002147 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002148 if (s == NULL) {
2149 com_error(c, PyExc_MemoryError, "");
2150 com_addbyte(c, 255);
2151 return;
2152 }
2153 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002154 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002155 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002156 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002157 }
Tim Peters51e26512001-09-07 08:45:55 +00002158 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002159 }
2160 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002161 com_factor(c, CHILD(n, 1));
2162 com_addbyte(c, UNARY_POSITIVE);
2163 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002164 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002165 com_factor(c, CHILD(n, 1));
2166 com_addbyte(c, UNARY_NEGATIVE);
2167 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002168 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002169 com_factor(c, CHILD(n, 1));
2170 com_addbyte(c, UNARY_INVERT);
2171 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002172 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002173 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002174 }
2175}
2176
2177static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002178com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002179{
2180 int i;
2181 int op;
2182 REQ(n, term);
2183 com_factor(c, CHILD(n, 0));
2184 for (i = 2; i < NCH(n); i += 2) {
2185 com_factor(c, CHILD(n, i));
2186 switch (TYPE(CHILD(n, i-1))) {
2187 case STAR:
2188 op = BINARY_MULTIPLY;
2189 break;
2190 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002191 if (c->c_flags & CO_FUTURE_DIVISION)
2192 op = BINARY_TRUE_DIVIDE;
2193 else
2194 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002195 break;
2196 case PERCENT:
2197 op = BINARY_MODULO;
2198 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002199 case DOUBLESLASH:
2200 op = BINARY_FLOOR_DIVIDE;
2201 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002202 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002203 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002204 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002205 op = 255;
2206 }
2207 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002208 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002209 }
2210}
2211
2212static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002213com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002214{
2215 int i;
2216 int op;
2217 REQ(n, arith_expr);
2218 com_term(c, CHILD(n, 0));
2219 for (i = 2; i < NCH(n); i += 2) {
2220 com_term(c, CHILD(n, i));
2221 switch (TYPE(CHILD(n, i-1))) {
2222 case PLUS:
2223 op = BINARY_ADD;
2224 break;
2225 case MINUS:
2226 op = BINARY_SUBTRACT;
2227 break;
2228 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002229 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002230 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002231 op = 255;
2232 }
2233 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002234 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002235 }
2236}
2237
2238static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002239com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002240{
2241 int i;
2242 int op;
2243 REQ(n, shift_expr);
2244 com_arith_expr(c, CHILD(n, 0));
2245 for (i = 2; i < NCH(n); i += 2) {
2246 com_arith_expr(c, CHILD(n, i));
2247 switch (TYPE(CHILD(n, i-1))) {
2248 case LEFTSHIFT:
2249 op = BINARY_LSHIFT;
2250 break;
2251 case RIGHTSHIFT:
2252 op = BINARY_RSHIFT;
2253 break;
2254 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002255 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002256 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002257 op = 255;
2258 }
2259 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002260 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002261 }
2262}
2263
2264static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002265com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002266{
2267 int i;
2268 int op;
2269 REQ(n, and_expr);
2270 com_shift_expr(c, CHILD(n, 0));
2271 for (i = 2; i < NCH(n); i += 2) {
2272 com_shift_expr(c, CHILD(n, i));
2273 if (TYPE(CHILD(n, i-1)) == AMPER) {
2274 op = BINARY_AND;
2275 }
2276 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002277 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002278 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002279 op = 255;
2280 }
2281 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002282 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002283 }
2284}
2285
2286static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002287com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002288{
2289 int i;
2290 int op;
2291 REQ(n, xor_expr);
2292 com_and_expr(c, CHILD(n, 0));
2293 for (i = 2; i < NCH(n); i += 2) {
2294 com_and_expr(c, CHILD(n, i));
2295 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2296 op = BINARY_XOR;
2297 }
2298 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002299 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002300 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002301 op = 255;
2302 }
2303 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002304 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002305 }
2306}
2307
2308static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002309com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002310{
2311 int i;
2312 int op;
2313 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002314 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002315 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002316 com_xor_expr(c, CHILD(n, i));
2317 if (TYPE(CHILD(n, i-1)) == VBAR) {
2318 op = BINARY_OR;
2319 }
2320 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002321 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002322 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002323 op = 255;
2324 }
2325 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002326 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002327 }
2328}
2329
2330static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002331cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002332{
2333 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00002334 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002335 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2336 if (NCH(n) == 1) {
2337 n = CHILD(n, 0);
2338 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002339 case LESS: return PyCmp_LT;
2340 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00002341 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00002342 case LESSEQUAL: return PyCmp_LE;
2343 case GREATEREQUAL: return PyCmp_GE;
2344 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2345 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2346 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002347 }
2348 }
2349 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002350 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002351 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002352 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002353 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002354 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002355 }
2356 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002357 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002358}
2359
2360static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002361com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002362{
2363 int i;
2364 enum cmp_op op;
2365 int anchor;
2366 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2367 com_expr(c, CHILD(n, 0));
2368 if (NCH(n) == 1)
2369 return;
2370
2371 /****************************************************************
2372 The following code is generated for all but the last
2373 comparison in a chain:
2374
2375 label: on stack: opcode: jump to:
2376
2377 a <code to load b>
2378 a, b DUP_TOP
2379 a, b, b ROT_THREE
2380 b, a, b COMPARE_OP
2381 b, 0-or-1 JUMP_IF_FALSE L1
2382 b, 1 POP_TOP
2383 b
2384
2385 We are now ready to repeat this sequence for the next
2386 comparison in the chain.
2387
2388 For the last we generate:
2389
2390 b <code to load c>
2391 b, c COMPARE_OP
2392 0-or-1
2393
2394 If there were any jumps to L1 (i.e., there was more than one
2395 comparison), we generate:
2396
2397 0-or-1 JUMP_FORWARD L2
2398 L1: b, 0 ROT_TWO
2399 0, b POP_TOP
2400 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002401 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002402 ****************************************************************/
2403
2404 anchor = 0;
2405
2406 for (i = 2; i < NCH(n); i += 2) {
2407 com_expr(c, CHILD(n, i));
2408 if (i+2 < NCH(n)) {
2409 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002410 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002411 com_addbyte(c, ROT_THREE);
2412 }
2413 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002414 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002415 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002416 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002417 }
2418 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002419 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002420 if (i+2 < NCH(n)) {
2421 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2422 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002423 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002424 }
2425 }
2426
2427 if (anchor) {
2428 int anchor2 = 0;
2429 com_addfwref(c, JUMP_FORWARD, &anchor2);
2430 com_backpatch(c, anchor);
2431 com_addbyte(c, ROT_TWO);
2432 com_addbyte(c, POP_TOP);
2433 com_backpatch(c, anchor2);
2434 }
2435}
2436
2437static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002438com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002439{
2440 REQ(n, not_test); /* 'not' not_test | comparison */
2441 if (NCH(n) == 1) {
2442 com_comparison(c, CHILD(n, 0));
2443 }
2444 else {
2445 com_not_test(c, CHILD(n, 1));
2446 com_addbyte(c, UNARY_NOT);
2447 }
2448}
2449
2450static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002451com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002452{
2453 int i;
2454 int anchor;
2455 REQ(n, and_test); /* not_test ('and' not_test)* */
2456 anchor = 0;
2457 i = 0;
2458 for (;;) {
2459 com_not_test(c, CHILD(n, i));
2460 if ((i += 2) >= NCH(n))
2461 break;
2462 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2463 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002464 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002465 }
2466 if (anchor)
2467 com_backpatch(c, anchor);
2468}
2469
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002470static int
2471com_make_closure(struct compiling *c, PyCodeObject *co)
2472{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002473 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002474 if (free == 0)
2475 return 0;
2476 for (i = 0; i < free; ++i) {
2477 /* Bypass com_addop_varname because it will generate
2478 LOAD_DEREF but LOAD_CLOSURE is needed.
2479 */
2480 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2481 int arg, reftype;
2482
2483 /* Special case: If a class contains a method with a
2484 free variable that has the same name as a method,
2485 the name will be considered free *and* local in the
2486 class. It should be handled by the closure, as
2487 well as by the normal name loookup logic.
2488 */
2489 reftype = get_ref_type(c, PyString_AS_STRING(name));
2490 if (reftype == CELL)
2491 arg = com_lookup_arg(c->c_cellvars, name);
2492 else /* (reftype == FREE) */
2493 arg = com_lookup_arg(c->c_freevars, name);
2494 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002495 fprintf(stderr, "lookup %s in %s %d %d\n"
2496 "freevars of %s: %s\n",
2497 PyObject_REPR(name),
2498 c->c_name,
2499 reftype, arg,
2500 PyString_AS_STRING(co->co_name),
2501 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002502 Py_FatalError("com_make_closure()");
2503 }
2504 com_addoparg(c, LOAD_CLOSURE, arg);
2505
2506 }
2507 com_push(c, free);
2508 return 1;
2509}
2510
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002511static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002512com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002513{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002514 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002515 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002516 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002517 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002518 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002519 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2520 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002521 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002522 if (co == NULL) {
2523 c->c_errors++;
2524 return;
2525 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002526 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002527 i = com_addconst(c, (PyObject *)co);
2528 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002529 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002530 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002531 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002532 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002533 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002534 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002535 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002536 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002537 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002538 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002539 else {
2540 int anchor = 0;
2541 int i = 0;
2542 for (;;) {
2543 com_and_test(c, CHILD(n, i));
2544 if ((i += 2) >= NCH(n))
2545 break;
2546 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2547 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002548 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002549 }
2550 if (anchor)
2551 com_backpatch(c, anchor);
2552 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002553}
2554
2555static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002556com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002557{
2558 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002559 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002560 com_node(c, CHILD(n, 0));
2561 }
2562 else {
2563 int i;
2564 int len;
2565 len = (NCH(n) + 1) / 2;
2566 for (i = 0; i < NCH(n); i += 2)
2567 com_node(c, CHILD(n, i));
2568 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002569 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002570 }
2571}
2572
2573
2574/* Begin of assignment compilation */
2575
Thomas Wouters434d0822000-08-24 20:11:32 +00002576
2577static void
2578com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2579{
2580 com_addbyte(c, DUP_TOP);
2581 com_push(c, 1);
2582 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002583 com_node(c, augn);
2584 com_addbyte(c, opcode);
2585 com_pop(c, 1);
2586 com_addbyte(c, ROT_TWO);
2587 com_addopname(c, STORE_ATTR, n);
2588 com_pop(c, 2);
2589}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002590
2591static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002592com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002593{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00002594 if (none_assignment_check(c, STR(n), assigning))
2595 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002596 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002597 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002598}
2599
2600static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002601com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002602{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002603 REQ(n, trailer);
2604 switch (TYPE(CHILD(n, 0))) {
2605 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002606 if (assigning == OP_DELETE)
2607 com_error(c, PyExc_SyntaxError,
2608 "can't delete function call");
2609 else
2610 com_error(c, PyExc_SyntaxError,
2611 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002612 break;
2613 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002614 if (assigning > OP_APPLY)
2615 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2616 else
2617 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002618 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002619 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002620 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002621 break;
2622 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002623 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002624 }
2625}
2626
2627static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002628com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002629{
2630 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002631 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002632 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002633 if (assigning) {
2634 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002635 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002636 com_push(c, i-1);
2637 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002638 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002639 com_assign(c, CHILD(n, i), assigning, NULL);
2640}
2641
2642static void
2643com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2644{
2645 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002646 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002647 com_push(c, 1);
2648 com_node(c, augn);
2649 com_addbyte(c, opcode);
2650 com_pop(c, 1);
2651 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002652}
2653
2654static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002655com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002656{
2657 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002658 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002659 if (assigning)
2660 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002661}
2662
2663static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002664com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002665{
2666 /* Loop to avoid trivial recursion */
2667 for (;;) {
2668 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002669
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002670 case exprlist:
2671 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002672 case testlist1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002673 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002674 if (assigning > OP_APPLY) {
2675 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002676 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002677 return;
2678 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002679 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002680 return;
2681 }
2682 n = CHILD(n, 0);
2683 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002684
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002685 case test:
2686 case and_test:
2687 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002688 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002689 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002690 case xor_expr:
2691 case and_expr:
2692 case shift_expr:
2693 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002694 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002695 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002696 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002697 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002698 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002699 return;
2700 }
2701 n = CHILD(n, 0);
2702 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002703
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002704 case power: /* atom trailer* ('**' power)*
2705 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002706 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002707 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002708 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002709 return;
2710 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002711 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002712 int i;
2713 com_node(c, CHILD(n, 0));
2714 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002715 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002716 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002717 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002718 return;
2719 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002720 com_apply_trailer(c, CHILD(n, i));
2721 } /* NB i is still alive */
2722 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002723 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002724 return;
2725 }
2726 n = CHILD(n, 0);
2727 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002728
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002729 case atom:
2730 switch (TYPE(CHILD(n, 0))) {
2731 case LPAR:
2732 n = CHILD(n, 1);
2733 if (TYPE(n) == RPAR) {
2734 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002735 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002736 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002737 return;
2738 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002739 if (assigning > OP_APPLY) {
2740 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00002741 "augmented assign to tuple literal not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002742 return;
2743 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002744 break;
2745 case LSQB:
2746 n = CHILD(n, 1);
2747 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002748 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002749 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002750 return;
2751 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002752 if (assigning > OP_APPLY) {
2753 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00002754 "augmented assign to list literal not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002755 return;
2756 }
2757 if (NCH(n) > 1
2758 && TYPE(CHILD(n, 1)) == list_for) {
2759 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002760 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002761 return;
2762 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002763 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002764 return;
2765 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002766 if (assigning > OP_APPLY)
2767 com_augassign_name(c, CHILD(n, 0),
2768 assigning, augn);
2769 else
2770 com_assign_name(c, CHILD(n, 0),
2771 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002772 return;
2773 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002774 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002775 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002776 return;
2777 }
2778 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002779
2780 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002781 com_error(c, PyExc_SyntaxError,
2782 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002783 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002784
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002785 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002786 com_error(c, PyExc_SystemError,
2787 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002788 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002789
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002790 }
2791 }
2792}
Guido van Rossum7c531111997-03-11 18:42:21 +00002793
Thomas Wouters434d0822000-08-24 20:11:32 +00002794static void
2795com_augassign(struct compiling *c, node *n)
2796{
2797 int opcode;
2798
2799 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2800 case '+': opcode = INPLACE_ADD; break;
2801 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002802 case '/':
2803 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
2804 opcode = INPLACE_FLOOR_DIVIDE;
2805 else if (c->c_flags & CO_FUTURE_DIVISION)
2806 opcode = INPLACE_TRUE_DIVIDE;
2807 else
2808 opcode = INPLACE_DIVIDE;
2809 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00002810 case '%': opcode = INPLACE_MODULO; break;
2811 case '<': opcode = INPLACE_LSHIFT; break;
2812 case '>': opcode = INPLACE_RSHIFT; break;
2813 case '&': opcode = INPLACE_AND; break;
2814 case '^': opcode = INPLACE_XOR; break;
2815 case '|': opcode = INPLACE_OR; break;
2816 case '*':
2817 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2818 opcode = INPLACE_POWER;
2819 else
2820 opcode = INPLACE_MULTIPLY;
2821 break;
2822 default:
2823 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2824 return;
2825 }
2826 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2827}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002828
2829static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002830com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002831{
Thomas Wouters434d0822000-08-24 20:11:32 +00002832 REQ(n, expr_stmt);
2833 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002834 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002835 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002836 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002837 if (NCH(n) == 1) {
2838 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002839 if (c->c_interactive)
2840 com_addbyte(c, PRINT_EXPR);
2841 else
2842 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002843 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002844 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002845 else if (TYPE(CHILD(n,1)) == augassign)
2846 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002847 else {
2848 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002849 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002850 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002851 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002852 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002853 com_push(c, 1);
2854 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002855 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002856 }
2857 }
2858}
2859
2860static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002861com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002862{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002863 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002864 int i;
2865 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002866 if (Py_OptimizeFlag)
2867 return;
2868 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00002869
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002870 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00002871 raise AssertionError [, <message>]
2872
2873 where <message> is the second test, if present.
2874 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002875 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002876 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002877 com_addbyte(c, POP_TOP);
2878 com_pop(c, 1);
2879 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002880 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002881 com_push(c, 1);
2882 i = NCH(n)/2; /* Either 2 or 4 */
2883 if (i > 1)
2884 com_node(c, CHILD(n, 3));
2885 com_addoparg(c, RAISE_VARARGS, i);
2886 com_pop(c, i);
2887 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002888 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002889 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002890 com_addbyte(c, POP_TOP);
2891}
2892
2893static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002894com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002895{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002896 int i = 1;
2897 node* stream = NULL;
2898
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002899 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002900
2901 /* are we using the extended print form? */
2902 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2903 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002904 com_node(c, stream);
2905 /* stack: [...] => [... stream] */
2906 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002907 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2908 i = 4;
2909 else
2910 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002911 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002912 for (; i < NCH(n); i += 2) {
2913 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002914 com_addbyte(c, DUP_TOP);
2915 /* stack: [stream] => [stream stream] */
2916 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002917 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002918 /* stack: [stream stream] => [stream stream obj] */
2919 com_addbyte(c, ROT_TWO);
2920 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002921 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002922 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002923 com_pop(c, 2);
2924 }
2925 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002926 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002927 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002928 com_addbyte(c, PRINT_ITEM);
2929 com_pop(c, 1);
2930 }
2931 }
2932 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002933 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002934 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002935 /* must pop the extra stream object off the stack */
2936 com_addbyte(c, POP_TOP);
2937 /* stack: [... stream] => [...] */
2938 com_pop(c, 1);
2939 }
2940 }
2941 else {
2942 if (stream != NULL) {
2943 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002944 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002945 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002946 com_pop(c, 1);
2947 }
2948 else
2949 com_addbyte(c, PRINT_NEWLINE);
2950 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002951}
2952
2953static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002954com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002955{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002956 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002957 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002958 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002959 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002960 if (c->c_flags & CO_GENERATOR) {
2961 if (NCH(n) > 1) {
2962 com_error(c, PyExc_SyntaxError,
2963 "'return' with argument inside generator");
2964 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002965 }
2966 if (NCH(n) < 2) {
2967 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002968 com_push(c, 1);
2969 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002970 else
2971 com_node(c, CHILD(n, 1));
2972 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00002973 com_pop(c, 1);
2974}
2975
2976static void
2977com_yield_stmt(struct compiling *c, node *n)
2978{
Tim Peters95c80f82001-06-23 02:07:08 +00002979 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00002980 REQ(n, yield_stmt); /* 'yield' testlist */
2981 if (!c->c_infunction) {
2982 com_error(c, PyExc_SyntaxError, "'yield' outside function");
2983 }
Tim Peters95c80f82001-06-23 02:07:08 +00002984
2985 for (i = 0; i < c->c_nblocks; ++i) {
2986 if (c->c_block[i] == SETUP_FINALLY) {
2987 com_error(c, PyExc_SyntaxError,
2988 "'yield' not allowed in a 'try' block "
2989 "with a 'finally' clause");
2990 return;
2991 }
2992 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002993 com_node(c, CHILD(n, 1));
2994 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002995 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002996}
2997
2998static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002999com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003000{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003001 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003002 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3003 if (NCH(n) > 1) {
3004 com_node(c, CHILD(n, 1));
3005 if (NCH(n) > 3) {
3006 com_node(c, CHILD(n, 3));
3007 if (NCH(n) > 5)
3008 com_node(c, CHILD(n, 5));
3009 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003010 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003011 i = NCH(n)/2;
3012 com_addoparg(c, RAISE_VARARGS, i);
3013 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003014}
3015
3016static void
Thomas Wouters52152252000-08-17 22:55:00 +00003017com_from_import(struct compiling *c, node *n)
3018{
3019 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3020 com_push(c, 1);
3021 if (NCH(n) > 1) {
3022 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3023 com_error(c, PyExc_SyntaxError, "invalid syntax");
3024 return;
3025 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003026 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003027 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003028 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003029 com_pop(c, 1);
3030}
3031
3032static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003033com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003034{
3035 int i;
3036 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003037 /* 'import' dotted_name (',' dotted_name)* |
3038 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003039 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00003040 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003041 /* 'from' dotted_name 'import' ... */
3042 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003043
3044 if (TYPE(CHILD(n, 3)) == STAR) {
3045 tup = Py_BuildValue("(s)", "*");
3046 } else {
3047 tup = PyTuple_New((NCH(n) - 2)/2);
3048 for (i = 3; i < NCH(n); i += 2) {
3049 PyTuple_SET_ITEM(tup, (i-3)/2,
Guido van Rossum633d90c2002-12-23 16:51:42 +00003050 PyString_FromString(STR(
3051 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003052 }
3053 }
3054 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003055 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003056 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003057 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00003058 if (TYPE(CHILD(n, 3)) == STAR)
3059 com_addbyte(c, IMPORT_STAR);
3060 else {
3061 for (i = 3; i < NCH(n); i += 2)
3062 com_from_import(c, CHILD(n, i));
3063 com_addbyte(c, POP_TOP);
3064 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003065 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003066 }
3067 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003068 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003069 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003070 node *subn = CHILD(n, i);
3071 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003072 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003073 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003074 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003075 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003076 int j;
3077 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003078 com_error(c, PyExc_SyntaxError,
3079 "invalid syntax");
3080 return;
3081 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003082 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3083 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003084 CHILD(CHILD(subn, 0),
3085 j));
3086 com_addop_varname(c, VAR_STORE,
3087 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003088 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003089 com_addop_varname(c, VAR_STORE,
3090 STR(CHILD(CHILD(subn, 0),
3091 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003092 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003093 }
3094 }
3095}
3096
3097static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003098com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003099{
3100 REQ(n, exec_stmt);
3101 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3102 com_node(c, CHILD(n, 1));
3103 if (NCH(n) >= 4)
3104 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003105 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003106 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003107 com_push(c, 1);
3108 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003109 if (NCH(n) >= 6)
3110 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003111 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003112 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003113 com_push(c, 1);
3114 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003115 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003116 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003117}
3118
Guido van Rossum7c531111997-03-11 18:42:21 +00003119static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003120is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003121{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003122 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003123 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003124 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003125
3126 /* Label to avoid tail recursion */
3127 next:
3128 switch (TYPE(n)) {
3129
3130 case suite:
3131 if (NCH(n) == 1) {
3132 n = CHILD(n, 0);
3133 goto next;
3134 }
3135 /* Fall through */
3136 case file_input:
3137 for (i = 0; i < NCH(n); i++) {
3138 node *ch = CHILD(n, i);
3139 if (TYPE(ch) == stmt) {
3140 n = ch;
3141 goto next;
3142 }
3143 }
3144 break;
3145
3146 case stmt:
3147 case simple_stmt:
3148 case small_stmt:
3149 n = CHILD(n, 0);
3150 goto next;
3151
3152 case expr_stmt:
3153 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003154 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003155 case test:
3156 case and_test:
3157 case not_test:
3158 case comparison:
3159 case expr:
3160 case xor_expr:
3161 case and_expr:
3162 case shift_expr:
3163 case arith_expr:
3164 case term:
3165 case factor:
3166 case power:
3167 case atom:
3168 if (NCH(n) == 1) {
3169 n = CHILD(n, 0);
3170 goto next;
3171 }
3172 break;
3173
3174 case NAME:
3175 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3176 return 1;
3177 break;
3178
3179 case NUMBER:
3180 v = parsenumber(c, STR(n));
3181 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003182 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003183 break;
3184 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003185 i = PyObject_IsTrue(v);
3186 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003187 return i == 0;
3188
3189 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003190 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003191 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003192 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003193 break;
3194 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003195 i = PyObject_IsTrue(v);
3196 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003197 return i == 0;
3198
3199 }
3200 return 0;
3201}
3202
Tim Peters08a898f2001-06-28 01:52:22 +00003203
3204/* Look under n for a return stmt with an expression.
3205 * This hack is used to find illegal returns under "if 0:" blocks in
3206 * functions already known to be generators (as determined by the symtable
3207 * pass).
3208 * Return the offending return node if found, else NULL.
3209 */
3210static node *
3211look_for_offending_return(node *n)
3212{
3213 int i;
3214
3215 for (i = 0; i < NCH(n); ++i) {
3216 node *kid = CHILD(n, i);
3217
3218 switch (TYPE(kid)) {
3219 case classdef:
3220 case funcdef:
3221 case lambdef:
3222 /* Stuff in nested functions & classes doesn't
3223 affect the code block we started in. */
3224 return NULL;
3225
3226 case return_stmt:
3227 if (NCH(kid) > 1)
3228 return kid;
3229 break;
3230
3231 default: {
3232 node *bad = look_for_offending_return(kid);
3233 if (bad != NULL)
3234 return bad;
3235 }
3236 }
3237 }
3238
3239 return NULL;
3240}
3241
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003242static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003243com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003244{
3245 int i;
3246 int anchor = 0;
3247 REQ(n, if_stmt);
3248 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3249 for (i = 0; i+3 < NCH(n); i+=4) {
3250 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003251 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003252 if (is_constant_false(c, ch)) {
3253 /* We're going to skip this block. However, if this
3254 is a generator, we have to check the dead code
3255 anyway to make sure there aren't any return stmts
3256 with expressions, in the same scope. */
3257 if (c->c_flags & CO_GENERATOR) {
3258 node *p = look_for_offending_return(n);
3259 if (p != NULL) {
3260 int savelineno = c->c_lineno;
3261 c->c_lineno = p->n_lineno;
3262 com_error(c, PyExc_SyntaxError,
3263 "'return' with argument "
3264 "inside generator");
3265 c->c_lineno = savelineno;
3266 }
3267 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003268 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003269 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003270 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003271 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003272 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003273 com_addfwref(c, JUMP_IF_FALSE, &a);
3274 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003275 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003276 com_node(c, CHILD(n, i+3));
3277 com_addfwref(c, JUMP_FORWARD, &anchor);
3278 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003279 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003280 com_addbyte(c, POP_TOP);
3281 }
3282 if (i+2 < NCH(n))
3283 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003284 if (anchor)
3285 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003286}
3287
3288static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003289com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003290{
3291 int break_anchor = 0;
3292 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003293 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003294 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3295 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003296 block_push(c, SETUP_LOOP);
3297 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003298 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003299 com_node(c, CHILD(n, 1));
3300 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3301 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003302 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003303 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003304 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003305 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003306 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3307 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003308 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003309 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003310 com_addbyte(c, POP_TOP);
3311 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003312 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003313 if (NCH(n) > 4)
3314 com_node(c, CHILD(n, 6));
3315 com_backpatch(c, break_anchor);
3316}
3317
3318static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003319com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003320{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003321 int break_anchor = 0;
3322 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003323 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003324 REQ(n, for_stmt);
3325 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3326 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003327 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003328 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003329 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003330 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00003331 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003332 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003333 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003334 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003335 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003336 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003337 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003338 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3339 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003340 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003341 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003342 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003343 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003344 if (NCH(n) > 8)
3345 com_node(c, CHILD(n, 8));
3346 com_backpatch(c, break_anchor);
3347}
3348
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003349/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003350
3351 SETUP_FINALLY L
3352 <code for S>
3353 POP_BLOCK
3354 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003355 L: <code for Sf>
3356 END_FINALLY
3357
3358 The special instructions use the block stack. Each block
3359 stack entry contains the instruction that created it (here
3360 SETUP_FINALLY), the level of the value stack at the time the
3361 block stack entry was created, and a label (here L).
3362
3363 SETUP_FINALLY:
3364 Pushes the current value stack level and the label
3365 onto the block stack.
3366 POP_BLOCK:
3367 Pops en entry from the block stack, and pops the value
3368 stack until its level is the same as indicated on the
3369 block stack. (The label is ignored.)
3370 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003371 Pops a variable number of entries from the *value* stack
3372 and re-raises the exception they specify. The number of
3373 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003374
3375 The block stack is unwound when an exception is raised:
3376 when a SETUP_FINALLY entry is found, the exception is pushed
3377 onto the value stack (and the exception condition is cleared),
3378 and the interpreter jumps to the label gotten from the block
3379 stack.
3380
3381 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003382 (The contents of the value stack is shown in [], with the top
3383 at the right; 'tb' is trace-back info, 'val' the exception's
3384 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003385
3386 Value stack Label Instruction Argument
3387 [] SETUP_EXCEPT L1
3388 [] <code for S>
3389 [] POP_BLOCK
3390 [] JUMP_FORWARD L0
3391
Guido van Rossum3f5da241990-12-20 15:06:42 +00003392 [tb, val, exc] L1: DUP )
3393 [tb, val, exc, exc] <evaluate E1> )
3394 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3395 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3396 [tb, val, exc, 1] POP )
3397 [tb, val, exc] POP
3398 [tb, val] <assign to V1> (or POP if no V1)
3399 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003400 [] <code for S1>
3401 JUMP_FORWARD L0
3402
Guido van Rossum3f5da241990-12-20 15:06:42 +00003403 [tb, val, exc, 0] L2: POP
3404 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003405 .............................etc.......................
3406
Guido van Rossum3f5da241990-12-20 15:06:42 +00003407 [tb, val, exc, 0] Ln+1: POP
3408 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003409
3410 [] L0: <next statement>
3411
3412 Of course, parts are not generated if Vi or Ei is not present.
3413*/
3414
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003415static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003416com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003417{
3418 int except_anchor = 0;
3419 int end_anchor = 0;
3420 int else_anchor = 0;
3421 int i;
3422 node *ch;
3423
3424 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3425 block_push(c, SETUP_EXCEPT);
3426 com_node(c, CHILD(n, 2));
3427 com_addbyte(c, POP_BLOCK);
3428 block_pop(c, SETUP_EXCEPT);
3429 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3430 com_backpatch(c, except_anchor);
3431 for (i = 3;
3432 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3433 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003434 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003435 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003436 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003437 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003438 break;
3439 }
3440 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003441 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003442 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003443 if (NCH(ch) > 1) {
3444 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003445 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003446 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003447 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003448 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003449 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3450 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003451 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003452 }
3453 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003454 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003455 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003456 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003457 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003458 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003459 com_pop(c, 1);
3460 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003461 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003462 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003463 com_node(c, CHILD(n, i+2));
3464 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3465 if (except_anchor) {
3466 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003467 /* We come in with [tb, val, exc, 0] on the
3468 stack; one pop and it's the same as
3469 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003470 com_addbyte(c, POP_TOP);
3471 }
3472 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003473 /* We actually come in here with [tb, val, exc] but the
3474 END_FINALLY will zap those and jump around.
3475 The c_stacklevel does not reflect them so we need not pop
3476 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003477 com_addbyte(c, END_FINALLY);
3478 com_backpatch(c, else_anchor);
3479 if (i < NCH(n))
3480 com_node(c, CHILD(n, i+2));
3481 com_backpatch(c, end_anchor);
3482}
3483
3484static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003485com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003486{
3487 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003488 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003489
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003490 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3491 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003492 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003493 com_addbyte(c, POP_BLOCK);
3494 block_pop(c, SETUP_FINALLY);
3495 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003496 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003497 /* While the generated code pushes only one item,
3498 the try-finally handling can enter here with
3499 up to three items. OK, here are the details:
3500 3 for an exception, 2 for RETURN, 1 for BREAK. */
3501 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003502 com_backpatch(c, finally_anchor);
3503 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003504 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003505 com_node(c, ch);
3506 com_addbyte(c, END_FINALLY);
3507 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003508 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003509}
3510
3511static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003512com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003513{
3514 REQ(n, try_stmt);
3515 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3516 | 'try' ':' suite 'finally' ':' suite */
3517 if (TYPE(CHILD(n, 3)) != except_clause)
3518 com_try_finally(c, n);
3519 else
3520 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003521}
3522
Guido van Rossum8b993a91997-01-17 21:04:03 +00003523static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003524get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003525{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003526 int i;
3527
Guido van Rossum8b993a91997-01-17 21:04:03 +00003528 /* Label to avoid tail recursion */
3529 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003530 switch (TYPE(n)) {
3531
3532 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003533 if (NCH(n) == 1) {
3534 n = CHILD(n, 0);
3535 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003536 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003537 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003538 case file_input:
3539 for (i = 0; i < NCH(n); i++) {
3540 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003541 if (TYPE(ch) == stmt) {
3542 n = ch;
3543 goto next;
3544 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003545 }
3546 break;
3547
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003548 case stmt:
3549 case simple_stmt:
3550 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003551 n = CHILD(n, 0);
3552 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003553
3554 case expr_stmt:
3555 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003556 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003557 case test:
3558 case and_test:
3559 case not_test:
3560 case comparison:
3561 case expr:
3562 case xor_expr:
3563 case and_expr:
3564 case shift_expr:
3565 case arith_expr:
3566 case term:
3567 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003568 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003569 if (NCH(n) == 1) {
3570 n = CHILD(n, 0);
3571 goto next;
3572 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003573 break;
3574
3575 case atom:
3576 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003577 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003578 break;
3579
3580 }
3581 return NULL;
3582}
3583
Guido van Rossum79f25d91997-04-29 20:08:16 +00003584static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003585get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003586{
Guido van Rossum541563e1999-01-28 15:08:09 +00003587 /* Don't generate doc-strings if run with -OO */
3588 if (Py_OptimizeFlag > 1)
3589 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003590 n = get_rawdocstring(n);
3591 if (n == NULL)
3592 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003593 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003594}
3595
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003596static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003597com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003598{
3599 REQ(n, suite);
3600 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3601 if (NCH(n) == 1) {
3602 com_node(c, CHILD(n, 0));
3603 }
3604 else {
3605 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003606 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003607 node *ch = CHILD(n, i);
3608 if (TYPE(ch) == stmt)
3609 com_node(c, ch);
3610 }
3611 }
3612}
3613
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003614/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003615static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003616com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003617{
3618 int i = c->c_nblocks;
3619 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3620 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3621 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003622 else if (i <= 0) {
3623 /* at the outer level */
3624 com_error(c, PyExc_SyntaxError,
3625 "'continue' not properly in loop");
3626 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003627 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003628 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003629 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003630 if (c->c_block[j] == SETUP_LOOP)
3631 break;
3632 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003633 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003634 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003635 for (; i > j; --i) {
3636 if (c->c_block[i] == SETUP_EXCEPT ||
3637 c->c_block[i] == SETUP_FINALLY) {
3638 com_addoparg(c, CONTINUE_LOOP,
3639 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003640 return;
3641 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003642 if (c->c_block[i] == END_FINALLY) {
3643 com_error(c, PyExc_SyntaxError,
3644 "'continue' not supported inside 'finally' clause");
3645 return;
3646 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003647 }
3648 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003649 com_error(c, PyExc_SyntaxError,
3650 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003651 }
3652 /* XXX Could allow it inside a 'finally' clause
3653 XXX if we could pop the exception still on the stack */
3654}
3655
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003656/* Return the number of default values in the argument list.
3657
3658 If a non-default argument follows a default argument, set an
3659 exception and return -1.
3660*/
3661
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003662static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003663com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003664{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003665 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003666 if (TYPE(n) == lambdef) {
3667 /* lambdef: 'lambda' [varargslist] ':' test */
3668 n = CHILD(n, 1);
3669 }
3670 else {
3671 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3672 n = CHILD(n, 2);
3673 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3674 n = CHILD(n, 1);
3675 }
3676 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003677 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003678 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003679 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003680 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3681 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003682 ndefs = 0;
3683 for (i = 0; i < nch; i++) {
3684 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003685 if (TYPE(CHILD(n, i)) == STAR ||
3686 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003687 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003688 i++;
3689 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003690 t = RPAR; /* Anything except EQUAL or COMMA */
3691 else
3692 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003693 if (t == EQUAL) {
3694 i++;
3695 ndefs++;
3696 com_node(c, CHILD(n, i));
3697 i++;
3698 if (i >= nch)
3699 break;
3700 t = TYPE(CHILD(n, i));
3701 }
3702 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003703 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003704 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003705 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003706 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003707 return -1;
3708 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003709 }
3710 if (t != COMMA)
3711 break;
3712 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003713 return ndefs;
3714}
3715
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003716static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003717com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003718{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003719 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003720 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003721 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003722 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003723 if (ndefs < 0)
3724 return;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003725 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3726 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003727 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003728 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003729 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003730 c->c_errors++;
3731 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003732 int closure = com_make_closure(c, (PyCodeObject *)co);
3733 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003734 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003735 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003736 if (closure)
3737 com_addoparg(c, MAKE_CLOSURE, ndefs);
3738 else
3739 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003740 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003741 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003742 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003743 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003744 }
3745}
3746
3747static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003748com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003749{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003750 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003751 REQ(n, testlist);
3752 /* testlist: test (',' test)* [','] */
3753 for (i = 0; i < NCH(n); i += 2)
3754 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003755 i = (NCH(n)+1) / 2;
3756 com_addoparg(c, BUILD_TUPLE, i);
3757 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003758}
3759
3760static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003761com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003762{
Guido van Rossum25831651993-05-19 14:50:45 +00003763 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003764 PyObject *v;
3765 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003766 char *name;
3767
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003768 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003769 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003770 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003771 c->c_errors++;
3772 return;
3773 }
3774 /* Push the class name on the stack */
3775 i = com_addconst(c, v);
3776 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003777 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003778 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003779 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003780 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003781 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003782 com_push(c, 1);
3783 }
Guido van Rossum25831651993-05-19 14:50:45 +00003784 else
3785 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003786 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003787 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003788 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003789 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003790 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003791 c->c_errors++;
3792 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003793 int closure = com_make_closure(c, co);
3794 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003795 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003796 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003797 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003798 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003799 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003800 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003801 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003802 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003803 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003804 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003805 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003806 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003807 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003808 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003809}
3810
3811static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003812com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003813{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003814 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003815 if (c->c_errors)
3816 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003817 switch (TYPE(n)) {
3818
3819 /* Definition nodes */
3820
3821 case funcdef:
3822 com_funcdef(c, n);
3823 break;
3824 case classdef:
3825 com_classdef(c, n);
3826 break;
3827
3828 /* Trivial parse tree nodes */
3829
3830 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003831 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003832 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003833 n = CHILD(n, 0);
3834 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003835
3836 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003837 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003838 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003839 {
3840 int i;
3841 for (i = 0; i < NCH(n)-1; i += 2)
3842 com_node(c, CHILD(n, i));
3843 }
3844 break;
3845
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003846 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003847 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003848 n = CHILD(n, 0);
3849 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003850
3851 /* Statement nodes */
3852
3853 case expr_stmt:
3854 com_expr_stmt(c, n);
3855 break;
3856 case print_stmt:
3857 com_print_stmt(c, n);
3858 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003859 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003860 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003861 break;
3862 case pass_stmt:
3863 break;
3864 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003865 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003866 com_error(c, PyExc_SyntaxError,
3867 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003868 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003869 com_addbyte(c, BREAK_LOOP);
3870 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003871 case continue_stmt:
3872 com_continue_stmt(c, n);
3873 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003874 case return_stmt:
3875 com_return_stmt(c, n);
3876 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003877 case yield_stmt:
3878 com_yield_stmt(c, n);
3879 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003880 case raise_stmt:
3881 com_raise_stmt(c, n);
3882 break;
3883 case import_stmt:
3884 com_import_stmt(c, n);
3885 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003886 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003887 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003888 case exec_stmt:
3889 com_exec_stmt(c, n);
3890 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003891 case assert_stmt:
3892 com_assert_stmt(c, n);
3893 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003894 case if_stmt:
3895 com_if_stmt(c, n);
3896 break;
3897 case while_stmt:
3898 com_while_stmt(c, n);
3899 break;
3900 case for_stmt:
3901 com_for_stmt(c, n);
3902 break;
3903 case try_stmt:
3904 com_try_stmt(c, n);
3905 break;
3906 case suite:
3907 com_suite(c, n);
3908 break;
3909
3910 /* Expression nodes */
3911
3912 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003913 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00003914 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003915 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003916 break;
3917 case test:
3918 com_test(c, n);
3919 break;
3920 case and_test:
3921 com_and_test(c, n);
3922 break;
3923 case not_test:
3924 com_not_test(c, n);
3925 break;
3926 case comparison:
3927 com_comparison(c, n);
3928 break;
3929 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003930 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003931 break;
3932 case expr:
3933 com_expr(c, n);
3934 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003935 case xor_expr:
3936 com_xor_expr(c, n);
3937 break;
3938 case and_expr:
3939 com_and_expr(c, n);
3940 break;
3941 case shift_expr:
3942 com_shift_expr(c, n);
3943 break;
3944 case arith_expr:
3945 com_arith_expr(c, n);
3946 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003947 case term:
3948 com_term(c, n);
3949 break;
3950 case factor:
3951 com_factor(c, n);
3952 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003953 case power:
3954 com_power(c, n);
3955 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003956 case atom:
3957 com_atom(c, n);
3958 break;
3959
3960 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003961 com_error(c, PyExc_SystemError,
3962 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003963 }
3964}
3965
Tim Petersdbd9ba62000-07-09 03:09:57 +00003966static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003967
3968static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003969com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003970{
3971 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3972 if (TYPE(CHILD(n, 0)) == LPAR)
3973 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003974 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003975 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003976 com_pop(c, 1);
3977 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003978}
3979
3980static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003981com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003982{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003983 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003984 if (NCH(n) == 1) {
3985 com_fpdef(c, CHILD(n, 0));
3986 }
3987 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003988 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003989 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003990 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003991 for (i = 0; i < NCH(n); i += 2)
3992 com_fpdef(c, CHILD(n, i));
3993 }
3994}
3995
3996static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003997com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003998{
Guido van Rossum633d90c2002-12-23 16:51:42 +00003999 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004000 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004001 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004002 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004003 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004004 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004005 nch = NCH(n);
4006 /* Enter all arguments in table of locals */
4007 for (i = 0, narg = 0; i < nch; i++) {
4008 node *ch = CHILD(n, i);
4009 node *fp;
4010 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004011 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004012 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4013 fp = CHILD(ch, 0);
4014 if (TYPE(fp) != NAME) {
4015 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4016 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004017 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004018 narg++;
4019 /* all name updates handled by symtable */
4020 if (++i >= nch)
4021 break;
4022 ch = CHILD(n, i);
4023 if (TYPE(ch) == EQUAL)
4024 i += 2;
4025 else
4026 REQ(ch, COMMA);
4027 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004028 if (complex) {
4029 /* Generate code for complex arguments only after
4030 having counted the simple arguments */
4031 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004032 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004033 node *ch = CHILD(n, i);
4034 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004035 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004036 break;
4037 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4038 fp = CHILD(ch, 0);
4039 if (TYPE(fp) != NAME) {
4040 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004041 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004042 com_fpdef(c, ch);
4043 }
4044 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004045 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004046 break;
4047 ch = CHILD(n, i);
4048 if (TYPE(ch) == EQUAL)
4049 i += 2;
4050 else
4051 REQ(ch, COMMA);
4052 }
4053 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004054}
4055
4056static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004057com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004058{
4059 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004060 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004061 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004062 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004063 if (doc != NULL) {
4064 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004065 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004066 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004067 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004068 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004069 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004070 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004071 for (i = 0; i < NCH(n); i++) {
4072 node *ch = CHILD(n, i);
4073 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4074 com_node(c, ch);
4075 }
4076}
4077
4078/* Top-level compile-node interface */
4079
4080static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004081compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004082{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004083 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004084 node *ch;
4085 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00004086 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004087 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004088 if (doc != NULL) {
4089 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004090 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004091 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004092 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004093 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004094 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
4095 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004096 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004097 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004098 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004099 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004100 c->c_infunction = 0;
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004101 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4102 com_push(c, 1);
4103 com_addbyte(c, RETURN_VALUE);
4104 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004105}
4106
4107static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004108compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004109{
Guido van Rossum590baa41993-11-30 13:40:46 +00004110 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004111 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004112 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004113
4114 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004115 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004116 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004117 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004118 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004119 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004120 else
4121 ch = CHILD(n, 2);
4122 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004123 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004124 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004125}
4126
4127static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004128compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004129{
4130 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004131 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004132 REQ(n, classdef);
4133 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4134 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004135 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004136 /* Initialize local __module__ from global __name__ */
4137 com_addop_name(c, LOAD_GLOBAL, "__name__");
4138 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004139 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004140 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004141 if (doc != NULL) {
4142 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004143 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004144 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004145 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004146 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004147 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004148 }
4149 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004150 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004151 com_node(c, ch);
4152 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004153 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004154 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004155 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004156}
4157
4158static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004159compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004160{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004161 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004162
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004163 switch (TYPE(n)) {
4164
Guido van Rossum4c417781991-01-21 16:09:22 +00004165 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004166 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004167 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004168 n = CHILD(n, 0);
4169 if (TYPE(n) != NEWLINE)
4170 com_node(c, n);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004171 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4172 com_push(c, 1);
4173 com_addbyte(c, RETURN_VALUE);
4174 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004175 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004176 break;
4177
Guido van Rossum4c417781991-01-21 16:09:22 +00004178 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004179 com_file_input(c, n);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004180 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4181 com_push(c, 1);
4182 com_addbyte(c, RETURN_VALUE);
4183 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004184 break;
4185
Guido van Rossum590baa41993-11-30 13:40:46 +00004186 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004187 com_node(c, CHILD(n, 0));
4188 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004189 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004190 break;
4191
Guido van Rossum590baa41993-11-30 13:40:46 +00004192 case lambdef: /* anonymous function definition */
4193 compile_lambdef(c, n);
4194 break;
4195
Guido van Rossum4c417781991-01-21 16:09:22 +00004196 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004197 compile_funcdef(c, n);
4198 break;
4199
Guido van Rossum4c417781991-01-21 16:09:22 +00004200 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004201 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004202 break;
4203
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004204 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004205 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004206 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004207 }
4208}
4209
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004210static PyObject *
4211dict_keys_inorder(PyObject *dict, int offset)
4212{
4213 PyObject *tuple, *k, *v;
4214 int i, pos = 0, size = PyDict_Size(dict);
4215
4216 tuple = PyTuple_New(size);
4217 if (tuple == NULL)
4218 return NULL;
4219 while (PyDict_Next(dict, &pos, &k, &v)) {
4220 i = PyInt_AS_LONG(v);
4221 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004222 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004223 PyTuple_SET_ITEM(tuple, i - offset, k);
4224 }
4225 return tuple;
4226}
4227
Guido van Rossum79f25d91997-04-29 20:08:16 +00004228PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004229PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004230{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004231 return PyNode_CompileFlags(n, filename, NULL);
4232}
4233
4234PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004235PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004236{
4237 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004238}
4239
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004240struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004241PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004242{
4243 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004244 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004245
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004246 ff = PyNode_Future(n, filename);
4247 if (ff == NULL)
4248 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004249 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00004250 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004251 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004252 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004253 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004254 return st;
4255}
4256
Guido van Rossum79f25d91997-04-29 20:08:16 +00004257static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004258icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004259{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004260 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004261}
4262
Guido van Rossum79f25d91997-04-29 20:08:16 +00004263static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004264jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004265 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004266{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004267 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004268 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004269 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004270 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004271 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4272 sc.c_encoding = "utf-8";
4273 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004274 sc.c_encoding = STR(n);
4275 n = CHILD(n, 0);
4276 } else {
4277 sc.c_encoding = NULL;
4278 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004279 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004280 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004281 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004282 /* c_symtable still points to parent's symbols */
4283 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004284 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004285 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004286 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004287 if (base->c_encoding != NULL) {
4288 assert(sc.c_encoding == NULL);
4289 sc.c_encoding = base->c_encoding;
4290 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004291 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004292 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004293 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004294 if (sc.c_future == NULL) {
4295 com_free(&sc);
4296 return NULL;
4297 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004298 if (flags) {
4299 int merged = sc.c_future->ff_features |
4300 flags->cf_flags;
4301 sc.c_future->ff_features = merged;
4302 flags->cf_flags = merged;
4303 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004304 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
4305 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004306 com_free(&sc);
4307 return NULL;
4308 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004309 /* reset symbol table for second pass */
4310 sc.c_symtable->st_nscopes = 1;
4311 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004312 }
4313 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004314 if (symtable_load_symbols(&sc) < 0) {
4315 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004316 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004317 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004318 compile_node(&sc, n);
4319 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004320 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004321 PyObject *consts, *names, *varnames, *filename, *name,
4322 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004323 consts = PyList_AsTuple(sc.c_consts);
4324 names = PyList_AsTuple(sc.c_names);
4325 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004326 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4327 freevars = dict_keys_inorder(sc.c_freevars,
4328 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004329 filename = PyString_InternFromString(sc.c_filename);
4330 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004331 if (!PyErr_Occurred())
4332 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004333 sc.c_nlocals,
4334 sc.c_maxstacklevel,
4335 sc.c_flags,
4336 sc.c_code,
4337 consts,
4338 names,
4339 varnames,
4340 freevars,
4341 cellvars,
4342 filename,
4343 name,
4344 sc.c_firstlineno,
4345 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004346 Py_XDECREF(consts);
4347 Py_XDECREF(names);
4348 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004349 Py_XDECREF(freevars);
4350 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004351 Py_XDECREF(filename);
4352 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004353 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004354 else if (!PyErr_Occurred()) {
4355 /* This could happen if someone called PyErr_Clear() after an
4356 error was reported above. That's not supposed to happen,
4357 but I just plugged one case and I'm not sure there can't be
4358 others. In that case, raise SystemError so that at least
4359 it gets reported instead dumping core. */
4360 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4361 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004362 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004363 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004364 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004365 sc.c_symtable = NULL;
4366 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004367 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004368 return co;
4369}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004370
4371int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004372PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004373{
4374 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004375 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004376 int line = co->co_firstlineno;
4377 int addr = 0;
4378 while (--size >= 0) {
4379 addr += *p++;
4380 if (addr > addrq)
4381 break;
4382 line += *p++;
4383 }
4384 return line;
4385}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004386
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004387/* The test for LOCAL must come before the test for FREE in order to
4388 handle classes where name is both local and free. The local var is
4389 a method and the free var is a free var referenced within a method.
4390*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004391
4392static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004393get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004394{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004395 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004396 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004397
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004398 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4399 return CELL;
4400 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4401 return LOCAL;
4402 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4403 return FREE;
4404 v = PyDict_GetItemString(c->c_globals, name);
4405 if (v) {
4406 if (v == Py_None)
4407 return GLOBAL_EXPLICIT;
4408 else {
4409 return GLOBAL_IMPLICIT;
4410 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004411 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004412 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004413 "unknown scope for %.100s in %.100s(%s) "
4414 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4415 name, c->c_name,
4416 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4417 c->c_filename,
4418 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4419 PyObject_REPR(c->c_locals),
4420 PyObject_REPR(c->c_globals)
4421 );
4422
4423 Py_FatalError(buf);
4424 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004425}
4426
Guido van Rossum207fda62001-03-02 03:30:41 +00004427/* Helper functions to issue warnings */
4428
4429static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004430issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004431{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004432 if (PyErr_Occurred()) {
4433 /* This can happen because symtable_node continues
4434 processing even after raising a SyntaxError.
4435 Calling PyErr_WarnExplicit now would clobber the
4436 pending exception; instead we fail and let that
4437 exception propagate.
4438 */
4439 return -1;
4440 }
Guido van Rossum207fda62001-03-02 03:30:41 +00004441 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4442 lineno, NULL, NULL) < 0) {
4443 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4444 PyErr_SetString(PyExc_SyntaxError, msg);
4445 PyErr_SyntaxLocation(filename, lineno);
4446 }
4447 return -1;
4448 }
4449 return 0;
4450}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004451
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004452static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004453symtable_warn(struct symtable *st, char *msg)
4454{
Guido van Rossum207fda62001-03-02 03:30:41 +00004455 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004456 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004457 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004458 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004459 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004460}
4461
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004462/* Helper function for setting lineno and filename */
4463
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004464static struct symtable *
4465symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004466{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004467 struct symtable *st;
4468
4469 st = symtable_init();
4470 if (st == NULL)
4471 return NULL;
4472 st->st_future = ff;
4473 st->st_filename = filename;
4474 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
4475 if (st->st_errors > 0)
4476 goto fail;
4477 symtable_node(st, n);
4478 if (st->st_errors > 0)
4479 goto fail;
4480 return st;
4481 fail:
4482 if (!PyErr_Occurred()) {
4483 /* This could happen because after a syntax error is
4484 detected, the symbol-table-building continues for
4485 a while, and PyErr_Clear() might erroneously be
4486 called during that process. One such case has been
4487 fixed, but there might be more (now or later).
4488 */
4489 PyErr_SetString(PyExc_SystemError, "lost exception");
4490 }
4491 st->st_future = NULL;
4492 st->st_filename = NULL;
4493 PySymtable_Free(st);
4494 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004495}
4496
4497static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004498symtable_init_compiling_symbols(struct compiling *c)
4499{
4500 PyObject *varnames;
4501
4502 varnames = c->c_symtable->st_cur->ste_varnames;
4503 if (varnames == NULL) {
4504 varnames = PyList_New(0);
4505 if (varnames == NULL)
4506 return -1;
4507 c->c_symtable->st_cur->ste_varnames = varnames;
4508 Py_INCREF(varnames);
4509 } else
4510 Py_INCREF(varnames);
4511 c->c_varnames = varnames;
4512
4513 c->c_globals = PyDict_New();
4514 if (c->c_globals == NULL)
4515 return -1;
4516 c->c_freevars = PyDict_New();
4517 if (c->c_freevars == NULL)
4518 return -1;
4519 c->c_cellvars = PyDict_New();
4520 if (c->c_cellvars == NULL)
4521 return -1;
4522 return 0;
4523}
4524
4525struct symbol_info {
4526 int si_nlocals;
4527 int si_ncells;
4528 int si_nfrees;
4529 int si_nimplicit;
4530};
4531
4532static void
4533symtable_init_info(struct symbol_info *si)
4534{
4535 si->si_nlocals = 0;
4536 si->si_ncells = 0;
4537 si->si_nfrees = 0;
4538 si->si_nimplicit = 0;
4539}
4540
4541static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004542symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004543 struct symbol_info *si)
4544{
4545 PyObject *dict, *v;
4546
4547 /* Seperate logic for DEF_FREE. If it occurs in a function,
4548 it indicates a local that we must allocate storage for (a
4549 cell var). If it occurs in a class, then the class has a
4550 method and a free variable with the same name.
4551 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004552 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004553 /* If it isn't declared locally, it can't be a cell. */
4554 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4555 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004556 v = PyInt_FromLong(si->si_ncells++);
4557 dict = c->c_cellvars;
4558 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004559 /* If it is free anyway, then there is no need to do
4560 anything here.
4561 */
4562 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004563 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004564 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004565 v = PyInt_FromLong(si->si_nfrees++);
4566 dict = c->c_freevars;
4567 }
4568 if (v == NULL)
4569 return -1;
4570 if (PyDict_SetItem(dict, name, v) < 0) {
4571 Py_DECREF(v);
4572 return -1;
4573 }
4574 Py_DECREF(v);
4575 return 0;
4576}
4577
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004578/* If a variable is a cell and an argument, make sure that appears in
4579 co_cellvars before any variable to its right in varnames.
4580*/
4581
4582
4583static int
4584symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4585 PyObject *varnames, int flags)
4586{
Tim Petersb39903b2003-03-24 17:22:24 +00004587 PyObject *v = NULL;
4588 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004589 int i, pos;
4590
4591 if (flags & CO_VARARGS)
4592 argcount++;
4593 if (flags & CO_VARKEYWORDS)
4594 argcount++;
4595 for (i = argcount; --i >= 0; ) {
4596 v = PyList_GET_ITEM(varnames, i);
4597 if (PyDict_GetItem(*cellvars, v)) {
4598 if (list == NULL) {
4599 list = PyList_New(1);
4600 if (list == NULL)
4601 return -1;
4602 PyList_SET_ITEM(list, 0, v);
4603 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004604 } else {
4605 if (PyList_Insert(list, 0, v) < 0) {
4606 Py_DECREF(list);
4607 return -1;
4608 }
4609 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004610 }
4611 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00004612 if (list == NULL)
4613 return 0;
4614
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004615 /* There are cellvars that are also arguments. Create a dict
4616 to replace cellvars and put the args at the front.
4617 */
4618 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004619 if (d == NULL)
4620 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004621 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4622 v = PyInt_FromLong(i);
4623 if (v == NULL)
4624 goto fail;
4625 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4626 goto fail;
4627 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4628 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00004629 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004630 }
4631 pos = 0;
4632 i = PyList_GET_SIZE(list);
4633 Py_DECREF(list);
4634 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4635 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004636 if (w == NULL)
4637 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004638 if (PyDict_SetItem(d, v, w) < 0) {
4639 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00004640 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004641 goto fail;
4642 }
4643 Py_DECREF(w);
4644 }
4645 Py_DECREF(*cellvars);
4646 *cellvars = d;
4647 return 1;
4648 fail:
4649 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00004650 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004651 return -1;
4652}
4653
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004654static int
4655symtable_freevar_offsets(PyObject *freevars, int offset)
4656{
4657 PyObject *name, *v;
4658 int pos;
4659
4660 /* The cell vars are the first elements of the closure,
4661 followed by the free vars. Update the offsets in
4662 c_freevars to account for number of cellvars. */
4663 pos = 0;
4664 while (PyDict_Next(freevars, &pos, &name, &v)) {
4665 int i = PyInt_AS_LONG(v) + offset;
4666 PyObject *o = PyInt_FromLong(i);
4667 if (o == NULL)
4668 return -1;
4669 if (PyDict_SetItem(freevars, name, o) < 0) {
4670 Py_DECREF(o);
4671 return -1;
4672 }
4673 Py_DECREF(o);
4674 }
4675 return 0;
4676}
4677
4678static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004679symtable_check_unoptimized(struct compiling *c,
4680 PySymtableEntryObject *ste,
4681 struct symbol_info *si)
4682{
4683 char buf[300];
4684
4685 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4686 || (ste->ste_nested && si->si_nimplicit)))
4687 return 0;
4688
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004689#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4690
4691#define ILLEGAL_IS "is a nested function"
4692
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004693#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004694"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004695
4696#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004697"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004698
4699#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00004700"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004701"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004702
4703 /* XXX perhaps the linenos for these opt-breaking statements
4704 should be stored so the exception can point to them. */
4705
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004706 if (ste->ste_child_free) {
4707 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004708 PyOS_snprintf(buf, sizeof(buf),
4709 ILLEGAL_IMPORT_STAR,
4710 PyString_AS_STRING(ste->ste_name),
4711 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004712 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004713 PyOS_snprintf(buf, sizeof(buf),
4714 ILLEGAL_BARE_EXEC,
4715 PyString_AS_STRING(ste->ste_name),
4716 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004717 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004718 PyOS_snprintf(buf, sizeof(buf),
4719 ILLEGAL_EXEC_AND_IMPORT_STAR,
4720 PyString_AS_STRING(ste->ste_name),
4721 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004722 }
4723 } else {
4724 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004725 PyOS_snprintf(buf, sizeof(buf),
4726 ILLEGAL_IMPORT_STAR,
4727 PyString_AS_STRING(ste->ste_name),
4728 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004729 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004730 PyOS_snprintf(buf, sizeof(buf),
4731 ILLEGAL_BARE_EXEC,
4732 PyString_AS_STRING(ste->ste_name),
4733 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004734 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004735 PyOS_snprintf(buf, sizeof(buf),
4736 ILLEGAL_EXEC_AND_IMPORT_STAR,
4737 PyString_AS_STRING(ste->ste_name),
4738 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004739 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004740 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004741
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004742 PyErr_SetString(PyExc_SyntaxError, buf);
4743 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4744 ste->ste_opt_lineno);
4745 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004746}
4747
4748static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004749symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4750 struct symbol_info *si)
4751{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004752 if (c->c_future)
4753 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004754 if (ste->ste_generator)
4755 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004756 if (ste->ste_type != TYPE_MODULE)
4757 c->c_flags |= CO_NEWLOCALS;
4758 if (ste->ste_type == TYPE_FUNCTION) {
4759 c->c_nlocals = si->si_nlocals;
4760 if (ste->ste_optimized == 0)
4761 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004762 else if (ste->ste_optimized != OPT_EXEC)
4763 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004764 }
4765 return 0;
4766}
4767
4768static int
Jeremy Hylton98326132003-09-22 04:26:44 +00004769symtable_error(struct symtable *st, int lineno)
4770{
4771 if (lineno == 0)
4772 lineno = st->st_cur->ste_lineno;
4773 PyErr_SyntaxLocation(st->st_filename, lineno);
4774 st->st_errors++;
4775 return -1;
4776}
4777
4778static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004779symtable_load_symbols(struct compiling *c)
4780{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004781 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004782 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004783 PyObject *name, *varnames, *v;
4784 int i, flags, pos;
4785 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004786
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004787 v = NULL;
4788
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004789 if (symtable_init_compiling_symbols(c) < 0)
4790 goto fail;
4791 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004792 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004793 si.si_nlocals = PyList_GET_SIZE(varnames);
4794 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004795
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004796 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004797 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004798 if (v == NULL)
4799 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004800 if (PyDict_SetItem(c->c_locals,
4801 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004802 goto fail;
4803 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004804 }
4805
4806 /* XXX The cases below define the rules for whether a name is
4807 local or global. The logic could probably be clearer. */
4808 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004809 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4810 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004811
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004812 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004813 /* undo the original DEF_FREE */
4814 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004815
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004816 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004817 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004818 2. Free variables in methods that are also class
4819 variables or declared global.
4820 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004821 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004822 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004823
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004824 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004825 c->c_argcount--;
4826 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004827 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004828 c->c_argcount--;
4829 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004830 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004831 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004832 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004833 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00004834 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004835 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00004836 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004837 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004838 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004839 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4840 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004841 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004842 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00004843 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004844 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004845 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004846 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004847 if (v == NULL)
4848 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004849 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004850 goto fail;
4851 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004852 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004853 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004854 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004855 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004856 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004857 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004858 if (v == NULL)
4859 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004860 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004861 goto fail;
4862 Py_DECREF(v);
4863 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004864 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004865 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00004866 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004867 goto fail;
4868 if (st->st_nscopes != 1) {
4869 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004870 if (v == NULL)
4871 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004872 if (PyDict_SetItem(st->st_global,
4873 name, v))
4874 goto fail;
4875 Py_DECREF(v);
4876 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004877 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004878 }
4879 }
4880
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004881 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4882
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004883 if (si.si_ncells > 1) { /* one cell is always in order */
4884 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4885 c->c_varnames, c->c_flags) < 0)
4886 return -1;
4887 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004888 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4889 return -1;
4890 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004891 fail:
4892 /* is this always the right thing to do? */
4893 Py_XDECREF(v);
4894 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004895}
4896
4897static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004898symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004899{
4900 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004901
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004902 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004903 if (st == NULL)
4904 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004905 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00004906
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004907 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004908 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004909 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004910 goto fail;
4911 if ((st->st_symbols = PyDict_New()) == NULL)
4912 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004913 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004914 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004915 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004916 st->st_private = NULL;
4917 return st;
4918 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004919 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004920 return NULL;
4921}
4922
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004923void
4924PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004925{
4926 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004927 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004928 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004929 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004930}
4931
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004932/* When the compiler exits a scope, it must should update the scope's
4933 free variable information with the list of free variables in its
4934 children.
4935
4936 Variables that are free in children and defined in the current
4937 scope are cellvars.
4938
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004939 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004940 false), free variables in children that are not defined here are
4941 implicit globals.
4942
4943*/
4944
4945static int
4946symtable_update_free_vars(struct symtable *st)
4947{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004948 int i, j, def;
4949 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004950 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004951
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004952 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004953 def = DEF_FREE_CLASS;
4954 else
4955 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004956 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004957 int pos = 0;
4958
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00004959 if (list && PyList_SetSlice(list, 0,
4960 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004961 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00004962 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004963 PyList_GET_ITEM(ste->ste_children, i);
4964 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004965 int flags = PyInt_AS_LONG(o);
4966 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004967 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004968 if (list == NULL) {
4969 list = PyList_New(0);
4970 if (list == NULL)
4971 return -1;
4972 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004973 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004974 if (PyList_Append(list, name) < 0) {
4975 Py_DECREF(list);
4976 return -1;
4977 }
4978 }
4979 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004980 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004981 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004982 v = PyDict_GetItem(ste->ste_symbols, name);
4983 /* If a name N is declared global in scope A and
4984 referenced in scope B contained (perhaps
4985 indirectly) in A and there are no scopes
4986 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004987 is global in B. Unless A is a class scope,
4988 because class scopes are not considered for
4989 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004990 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004991 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004992 int flags = PyInt_AS_LONG(v);
4993 if (flags & DEF_GLOBAL) {
4994 symtable_undo_free(st, child->ste_id,
4995 name);
4996 continue;
4997 }
4998 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004999 if (ste->ste_nested) {
5000 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005001 name, def) < 0) {
5002 Py_DECREF(list);
5003 return -1;
5004 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005005 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005006 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005007 name) < 0) {
5008 Py_DECREF(list);
5009 return -1;
5010 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005011 }
5012 }
5013 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005014
5015 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005016 return 0;
5017}
5018
5019/* If the current scope is a non-nested class or if name is not
5020 defined in the current, non-nested scope, then it is an implicit
5021 global in all nested scopes.
5022*/
5023
5024static int
5025symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5026{
5027 PyObject *o;
5028 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005029 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005030
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005031 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005032 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005033 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005034 if (o == NULL)
5035 return symtable_undo_free(st, child, name);
5036 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005037
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005038 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005039 return symtable_undo_free(st, child, name);
5040 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005041 return symtable_add_def_o(st, ste->ste_symbols,
5042 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005043}
5044
5045static int
5046symtable_undo_free(struct symtable *st, PyObject *id,
5047 PyObject *name)
5048{
5049 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005050 PyObject *info;
5051 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005052
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005053 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5054 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005055 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005056
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005057 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005058 if (info == NULL)
5059 return 0;
5060 v = PyInt_AS_LONG(info);
5061 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005062 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005063 DEF_FREE_GLOBAL) < 0)
5064 return -1;
5065 } else
5066 /* If the name is defined here or declared global,
5067 then the recursion stops. */
5068 return 0;
5069
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005070 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5071 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005072 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005073 PyList_GET_ITEM(ste->ste_children, i);
5074 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005075 if (x < 0)
5076 return x;
5077 }
5078 return 0;
5079}
5080
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005081/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5082 This reference is released when the scope is exited, via the DECREF
5083 in symtable_exit_scope().
5084*/
5085
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005086static int
5087symtable_exit_scope(struct symtable *st)
5088{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005089 int end;
5090
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005091 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005092 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005093 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005094 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005095 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5096 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005097 if (PySequence_DelItem(st->st_stack, end) < 0)
5098 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005099 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005100}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005101
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005102static void
5103symtable_enter_scope(struct symtable *st, char *name, int type,
5104 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005105{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005106 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005107
5108 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005109 prev = st->st_cur;
5110 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005111 st->st_errors++;
5112 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005113 }
5114 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005115 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005116 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005117 if (st->st_cur == NULL) {
5118 st->st_errors++;
5119 return;
5120 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005121 if (strcmp(name, TOP) == 0)
5122 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005123 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005124 if (PyList_Append(prev->ste_children,
5125 (PyObject *)st->st_cur) < 0)
5126 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005127 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005128}
5129
5130static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005131symtable_lookup(struct symtable *st, char *name)
5132{
5133 char buffer[MANGLE_LEN];
5134 PyObject *v;
5135 int flags;
5136
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005137 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005138 name = buffer;
5139 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5140 if (v == NULL) {
5141 if (PyErr_Occurred())
5142 return -1;
5143 else
5144 return 0;
5145 }
5146
5147 flags = PyInt_AS_LONG(v);
5148 return flags;
5149}
5150
5151static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005152symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005153{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005154 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005155 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005156 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005157
Guido van Rossumb7164622002-08-16 02:48:11 +00005158 /* Warn about None, except inside a tuple (where the assignment
5159 code already issues a warning). */
5160 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5161 *name == 'N' && strcmp(name, "None") == 0)
5162 {
5163 if (symtable_warn(st, "argument named None"))
5164 return -1;
5165 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005166 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005167 name = buffer;
5168 if ((s = PyString_InternFromString(name)) == NULL)
5169 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005170 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5171 Py_DECREF(s);
5172 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005173}
5174
5175/* Must only be called with mangled names */
5176
5177static int
5178symtable_add_def_o(struct symtable *st, PyObject *dict,
5179 PyObject *name, int flag)
5180{
5181 PyObject *o;
5182 int val;
5183
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005184 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005185 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005186 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005187 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005188 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005189 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005190 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005191 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005192 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005193 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005194 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005195 if (o == NULL)
5196 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005197 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005198 Py_DECREF(o);
5199 return -1;
5200 }
5201 Py_DECREF(o);
5202
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005203 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005204 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005205 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005206 } else if (flag & DEF_GLOBAL) {
5207 /* XXX need to update DEF_GLOBAL for other flags too;
5208 perhaps only DEF_FREE_GLOBAL */
5209 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005210 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005211 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005212 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005213 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005214 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005215 if (o == NULL)
5216 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005217 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005218 Py_DECREF(o);
5219 return -1;
5220 }
5221 Py_DECREF(o);
5222 }
5223 return 0;
5224}
5225
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005226#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005227
Tim Peters08a898f2001-06-28 01:52:22 +00005228/* Look for a yield stmt under n. Return 1 if found, else 0.
5229 This hack is used to look inside "if 0:" blocks (which are normally
5230 ignored) in case those are the only places a yield occurs (so that this
5231 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005232static int
5233look_for_yield(node *n)
5234{
5235 int i;
5236
5237 for (i = 0; i < NCH(n); ++i) {
5238 node *kid = CHILD(n, i);
5239
5240 switch (TYPE(kid)) {
5241
5242 case classdef:
5243 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005244 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005245 /* Stuff in nested functions and classes can't make
5246 the parent a generator. */
5247 return 0;
5248
5249 case yield_stmt:
5250 return 1;
5251
5252 default:
5253 if (look_for_yield(kid))
5254 return 1;
5255 }
5256 }
5257 return 0;
5258}
5259
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005260static void
5261symtable_node(struct symtable *st, node *n)
5262{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005263 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005264
5265 loop:
5266 switch (TYPE(n)) {
5267 case funcdef: {
5268 char *func_name = STR(CHILD(n, 1));
5269 symtable_add_def(st, func_name, DEF_LOCAL);
5270 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005271 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005272 symtable_funcdef(st, n);
5273 symtable_exit_scope(st);
5274 break;
5275 }
5276 case lambdef:
5277 if (NCH(n) == 4)
5278 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005279 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005280 symtable_funcdef(st, n);
5281 symtable_exit_scope(st);
5282 break;
5283 case classdef: {
5284 char *tmp, *class_name = STR(CHILD(n, 1));
5285 symtable_add_def(st, class_name, DEF_LOCAL);
5286 if (TYPE(CHILD(n, 2)) == LPAR) {
5287 node *bases = CHILD(n, 3);
5288 int i;
5289 for (i = 0; i < NCH(bases); i += 2) {
5290 symtable_node(st, CHILD(bases, i));
5291 }
5292 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005293 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005294 tmp = st->st_private;
5295 st->st_private = class_name;
5296 symtable_node(st, CHILD(n, NCH(n) - 1));
5297 st->st_private = tmp;
5298 symtable_exit_scope(st);
5299 break;
5300 }
5301 case if_stmt:
5302 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005303 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5304 if (st->st_cur->ste_generator == 0)
5305 st->st_cur->ste_generator =
5306 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005307 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005308 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005309 symtable_node(st, CHILD(n, i + 1));
5310 symtable_node(st, CHILD(n, i + 3));
5311 }
5312 if (i + 2 < NCH(n))
5313 symtable_node(st, CHILD(n, i + 2));
5314 break;
5315 case global_stmt:
5316 symtable_global(st, n);
5317 break;
5318 case import_stmt:
5319 symtable_import(st, n);
5320 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005321 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005322 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005323 symtable_node(st, CHILD(n, 1));
5324 if (NCH(n) > 2)
5325 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005326 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005327 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005328 st->st_cur->ste_opt_lineno = n->n_lineno;
5329 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005330 if (NCH(n) > 4)
5331 symtable_node(st, CHILD(n, 5));
5332 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005333
5334 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005335 case assert_stmt:
5336 if (Py_OptimizeFlag)
5337 return;
5338 if (NCH(n) == 2) {
5339 n = CHILD(n, 1);
5340 goto loop;
5341 } else {
5342 symtable_node(st, CHILD(n, 1));
5343 n = CHILD(n, 3);
5344 goto loop;
5345 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005346 case except_clause:
5347 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005348 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005349 if (NCH(n) > 1) {
5350 n = CHILD(n, 1);
5351 goto loop;
5352 }
5353 break;
5354 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005355 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005356 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005357 case yield_stmt:
5358 st->st_cur->ste_generator = 1;
5359 n = CHILD(n, 1);
5360 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005361 case expr_stmt:
5362 if (NCH(n) == 1)
5363 n = CHILD(n, 0);
5364 else {
5365 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005366 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005367 symtable_node(st, CHILD(n, 2));
5368 break;
5369 } else {
5370 int i;
5371 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005372 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005373 n = CHILD(n, NCH(n) - 1);
5374 }
5375 }
5376 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005377 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005378 /* only occurs when there are multiple for loops
5379 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005380 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005381 if (TYPE(n) == list_for)
5382 symtable_list_for(st, n);
5383 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005384 REQ(n, list_if);
5385 symtable_node(st, CHILD(n, 1));
5386 if (NCH(n) == 3) {
5387 n = CHILD(n, 2);
5388 goto loop;
5389 }
5390 }
5391 break;
5392 case for_stmt:
5393 symtable_assign(st, CHILD(n, 1), 0);
5394 for (i = 3; i < NCH(n); ++i)
5395 if (TYPE(CHILD(n, i)) >= single_input)
5396 symtable_node(st, CHILD(n, i));
5397 break;
5398 /* The remaining cases fall through to default except in
5399 special circumstances. This requires the individual cases
5400 to be coded with great care, even though they look like
5401 rather innocuous. Each case must double-check TYPE(n).
5402 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005403 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005404 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005405 n = CHILD(n, 2);
5406 goto loop;
5407 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005408 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005409 case listmaker:
5410 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005411 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005412 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005413 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005414 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005415 case atom:
5416 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5417 symtable_add_use(st, STR(CHILD(n, 0)));
5418 break;
5419 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005420 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005421 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005422 /* Walk over every non-token child with a special case
5423 for one child.
5424 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005425 if (NCH(n) == 1) {
5426 n = CHILD(n, 0);
5427 goto loop;
5428 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005429 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005430 if (TYPE(CHILD(n, i)) >= single_input)
5431 symtable_node(st, CHILD(n, i));
5432 }
5433}
5434
5435static void
5436symtable_funcdef(struct symtable *st, node *n)
5437{
5438 node *body;
5439
5440 if (TYPE(n) == lambdef) {
5441 if (NCH(n) == 4)
5442 symtable_params(st, CHILD(n, 1));
5443 } else
5444 symtable_params(st, CHILD(n, 2));
5445 body = CHILD(n, NCH(n) - 1);
5446 symtable_node(st, body);
5447}
5448
5449/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00005450 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005451 which are references in the defining scope. symtable_params()
5452 parses the parameter names, which are defined in the function's
5453 body.
5454
5455 varargslist:
5456 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5457 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5458*/
5459
5460static void
5461symtable_default_args(struct symtable *st, node *n)
5462{
5463 node *c;
5464 int i;
5465
5466 if (TYPE(n) == parameters) {
5467 n = CHILD(n, 1);
5468 if (TYPE(n) == RPAR)
5469 return;
5470 }
5471 REQ(n, varargslist);
5472 for (i = 0; i < NCH(n); i += 2) {
5473 c = CHILD(n, i);
5474 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5475 break;
5476 }
5477 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5478 symtable_node(st, CHILD(n, i));
5479 }
5480}
5481
5482static void
5483symtable_params(struct symtable *st, node *n)
5484{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005485 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00005486 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005487
5488 if (TYPE(n) == parameters) {
5489 n = CHILD(n, 1);
5490 if (TYPE(n) == RPAR)
5491 return;
5492 }
5493 REQ(n, varargslist);
5494 for (i = 0; i < NCH(n); i += 2) {
5495 c = CHILD(n, i);
5496 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5497 ext = 1;
5498 break;
5499 }
5500 if (TYPE(c) == test) {
5501 continue;
5502 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00005503 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005504 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00005505 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005506 char nbuf[30];
5507 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005508 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005509 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005510 }
5511 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005512 if (ext) {
5513 c = CHILD(n, i);
5514 if (TYPE(c) == STAR) {
5515 i++;
5516 symtable_add_def(st, STR(CHILD(n, i)),
5517 DEF_PARAM | DEF_STAR);
5518 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005519 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005520 c = NULL;
5521 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005522 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005523 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005524 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005525 i++;
5526 symtable_add_def(st, STR(CHILD(n, i)),
5527 DEF_PARAM | DEF_DOUBLESTAR);
5528 }
5529 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005530 if (complex >= 0) {
5531 int j;
5532 for (j = 0; j <= complex; j++) {
5533 c = CHILD(n, j);
5534 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005535 c = CHILD(n, ++j);
5536 else if (TYPE(c) == EQUAL)
5537 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005538 if (TYPE(CHILD(c, 0)) == LPAR)
5539 symtable_params_fplist(st, CHILD(c, 1));
5540 }
5541 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005542}
5543
5544static void
5545symtable_params_fplist(struct symtable *st, node *n)
5546{
5547 int i;
5548 node *c;
5549
5550 REQ(n, fplist);
5551 for (i = 0; i < NCH(n); i += 2) {
5552 c = CHILD(n, i);
5553 REQ(c, fpdef);
5554 if (NCH(c) == 1)
5555 symtable_add_def(st, STR(CHILD(c, 0)),
5556 DEF_PARAM | DEF_INTUPLE);
5557 else
5558 symtable_params_fplist(st, CHILD(c, 1));
5559 }
5560
5561}
5562
5563static void
5564symtable_global(struct symtable *st, node *n)
5565{
5566 int i;
5567
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005568 /* XXX It might be helpful to warn about module-level global
5569 statements, but it's hard to tell the difference between
5570 module-level and a string passed to exec.
5571 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005572
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005573 for (i = 1; i < NCH(n); i += 2) {
5574 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005575 int flags;
5576
5577 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005578 if (flags < 0)
5579 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005580 if (flags && flags != DEF_GLOBAL) {
5581 char buf[500];
5582 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005583 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005584 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00005585 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005586 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005587 }
5588 else {
5589 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005590 PyOS_snprintf(buf, sizeof(buf),
5591 GLOBAL_AFTER_ASSIGN,
5592 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005593 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005594 PyOS_snprintf(buf, sizeof(buf),
5595 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005596 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005597 }
5598 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005599 symtable_add_def(st, name, DEF_GLOBAL);
5600 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005601}
5602
5603static void
5604symtable_list_comprehension(struct symtable *st, node *n)
5605{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005606 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005607 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005608
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005609 REQ(n, listmaker);
5610 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
5611 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005612 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005613 symtable_list_for(st, CHILD(n, 1));
5614 symtable_node(st, CHILD(n, 0));
5615 --st->st_cur->ste_tmpname;
5616}
5617
5618static void
5619symtable_list_for(struct symtable *st, node *n)
5620{
5621 REQ(n, list_for);
5622 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005623 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005624 symtable_node(st, CHILD(n, 3));
5625 if (NCH(n) == 5)
5626 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005627}
5628
5629static void
5630symtable_import(struct symtable *st, node *n)
5631{
5632 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005633 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005634 | 'from' dotted_name 'import'
5635 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005636 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005637 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005638 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005639 node *dotname = CHILD(n, 1);
5640 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5641 /* check for bogus imports */
5642 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5643 PyErr_SetString(PyExc_SyntaxError,
5644 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00005645 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005646 return;
5647 }
5648 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005649 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005650 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005651 if (symtable_warn(st,
5652 "import * only allowed at module level") < 0)
5653 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005654 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005655 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005656 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005657 } else {
5658 for (i = 3; i < NCH(n); i += 2) {
5659 node *c = CHILD(n, i);
5660 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005661 symtable_assign(st, CHILD(c, 2),
5662 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005663 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005664 symtable_assign(st, CHILD(c, 0),
5665 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005666 }
5667 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005668 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005669 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005670 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005671 }
5672 }
5673}
5674
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005675/* The third argument to symatble_assign() is a flag to be passed to
5676 symtable_add_def() if it is eventually called. The flag is useful
5677 to specify the particular type of assignment that should be
5678 recorded, e.g. an assignment caused by import.
5679 */
5680
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005681static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005682symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005683{
5684 node *tmp;
5685 int i;
5686
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005687 loop:
5688 switch (TYPE(n)) {
5689 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005690 /* invalid assignment, e.g. lambda x:x=2. The next
5691 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005692 return;
5693 case power:
5694 if (NCH(n) > 2) {
5695 for (i = 2; i < NCH(n); ++i)
5696 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5697 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005698 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005699 if (NCH(n) > 1) {
5700 symtable_node(st, CHILD(n, 0));
5701 symtable_node(st, CHILD(n, 1));
5702 } else {
5703 n = CHILD(n, 0);
5704 goto loop;
5705 }
5706 return;
5707 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005708 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5709 /* XXX This is an error, but the next pass
5710 will catch it. */
5711 return;
5712 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005713 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005714 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005715 }
5716 return;
5717 case exprlist:
5718 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00005719 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005720 if (NCH(n) == 1) {
5721 n = CHILD(n, 0);
5722 goto loop;
5723 }
5724 else {
5725 int i;
5726 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005727 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005728 return;
5729 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005730 case atom:
5731 tmp = CHILD(n, 0);
5732 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5733 n = CHILD(n, 1);
5734 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005735 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00005736 if (strcmp(STR(tmp), "__debug__") == 0) {
5737 PyErr_SetString(PyExc_SyntaxError,
5738 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00005739 symtable_error(st, n->n_lineno);
5740 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00005741 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005742 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005743 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005744 return;
5745 case dotted_as_name:
5746 if (NCH(n) == 3)
5747 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005748 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005749 else
5750 symtable_add_def(st,
5751 STR(CHILD(CHILD(n,
5752 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005753 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005754 return;
5755 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005756 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005757 return;
5758 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005759 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005760 return;
5761 default:
5762 if (NCH(n) == 0)
5763 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005764 if (NCH(n) == 1) {
5765 n = CHILD(n, 0);
5766 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005767 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005768 /* Should only occur for errors like x + 1 = 1,
5769 which will be caught in the next pass. */
5770 for (i = 0; i < NCH(n); ++i)
5771 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005772 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005773 }
5774}