blob: 4fb47ae84acbabda918859d264b7c282d9cb294d [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 Rossum715eca92002-08-12 21:54:46 +00001261 if (PyErr_WarnExplicit(
Barry Warsaw9f007392002-08-14 15:51:29 +00001262 PyExc_FutureWarning,
Guido van Rossum715eca92002-08-12 21:54:46 +00001263 "hex/oct constants > sys.maxint "
1264 "will return positive values "
1265 "in Python 2.4 and up",
Martin v. Löwis95292d62002-12-11 14:04:59 +00001266 /* XXX: Give WarnExplicit
1267 a const char* argument. */
1268 (char*)c->c_filename,
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001269 c->c_lineno,
Guido van Rossum715eca92002-08-12 21:54:46 +00001270 NULL,
1271 NULL) < 0)
Guido van Rossum078151d2002-08-11 04:24:12 +00001272 return NULL;
Guido van Rossum3cb8e542002-08-11 14:06:15 +00001273 errno = 0; /* Might be changed by PyErr_Warn() */
Guido van Rossum078151d2002-08-11 04:24:12 +00001274 }
1275 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001276 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001277 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001278 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001279 if (errno != 0)
1280 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001281 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001282 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001283 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001284#ifndef WITHOUT_COMPLEX
1285 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001286 Py_complex z;
1287 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001288 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001289 z.imag = atof(s);
1290 PyFPE_END_PROTECT(z)
1291 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001292 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001293 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001294#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001295 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001296 PyFPE_START_PROTECT("atof", return 0)
1297 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001298 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001299 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001300 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001301}
1302
Guido van Rossum79f25d91997-04-29 20:08:16 +00001303static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001304decode_utf8(char **sPtr, char *end, char* encoding)
1305{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001306#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001307 Py_FatalError("decode_utf8 should not be called in this build.");
1308 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001309#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001310 PyObject *u, *v;
1311 char *s, *t;
1312 t = s = *sPtr;
1313 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1314 while (s < end && (*s & 0x80)) s++;
1315 *sPtr = s;
1316 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1317 if (u == NULL)
1318 return NULL;
1319 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1320 Py_DECREF(u);
1321 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001322#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001323}
1324
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001325/* compiler.transformer.Transformer.decode_literal depends on what
1326 might seem like minor details of this function -- changes here
1327 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001328static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001329parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001330{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001331 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001332 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001333 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001334 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001335 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001336 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001337 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001338
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001339 if (isalpha(quote) || quote == '_') {
1340 if (quote == 'u' || quote == 'U') {
1341 quote = *++s;
1342 unicode = 1;
1343 }
1344 if (quote == 'r' || quote == 'R') {
1345 quote = *++s;
1346 rawmode = 1;
1347 }
1348 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001349 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001350 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001351 return NULL;
1352 }
1353 s++;
1354 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001355 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001356 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001357 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001358 return NULL;
1359 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001360 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001361 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001362 return NULL;
1363 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001364 if (len >= 4 && s[0] == quote && s[1] == quote) {
1365 s += 2;
1366 len -= 2;
1367 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001368 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001369 return NULL;
1370 }
1371 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001372#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001373 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001374 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001375 char *buf;
1376 char *p;
1377 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001378 if (encoding == NULL) {
1379 buf = s;
1380 u = NULL;
1381 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1382 buf = s;
1383 u = NULL;
1384 } else {
1385 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1386 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1387 if (u == NULL)
1388 return NULL;
1389 p = buf = PyString_AsString(u);
1390 end = s + len;
1391 while (s < end) {
1392 if (*s == '\\') {
1393 *p++ = *s++;
1394 if (*s & 0x80) {
1395 strcpy(p, "u005c");
1396 p += 5;
1397 }
1398 }
1399 if (*s & 0x80) { /* XXX inefficient */
1400 char *r;
1401 int rn, i;
1402 w = decode_utf8(&s, end, "utf-16-be");
1403 if (w == NULL) {
1404 Py_DECREF(u);
1405 return NULL;
1406 }
1407 r = PyString_AsString(w);
1408 rn = PyString_Size(w);
1409 assert(rn % 2 == 0);
1410 for (i = 0; i < rn; i += 2) {
1411 sprintf(p, "\\u%02x%02x",
1412 r[i + 0] & 0xFF,
1413 r[i + 1] & 0xFF);
1414 p += 6;
1415 }
1416 Py_DECREF(w);
1417 } else {
1418 *p++ = *s++;
1419 }
1420 }
1421 len = p - buf;
1422 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001423 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001424 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001425 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001426 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1427 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001428 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001429 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001430 return v;
1431
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001432 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001433#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001434 need_encoding = (encoding != NULL &&
1435 strcmp(encoding, "utf-8") != 0 &&
1436 strcmp(encoding, "iso-8859-1") != 0);
1437 if (rawmode || strchr(s, '\\') == NULL) {
1438 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001439#ifndef Py_USING_UNICODE
1440 /* This should not happen - we never see any other
1441 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001442 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001443#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001444 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1445 if (u == NULL)
1446 return NULL;
1447 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1448 Py_DECREF(u);
1449 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001450#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001451 } else {
1452 return PyString_FromStringAndSize(s, len);
1453 }
1454 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001455
1456 v = PyString_DecodeEscape(s, len, NULL, unicode,
1457 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001458 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001459 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001460 return v;
1461}
1462
Guido van Rossum79f25d91997-04-29 20:08:16 +00001463static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001464parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001465{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001466 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001467 int i;
1468 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001469 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001470 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001471 for (i = 1; i < NCH(n); i++) {
1472 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001473 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001474 if (s == NULL)
1475 goto onError;
1476 if (PyString_Check(v) && PyString_Check(s)) {
1477 PyString_ConcatAndDel(&v, s);
1478 if (v == NULL)
1479 goto onError;
1480 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001481#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001482 else {
1483 PyObject *temp;
1484 temp = PyUnicode_Concat(v, s);
1485 Py_DECREF(s);
1486 if (temp == NULL)
1487 goto onError;
1488 Py_DECREF(v);
1489 v = temp;
1490 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001491#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001492 }
1493 }
1494 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001495
1496 onError:
1497 Py_XDECREF(v);
1498 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001499}
1500
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001501static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001502com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001503{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001504 int anchor = 0;
1505 int save_begin = c->c_begin;
1506
1507 /* list_iter: for v in expr [list_iter] */
1508 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001509 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001510 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001511 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001512 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001513 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001514 c->c_loops++;
1515 com_list_iter(c, n, e, t);
1516 c->c_loops--;
1517 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1518 c->c_begin = save_begin;
1519 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001520 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001521}
1522
1523static void
1524com_list_if(struct compiling *c, node *n, node *e, char *t)
1525{
1526 int anchor = 0;
1527 int a = 0;
1528 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001529 com_node(c, CHILD(n, 1));
1530 com_addfwref(c, JUMP_IF_FALSE, &a);
1531 com_addbyte(c, POP_TOP);
1532 com_pop(c, 1);
1533 com_list_iter(c, n, e, t);
1534 com_addfwref(c, JUMP_FORWARD, &anchor);
1535 com_backpatch(c, a);
1536 /* We jump here with an extra entry which we now pop */
1537 com_addbyte(c, POP_TOP);
1538 com_backpatch(c, anchor);
1539}
1540
1541static void
1542com_list_iter(struct compiling *c,
1543 node *p, /* parent of list_iter node */
1544 node *e, /* element expression node */
1545 char *t /* name of result list temp local */)
1546{
1547 /* list_iter is the last child in a listmaker, list_for, or list_if */
1548 node *n = CHILD(p, NCH(p)-1);
1549 if (TYPE(n) == list_iter) {
1550 n = CHILD(n, 0);
1551 switch (TYPE(n)) {
1552 case list_for:
1553 com_list_for(c, n, e, t);
1554 break;
1555 case list_if:
1556 com_list_if(c, n, e, t);
1557 break;
1558 default:
1559 com_error(c, PyExc_SystemError,
1560 "invalid list_iter node type");
1561 }
1562 }
1563 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001564 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001565 com_push(c, 1);
1566 com_node(c, e);
1567 com_addoparg(c, CALL_FUNCTION, 1);
1568 com_addbyte(c, POP_TOP);
1569 com_pop(c, 2);
1570 }
1571}
1572
1573static void
1574com_list_comprehension(struct compiling *c, node *n)
1575{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001576 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001577 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001578
1579 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001580 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001581 com_addoparg(c, BUILD_LIST, 0);
1582 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1583 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001584 com_addop_name(c, LOAD_ATTR, "append");
1585 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001586 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001587 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001588 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001589 --c->c_tmpname;
1590}
1591
1592static void
1593com_listmaker(struct compiling *c, node *n)
1594{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001595 /* listmaker: test ( list_for | (',' test)* [','] ) */
1596 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001597 com_list_comprehension(c, n);
1598 else {
1599 int len = 0;
1600 int i;
1601 for (i = 0; i < NCH(n); i += 2, len++)
1602 com_node(c, CHILD(n, i));
1603 com_addoparg(c, BUILD_LIST, len);
1604 com_pop(c, len-1);
1605 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001606}
1607
1608static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001609com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001610{
1611 int i;
1612 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1613 for (i = 0; i+2 < NCH(n); i += 4) {
1614 /* We must arrange things just right for STORE_SUBSCR.
1615 It wants the stack to look like (value) (dict) (key) */
1616 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001617 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001618 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00001619 com_node(c, CHILD(n, i+2)); /* value */
1620 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001621 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001622 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001623 }
1624}
1625
1626static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001627com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001628{
1629 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001630 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001631 int i;
1632 REQ(n, atom);
1633 ch = CHILD(n, 0);
1634 switch (TYPE(ch)) {
1635 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001636 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001637 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001638 com_push(c, 1);
1639 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001640 else
1641 com_node(c, CHILD(n, 1));
1642 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001643 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001644 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001645 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001646 com_push(c, 1);
1647 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001648 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001649 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001650 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001651 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001652 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001653 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001654 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001655 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001656 break;
1657 case BACKQUOTE:
1658 com_node(c, CHILD(n, 1));
1659 com_addbyte(c, UNARY_CONVERT);
1660 break;
1661 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001662 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001663 i = 255;
1664 }
1665 else {
1666 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001667 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001668 }
1669 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001670 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001671 break;
1672 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001673 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001674 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001675 c->c_errors++;
1676 i = 255;
1677 }
1678 else {
1679 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001680 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001681 }
1682 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001683 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001684 break;
1685 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001686 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001687 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001688 break;
1689 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001690 com_error(c, PyExc_SystemError,
1691 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001692 }
1693}
1694
1695static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001696com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001697{
1698 if (NCH(n) == 1) {
1699 com_addbyte(c, op);
1700 }
1701 else if (NCH(n) == 2) {
1702 if (TYPE(CHILD(n, 0)) != COLON) {
1703 com_node(c, CHILD(n, 0));
1704 com_addbyte(c, op+1);
1705 }
1706 else {
1707 com_node(c, CHILD(n, 1));
1708 com_addbyte(c, op+2);
1709 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001710 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001711 }
1712 else {
1713 com_node(c, CHILD(n, 0));
1714 com_node(c, CHILD(n, 2));
1715 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001716 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001717 }
1718}
1719
Guido van Rossum635abd21997-01-06 22:56:52 +00001720static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001721com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1722{
1723 if (NCH(n) == 1) {
1724 com_addbyte(c, DUP_TOP);
1725 com_push(c, 1);
1726 com_addbyte(c, SLICE);
1727 com_node(c, augn);
1728 com_addbyte(c, opcode);
1729 com_pop(c, 1);
1730 com_addbyte(c, ROT_TWO);
1731 com_addbyte(c, STORE_SLICE);
1732 com_pop(c, 2);
1733 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1734 com_node(c, CHILD(n, 0));
1735 com_addoparg(c, DUP_TOPX, 2);
1736 com_push(c, 2);
1737 com_addbyte(c, SLICE+1);
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+1);
1744 com_pop(c, 3);
1745 } else if (NCH(n) == 2) {
1746 com_node(c, CHILD(n, 1));
1747 com_addoparg(c, DUP_TOPX, 2);
1748 com_push(c, 2);
1749 com_addbyte(c, SLICE+2);
1750 com_pop(c, 1);
1751 com_node(c, augn);
1752 com_addbyte(c, opcode);
1753 com_pop(c, 1);
1754 com_addbyte(c, ROT_THREE);
1755 com_addbyte(c, STORE_SLICE+2);
1756 com_pop(c, 3);
1757 } else {
1758 com_node(c, CHILD(n, 0));
1759 com_node(c, CHILD(n, 2));
1760 com_addoparg(c, DUP_TOPX, 3);
1761 com_push(c, 3);
1762 com_addbyte(c, SLICE+3);
1763 com_pop(c, 2);
1764 com_node(c, augn);
1765 com_addbyte(c, opcode);
1766 com_pop(c, 1);
1767 com_addbyte(c, ROT_FOUR);
1768 com_addbyte(c, STORE_SLICE+3);
1769 com_pop(c, 4);
1770 }
1771}
1772
1773static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001774com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001775{
1776 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001777 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001778 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001779 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001780 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001781 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001782 }
1783 else {
1784 com_node(c, CHILD(n, 0));
1785 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001786 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001787 }
1788 m = n;
1789 do {
1790 m = CHILD(m, 0);
1791 } while (NCH(m) == 1);
1792 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001793 /* f(lambda x: x[0] = 3) ends up getting parsed with
1794 * LHS test = lambda x: x[0], and RHS test = 3.
1795 * SF bug 132313 points out that complaining about a keyword
1796 * then is very confusing.
1797 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001798 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001799 TYPE(m) == lambdef ?
1800 "lambda cannot contain assignment" :
1801 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001802 }
1803 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001804 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00001805 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00001806 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001807 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001808 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001809 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001810 else if (*pkeywords == NULL) {
1811 c->c_errors++;
1812 Py_DECREF(v);
1813 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001814 if (PyDict_GetItem(*pkeywords, v) != NULL)
1815 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001816 "duplicate keyword argument");
1817 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001818 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001819 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001820 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001821 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001822 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001823 }
1824 }
1825 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001826}
1827
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001828static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001829com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001830{
1831 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001832 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001833 }
1834 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001835 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001836 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001837 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001838 int star_flag = 0;
1839 int starstar_flag = 0;
1840 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001841 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001842 na = 0;
1843 nk = 0;
1844 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001845 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001846 if (TYPE(ch) == STAR ||
1847 TYPE(ch) == DOUBLESTAR)
1848 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001849 if (ch->n_lineno != lineno) {
1850 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001851 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00001852 }
1853 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001854 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001855 na++;
1856 else
1857 nk++;
1858 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001859 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001860 while (i < NCH(n)) {
1861 node *tok = CHILD(n, i);
1862 node *ch = CHILD(n, i+1);
1863 i += 3;
1864 switch (TYPE(tok)) {
1865 case STAR: star_flag = 1; break;
1866 case DOUBLESTAR: starstar_flag = 1; break;
1867 }
1868 com_node(c, ch);
1869 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001870 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001871 com_error(c, PyExc_SyntaxError,
1872 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001873 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001874 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001875 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001876 star_flag + (starstar_flag << 1);
1877 else
1878 opcode = CALL_FUNCTION;
1879 com_addoparg(c, opcode, na | (nk << 8));
1880 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001881 }
1882}
1883
1884static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001885com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001886{
1887 com_addopname(c, LOAD_ATTR, n);
1888}
1889
1890static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001891com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001892{
1893 int i=0;
1894 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001895 node *ch;
1896
1897 /* first argument */
1898 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001899 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001900 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001901 i++;
1902 }
1903 else {
1904 com_node(c, CHILD(n,i));
1905 i++;
1906 REQ(CHILD(n,i),COLON);
1907 i++;
1908 }
1909 /* second argument */
1910 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1911 com_node(c, CHILD(n,i));
1912 i++;
1913 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001914 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001915 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001916 com_push(c, 1);
1917 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001918 /* remaining arguments */
1919 for (; i < NCH(n); i++) {
1920 ns++;
1921 ch=CHILD(n,i);
1922 REQ(ch, sliceop);
1923 if (NCH(ch) == 1) {
1924 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001925 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001926 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001927 }
1928 else
1929 com_node(c, CHILD(ch,1));
1930 }
1931 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001932 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001933}
1934
1935static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001936com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001937{
1938 node *ch;
1939 REQ(n, subscript);
1940 ch = CHILD(n,0);
1941 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001942 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001943 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001944 com_push(c, 1);
1945 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001946 else {
1947 /* check for slice */
1948 if ((TYPE(ch) == COLON || NCH(n) > 1))
1949 com_sliceobj(c, n);
1950 else {
1951 REQ(ch, test);
1952 com_node(c, ch);
1953 }
1954 }
1955}
1956
1957static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001958com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001959{
1960 int i, op;
1961 REQ(n, subscriptlist);
1962 /* Check to make backward compatible slice behavior for '[i:j]' */
1963 if (NCH(n) == 1) {
1964 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001965 /* 'Basic' slice, should have exactly one colon. */
1966 if ((TYPE(CHILD(sub, 0)) == COLON
1967 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1968 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1969 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001970 switch (assigning) {
1971 case OP_DELETE:
1972 op = DELETE_SLICE;
1973 break;
1974 case OP_ASSIGN:
1975 op = STORE_SLICE;
1976 break;
1977 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001978 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001979 break;
1980 default:
1981 com_augassign_slice(c, sub, assigning, augn);
1982 return;
1983 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001984 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001985 if (op == STORE_SLICE)
1986 com_pop(c, 2);
1987 else if (op == DELETE_SLICE)
1988 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001989 return;
1990 }
1991 }
1992 /* Else normal subscriptlist. Compile each subscript. */
1993 for (i = 0; i < NCH(n); i += 2)
1994 com_subscript(c, CHILD(n, i));
1995 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001996 if (NCH(n) > 1) {
1997 i = (NCH(n)+1) / 2;
1998 com_addoparg(c, BUILD_TUPLE, i);
1999 com_pop(c, i-1);
2000 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002001 switch (assigning) {
2002 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002003 op = DELETE_SUBSCR;
2004 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002005 break;
2006 default:
2007 case OP_ASSIGN:
2008 op = STORE_SUBSCR;
2009 i = 3;
2010 break;
2011 case OP_APPLY:
2012 op = BINARY_SUBSCR;
2013 i = 1;
2014 break;
2015 }
2016 if (assigning > OP_APPLY) {
2017 com_addoparg(c, DUP_TOPX, 2);
2018 com_push(c, 2);
2019 com_addbyte(c, BINARY_SUBSCR);
2020 com_pop(c, 1);
2021 com_node(c, augn);
2022 com_addbyte(c, assigning);
2023 com_pop(c, 1);
2024 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002025 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002026 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002027 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002028}
2029
2030static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002031com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002032{
2033 REQ(n, trailer);
2034 switch (TYPE(CHILD(n, 0))) {
2035 case LPAR:
2036 com_call_function(c, CHILD(n, 1));
2037 break;
2038 case DOT:
2039 com_select_member(c, CHILD(n, 1));
2040 break;
2041 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002042 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002043 break;
2044 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002045 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002046 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002047 }
2048}
2049
2050static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002051com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002052{
2053 int i;
2054 REQ(n, power);
2055 com_atom(c, CHILD(n, 0));
2056 for (i = 1; i < NCH(n); i++) {
2057 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2058 com_factor(c, CHILD(n, i+1));
2059 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002060 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002061 break;
2062 }
2063 else
2064 com_apply_trailer(c, CHILD(n, i));
2065 }
2066}
2067
2068static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002069com_invert_constant(struct compiling *c, node *n)
2070{
2071 /* Compute the inverse of int and longs and use them directly,
2072 but be prepared to generate code for all other
2073 possibilities (invalid numbers, floats, complex).
2074 */
2075 PyObject *num, *inv = NULL;
2076 int i;
2077
2078 REQ(n, NUMBER);
2079 num = parsenumber(c, STR(n));
2080 if (num == NULL)
2081 i = 255;
2082 else {
2083 inv = PyNumber_Invert(num);
2084 if (inv == NULL) {
2085 PyErr_Clear();
2086 i = com_addconst(c, num);
2087 } else {
2088 i = com_addconst(c, inv);
2089 Py_DECREF(inv);
2090 }
2091 Py_DECREF(num);
2092 }
2093 com_addoparg(c, LOAD_CONST, i);
2094 com_push(c, 1);
2095 if (num != NULL && inv == NULL)
2096 com_addbyte(c, UNARY_INVERT);
2097}
2098
Tim Peters51e26512001-09-07 08:45:55 +00002099static int
2100is_float_zero(const char *p)
2101{
2102 int found_radix_point = 0;
2103 int ch;
2104 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2105 switch (ch) {
2106 case '0':
2107 /* no reason to believe it's not 0 -- continue */
2108 break;
2109
2110 case 'e': case 'E': case 'j': case 'J':
2111 /* If this was a hex constant, we already would have
2112 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2113 must be an exponent marker, and we haven't yet
2114 seen a non-zero digit, and it doesn't matter what
2115 the exponent is then. For 'j' or 'J' similarly,
2116 except that this is an imaginary 0 then. */
2117 return 1;
2118
2119 case '.':
2120 found_radix_point = 1;
2121 break;
2122
2123 default:
2124 return 0;
2125 }
2126 }
2127 return found_radix_point;
2128}
2129
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002130static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002131com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002132{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002133 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002134 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002135 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002136 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002137 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002138 approriate value as a constant. If the value is negative,
2139 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002140 negative in the 0th position -- unless we're doing unary minus
2141 of a floating zero! In that case the sign is significant, but
2142 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002143 */
2144 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002145 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002146 && TYPE((pfactor = CHILD(n, 1))) == factor
2147 && NCH(pfactor) == 1
2148 && TYPE((ppower = CHILD(pfactor, 0))) == power
2149 && NCH(ppower) == 1
2150 && TYPE((patom = CHILD(ppower, 0))) == atom
2151 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002152 && !(childtype == MINUS &&
2153 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002154 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002155 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002156 return;
2157 }
2158 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002159 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002160 if (s == NULL) {
2161 com_error(c, PyExc_MemoryError, "");
2162 com_addbyte(c, 255);
2163 return;
2164 }
2165 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002166 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002167 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002168 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002169 }
Tim Peters51e26512001-09-07 08:45:55 +00002170 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002171 }
2172 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002173 com_factor(c, CHILD(n, 1));
2174 com_addbyte(c, UNARY_POSITIVE);
2175 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002176 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002177 com_factor(c, CHILD(n, 1));
2178 com_addbyte(c, UNARY_NEGATIVE);
2179 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002180 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002181 com_factor(c, CHILD(n, 1));
2182 com_addbyte(c, UNARY_INVERT);
2183 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002184 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002185 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002186 }
2187}
2188
2189static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002190com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002191{
2192 int i;
2193 int op;
2194 REQ(n, term);
2195 com_factor(c, CHILD(n, 0));
2196 for (i = 2; i < NCH(n); i += 2) {
2197 com_factor(c, CHILD(n, i));
2198 switch (TYPE(CHILD(n, i-1))) {
2199 case STAR:
2200 op = BINARY_MULTIPLY;
2201 break;
2202 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002203 if (c->c_flags & CO_FUTURE_DIVISION)
2204 op = BINARY_TRUE_DIVIDE;
2205 else
2206 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002207 break;
2208 case PERCENT:
2209 op = BINARY_MODULO;
2210 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002211 case DOUBLESLASH:
2212 op = BINARY_FLOOR_DIVIDE;
2213 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002214 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002215 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002216 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002217 op = 255;
2218 }
2219 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002220 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002221 }
2222}
2223
2224static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002225com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002226{
2227 int i;
2228 int op;
2229 REQ(n, arith_expr);
2230 com_term(c, CHILD(n, 0));
2231 for (i = 2; i < NCH(n); i += 2) {
2232 com_term(c, CHILD(n, i));
2233 switch (TYPE(CHILD(n, i-1))) {
2234 case PLUS:
2235 op = BINARY_ADD;
2236 break;
2237 case MINUS:
2238 op = BINARY_SUBTRACT;
2239 break;
2240 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002241 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002242 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002243 op = 255;
2244 }
2245 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002246 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002247 }
2248}
2249
2250static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002251com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002252{
2253 int i;
2254 int op;
2255 REQ(n, shift_expr);
2256 com_arith_expr(c, CHILD(n, 0));
2257 for (i = 2; i < NCH(n); i += 2) {
2258 com_arith_expr(c, CHILD(n, i));
2259 switch (TYPE(CHILD(n, i-1))) {
2260 case LEFTSHIFT:
2261 op = BINARY_LSHIFT;
2262 break;
2263 case RIGHTSHIFT:
2264 op = BINARY_RSHIFT;
2265 break;
2266 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002267 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002268 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002269 op = 255;
2270 }
2271 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002272 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002273 }
2274}
2275
2276static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002277com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002278{
2279 int i;
2280 int op;
2281 REQ(n, and_expr);
2282 com_shift_expr(c, CHILD(n, 0));
2283 for (i = 2; i < NCH(n); i += 2) {
2284 com_shift_expr(c, CHILD(n, i));
2285 if (TYPE(CHILD(n, i-1)) == AMPER) {
2286 op = BINARY_AND;
2287 }
2288 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002289 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002290 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002291 op = 255;
2292 }
2293 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002294 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002295 }
2296}
2297
2298static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002299com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002300{
2301 int i;
2302 int op;
2303 REQ(n, xor_expr);
2304 com_and_expr(c, CHILD(n, 0));
2305 for (i = 2; i < NCH(n); i += 2) {
2306 com_and_expr(c, CHILD(n, i));
2307 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2308 op = BINARY_XOR;
2309 }
2310 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002311 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002312 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002313 op = 255;
2314 }
2315 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002316 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002317 }
2318}
2319
2320static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002321com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002322{
2323 int i;
2324 int op;
2325 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002326 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002327 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002328 com_xor_expr(c, CHILD(n, i));
2329 if (TYPE(CHILD(n, i-1)) == VBAR) {
2330 op = BINARY_OR;
2331 }
2332 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002333 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002334 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002335 op = 255;
2336 }
2337 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002338 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002339 }
2340}
2341
2342static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002343cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002344{
2345 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00002346 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002347 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2348 if (NCH(n) == 1) {
2349 n = CHILD(n, 0);
2350 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002351 case LESS: return PyCmp_LT;
2352 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00002353 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00002354 case LESSEQUAL: return PyCmp_LE;
2355 case GREATEREQUAL: return PyCmp_GE;
2356 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2357 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2358 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002359 }
2360 }
2361 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002362 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002363 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002364 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002365 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002366 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002367 }
2368 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002369 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002370}
2371
2372static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002373com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002374{
2375 int i;
2376 enum cmp_op op;
2377 int anchor;
2378 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2379 com_expr(c, CHILD(n, 0));
2380 if (NCH(n) == 1)
2381 return;
2382
2383 /****************************************************************
2384 The following code is generated for all but the last
2385 comparison in a chain:
2386
2387 label: on stack: opcode: jump to:
2388
2389 a <code to load b>
2390 a, b DUP_TOP
2391 a, b, b ROT_THREE
2392 b, a, b COMPARE_OP
2393 b, 0-or-1 JUMP_IF_FALSE L1
2394 b, 1 POP_TOP
2395 b
2396
2397 We are now ready to repeat this sequence for the next
2398 comparison in the chain.
2399
2400 For the last we generate:
2401
2402 b <code to load c>
2403 b, c COMPARE_OP
2404 0-or-1
2405
2406 If there were any jumps to L1 (i.e., there was more than one
2407 comparison), we generate:
2408
2409 0-or-1 JUMP_FORWARD L2
2410 L1: b, 0 ROT_TWO
2411 0, b POP_TOP
2412 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002413 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002414 ****************************************************************/
2415
2416 anchor = 0;
2417
2418 for (i = 2; i < NCH(n); i += 2) {
2419 com_expr(c, CHILD(n, i));
2420 if (i+2 < NCH(n)) {
2421 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002422 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002423 com_addbyte(c, ROT_THREE);
2424 }
2425 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002426 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002427 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002428 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002429 }
2430 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002431 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002432 if (i+2 < NCH(n)) {
2433 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2434 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002435 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002436 }
2437 }
2438
2439 if (anchor) {
2440 int anchor2 = 0;
2441 com_addfwref(c, JUMP_FORWARD, &anchor2);
2442 com_backpatch(c, anchor);
2443 com_addbyte(c, ROT_TWO);
2444 com_addbyte(c, POP_TOP);
2445 com_backpatch(c, anchor2);
2446 }
2447}
2448
2449static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002450com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002451{
2452 REQ(n, not_test); /* 'not' not_test | comparison */
2453 if (NCH(n) == 1) {
2454 com_comparison(c, CHILD(n, 0));
2455 }
2456 else {
2457 com_not_test(c, CHILD(n, 1));
2458 com_addbyte(c, UNARY_NOT);
2459 }
2460}
2461
2462static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002463com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002464{
2465 int i;
2466 int anchor;
2467 REQ(n, and_test); /* not_test ('and' not_test)* */
2468 anchor = 0;
2469 i = 0;
2470 for (;;) {
2471 com_not_test(c, CHILD(n, i));
2472 if ((i += 2) >= NCH(n))
2473 break;
2474 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2475 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002476 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002477 }
2478 if (anchor)
2479 com_backpatch(c, anchor);
2480}
2481
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002482static int
2483com_make_closure(struct compiling *c, PyCodeObject *co)
2484{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002485 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002486 if (free == 0)
2487 return 0;
2488 for (i = 0; i < free; ++i) {
2489 /* Bypass com_addop_varname because it will generate
2490 LOAD_DEREF but LOAD_CLOSURE is needed.
2491 */
2492 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2493 int arg, reftype;
2494
2495 /* Special case: If a class contains a method with a
2496 free variable that has the same name as a method,
2497 the name will be considered free *and* local in the
2498 class. It should be handled by the closure, as
2499 well as by the normal name loookup logic.
2500 */
2501 reftype = get_ref_type(c, PyString_AS_STRING(name));
2502 if (reftype == CELL)
2503 arg = com_lookup_arg(c->c_cellvars, name);
2504 else /* (reftype == FREE) */
2505 arg = com_lookup_arg(c->c_freevars, name);
2506 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002507 fprintf(stderr, "lookup %s in %s %d %d\n"
2508 "freevars of %s: %s\n",
2509 PyObject_REPR(name),
2510 c->c_name,
2511 reftype, arg,
2512 PyString_AS_STRING(co->co_name),
2513 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002514 Py_FatalError("com_make_closure()");
2515 }
2516 com_addoparg(c, LOAD_CLOSURE, arg);
2517
2518 }
2519 com_push(c, free);
2520 return 1;
2521}
2522
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002523static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002524com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002525{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002526 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002527 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002528 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002529 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002530 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002531 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2532 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002533 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002534 if (co == NULL) {
2535 c->c_errors++;
2536 return;
2537 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002538 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002539 i = com_addconst(c, (PyObject *)co);
2540 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002541 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002542 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002543 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002544 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002545 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002546 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002547 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002548 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002549 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002550 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002551 else {
2552 int anchor = 0;
2553 int i = 0;
2554 for (;;) {
2555 com_and_test(c, CHILD(n, i));
2556 if ((i += 2) >= NCH(n))
2557 break;
2558 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2559 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002560 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002561 }
2562 if (anchor)
2563 com_backpatch(c, anchor);
2564 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002565}
2566
2567static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002568com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002569{
2570 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002571 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002572 com_node(c, CHILD(n, 0));
2573 }
2574 else {
2575 int i;
2576 int len;
2577 len = (NCH(n) + 1) / 2;
2578 for (i = 0; i < NCH(n); i += 2)
2579 com_node(c, CHILD(n, i));
2580 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002581 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002582 }
2583}
2584
2585
2586/* Begin of assignment compilation */
2587
Thomas Wouters434d0822000-08-24 20:11:32 +00002588
2589static void
2590com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2591{
2592 com_addbyte(c, DUP_TOP);
2593 com_push(c, 1);
2594 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002595 com_node(c, augn);
2596 com_addbyte(c, opcode);
2597 com_pop(c, 1);
2598 com_addbyte(c, ROT_TWO);
2599 com_addopname(c, STORE_ATTR, n);
2600 com_pop(c, 2);
2601}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002602
2603static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002604com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002605{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00002606 if (none_assignment_check(c, STR(n), assigning))
2607 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002608 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002609 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002610}
2611
2612static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002613com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002614{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002615 REQ(n, trailer);
2616 switch (TYPE(CHILD(n, 0))) {
2617 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002618 if (assigning == OP_DELETE)
2619 com_error(c, PyExc_SyntaxError,
2620 "can't delete function call");
2621 else
2622 com_error(c, PyExc_SyntaxError,
2623 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002624 break;
2625 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002626 if (assigning > OP_APPLY)
2627 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2628 else
2629 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002630 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002631 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002632 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002633 break;
2634 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002635 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002636 }
2637}
2638
2639static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002640com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002641{
2642 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002643 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002644 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002645 if (assigning) {
2646 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002647 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002648 com_push(c, i-1);
2649 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002650 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002651 com_assign(c, CHILD(n, i), assigning, NULL);
2652}
2653
2654static void
2655com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2656{
2657 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002658 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002659 com_push(c, 1);
2660 com_node(c, augn);
2661 com_addbyte(c, opcode);
2662 com_pop(c, 1);
2663 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002664}
2665
2666static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002667com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002668{
2669 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002670 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002671 if (assigning)
2672 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002673}
2674
2675static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002676com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002677{
2678 /* Loop to avoid trivial recursion */
2679 for (;;) {
2680 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002681
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002682 case exprlist:
2683 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002684 case testlist1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002685 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002686 if (assigning > OP_APPLY) {
2687 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002688 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002689 return;
2690 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002691 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002692 return;
2693 }
2694 n = CHILD(n, 0);
2695 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002696
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002697 case test:
2698 case and_test:
2699 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002700 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002701 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002702 case xor_expr:
2703 case and_expr:
2704 case shift_expr:
2705 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002706 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002707 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002708 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002709 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002710 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002711 return;
2712 }
2713 n = CHILD(n, 0);
2714 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002715
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002716 case power: /* atom trailer* ('**' power)*
2717 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002718 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002719 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002720 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002721 return;
2722 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002723 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002724 int i;
2725 com_node(c, CHILD(n, 0));
2726 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002727 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002728 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002729 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002730 return;
2731 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002732 com_apply_trailer(c, CHILD(n, i));
2733 } /* NB i is still alive */
2734 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002735 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002736 return;
2737 }
2738 n = CHILD(n, 0);
2739 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002740
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002741 case atom:
2742 switch (TYPE(CHILD(n, 0))) {
2743 case LPAR:
2744 n = CHILD(n, 1);
2745 if (TYPE(n) == RPAR) {
2746 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002747 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002748 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002749 return;
2750 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002751 if (assigning > OP_APPLY) {
2752 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00002753 "augmented assign to tuple literal not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002754 return;
2755 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002756 break;
2757 case LSQB:
2758 n = CHILD(n, 1);
2759 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002760 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002761 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002762 return;
2763 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002764 if (assigning > OP_APPLY) {
2765 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00002766 "augmented assign to list literal not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002767 return;
2768 }
2769 if (NCH(n) > 1
2770 && TYPE(CHILD(n, 1)) == list_for) {
2771 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002772 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002773 return;
2774 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002775 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002776 return;
2777 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002778 if (assigning > OP_APPLY)
2779 com_augassign_name(c, CHILD(n, 0),
2780 assigning, augn);
2781 else
2782 com_assign_name(c, CHILD(n, 0),
2783 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002784 return;
2785 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002786 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002787 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002788 return;
2789 }
2790 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002791
2792 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002793 com_error(c, PyExc_SyntaxError,
2794 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002795 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002796
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002797 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002798 com_error(c, PyExc_SystemError,
2799 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002800 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002801
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002802 }
2803 }
2804}
Guido van Rossum7c531111997-03-11 18:42:21 +00002805
Thomas Wouters434d0822000-08-24 20:11:32 +00002806static void
2807com_augassign(struct compiling *c, node *n)
2808{
2809 int opcode;
2810
2811 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2812 case '+': opcode = INPLACE_ADD; break;
2813 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002814 case '/':
2815 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
2816 opcode = INPLACE_FLOOR_DIVIDE;
2817 else if (c->c_flags & CO_FUTURE_DIVISION)
2818 opcode = INPLACE_TRUE_DIVIDE;
2819 else
2820 opcode = INPLACE_DIVIDE;
2821 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00002822 case '%': opcode = INPLACE_MODULO; break;
2823 case '<': opcode = INPLACE_LSHIFT; break;
2824 case '>': opcode = INPLACE_RSHIFT; break;
2825 case '&': opcode = INPLACE_AND; break;
2826 case '^': opcode = INPLACE_XOR; break;
2827 case '|': opcode = INPLACE_OR; break;
2828 case '*':
2829 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2830 opcode = INPLACE_POWER;
2831 else
2832 opcode = INPLACE_MULTIPLY;
2833 break;
2834 default:
2835 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2836 return;
2837 }
2838 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2839}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002840
2841static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002842com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002843{
Thomas Wouters434d0822000-08-24 20:11:32 +00002844 REQ(n, expr_stmt);
2845 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002846 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002847 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002848 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002849 if (NCH(n) == 1) {
2850 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002851 if (c->c_interactive)
2852 com_addbyte(c, PRINT_EXPR);
2853 else
2854 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002855 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002856 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002857 else if (TYPE(CHILD(n,1)) == augassign)
2858 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002859 else {
2860 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002861 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002862 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002863 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002864 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002865 com_push(c, 1);
2866 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002867 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002868 }
2869 }
2870}
2871
2872static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002873com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002874{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002875 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002876 int i;
2877 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002878 if (Py_OptimizeFlag)
2879 return;
2880 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00002881
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002882 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00002883 raise AssertionError [, <message>]
2884
2885 where <message> is the second test, if present.
2886 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002887 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002888 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002889 com_addbyte(c, POP_TOP);
2890 com_pop(c, 1);
2891 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002892 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002893 com_push(c, 1);
2894 i = NCH(n)/2; /* Either 2 or 4 */
2895 if (i > 1)
2896 com_node(c, CHILD(n, 3));
2897 com_addoparg(c, RAISE_VARARGS, i);
2898 com_pop(c, i);
2899 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002900 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002901 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002902 com_addbyte(c, POP_TOP);
2903}
2904
2905static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002906com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002907{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002908 int i = 1;
2909 node* stream = NULL;
2910
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002911 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002912
2913 /* are we using the extended print form? */
2914 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2915 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002916 com_node(c, stream);
2917 /* stack: [...] => [... stream] */
2918 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002919 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2920 i = 4;
2921 else
2922 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002923 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002924 for (; i < NCH(n); i += 2) {
2925 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002926 com_addbyte(c, DUP_TOP);
2927 /* stack: [stream] => [stream stream] */
2928 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002929 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002930 /* stack: [stream stream] => [stream stream obj] */
2931 com_addbyte(c, ROT_TWO);
2932 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002933 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002934 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002935 com_pop(c, 2);
2936 }
2937 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002938 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002939 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002940 com_addbyte(c, PRINT_ITEM);
2941 com_pop(c, 1);
2942 }
2943 }
2944 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002945 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002946 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002947 /* must pop the extra stream object off the stack */
2948 com_addbyte(c, POP_TOP);
2949 /* stack: [... stream] => [...] */
2950 com_pop(c, 1);
2951 }
2952 }
2953 else {
2954 if (stream != NULL) {
2955 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002956 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002957 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002958 com_pop(c, 1);
2959 }
2960 else
2961 com_addbyte(c, PRINT_NEWLINE);
2962 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002963}
2964
2965static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002966com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002967{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002968 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002969 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002970 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002971 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002972 if (c->c_flags & CO_GENERATOR) {
2973 if (NCH(n) > 1) {
2974 com_error(c, PyExc_SyntaxError,
2975 "'return' with argument inside generator");
2976 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002977 }
2978 if (NCH(n) < 2) {
2979 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002980 com_push(c, 1);
2981 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002982 else
2983 com_node(c, CHILD(n, 1));
2984 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00002985 com_pop(c, 1);
2986}
2987
2988static void
2989com_yield_stmt(struct compiling *c, node *n)
2990{
Tim Peters95c80f82001-06-23 02:07:08 +00002991 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00002992 REQ(n, yield_stmt); /* 'yield' testlist */
2993 if (!c->c_infunction) {
2994 com_error(c, PyExc_SyntaxError, "'yield' outside function");
2995 }
Tim Peters95c80f82001-06-23 02:07:08 +00002996
2997 for (i = 0; i < c->c_nblocks; ++i) {
2998 if (c->c_block[i] == SETUP_FINALLY) {
2999 com_error(c, PyExc_SyntaxError,
3000 "'yield' not allowed in a 'try' block "
3001 "with a 'finally' clause");
3002 return;
3003 }
3004 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003005 com_node(c, CHILD(n, 1));
3006 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003007 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003008}
3009
3010static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003011com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003012{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003013 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003014 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3015 if (NCH(n) > 1) {
3016 com_node(c, CHILD(n, 1));
3017 if (NCH(n) > 3) {
3018 com_node(c, CHILD(n, 3));
3019 if (NCH(n) > 5)
3020 com_node(c, CHILD(n, 5));
3021 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003022 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003023 i = NCH(n)/2;
3024 com_addoparg(c, RAISE_VARARGS, i);
3025 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003026}
3027
3028static void
Thomas Wouters52152252000-08-17 22:55:00 +00003029com_from_import(struct compiling *c, node *n)
3030{
3031 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3032 com_push(c, 1);
3033 if (NCH(n) > 1) {
3034 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3035 com_error(c, PyExc_SyntaxError, "invalid syntax");
3036 return;
3037 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003038 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003039 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003040 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003041 com_pop(c, 1);
3042}
3043
3044static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003045com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003046{
3047 int i;
3048 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003049 /* 'import' dotted_name (',' dotted_name)* |
3050 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003051 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00003052 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003053 /* 'from' dotted_name 'import' ... */
3054 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003055
3056 if (TYPE(CHILD(n, 3)) == STAR) {
3057 tup = Py_BuildValue("(s)", "*");
3058 } else {
3059 tup = PyTuple_New((NCH(n) - 2)/2);
3060 for (i = 3; i < NCH(n); i += 2) {
3061 PyTuple_SET_ITEM(tup, (i-3)/2,
Guido van Rossum633d90c2002-12-23 16:51:42 +00003062 PyString_FromString(STR(
3063 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003064 }
3065 }
3066 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003067 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003068 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003069 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00003070 if (TYPE(CHILD(n, 3)) == STAR)
3071 com_addbyte(c, IMPORT_STAR);
3072 else {
3073 for (i = 3; i < NCH(n); i += 2)
3074 com_from_import(c, CHILD(n, i));
3075 com_addbyte(c, POP_TOP);
3076 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003077 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003078 }
3079 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003080 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003081 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003082 node *subn = CHILD(n, i);
3083 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003084 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003085 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003086 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003087 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003088 int j;
3089 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003090 com_error(c, PyExc_SyntaxError,
3091 "invalid syntax");
3092 return;
3093 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003094 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3095 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003096 CHILD(CHILD(subn, 0),
3097 j));
3098 com_addop_varname(c, VAR_STORE,
3099 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003100 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003101 com_addop_varname(c, VAR_STORE,
3102 STR(CHILD(CHILD(subn, 0),
3103 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003104 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003105 }
3106 }
3107}
3108
3109static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003110com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003111{
3112 REQ(n, exec_stmt);
3113 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3114 com_node(c, CHILD(n, 1));
3115 if (NCH(n) >= 4)
3116 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003117 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003118 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003119 com_push(c, 1);
3120 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003121 if (NCH(n) >= 6)
3122 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003123 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003124 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003125 com_push(c, 1);
3126 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003127 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003128 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003129}
3130
Guido van Rossum7c531111997-03-11 18:42:21 +00003131static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003132is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003133{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003134 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003135 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003136 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003137
3138 /* Label to avoid tail recursion */
3139 next:
3140 switch (TYPE(n)) {
3141
3142 case suite:
3143 if (NCH(n) == 1) {
3144 n = CHILD(n, 0);
3145 goto next;
3146 }
3147 /* Fall through */
3148 case file_input:
3149 for (i = 0; i < NCH(n); i++) {
3150 node *ch = CHILD(n, i);
3151 if (TYPE(ch) == stmt) {
3152 n = ch;
3153 goto next;
3154 }
3155 }
3156 break;
3157
3158 case stmt:
3159 case simple_stmt:
3160 case small_stmt:
3161 n = CHILD(n, 0);
3162 goto next;
3163
3164 case expr_stmt:
3165 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003166 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003167 case test:
3168 case and_test:
3169 case not_test:
3170 case comparison:
3171 case expr:
3172 case xor_expr:
3173 case and_expr:
3174 case shift_expr:
3175 case arith_expr:
3176 case term:
3177 case factor:
3178 case power:
3179 case atom:
3180 if (NCH(n) == 1) {
3181 n = CHILD(n, 0);
3182 goto next;
3183 }
3184 break;
3185
3186 case NAME:
3187 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3188 return 1;
3189 break;
3190
3191 case NUMBER:
3192 v = parsenumber(c, STR(n));
3193 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003194 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003195 break;
3196 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003197 i = PyObject_IsTrue(v);
3198 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003199 return i == 0;
3200
3201 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003202 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003203 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003204 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003205 break;
3206 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003207 i = PyObject_IsTrue(v);
3208 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003209 return i == 0;
3210
3211 }
3212 return 0;
3213}
3214
Tim Peters08a898f2001-06-28 01:52:22 +00003215
3216/* Look under n for a return stmt with an expression.
3217 * This hack is used to find illegal returns under "if 0:" blocks in
3218 * functions already known to be generators (as determined by the symtable
3219 * pass).
3220 * Return the offending return node if found, else NULL.
3221 */
3222static node *
3223look_for_offending_return(node *n)
3224{
3225 int i;
3226
3227 for (i = 0; i < NCH(n); ++i) {
3228 node *kid = CHILD(n, i);
3229
3230 switch (TYPE(kid)) {
3231 case classdef:
3232 case funcdef:
3233 case lambdef:
3234 /* Stuff in nested functions & classes doesn't
3235 affect the code block we started in. */
3236 return NULL;
3237
3238 case return_stmt:
3239 if (NCH(kid) > 1)
3240 return kid;
3241 break;
3242
3243 default: {
3244 node *bad = look_for_offending_return(kid);
3245 if (bad != NULL)
3246 return bad;
3247 }
3248 }
3249 }
3250
3251 return NULL;
3252}
3253
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003254static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003255com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003256{
3257 int i;
3258 int anchor = 0;
3259 REQ(n, if_stmt);
3260 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3261 for (i = 0; i+3 < NCH(n); i+=4) {
3262 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003263 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003264 if (is_constant_false(c, ch)) {
3265 /* We're going to skip this block. However, if this
3266 is a generator, we have to check the dead code
3267 anyway to make sure there aren't any return stmts
3268 with expressions, in the same scope. */
3269 if (c->c_flags & CO_GENERATOR) {
3270 node *p = look_for_offending_return(n);
3271 if (p != NULL) {
3272 int savelineno = c->c_lineno;
3273 c->c_lineno = p->n_lineno;
3274 com_error(c, PyExc_SyntaxError,
3275 "'return' with argument "
3276 "inside generator");
3277 c->c_lineno = savelineno;
3278 }
3279 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003280 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003281 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003282 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003283 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003284 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003285 com_addfwref(c, JUMP_IF_FALSE, &a);
3286 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003287 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003288 com_node(c, CHILD(n, i+3));
3289 com_addfwref(c, JUMP_FORWARD, &anchor);
3290 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003291 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003292 com_addbyte(c, POP_TOP);
3293 }
3294 if (i+2 < NCH(n))
3295 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003296 if (anchor)
3297 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003298}
3299
3300static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003301com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003302{
3303 int break_anchor = 0;
3304 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003305 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003306 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3307 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003308 block_push(c, SETUP_LOOP);
3309 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003310 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003311 com_node(c, CHILD(n, 1));
3312 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3313 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003314 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003315 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003316 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003317 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003318 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3319 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003320 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003321 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003322 com_addbyte(c, POP_TOP);
3323 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003324 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003325 if (NCH(n) > 4)
3326 com_node(c, CHILD(n, 6));
3327 com_backpatch(c, break_anchor);
3328}
3329
3330static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003331com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003332{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003333 int break_anchor = 0;
3334 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003335 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003336 REQ(n, for_stmt);
3337 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3338 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003339 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003340 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003341 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003342 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00003343 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003344 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003345 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003346 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003347 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003348 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003349 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003350 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3351 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003352 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003353 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003354 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003355 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003356 if (NCH(n) > 8)
3357 com_node(c, CHILD(n, 8));
3358 com_backpatch(c, break_anchor);
3359}
3360
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003361/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003362
3363 SETUP_FINALLY L
3364 <code for S>
3365 POP_BLOCK
3366 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003367 L: <code for Sf>
3368 END_FINALLY
3369
3370 The special instructions use the block stack. Each block
3371 stack entry contains the instruction that created it (here
3372 SETUP_FINALLY), the level of the value stack at the time the
3373 block stack entry was created, and a label (here L).
3374
3375 SETUP_FINALLY:
3376 Pushes the current value stack level and the label
3377 onto the block stack.
3378 POP_BLOCK:
3379 Pops en entry from the block stack, and pops the value
3380 stack until its level is the same as indicated on the
3381 block stack. (The label is ignored.)
3382 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003383 Pops a variable number of entries from the *value* stack
3384 and re-raises the exception they specify. The number of
3385 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003386
3387 The block stack is unwound when an exception is raised:
3388 when a SETUP_FINALLY entry is found, the exception is pushed
3389 onto the value stack (and the exception condition is cleared),
3390 and the interpreter jumps to the label gotten from the block
3391 stack.
3392
3393 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003394 (The contents of the value stack is shown in [], with the top
3395 at the right; 'tb' is trace-back info, 'val' the exception's
3396 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003397
3398 Value stack Label Instruction Argument
3399 [] SETUP_EXCEPT L1
3400 [] <code for S>
3401 [] POP_BLOCK
3402 [] JUMP_FORWARD L0
3403
Guido van Rossum3f5da241990-12-20 15:06:42 +00003404 [tb, val, exc] L1: DUP )
3405 [tb, val, exc, exc] <evaluate E1> )
3406 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3407 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3408 [tb, val, exc, 1] POP )
3409 [tb, val, exc] POP
3410 [tb, val] <assign to V1> (or POP if no V1)
3411 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003412 [] <code for S1>
3413 JUMP_FORWARD L0
3414
Guido van Rossum3f5da241990-12-20 15:06:42 +00003415 [tb, val, exc, 0] L2: POP
3416 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003417 .............................etc.......................
3418
Guido van Rossum3f5da241990-12-20 15:06:42 +00003419 [tb, val, exc, 0] Ln+1: POP
3420 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003421
3422 [] L0: <next statement>
3423
3424 Of course, parts are not generated if Vi or Ei is not present.
3425*/
3426
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003427static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003428com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003429{
3430 int except_anchor = 0;
3431 int end_anchor = 0;
3432 int else_anchor = 0;
3433 int i;
3434 node *ch;
3435
3436 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3437 block_push(c, SETUP_EXCEPT);
3438 com_node(c, CHILD(n, 2));
3439 com_addbyte(c, POP_BLOCK);
3440 block_pop(c, SETUP_EXCEPT);
3441 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3442 com_backpatch(c, except_anchor);
3443 for (i = 3;
3444 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3445 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003446 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003447 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003448 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003449 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003450 break;
3451 }
3452 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003453 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003454 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003455 if (NCH(ch) > 1) {
3456 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003457 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003458 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003459 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003460 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003461 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3462 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003463 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003464 }
3465 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003466 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003467 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003468 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003469 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003470 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003471 com_pop(c, 1);
3472 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003473 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003474 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003475 com_node(c, CHILD(n, i+2));
3476 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3477 if (except_anchor) {
3478 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003479 /* We come in with [tb, val, exc, 0] on the
3480 stack; one pop and it's the same as
3481 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003482 com_addbyte(c, POP_TOP);
3483 }
3484 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003485 /* We actually come in here with [tb, val, exc] but the
3486 END_FINALLY will zap those and jump around.
3487 The c_stacklevel does not reflect them so we need not pop
3488 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003489 com_addbyte(c, END_FINALLY);
3490 com_backpatch(c, else_anchor);
3491 if (i < NCH(n))
3492 com_node(c, CHILD(n, i+2));
3493 com_backpatch(c, end_anchor);
3494}
3495
3496static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003497com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003498{
3499 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003500 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003501
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003502 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3503 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003504 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003505 com_addbyte(c, POP_BLOCK);
3506 block_pop(c, SETUP_FINALLY);
3507 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003508 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003509 /* While the generated code pushes only one item,
3510 the try-finally handling can enter here with
3511 up to three items. OK, here are the details:
3512 3 for an exception, 2 for RETURN, 1 for BREAK. */
3513 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003514 com_backpatch(c, finally_anchor);
3515 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003516 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003517 com_node(c, ch);
3518 com_addbyte(c, END_FINALLY);
3519 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003520 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003521}
3522
3523static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003524com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003525{
3526 REQ(n, try_stmt);
3527 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3528 | 'try' ':' suite 'finally' ':' suite */
3529 if (TYPE(CHILD(n, 3)) != except_clause)
3530 com_try_finally(c, n);
3531 else
3532 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003533}
3534
Guido van Rossum8b993a91997-01-17 21:04:03 +00003535static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003536get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003537{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003538 int i;
3539
Guido van Rossum8b993a91997-01-17 21:04:03 +00003540 /* Label to avoid tail recursion */
3541 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003542 switch (TYPE(n)) {
3543
3544 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003545 if (NCH(n) == 1) {
3546 n = CHILD(n, 0);
3547 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003548 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003549 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003550 case file_input:
3551 for (i = 0; i < NCH(n); i++) {
3552 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003553 if (TYPE(ch) == stmt) {
3554 n = ch;
3555 goto next;
3556 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003557 }
3558 break;
3559
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003560 case stmt:
3561 case simple_stmt:
3562 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003563 n = CHILD(n, 0);
3564 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003565
3566 case expr_stmt:
3567 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003568 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003569 case test:
3570 case and_test:
3571 case not_test:
3572 case comparison:
3573 case expr:
3574 case xor_expr:
3575 case and_expr:
3576 case shift_expr:
3577 case arith_expr:
3578 case term:
3579 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003580 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003581 if (NCH(n) == 1) {
3582 n = CHILD(n, 0);
3583 goto next;
3584 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003585 break;
3586
3587 case atom:
3588 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003589 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003590 break;
3591
3592 }
3593 return NULL;
3594}
3595
Guido van Rossum79f25d91997-04-29 20:08:16 +00003596static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003597get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003598{
Guido van Rossum541563e1999-01-28 15:08:09 +00003599 /* Don't generate doc-strings if run with -OO */
3600 if (Py_OptimizeFlag > 1)
3601 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003602 n = get_rawdocstring(n);
3603 if (n == NULL)
3604 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003605 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003606}
3607
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003608static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003609com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003610{
3611 REQ(n, suite);
3612 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3613 if (NCH(n) == 1) {
3614 com_node(c, CHILD(n, 0));
3615 }
3616 else {
3617 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003618 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003619 node *ch = CHILD(n, i);
3620 if (TYPE(ch) == stmt)
3621 com_node(c, ch);
3622 }
3623 }
3624}
3625
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003626/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003627static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003628com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003629{
3630 int i = c->c_nblocks;
3631 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3632 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3633 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003634 else if (i <= 0) {
3635 /* at the outer level */
3636 com_error(c, PyExc_SyntaxError,
3637 "'continue' not properly in loop");
3638 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003639 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003640 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003641 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003642 if (c->c_block[j] == SETUP_LOOP)
3643 break;
3644 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003645 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003646 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003647 for (; i > j; --i) {
3648 if (c->c_block[i] == SETUP_EXCEPT ||
3649 c->c_block[i] == SETUP_FINALLY) {
3650 com_addoparg(c, CONTINUE_LOOP,
3651 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003652 return;
3653 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003654 if (c->c_block[i] == END_FINALLY) {
3655 com_error(c, PyExc_SyntaxError,
3656 "'continue' not supported inside 'finally' clause");
3657 return;
3658 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003659 }
3660 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003661 com_error(c, PyExc_SyntaxError,
3662 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003663 }
3664 /* XXX Could allow it inside a 'finally' clause
3665 XXX if we could pop the exception still on the stack */
3666}
3667
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003668/* Return the number of default values in the argument list.
3669
3670 If a non-default argument follows a default argument, set an
3671 exception and return -1.
3672*/
3673
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003674static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003675com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003676{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003677 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003678 if (TYPE(n) == lambdef) {
3679 /* lambdef: 'lambda' [varargslist] ':' test */
3680 n = CHILD(n, 1);
3681 }
3682 else {
3683 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3684 n = CHILD(n, 2);
3685 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3686 n = CHILD(n, 1);
3687 }
3688 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003689 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003690 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003691 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003692 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3693 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003694 ndefs = 0;
3695 for (i = 0; i < nch; i++) {
3696 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003697 if (TYPE(CHILD(n, i)) == STAR ||
3698 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003699 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003700 i++;
3701 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003702 t = RPAR; /* Anything except EQUAL or COMMA */
3703 else
3704 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003705 if (t == EQUAL) {
3706 i++;
3707 ndefs++;
3708 com_node(c, CHILD(n, i));
3709 i++;
3710 if (i >= nch)
3711 break;
3712 t = TYPE(CHILD(n, i));
3713 }
3714 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003715 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003716 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003717 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003718 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003719 return -1;
3720 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003721 }
3722 if (t != COMMA)
3723 break;
3724 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003725 return ndefs;
3726}
3727
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003728static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003729com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003730{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003731 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003732 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003733 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003734 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003735 if (ndefs < 0)
3736 return;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003737 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3738 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003739 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003740 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003741 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003742 c->c_errors++;
3743 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003744 int closure = com_make_closure(c, (PyCodeObject *)co);
3745 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003746 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003747 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003748 if (closure)
3749 com_addoparg(c, MAKE_CLOSURE, ndefs);
3750 else
3751 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003752 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003753 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003754 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003755 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003756 }
3757}
3758
3759static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003760com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003761{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003762 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003763 REQ(n, testlist);
3764 /* testlist: test (',' test)* [','] */
3765 for (i = 0; i < NCH(n); i += 2)
3766 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003767 i = (NCH(n)+1) / 2;
3768 com_addoparg(c, BUILD_TUPLE, i);
3769 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003770}
3771
3772static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003773com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003774{
Guido van Rossum25831651993-05-19 14:50:45 +00003775 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003776 PyObject *v;
3777 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003778 char *name;
3779
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003780 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003781 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003782 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003783 c->c_errors++;
3784 return;
3785 }
3786 /* Push the class name on the stack */
3787 i = com_addconst(c, v);
3788 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003789 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003790 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003791 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003792 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003793 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003794 com_push(c, 1);
3795 }
Guido van Rossum25831651993-05-19 14:50:45 +00003796 else
3797 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003798 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003799 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003800 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003801 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003802 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003803 c->c_errors++;
3804 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003805 int closure = com_make_closure(c, co);
3806 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003807 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003808 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003809 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003810 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003811 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003812 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003813 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003814 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003815 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003816 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003817 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003818 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003819 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003820 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003821}
3822
3823static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003824com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003825{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003826 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003827 if (c->c_errors)
3828 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003829 switch (TYPE(n)) {
3830
3831 /* Definition nodes */
3832
3833 case funcdef:
3834 com_funcdef(c, n);
3835 break;
3836 case classdef:
3837 com_classdef(c, n);
3838 break;
3839
3840 /* Trivial parse tree nodes */
3841
3842 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003843 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003844 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003845 n = CHILD(n, 0);
3846 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003847
3848 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003849 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003850 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003851 {
3852 int i;
3853 for (i = 0; i < NCH(n)-1; i += 2)
3854 com_node(c, CHILD(n, i));
3855 }
3856 break;
3857
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003858 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003859 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003860 n = CHILD(n, 0);
3861 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003862
3863 /* Statement nodes */
3864
3865 case expr_stmt:
3866 com_expr_stmt(c, n);
3867 break;
3868 case print_stmt:
3869 com_print_stmt(c, n);
3870 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003871 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003872 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003873 break;
3874 case pass_stmt:
3875 break;
3876 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003877 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003878 com_error(c, PyExc_SyntaxError,
3879 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003880 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003881 com_addbyte(c, BREAK_LOOP);
3882 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003883 case continue_stmt:
3884 com_continue_stmt(c, n);
3885 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003886 case return_stmt:
3887 com_return_stmt(c, n);
3888 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003889 case yield_stmt:
3890 com_yield_stmt(c, n);
3891 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003892 case raise_stmt:
3893 com_raise_stmt(c, n);
3894 break;
3895 case import_stmt:
3896 com_import_stmt(c, n);
3897 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003898 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003899 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003900 case exec_stmt:
3901 com_exec_stmt(c, n);
3902 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003903 case assert_stmt:
3904 com_assert_stmt(c, n);
3905 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003906 case if_stmt:
3907 com_if_stmt(c, n);
3908 break;
3909 case while_stmt:
3910 com_while_stmt(c, n);
3911 break;
3912 case for_stmt:
3913 com_for_stmt(c, n);
3914 break;
3915 case try_stmt:
3916 com_try_stmt(c, n);
3917 break;
3918 case suite:
3919 com_suite(c, n);
3920 break;
3921
3922 /* Expression nodes */
3923
3924 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003925 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00003926 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003927 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003928 break;
3929 case test:
3930 com_test(c, n);
3931 break;
3932 case and_test:
3933 com_and_test(c, n);
3934 break;
3935 case not_test:
3936 com_not_test(c, n);
3937 break;
3938 case comparison:
3939 com_comparison(c, n);
3940 break;
3941 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003942 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003943 break;
3944 case expr:
3945 com_expr(c, n);
3946 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003947 case xor_expr:
3948 com_xor_expr(c, n);
3949 break;
3950 case and_expr:
3951 com_and_expr(c, n);
3952 break;
3953 case shift_expr:
3954 com_shift_expr(c, n);
3955 break;
3956 case arith_expr:
3957 com_arith_expr(c, n);
3958 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003959 case term:
3960 com_term(c, n);
3961 break;
3962 case factor:
3963 com_factor(c, n);
3964 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003965 case power:
3966 com_power(c, n);
3967 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003968 case atom:
3969 com_atom(c, n);
3970 break;
3971
3972 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003973 com_error(c, PyExc_SystemError,
3974 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003975 }
3976}
3977
Tim Petersdbd9ba62000-07-09 03:09:57 +00003978static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003979
3980static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003981com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003982{
3983 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3984 if (TYPE(CHILD(n, 0)) == LPAR)
3985 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003986 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003987 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003988 com_pop(c, 1);
3989 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003990}
3991
3992static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003993com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003994{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003995 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003996 if (NCH(n) == 1) {
3997 com_fpdef(c, CHILD(n, 0));
3998 }
3999 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004000 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004001 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004002 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004003 for (i = 0; i < NCH(n); i += 2)
4004 com_fpdef(c, CHILD(n, i));
4005 }
4006}
4007
4008static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004009com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004010{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004011 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004012 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004013 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004014 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004015 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004016 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004017 nch = NCH(n);
4018 /* Enter all arguments in table of locals */
4019 for (i = 0, narg = 0; i < nch; i++) {
4020 node *ch = CHILD(n, i);
4021 node *fp;
4022 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004023 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004024 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4025 fp = CHILD(ch, 0);
4026 if (TYPE(fp) != NAME) {
4027 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4028 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004029 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004030 narg++;
4031 /* all name updates handled by symtable */
4032 if (++i >= nch)
4033 break;
4034 ch = CHILD(n, i);
4035 if (TYPE(ch) == EQUAL)
4036 i += 2;
4037 else
4038 REQ(ch, COMMA);
4039 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004040 if (complex) {
4041 /* Generate code for complex arguments only after
4042 having counted the simple arguments */
4043 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004044 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004045 node *ch = CHILD(n, i);
4046 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004047 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004048 break;
4049 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4050 fp = CHILD(ch, 0);
4051 if (TYPE(fp) != NAME) {
4052 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004053 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004054 com_fpdef(c, ch);
4055 }
4056 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004057 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004058 break;
4059 ch = CHILD(n, i);
4060 if (TYPE(ch) == EQUAL)
4061 i += 2;
4062 else
4063 REQ(ch, COMMA);
4064 }
4065 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004066}
4067
4068static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004069com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004070{
4071 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004072 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004073 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004074 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004075 if (doc != NULL) {
4076 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004077 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004078 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004079 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004080 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004081 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004082 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004083 for (i = 0; i < NCH(n); i++) {
4084 node *ch = CHILD(n, i);
4085 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4086 com_node(c, ch);
4087 }
4088}
4089
4090/* Top-level compile-node interface */
4091
4092static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004093compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004094{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004095 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004096 node *ch;
4097 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00004098 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004099 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004100 if (doc != NULL) {
4101 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004102 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004103 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004104 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004105 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004106 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
4107 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004108 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004109 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004110 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004111 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004112 c->c_infunction = 0;
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004113 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4114 com_push(c, 1);
4115 com_addbyte(c, RETURN_VALUE);
4116 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004117}
4118
4119static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004120compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004121{
Guido van Rossum590baa41993-11-30 13:40:46 +00004122 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004123 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004124 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004125
4126 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004127 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004128 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004129 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004130 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004131 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004132 else
4133 ch = CHILD(n, 2);
4134 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004135 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004136 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004137}
4138
4139static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004140compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004141{
4142 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004143 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004144 REQ(n, classdef);
4145 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4146 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004147 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004148 /* Initialize local __module__ from global __name__ */
4149 com_addop_name(c, LOAD_GLOBAL, "__name__");
4150 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004151 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004152 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004153 if (doc != NULL) {
4154 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004155 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004156 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004157 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004158 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004159 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004160 }
4161 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004162 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004163 com_node(c, ch);
4164 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004165 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004166 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004167 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004168}
4169
4170static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004171compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004172{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004173 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004174
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004175 switch (TYPE(n)) {
4176
Guido van Rossum4c417781991-01-21 16:09:22 +00004177 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004178 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004179 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004180 n = CHILD(n, 0);
4181 if (TYPE(n) != NEWLINE)
4182 com_node(c, n);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004183 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4184 com_push(c, 1);
4185 com_addbyte(c, RETURN_VALUE);
4186 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004187 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004188 break;
4189
Guido van Rossum4c417781991-01-21 16:09:22 +00004190 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004191 com_file_input(c, n);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004192 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4193 com_push(c, 1);
4194 com_addbyte(c, RETURN_VALUE);
4195 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004196 break;
4197
Guido van Rossum590baa41993-11-30 13:40:46 +00004198 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004199 com_node(c, CHILD(n, 0));
4200 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004201 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004202 break;
4203
Guido van Rossum590baa41993-11-30 13:40:46 +00004204 case lambdef: /* anonymous function definition */
4205 compile_lambdef(c, n);
4206 break;
4207
Guido van Rossum4c417781991-01-21 16:09:22 +00004208 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004209 compile_funcdef(c, n);
4210 break;
4211
Guido van Rossum4c417781991-01-21 16:09:22 +00004212 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004213 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004214 break;
4215
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004216 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004217 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004218 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004219 }
4220}
4221
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004222static PyObject *
4223dict_keys_inorder(PyObject *dict, int offset)
4224{
4225 PyObject *tuple, *k, *v;
4226 int i, pos = 0, size = PyDict_Size(dict);
4227
4228 tuple = PyTuple_New(size);
4229 if (tuple == NULL)
4230 return NULL;
4231 while (PyDict_Next(dict, &pos, &k, &v)) {
4232 i = PyInt_AS_LONG(v);
4233 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004234 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004235 PyTuple_SET_ITEM(tuple, i - offset, k);
4236 }
4237 return tuple;
4238}
4239
Guido van Rossum79f25d91997-04-29 20:08:16 +00004240PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004241PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004242{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004243 return PyNode_CompileFlags(n, filename, NULL);
4244}
4245
4246PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004247PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004248{
4249 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004250}
4251
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004252struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004253PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004254{
4255 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004256 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004257
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004258 ff = PyNode_Future(n, filename);
4259 if (ff == NULL)
4260 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004261 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00004262 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004263 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004264 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004265 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004266 return st;
4267}
4268
Guido van Rossum79f25d91997-04-29 20:08:16 +00004269static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004270icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004271{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004272 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004273}
4274
Guido van Rossum79f25d91997-04-29 20:08:16 +00004275static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004276jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004277 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004278{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004279 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004280 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004281 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004282 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004283 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4284 sc.c_encoding = "utf-8";
4285 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004286 sc.c_encoding = STR(n);
4287 n = CHILD(n, 0);
4288 } else {
4289 sc.c_encoding = NULL;
4290 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004291 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004292 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004293 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004294 /* c_symtable still points to parent's symbols */
4295 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004296 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004297 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004298 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004299 if (base->c_encoding != NULL) {
4300 assert(sc.c_encoding == NULL);
4301 sc.c_encoding = base->c_encoding;
4302 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004303 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004304 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004305 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004306 if (sc.c_future == NULL) {
4307 com_free(&sc);
4308 return NULL;
4309 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004310 if (flags) {
4311 int merged = sc.c_future->ff_features |
4312 flags->cf_flags;
4313 sc.c_future->ff_features = merged;
4314 flags->cf_flags = merged;
4315 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004316 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
4317 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004318 com_free(&sc);
4319 return NULL;
4320 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004321 /* reset symbol table for second pass */
4322 sc.c_symtable->st_nscopes = 1;
4323 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004324 }
4325 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004326 if (symtable_load_symbols(&sc) < 0) {
4327 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004328 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004329 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004330 compile_node(&sc, n);
4331 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004332 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004333 PyObject *consts, *names, *varnames, *filename, *name,
4334 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004335 consts = PyList_AsTuple(sc.c_consts);
4336 names = PyList_AsTuple(sc.c_names);
4337 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004338 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4339 freevars = dict_keys_inorder(sc.c_freevars,
4340 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004341 filename = PyString_InternFromString(sc.c_filename);
4342 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004343 if (!PyErr_Occurred())
4344 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004345 sc.c_nlocals,
4346 sc.c_maxstacklevel,
4347 sc.c_flags,
4348 sc.c_code,
4349 consts,
4350 names,
4351 varnames,
4352 freevars,
4353 cellvars,
4354 filename,
4355 name,
4356 sc.c_firstlineno,
4357 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004358 Py_XDECREF(consts);
4359 Py_XDECREF(names);
4360 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004361 Py_XDECREF(freevars);
4362 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004363 Py_XDECREF(filename);
4364 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004365 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004366 else if (!PyErr_Occurred()) {
4367 /* This could happen if someone called PyErr_Clear() after an
4368 error was reported above. That's not supposed to happen,
4369 but I just plugged one case and I'm not sure there can't be
4370 others. In that case, raise SystemError so that at least
4371 it gets reported instead dumping core. */
4372 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4373 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004374 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004375 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004376 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004377 sc.c_symtable = NULL;
4378 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004379 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004380 return co;
4381}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004382
4383int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004384PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004385{
4386 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004387 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004388 int line = co->co_firstlineno;
4389 int addr = 0;
4390 while (--size >= 0) {
4391 addr += *p++;
4392 if (addr > addrq)
4393 break;
4394 line += *p++;
4395 }
4396 return line;
4397}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004398
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004399/* The test for LOCAL must come before the test for FREE in order to
4400 handle classes where name is both local and free. The local var is
4401 a method and the free var is a free var referenced within a method.
4402*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004403
4404static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004405get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004406{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004407 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004408 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004409
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004410 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4411 return CELL;
4412 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4413 return LOCAL;
4414 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4415 return FREE;
4416 v = PyDict_GetItemString(c->c_globals, name);
4417 if (v) {
4418 if (v == Py_None)
4419 return GLOBAL_EXPLICIT;
4420 else {
4421 return GLOBAL_IMPLICIT;
4422 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004423 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004424 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004425 "unknown scope for %.100s in %.100s(%s) "
4426 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4427 name, c->c_name,
4428 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4429 c->c_filename,
4430 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4431 PyObject_REPR(c->c_locals),
4432 PyObject_REPR(c->c_globals)
4433 );
4434
4435 Py_FatalError(buf);
4436 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004437}
4438
Guido van Rossum207fda62001-03-02 03:30:41 +00004439/* Helper functions to issue warnings */
4440
4441static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004442issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004443{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004444 if (PyErr_Occurred()) {
4445 /* This can happen because symtable_node continues
4446 processing even after raising a SyntaxError.
4447 Calling PyErr_WarnExplicit now would clobber the
4448 pending exception; instead we fail and let that
4449 exception propagate.
4450 */
4451 return -1;
4452 }
Guido van Rossum207fda62001-03-02 03:30:41 +00004453 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4454 lineno, NULL, NULL) < 0) {
4455 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4456 PyErr_SetString(PyExc_SyntaxError, msg);
4457 PyErr_SyntaxLocation(filename, lineno);
4458 }
4459 return -1;
4460 }
4461 return 0;
4462}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004463
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004464static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004465symtable_warn(struct symtable *st, char *msg)
4466{
Guido van Rossum207fda62001-03-02 03:30:41 +00004467 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004468 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004469 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004470 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004471 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004472}
4473
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004474/* Helper function for setting lineno and filename */
4475
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004476static struct symtable *
4477symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004478{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004479 struct symtable *st;
4480
4481 st = symtable_init();
4482 if (st == NULL)
4483 return NULL;
4484 st->st_future = ff;
4485 st->st_filename = filename;
4486 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
4487 if (st->st_errors > 0)
4488 goto fail;
4489 symtable_node(st, n);
4490 if (st->st_errors > 0)
4491 goto fail;
4492 return st;
4493 fail:
4494 if (!PyErr_Occurred()) {
4495 /* This could happen because after a syntax error is
4496 detected, the symbol-table-building continues for
4497 a while, and PyErr_Clear() might erroneously be
4498 called during that process. One such case has been
4499 fixed, but there might be more (now or later).
4500 */
4501 PyErr_SetString(PyExc_SystemError, "lost exception");
4502 }
4503 st->st_future = NULL;
4504 st->st_filename = NULL;
4505 PySymtable_Free(st);
4506 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004507}
4508
4509static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004510symtable_init_compiling_symbols(struct compiling *c)
4511{
4512 PyObject *varnames;
4513
4514 varnames = c->c_symtable->st_cur->ste_varnames;
4515 if (varnames == NULL) {
4516 varnames = PyList_New(0);
4517 if (varnames == NULL)
4518 return -1;
4519 c->c_symtable->st_cur->ste_varnames = varnames;
4520 Py_INCREF(varnames);
4521 } else
4522 Py_INCREF(varnames);
4523 c->c_varnames = varnames;
4524
4525 c->c_globals = PyDict_New();
4526 if (c->c_globals == NULL)
4527 return -1;
4528 c->c_freevars = PyDict_New();
4529 if (c->c_freevars == NULL)
4530 return -1;
4531 c->c_cellvars = PyDict_New();
4532 if (c->c_cellvars == NULL)
4533 return -1;
4534 return 0;
4535}
4536
4537struct symbol_info {
4538 int si_nlocals;
4539 int si_ncells;
4540 int si_nfrees;
4541 int si_nimplicit;
4542};
4543
4544static void
4545symtable_init_info(struct symbol_info *si)
4546{
4547 si->si_nlocals = 0;
4548 si->si_ncells = 0;
4549 si->si_nfrees = 0;
4550 si->si_nimplicit = 0;
4551}
4552
4553static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004554symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004555 struct symbol_info *si)
4556{
4557 PyObject *dict, *v;
4558
4559 /* Seperate logic for DEF_FREE. If it occurs in a function,
4560 it indicates a local that we must allocate storage for (a
4561 cell var). If it occurs in a class, then the class has a
4562 method and a free variable with the same name.
4563 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004564 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004565 /* If it isn't declared locally, it can't be a cell. */
4566 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4567 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004568 v = PyInt_FromLong(si->si_ncells++);
4569 dict = c->c_cellvars;
4570 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004571 /* If it is free anyway, then there is no need to do
4572 anything here.
4573 */
4574 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004575 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004576 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004577 v = PyInt_FromLong(si->si_nfrees++);
4578 dict = c->c_freevars;
4579 }
4580 if (v == NULL)
4581 return -1;
4582 if (PyDict_SetItem(dict, name, v) < 0) {
4583 Py_DECREF(v);
4584 return -1;
4585 }
4586 Py_DECREF(v);
4587 return 0;
4588}
4589
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004590/* If a variable is a cell and an argument, make sure that appears in
4591 co_cellvars before any variable to its right in varnames.
4592*/
4593
4594
4595static int
4596symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4597 PyObject *varnames, int flags)
4598{
Tim Petersb39903b2003-03-24 17:22:24 +00004599 PyObject *v = NULL;
4600 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004601 int i, pos;
4602
4603 if (flags & CO_VARARGS)
4604 argcount++;
4605 if (flags & CO_VARKEYWORDS)
4606 argcount++;
4607 for (i = argcount; --i >= 0; ) {
4608 v = PyList_GET_ITEM(varnames, i);
4609 if (PyDict_GetItem(*cellvars, v)) {
4610 if (list == NULL) {
4611 list = PyList_New(1);
4612 if (list == NULL)
4613 return -1;
4614 PyList_SET_ITEM(list, 0, v);
4615 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004616 } else {
4617 if (PyList_Insert(list, 0, v) < 0) {
4618 Py_DECREF(list);
4619 return -1;
4620 }
4621 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004622 }
4623 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00004624 if (list == NULL)
4625 return 0;
4626
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004627 /* There are cellvars that are also arguments. Create a dict
4628 to replace cellvars and put the args at the front.
4629 */
4630 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004631 if (d == NULL)
4632 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004633 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4634 v = PyInt_FromLong(i);
4635 if (v == NULL)
4636 goto fail;
4637 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4638 goto fail;
4639 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4640 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00004641 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004642 }
4643 pos = 0;
4644 i = PyList_GET_SIZE(list);
4645 Py_DECREF(list);
4646 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4647 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004648 if (w == NULL)
4649 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004650 if (PyDict_SetItem(d, v, w) < 0) {
4651 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00004652 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004653 goto fail;
4654 }
4655 Py_DECREF(w);
4656 }
4657 Py_DECREF(*cellvars);
4658 *cellvars = d;
4659 return 1;
4660 fail:
4661 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00004662 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004663 return -1;
4664}
4665
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004666static int
4667symtable_freevar_offsets(PyObject *freevars, int offset)
4668{
4669 PyObject *name, *v;
4670 int pos;
4671
4672 /* The cell vars are the first elements of the closure,
4673 followed by the free vars. Update the offsets in
4674 c_freevars to account for number of cellvars. */
4675 pos = 0;
4676 while (PyDict_Next(freevars, &pos, &name, &v)) {
4677 int i = PyInt_AS_LONG(v) + offset;
4678 PyObject *o = PyInt_FromLong(i);
4679 if (o == NULL)
4680 return -1;
4681 if (PyDict_SetItem(freevars, name, o) < 0) {
4682 Py_DECREF(o);
4683 return -1;
4684 }
4685 Py_DECREF(o);
4686 }
4687 return 0;
4688}
4689
4690static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004691symtable_check_unoptimized(struct compiling *c,
4692 PySymtableEntryObject *ste,
4693 struct symbol_info *si)
4694{
4695 char buf[300];
4696
4697 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4698 || (ste->ste_nested && si->si_nimplicit)))
4699 return 0;
4700
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004701#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4702
4703#define ILLEGAL_IS "is a nested function"
4704
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004705#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004706"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004707
4708#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004709"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004710
4711#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00004712"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004713"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004714
4715 /* XXX perhaps the linenos for these opt-breaking statements
4716 should be stored so the exception can point to them. */
4717
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004718 if (ste->ste_child_free) {
4719 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004720 PyOS_snprintf(buf, sizeof(buf),
4721 ILLEGAL_IMPORT_STAR,
4722 PyString_AS_STRING(ste->ste_name),
4723 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004724 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004725 PyOS_snprintf(buf, sizeof(buf),
4726 ILLEGAL_BARE_EXEC,
4727 PyString_AS_STRING(ste->ste_name),
4728 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004729 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004730 PyOS_snprintf(buf, sizeof(buf),
4731 ILLEGAL_EXEC_AND_IMPORT_STAR,
4732 PyString_AS_STRING(ste->ste_name),
4733 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004734 }
4735 } else {
4736 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004737 PyOS_snprintf(buf, sizeof(buf),
4738 ILLEGAL_IMPORT_STAR,
4739 PyString_AS_STRING(ste->ste_name),
4740 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004741 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004742 PyOS_snprintf(buf, sizeof(buf),
4743 ILLEGAL_BARE_EXEC,
4744 PyString_AS_STRING(ste->ste_name),
4745 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004746 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004747 PyOS_snprintf(buf, sizeof(buf),
4748 ILLEGAL_EXEC_AND_IMPORT_STAR,
4749 PyString_AS_STRING(ste->ste_name),
4750 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004751 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004752 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004753
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004754 PyErr_SetString(PyExc_SyntaxError, buf);
4755 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4756 ste->ste_opt_lineno);
4757 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004758}
4759
4760static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004761symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4762 struct symbol_info *si)
4763{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004764 if (c->c_future)
4765 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004766 if (ste->ste_generator)
4767 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004768 if (ste->ste_type != TYPE_MODULE)
4769 c->c_flags |= CO_NEWLOCALS;
4770 if (ste->ste_type == TYPE_FUNCTION) {
4771 c->c_nlocals = si->si_nlocals;
4772 if (ste->ste_optimized == 0)
4773 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004774 else if (ste->ste_optimized != OPT_EXEC)
4775 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004776 }
4777 return 0;
4778}
4779
4780static int
Jeremy Hylton98326132003-09-22 04:26:44 +00004781symtable_error(struct symtable *st, int lineno)
4782{
4783 if (lineno == 0)
4784 lineno = st->st_cur->ste_lineno;
4785 PyErr_SyntaxLocation(st->st_filename, lineno);
4786 st->st_errors++;
4787 return -1;
4788}
4789
4790static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004791symtable_load_symbols(struct compiling *c)
4792{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004793 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004794 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004795 PyObject *name, *varnames, *v;
4796 int i, flags, pos;
4797 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004798
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004799 v = NULL;
4800
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004801 if (symtable_init_compiling_symbols(c) < 0)
4802 goto fail;
4803 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004804 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004805 si.si_nlocals = PyList_GET_SIZE(varnames);
4806 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004807
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004808 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004809 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004810 if (v == NULL)
4811 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004812 if (PyDict_SetItem(c->c_locals,
4813 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004814 goto fail;
4815 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004816 }
4817
4818 /* XXX The cases below define the rules for whether a name is
4819 local or global. The logic could probably be clearer. */
4820 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004821 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4822 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004823
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004824 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004825 /* undo the original DEF_FREE */
4826 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004827
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004828 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004829 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004830 2. Free variables in methods that are also class
4831 variables or declared global.
4832 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004833 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004834 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004835
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004836 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004837 c->c_argcount--;
4838 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004839 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004840 c->c_argcount--;
4841 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004842 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004843 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004844 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004845 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00004846 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004847 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00004848 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004849 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004850 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004851 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4852 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004853 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004854 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00004855 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004856 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004857 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004858 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004859 if (v == NULL)
4860 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004861 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004862 goto fail;
4863 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004864 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004865 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004866 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004867 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004868 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004869 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004870 if (v == NULL)
4871 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004872 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004873 goto fail;
4874 Py_DECREF(v);
4875 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004876 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004877 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00004878 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004879 goto fail;
4880 if (st->st_nscopes != 1) {
4881 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004882 if (v == NULL)
4883 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004884 if (PyDict_SetItem(st->st_global,
4885 name, v))
4886 goto fail;
4887 Py_DECREF(v);
4888 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004889 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004890 }
4891 }
4892
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004893 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4894
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004895 if (si.si_ncells > 1) { /* one cell is always in order */
4896 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4897 c->c_varnames, c->c_flags) < 0)
4898 return -1;
4899 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004900 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4901 return -1;
4902 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004903 fail:
4904 /* is this always the right thing to do? */
4905 Py_XDECREF(v);
4906 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004907}
4908
4909static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004910symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004911{
4912 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004913
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004914 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004915 if (st == NULL)
4916 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004917 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00004918
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004919 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004920 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004921 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004922 goto fail;
4923 if ((st->st_symbols = PyDict_New()) == NULL)
4924 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004925 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004926 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004927 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004928 st->st_private = NULL;
4929 return st;
4930 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004931 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004932 return NULL;
4933}
4934
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004935void
4936PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004937{
4938 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004939 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004940 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004941 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004942}
4943
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004944/* When the compiler exits a scope, it must should update the scope's
4945 free variable information with the list of free variables in its
4946 children.
4947
4948 Variables that are free in children and defined in the current
4949 scope are cellvars.
4950
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004951 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004952 false), free variables in children that are not defined here are
4953 implicit globals.
4954
4955*/
4956
4957static int
4958symtable_update_free_vars(struct symtable *st)
4959{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004960 int i, j, def;
4961 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004962 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004963
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004964 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004965 def = DEF_FREE_CLASS;
4966 else
4967 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004968 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004969 int pos = 0;
4970
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00004971 if (list && PyList_SetSlice(list, 0,
4972 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004973 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00004974 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004975 PyList_GET_ITEM(ste->ste_children, i);
4976 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004977 int flags = PyInt_AS_LONG(o);
4978 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004979 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004980 if (list == NULL) {
4981 list = PyList_New(0);
4982 if (list == NULL)
4983 return -1;
4984 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004985 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004986 if (PyList_Append(list, name) < 0) {
4987 Py_DECREF(list);
4988 return -1;
4989 }
4990 }
4991 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004992 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004993 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004994 v = PyDict_GetItem(ste->ste_symbols, name);
4995 /* If a name N is declared global in scope A and
4996 referenced in scope B contained (perhaps
4997 indirectly) in A and there are no scopes
4998 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004999 is global in B. Unless A is a class scope,
5000 because class scopes are not considered for
5001 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005002 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005003 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005004 int flags = PyInt_AS_LONG(v);
5005 if (flags & DEF_GLOBAL) {
5006 symtable_undo_free(st, child->ste_id,
5007 name);
5008 continue;
5009 }
5010 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005011 if (ste->ste_nested) {
5012 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005013 name, def) < 0) {
5014 Py_DECREF(list);
5015 return -1;
5016 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005017 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005018 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005019 name) < 0) {
5020 Py_DECREF(list);
5021 return -1;
5022 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005023 }
5024 }
5025 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005026
5027 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005028 return 0;
5029}
5030
5031/* If the current scope is a non-nested class or if name is not
5032 defined in the current, non-nested scope, then it is an implicit
5033 global in all nested scopes.
5034*/
5035
5036static int
5037symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5038{
5039 PyObject *o;
5040 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005041 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005042
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005043 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005044 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005045 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005046 if (o == NULL)
5047 return symtable_undo_free(st, child, name);
5048 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005049
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005050 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005051 return symtable_undo_free(st, child, name);
5052 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005053 return symtable_add_def_o(st, ste->ste_symbols,
5054 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005055}
5056
5057static int
5058symtable_undo_free(struct symtable *st, PyObject *id,
5059 PyObject *name)
5060{
5061 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005062 PyObject *info;
5063 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005064
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005065 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5066 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005067 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005068
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005069 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005070 if (info == NULL)
5071 return 0;
5072 v = PyInt_AS_LONG(info);
5073 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005074 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005075 DEF_FREE_GLOBAL) < 0)
5076 return -1;
5077 } else
5078 /* If the name is defined here or declared global,
5079 then the recursion stops. */
5080 return 0;
5081
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005082 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5083 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005084 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005085 PyList_GET_ITEM(ste->ste_children, i);
5086 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005087 if (x < 0)
5088 return x;
5089 }
5090 return 0;
5091}
5092
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005093/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5094 This reference is released when the scope is exited, via the DECREF
5095 in symtable_exit_scope().
5096*/
5097
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005098static int
5099symtable_exit_scope(struct symtable *st)
5100{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005101 int end;
5102
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005103 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005104 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005105 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005106 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005107 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5108 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005109 if (PySequence_DelItem(st->st_stack, end) < 0)
5110 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005111 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005112}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005113
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005114static void
5115symtable_enter_scope(struct symtable *st, char *name, int type,
5116 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005117{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005118 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005119
5120 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005121 prev = st->st_cur;
5122 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005123 st->st_errors++;
5124 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005125 }
5126 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005127 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005128 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005129 if (st->st_cur == NULL) {
5130 st->st_errors++;
5131 return;
5132 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005133 if (strcmp(name, TOP) == 0)
5134 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005135 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005136 if (PyList_Append(prev->ste_children,
5137 (PyObject *)st->st_cur) < 0)
5138 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005139 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005140}
5141
5142static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005143symtable_lookup(struct symtable *st, char *name)
5144{
5145 char buffer[MANGLE_LEN];
5146 PyObject *v;
5147 int flags;
5148
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005149 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005150 name = buffer;
5151 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5152 if (v == NULL) {
5153 if (PyErr_Occurred())
5154 return -1;
5155 else
5156 return 0;
5157 }
5158
5159 flags = PyInt_AS_LONG(v);
5160 return flags;
5161}
5162
5163static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005164symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005165{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005166 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005167 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005168 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005169
Guido van Rossumb7164622002-08-16 02:48:11 +00005170 /* Warn about None, except inside a tuple (where the assignment
5171 code already issues a warning). */
5172 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5173 *name == 'N' && strcmp(name, "None") == 0)
5174 {
5175 if (symtable_warn(st, "argument named None"))
5176 return -1;
5177 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005178 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005179 name = buffer;
5180 if ((s = PyString_InternFromString(name)) == NULL)
5181 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005182 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5183 Py_DECREF(s);
5184 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005185}
5186
5187/* Must only be called with mangled names */
5188
5189static int
5190symtable_add_def_o(struct symtable *st, PyObject *dict,
5191 PyObject *name, int flag)
5192{
5193 PyObject *o;
5194 int val;
5195
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005196 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005197 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005198 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005199 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005200 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005201 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005202 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005203 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005204 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005205 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005206 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005207 if (o == NULL)
5208 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005209 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005210 Py_DECREF(o);
5211 return -1;
5212 }
5213 Py_DECREF(o);
5214
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005215 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005216 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005217 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005218 } else if (flag & DEF_GLOBAL) {
5219 /* XXX need to update DEF_GLOBAL for other flags too;
5220 perhaps only DEF_FREE_GLOBAL */
5221 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005222 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005223 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005224 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005225 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005226 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005227 if (o == NULL)
5228 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005229 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005230 Py_DECREF(o);
5231 return -1;
5232 }
5233 Py_DECREF(o);
5234 }
5235 return 0;
5236}
5237
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005238#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005239
Tim Peters08a898f2001-06-28 01:52:22 +00005240/* Look for a yield stmt under n. Return 1 if found, else 0.
5241 This hack is used to look inside "if 0:" blocks (which are normally
5242 ignored) in case those are the only places a yield occurs (so that this
5243 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005244static int
5245look_for_yield(node *n)
5246{
5247 int i;
5248
5249 for (i = 0; i < NCH(n); ++i) {
5250 node *kid = CHILD(n, i);
5251
5252 switch (TYPE(kid)) {
5253
5254 case classdef:
5255 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005256 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005257 /* Stuff in nested functions and classes can't make
5258 the parent a generator. */
5259 return 0;
5260
5261 case yield_stmt:
5262 return 1;
5263
5264 default:
5265 if (look_for_yield(kid))
5266 return 1;
5267 }
5268 }
5269 return 0;
5270}
5271
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005272static void
5273symtable_node(struct symtable *st, node *n)
5274{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005275 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005276
5277 loop:
5278 switch (TYPE(n)) {
5279 case funcdef: {
5280 char *func_name = STR(CHILD(n, 1));
5281 symtable_add_def(st, func_name, DEF_LOCAL);
5282 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005283 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005284 symtable_funcdef(st, n);
5285 symtable_exit_scope(st);
5286 break;
5287 }
5288 case lambdef:
5289 if (NCH(n) == 4)
5290 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005291 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005292 symtable_funcdef(st, n);
5293 symtable_exit_scope(st);
5294 break;
5295 case classdef: {
5296 char *tmp, *class_name = STR(CHILD(n, 1));
5297 symtable_add_def(st, class_name, DEF_LOCAL);
5298 if (TYPE(CHILD(n, 2)) == LPAR) {
5299 node *bases = CHILD(n, 3);
5300 int i;
5301 for (i = 0; i < NCH(bases); i += 2) {
5302 symtable_node(st, CHILD(bases, i));
5303 }
5304 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005305 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005306 tmp = st->st_private;
5307 st->st_private = class_name;
5308 symtable_node(st, CHILD(n, NCH(n) - 1));
5309 st->st_private = tmp;
5310 symtable_exit_scope(st);
5311 break;
5312 }
5313 case if_stmt:
5314 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005315 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5316 if (st->st_cur->ste_generator == 0)
5317 st->st_cur->ste_generator =
5318 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005319 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005320 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005321 symtable_node(st, CHILD(n, i + 1));
5322 symtable_node(st, CHILD(n, i + 3));
5323 }
5324 if (i + 2 < NCH(n))
5325 symtable_node(st, CHILD(n, i + 2));
5326 break;
5327 case global_stmt:
5328 symtable_global(st, n);
5329 break;
5330 case import_stmt:
5331 symtable_import(st, n);
5332 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005333 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005334 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005335 symtable_node(st, CHILD(n, 1));
5336 if (NCH(n) > 2)
5337 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005338 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005339 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005340 st->st_cur->ste_opt_lineno = n->n_lineno;
5341 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005342 if (NCH(n) > 4)
5343 symtable_node(st, CHILD(n, 5));
5344 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005345
5346 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005347 case assert_stmt:
5348 if (Py_OptimizeFlag)
5349 return;
5350 if (NCH(n) == 2) {
5351 n = CHILD(n, 1);
5352 goto loop;
5353 } else {
5354 symtable_node(st, CHILD(n, 1));
5355 n = CHILD(n, 3);
5356 goto loop;
5357 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005358 case except_clause:
5359 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005360 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005361 if (NCH(n) > 1) {
5362 n = CHILD(n, 1);
5363 goto loop;
5364 }
5365 break;
5366 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005367 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005368 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005369 case yield_stmt:
5370 st->st_cur->ste_generator = 1;
5371 n = CHILD(n, 1);
5372 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005373 case expr_stmt:
5374 if (NCH(n) == 1)
5375 n = CHILD(n, 0);
5376 else {
5377 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005378 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005379 symtable_node(st, CHILD(n, 2));
5380 break;
5381 } else {
5382 int i;
5383 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005384 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005385 n = CHILD(n, NCH(n) - 1);
5386 }
5387 }
5388 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005389 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005390 /* only occurs when there are multiple for loops
5391 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005392 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005393 if (TYPE(n) == list_for)
5394 symtable_list_for(st, n);
5395 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005396 REQ(n, list_if);
5397 symtable_node(st, CHILD(n, 1));
5398 if (NCH(n) == 3) {
5399 n = CHILD(n, 2);
5400 goto loop;
5401 }
5402 }
5403 break;
5404 case for_stmt:
5405 symtable_assign(st, CHILD(n, 1), 0);
5406 for (i = 3; i < NCH(n); ++i)
5407 if (TYPE(CHILD(n, i)) >= single_input)
5408 symtable_node(st, CHILD(n, i));
5409 break;
5410 /* The remaining cases fall through to default except in
5411 special circumstances. This requires the individual cases
5412 to be coded with great care, even though they look like
5413 rather innocuous. Each case must double-check TYPE(n).
5414 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005415 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005416 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005417 n = CHILD(n, 2);
5418 goto loop;
5419 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005420 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005421 case listmaker:
5422 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005423 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005424 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005425 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005426 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005427 case atom:
5428 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5429 symtable_add_use(st, STR(CHILD(n, 0)));
5430 break;
5431 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005432 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005433 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005434 /* Walk over every non-token child with a special case
5435 for one child.
5436 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005437 if (NCH(n) == 1) {
5438 n = CHILD(n, 0);
5439 goto loop;
5440 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005441 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005442 if (TYPE(CHILD(n, i)) >= single_input)
5443 symtable_node(st, CHILD(n, i));
5444 }
5445}
5446
5447static void
5448symtable_funcdef(struct symtable *st, node *n)
5449{
5450 node *body;
5451
5452 if (TYPE(n) == lambdef) {
5453 if (NCH(n) == 4)
5454 symtable_params(st, CHILD(n, 1));
5455 } else
5456 symtable_params(st, CHILD(n, 2));
5457 body = CHILD(n, NCH(n) - 1);
5458 symtable_node(st, body);
5459}
5460
5461/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00005462 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005463 which are references in the defining scope. symtable_params()
5464 parses the parameter names, which are defined in the function's
5465 body.
5466
5467 varargslist:
5468 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5469 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5470*/
5471
5472static void
5473symtable_default_args(struct symtable *st, node *n)
5474{
5475 node *c;
5476 int i;
5477
5478 if (TYPE(n) == parameters) {
5479 n = CHILD(n, 1);
5480 if (TYPE(n) == RPAR)
5481 return;
5482 }
5483 REQ(n, varargslist);
5484 for (i = 0; i < NCH(n); i += 2) {
5485 c = CHILD(n, i);
5486 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5487 break;
5488 }
5489 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5490 symtable_node(st, CHILD(n, i));
5491 }
5492}
5493
5494static void
5495symtable_params(struct symtable *st, node *n)
5496{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005497 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00005498 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005499
5500 if (TYPE(n) == parameters) {
5501 n = CHILD(n, 1);
5502 if (TYPE(n) == RPAR)
5503 return;
5504 }
5505 REQ(n, varargslist);
5506 for (i = 0; i < NCH(n); i += 2) {
5507 c = CHILD(n, i);
5508 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5509 ext = 1;
5510 break;
5511 }
5512 if (TYPE(c) == test) {
5513 continue;
5514 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00005515 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005516 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00005517 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005518 char nbuf[30];
5519 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005520 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005521 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005522 }
5523 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005524 if (ext) {
5525 c = CHILD(n, i);
5526 if (TYPE(c) == STAR) {
5527 i++;
5528 symtable_add_def(st, STR(CHILD(n, i)),
5529 DEF_PARAM | DEF_STAR);
5530 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005531 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005532 c = NULL;
5533 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005534 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005535 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005536 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005537 i++;
5538 symtable_add_def(st, STR(CHILD(n, i)),
5539 DEF_PARAM | DEF_DOUBLESTAR);
5540 }
5541 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005542 if (complex >= 0) {
5543 int j;
5544 for (j = 0; j <= complex; j++) {
5545 c = CHILD(n, j);
5546 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005547 c = CHILD(n, ++j);
5548 else if (TYPE(c) == EQUAL)
5549 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005550 if (TYPE(CHILD(c, 0)) == LPAR)
5551 symtable_params_fplist(st, CHILD(c, 1));
5552 }
5553 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005554}
5555
5556static void
5557symtable_params_fplist(struct symtable *st, node *n)
5558{
5559 int i;
5560 node *c;
5561
5562 REQ(n, fplist);
5563 for (i = 0; i < NCH(n); i += 2) {
5564 c = CHILD(n, i);
5565 REQ(c, fpdef);
5566 if (NCH(c) == 1)
5567 symtable_add_def(st, STR(CHILD(c, 0)),
5568 DEF_PARAM | DEF_INTUPLE);
5569 else
5570 symtable_params_fplist(st, CHILD(c, 1));
5571 }
5572
5573}
5574
5575static void
5576symtable_global(struct symtable *st, node *n)
5577{
5578 int i;
5579
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005580 /* XXX It might be helpful to warn about module-level global
5581 statements, but it's hard to tell the difference between
5582 module-level and a string passed to exec.
5583 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005584
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005585 for (i = 1; i < NCH(n); i += 2) {
5586 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005587 int flags;
5588
5589 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005590 if (flags < 0)
5591 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005592 if (flags && flags != DEF_GLOBAL) {
5593 char buf[500];
5594 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005595 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005596 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00005597 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005598 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005599 }
5600 else {
5601 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005602 PyOS_snprintf(buf, sizeof(buf),
5603 GLOBAL_AFTER_ASSIGN,
5604 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005605 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005606 PyOS_snprintf(buf, sizeof(buf),
5607 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005608 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005609 }
5610 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005611 symtable_add_def(st, name, DEF_GLOBAL);
5612 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005613}
5614
5615static void
5616symtable_list_comprehension(struct symtable *st, node *n)
5617{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005618 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005619 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005620
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005621 REQ(n, listmaker);
5622 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
5623 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005624 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005625 symtable_list_for(st, CHILD(n, 1));
5626 symtable_node(st, CHILD(n, 0));
5627 --st->st_cur->ste_tmpname;
5628}
5629
5630static void
5631symtable_list_for(struct symtable *st, node *n)
5632{
5633 REQ(n, list_for);
5634 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005635 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005636 symtable_node(st, CHILD(n, 3));
5637 if (NCH(n) == 5)
5638 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005639}
5640
5641static void
5642symtable_import(struct symtable *st, node *n)
5643{
5644 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005645 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005646 | 'from' dotted_name 'import'
5647 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005648 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005649 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005650 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005651 node *dotname = CHILD(n, 1);
5652 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5653 /* check for bogus imports */
5654 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5655 PyErr_SetString(PyExc_SyntaxError,
5656 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00005657 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005658 return;
5659 }
5660 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005661 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005662 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005663 if (symtable_warn(st,
5664 "import * only allowed at module level") < 0)
5665 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005666 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005667 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005668 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005669 } else {
5670 for (i = 3; i < NCH(n); i += 2) {
5671 node *c = CHILD(n, i);
5672 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005673 symtable_assign(st, CHILD(c, 2),
5674 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005675 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005676 symtable_assign(st, CHILD(c, 0),
5677 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005678 }
5679 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005680 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005681 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005682 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005683 }
5684 }
5685}
5686
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005687/* The third argument to symatble_assign() is a flag to be passed to
5688 symtable_add_def() if it is eventually called. The flag is useful
5689 to specify the particular type of assignment that should be
5690 recorded, e.g. an assignment caused by import.
5691 */
5692
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005693static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005694symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005695{
5696 node *tmp;
5697 int i;
5698
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005699 loop:
5700 switch (TYPE(n)) {
5701 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005702 /* invalid assignment, e.g. lambda x:x=2. The next
5703 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005704 return;
5705 case power:
5706 if (NCH(n) > 2) {
5707 for (i = 2; i < NCH(n); ++i)
5708 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5709 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005710 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005711 if (NCH(n) > 1) {
5712 symtable_node(st, CHILD(n, 0));
5713 symtable_node(st, CHILD(n, 1));
5714 } else {
5715 n = CHILD(n, 0);
5716 goto loop;
5717 }
5718 return;
5719 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005720 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5721 /* XXX This is an error, but the next pass
5722 will catch it. */
5723 return;
5724 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005725 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005726 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005727 }
5728 return;
5729 case exprlist:
5730 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00005731 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005732 if (NCH(n) == 1) {
5733 n = CHILD(n, 0);
5734 goto loop;
5735 }
5736 else {
5737 int i;
5738 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005739 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005740 return;
5741 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005742 case atom:
5743 tmp = CHILD(n, 0);
5744 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5745 n = CHILD(n, 1);
5746 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005747 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00005748 if (strcmp(STR(tmp), "__debug__") == 0) {
5749 PyErr_SetString(PyExc_SyntaxError,
5750 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00005751 symtable_error(st, n->n_lineno);
5752 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00005753 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005754 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005755 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005756 return;
5757 case dotted_as_name:
5758 if (NCH(n) == 3)
5759 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005760 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005761 else
5762 symtable_add_def(st,
5763 STR(CHILD(CHILD(n,
5764 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005765 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005766 return;
5767 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005768 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005769 return;
5770 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005771 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005772 return;
5773 default:
5774 if (NCH(n) == 0)
5775 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005776 if (NCH(n) == 1) {
5777 n = CHILD(n, 0);
5778 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005779 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005780 /* Should only occur for errors like x + 1 = 1,
5781 which will be caught in the next pass. */
5782 for (i = 0; i < NCH(n); ++i)
5783 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005784 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005785 }
5786}