blob: f94a3ac6f438889638027e3f25560b65b59e6ded [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
63#define LOCAL_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;
108 PyObject *empty;
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 Hettinger37a724d2003-09-15 21:43:16 +0000138 empty = PyTuple_New(0);
139 if (empty == NULL)
140 return NULL;
141 if (freevars == NULL)
142 freevars = empty;
143 if (cellvars == NULL)
144 cellvars = empty;
145
146 co = (PyObject *) PyCode_New(argcount, nlocals, stacksize, flags,
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000147 code, consts, names, varnames,
148 freevars, cellvars, filename, name,
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000149 firstlineno, lnotab);
150 Py_DECREF(empty);
151 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000152}
153
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000154static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000155code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000156{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000157 Py_XDECREF(co->co_code);
158 Py_XDECREF(co->co_consts);
159 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000160 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000161 Py_XDECREF(co->co_freevars);
162 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000163 Py_XDECREF(co->co_filename);
164 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000165 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000166 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000167}
168
Guido van Rossum79f25d91997-04-29 20:08:16 +0000169static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000170code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000171{
172 char buf[500];
173 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000174 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000175 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000176
Guido van Rossuma396a882000-04-07 01:21:36 +0000177 if (co->co_firstlineno != 0)
178 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000179 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000180 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000181 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000182 name = PyString_AS_STRING(co->co_name);
Barry Warsaw8f6d8682001-11-28 21:10:39 +0000183 PyOS_snprintf(buf, sizeof(buf),
184 "<code object %.100s at %p, file \"%.300s\", line %d>",
185 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000186 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000187}
188
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000189static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000190code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000191{
192 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000193 cmp = PyObject_Compare(co->co_name, cp->co_name);
194 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000195 cmp = co->co_argcount - cp->co_argcount;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000196 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000197 cmp = co->co_nlocals - cp->co_nlocals;
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_flags - cp->co_flags;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000200 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000201 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000202 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000203 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
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_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000206 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000207 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000208 if (cmp) return cmp;
209 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
210 if (cmp) return cmp;
211 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000212 return cmp;
213}
214
215static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000216code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000217{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000218 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000219 h0 = PyObject_Hash(co->co_name);
220 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000221 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000222 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000223 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000224 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000225 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000226 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000227 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000228 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000229 h5 = PyObject_Hash(co->co_freevars);
230 if (h5 == -1) return -1;
231 h6 = PyObject_Hash(co->co_cellvars);
232 if (h6 == -1) return -1;
233 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000234 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000235 if (h == -1) h = -2;
236 return h;
237}
238
Jeremy Hylton78891072001-03-01 06:09:34 +0000239/* XXX code objects need to participate in GC? */
240
Guido van Rossum79f25d91997-04-29 20:08:16 +0000241PyTypeObject PyCode_Type = {
242 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000243 0,
244 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000245 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000246 0,
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000247 (destructor)code_dealloc, /* tp_dealloc */
248 0, /* tp_print */
249 0, /* tp_getattr */
250 0, /* tp_setattr */
251 (cmpfunc)code_compare, /* tp_compare */
252 (reprfunc)code_repr, /* tp_repr */
253 0, /* tp_as_number */
254 0, /* tp_as_sequence */
255 0, /* tp_as_mapping */
256 (hashfunc)code_hash, /* tp_hash */
257 0, /* tp_call */
258 0, /* tp_str */
259 PyObject_GenericGetAttr, /* tp_getattro */
260 0, /* tp_setattro */
261 0, /* tp_as_buffer */
262 Py_TPFLAGS_DEFAULT, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000263 code_doc, /* tp_doc */
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000264 0, /* tp_traverse */
265 0, /* tp_clear */
266 0, /* tp_richcompare */
267 0, /* tp_weaklistoffset */
268 0, /* tp_iter */
269 0, /* tp_iternext */
270 0, /* tp_methods */
271 code_memberlist, /* tp_members */
272 0, /* tp_getset */
273 0, /* tp_base */
274 0, /* tp_dict */
275 0, /* tp_descr_get */
276 0, /* tp_descr_set */
277 0, /* tp_dictoffset */
278 0, /* tp_init */
279 0, /* tp_alloc */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000280 code_new, /* tp_new */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000281};
282
Guido van Rossum644a12b1997-04-09 19:24:53 +0000283#define NAME_CHARS \
284 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
285
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000286/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
287
288static int
289all_name_chars(unsigned char *s)
290{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000291 static char ok_name_char[256];
292 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000293
Guido van Rossumcd90c202001-02-09 15:06:42 +0000294 if (ok_name_char[*name_chars] == 0) {
295 unsigned char *p;
296 for (p = name_chars; *p; p++)
297 ok_name_char[*p] = 1;
298 }
299 while (*s) {
300 if (ok_name_char[*s++] == 0)
301 return 0;
302 }
303 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000304}
305
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000306static int
307intern_strings(PyObject *tuple)
308{
309 int i;
310
311 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
312 PyObject *v = PyTuple_GET_ITEM(tuple, i);
313 if (v == NULL || !PyString_Check(v)) {
314 Py_FatalError("non-string found in code slot");
315 PyErr_BadInternalCall();
316 return -1;
317 }
318 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
319 }
320 return 0;
321}
322
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000323#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
324#define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD)
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000325#define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE || op==CONTINUE_LOOP)
326#define GETJUMPTGT(arr, i) (GETARG(arr,i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+3))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000327#define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255
328
329static PyObject *
330optimize_code(PyObject *code, PyObject* consts)
331{
332 int i, j, codelen;
333 int tgt, tgttgt, opcode;
334 unsigned char *codestr;
335
336 /* Make a modifiable copy of the code string */
337 if (!PyString_Check(code))
338 goto exitUnchanged;
339 codelen = PyString_Size(code);
340 codestr = PyMem_Malloc(codelen);
Raymond Hettingerf4cf76d2003-04-24 05:45:23 +0000341 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000342 goto exitUnchanged;
343 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
344 assert(PyTuple_Check(consts));
345
Raymond Hettingerf4cf76d2003-04-24 05:45:23 +0000346 for (i=0 ; i<codelen-7 ; i += HAS_ARG(codestr[i]) ? 3 : 1) {
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000347 opcode = codestr[i];
348 switch (opcode) {
349
350 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP.
351 Note, only the first opcode is changed, the others still
352 perform normally if they happen to be jump targets. */
353 case LOAD_CONST:
354 j = GETARG(codestr, i);
355 if (codestr[i+3] != JUMP_IF_FALSE ||
356 codestr[i+6] != POP_TOP ||
357 !PyObject_IsTrue(PyTuple_GET_ITEM(consts, j)))
358 continue;
359 codestr[i] = JUMP_FORWARD;
360 SETARG(codestr, i, 4);
361 break;
362
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000363 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000364 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000365 case JUMP_FORWARD:
366 case JUMP_IF_FALSE:
367 case JUMP_IF_TRUE:
368 case JUMP_ABSOLUTE:
369 case CONTINUE_LOOP:
370 case SETUP_LOOP:
371 case SETUP_EXCEPT:
372 case SETUP_FINALLY:
373 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerf4cf76d2003-04-24 05:45:23 +0000374 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000375 continue;
376 tgttgt = GETJUMPTGT(codestr, tgt);
377 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
378 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000379 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000380 tgttgt -= i + 3; /* Calc relative jump addr */
381 if (tgttgt < 0) /* No backward relative jumps */
382 continue;
383 codestr[i] = opcode;
384 SETARG(codestr, i, tgttgt);
385 break;
386
387 case EXTENDED_ARG:
388 PyMem_Free(codestr);
389 goto exitUnchanged;
390 }
391 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000392 code = PyString_FromStringAndSize((char *)codestr, codelen);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000393 PyMem_Free(codestr);
394 return code;
395
396exitUnchanged:
397 Py_INCREF(code);
398 return code;
399}
400
Guido van Rossum79f25d91997-04-29 20:08:16 +0000401PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000402PyCode_New(int argcount, int nlocals, int stacksize, int flags,
403 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000404 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
405 PyObject *filename, PyObject *name, int firstlineno,
406 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000407{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000408 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000409 int i;
410 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000411 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000412 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000413 consts == NULL || !PyTuple_Check(consts) ||
414 names == NULL || !PyTuple_Check(names) ||
415 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000416 freevars == NULL || !PyTuple_Check(freevars) ||
417 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000418 name == NULL || !PyString_Check(name) ||
419 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000420 lnotab == NULL || !PyString_Check(lnotab) ||
421 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000422 PyErr_BadInternalCall();
423 return NULL;
424 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000425 intern_strings(names);
426 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000427 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000428 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000429 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000430 for (i = PyTuple_Size(consts); --i >= 0; ) {
431 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000432 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000433 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000434 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000435 continue;
436 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000437 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000438 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000439 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000440 co->co_argcount = argcount;
441 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000442 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000443 co->co_flags = flags;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000444 co->co_code = optimize_code(code, consts);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000445 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000446 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000447 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000448 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000449 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000450 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000451 Py_INCREF(freevars);
452 co->co_freevars = freevars;
453 Py_INCREF(cellvars);
454 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000455 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000456 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000457 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000458 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000459 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000460 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000461 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000462 if (PyTuple_GET_SIZE(freevars) == 0 &&
463 PyTuple_GET_SIZE(cellvars) == 0)
464 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000465 }
466 return co;
467}
468
469
470/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000471
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000472/* The compiler uses two passes to generate bytecodes. The first pass
473 builds the symbol table. The second pass generates the bytecode.
474
475 The first pass uses a single symtable struct. The second pass uses
476 a compiling struct for each code block. The compiling structs
477 share a reference to the symtable.
478
479 The two passes communicate via symtable_load_symbols() and via
480 is_local() and is_global(). The former initializes several slots
481 in the compiling struct: c_varnames, c_locals, c_nlocals,
482 c_argcount, c_globals, and c_flags.
483*/
484
Tim Peters2a7f3842001-06-09 09:26:21 +0000485/* All about c_lnotab.
486
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000487c_lnotab is an array of unsigned bytes disguised as a Python string. Since
488version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
489mapped to source code line #s via c_lnotab instead.
490
Tim Peters2a7f3842001-06-09 09:26:21 +0000491The array is conceptually a list of
492 (bytecode offset increment, line number increment)
493pairs. The details are important and delicate, best illustrated by example:
494
495 byte code offset source code line number
496 0 1
497 6 2
498 50 7
499 350 307
500 361 308
501
502The first trick is that these numbers aren't stored, only the increments
503from one row to the next (this doesn't really work, but it's a start):
504
505 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
506
507The second trick is that an unsigned byte can't hold negative values, or
508values larger than 255, so (a) there's a deep assumption that byte code
509offsets and their corresponding line #s both increase monotonically, and (b)
510if at least one column jumps by more than 255 from one row to the next, more
511than one pair is written to the table. In case #b, there's no way to know
512from looking at the table later how many were written. That's the delicate
513part. A user of c_lnotab desiring to find the source line number
514corresponding to a bytecode address A should do something like this
515
516 lineno = addr = 0
517 for addr_incr, line_incr in c_lnotab:
518 addr += addr_incr
519 if addr > A:
520 return lineno
521 lineno += line_incr
522
523In order for this to work, when the addr field increments by more than 255,
524the line # increment in each pair generated must be 0 until the remaining addr
525increment is < 256. So, in the example above, com_set_lineno should not (as
526was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
527255, 0, 45, 255, 0, 45.
528*/
529
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000530struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000531 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000532 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000533 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000534 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000535 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +0000536 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000537 PyObject *c_locals; /* dictionary (value=localID) */
538 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000539 PyObject *c_freevars; /* dictionary (value=None) */
540 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000541 int c_nlocals; /* index of next local */
542 int c_argcount; /* number of top-level arguments */
543 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000544 int c_nexti; /* index into c_code */
545 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000546 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000547 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000548 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000549 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000550 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000551 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +0000552 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000553 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000554 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000555 int c_stacklevel; /* Current stack level */
556 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000557 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000558 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000559 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000560 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000561 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000562 int c_nested; /* Is block nested funcdef or lamdef? */
563 int c_closure; /* Is nested w/freevars? */
564 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000565 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000566 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000567};
568
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000569static int
570is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000571{
572 if ((v & (USE | DEF_FREE))
573 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
574 return 1;
575 if (v & DEF_FREE_CLASS)
576 return 1;
577 return 0;
578}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000579
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000580static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000581com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000582{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000583 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
584
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000585 if (c == NULL) {
586 /* Error occurred via symtable call to
587 is_constant_false */
588 PyErr_SetString(exc, msg);
589 return;
590 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000591 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000592 if (c->c_lineno < 1 || c->c_interactive) {
593 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000594 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000595 return;
596 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000597 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000598 if (v == NULL)
599 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000600
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000601 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000602 if (line == NULL) {
603 Py_INCREF(Py_None);
604 line = Py_None;
605 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000606 if (exc == PyExc_SyntaxError) {
607 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
608 Py_None, line);
609 if (t == NULL)
610 goto exit;
611 w = Py_BuildValue("(OO)", v, t);
612 if (w == NULL)
613 goto exit;
614 PyErr_SetObject(exc, w);
615 } else {
616 /* Make sure additional exceptions are printed with
617 file and line, also. */
618 PyErr_SetObject(exc, v);
619 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
620 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000621 exit:
622 Py_XDECREF(t);
623 Py_XDECREF(v);
624 Py_XDECREF(w);
625 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000626}
627
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000628/* Interface to the block stack */
629
630static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000631block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000632{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000633 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000634 com_error(c, PyExc_SystemError,
635 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000636 }
637 else {
638 c->c_block[c->c_nblocks++] = type;
639 }
640}
641
642static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000643block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000644{
645 if (c->c_nblocks > 0)
646 c->c_nblocks--;
647 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000648 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000649 }
650}
651
Guido van Rossum681d79a1995-07-18 14:51:37 +0000652/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000653
Martin v. Löwis95292d62002-12-11 14:04:59 +0000654static int issue_warning(const char *, const char *, int);
655static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000656static void com_free(struct compiling *);
657static void com_push(struct compiling *, int);
658static void com_pop(struct compiling *, int);
659static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000660static void com_node(struct compiling *, node *);
661static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000662static void com_addbyte(struct compiling *, int);
663static void com_addint(struct compiling *, int);
664static void com_addoparg(struct compiling *, int, int);
665static void com_addfwref(struct compiling *, int, int *);
666static void com_backpatch(struct compiling *, int);
667static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
668static int com_addconst(struct compiling *, PyObject *);
669static int com_addname(struct compiling *, PyObject *);
670static void com_addopname(struct compiling *, int, node *);
671static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000672static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000673static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000674static void com_assign(struct compiling *, node *, int, node *);
675static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000676static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +0000677static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000678 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000679static PyObject *parsestrplus(struct compiling*, node *);
680static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000681static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000682
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000683static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000684
685/* symtable operations */
Jeremy Hylton1955fcf2003-07-15 20:23:26 +0000686static struct symtable *symtable_build(node *, PyFutureFeatures *,
687 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000688static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000689static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000690static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000691static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000692static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000693static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000694
695static void symtable_node(struct symtable *, node *);
696static void symtable_funcdef(struct symtable *, node *);
697static void symtable_default_args(struct symtable *, node *);
698static void symtable_params(struct symtable *, node *);
699static void symtable_params_fplist(struct symtable *, node *n);
700static void symtable_global(struct symtable *, node *);
701static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000702static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000703static void symtable_list_comprehension(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +0000704static void symtable_list_for(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000705
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000706static int symtable_update_free_vars(struct symtable *);
707static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
708static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
709
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000710/* helper */
711static void
712do_pad(int pad)
713{
714 int i;
715 for (i = 0; i < pad; ++i)
716 fprintf(stderr, " ");
717}
718
719static void
720dump(node *n, int pad, int depth)
721{
722 int i;
723 if (depth == 0)
724 return;
725 do_pad(pad);
726 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
727 if (depth > 0)
728 depth--;
729 for (i = 0; i < NCH(n); ++i)
730 dump(CHILD(n, i), pad + 1, depth);
731}
732
733#define DUMP(N) dump(N, 0, -1)
734
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000735static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000736com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000737{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000738 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000739 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
740 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000741 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000742 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000743 goto fail;
744 if ((c->c_const_dict = PyDict_New()) == NULL)
745 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000746 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000747 goto fail;
748 if ((c->c_name_dict = PyDict_New()) == NULL)
749 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000750 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000751 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000752 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
753 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000754 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000755 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000756 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000757 c->c_freevars = NULL;
758 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000759 c->c_nlocals = 0;
760 c->c_argcount = 0;
761 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000762 c->c_nexti = 0;
763 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000764 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000765 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000766 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000767 c->c_begin = 0;
768 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000769 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000770 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000771 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000772 c->c_stacklevel = 0;
773 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000774 c->c_firstlineno = 0;
775 c->c_last_addr = 0;
776 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000777 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000778 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000779 c->c_nested = 0;
780 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000781 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000782 return 1;
783
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000784 fail:
785 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000786 return 0;
787}
788
789static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000790com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000791{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000792 Py_XDECREF(c->c_code);
793 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000794 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000795 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000796 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000797 Py_XDECREF(c->c_globals);
798 Py_XDECREF(c->c_locals);
799 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000800 Py_XDECREF(c->c_freevars);
801 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000802 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000803 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +0000804 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000805}
806
807static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000808com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000809{
810 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000811 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +0000812 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000813 /*
814 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
815 c->c_filename, c->c_name, c->c_lineno,
816 c->c_nexti, c->c_stacklevel, n);
817 */
818 }
Guido van Rossum8b993a91997-01-17 21:04:03 +0000819}
820
821static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000822com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000823{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000824 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000825 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000826 else
827 c->c_stacklevel -= n;
828}
829
830static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000831com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000832{
833 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000834 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000835 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000836 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000837}
838
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000839static int
840com_check_size(PyObject **s, int offset)
841{
842 int len = PyString_GET_SIZE(*s);
843 if (offset >= len)
844 return _PyString_Resize(s, len * 2);
845 return 0;
846}
847
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000848static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000849com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000850{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000851 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000852 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +0000853 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000854 if (com_check_size(&c->c_code, c->c_nexti)) {
855 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000856 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000857 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000858 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000859}
860
861static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000862com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000863{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000864 com_addbyte(c, x & 0xff);
865 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000866}
867
868static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000869com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000870{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000871 char *p;
872 if (c->c_lnotab == NULL)
873 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000874 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
875 c->c_errors++;
876 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000877 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000878 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000879 *p++ = addr;
880 *p++ = line;
881 c->c_lnotab_next += 2;
882}
883
884static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000885com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000886{
887 c->c_lineno = lineno;
888 if (c->c_firstlineno == 0) {
889 c->c_firstlineno = c->c_last_line = lineno;
890 }
891 else {
892 int incr_addr = c->c_nexti - c->c_last_addr;
893 int incr_line = lineno - c->c_last_line;
Tim Peters2a7f3842001-06-09 09:26:21 +0000894 while (incr_addr > 255) {
895 com_add_lnotab(c, 255, 0);
896 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000897 }
Tim Peters2a7f3842001-06-09 09:26:21 +0000898 while (incr_line > 255) {
899 com_add_lnotab(c, incr_addr, 255);
900 incr_line -=255;
901 incr_addr = 0;
902 }
903 if (incr_addr > 0 || incr_line > 0)
904 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000905 c->c_last_addr = c->c_nexti;
906 c->c_last_line = lineno;
907 }
908}
909
910static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000911com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000912{
Fred Drakeef8ace32000-08-24 00:32:09 +0000913 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +0000914 if (extended_arg){
915 com_addbyte(c, EXTENDED_ARG);
916 com_addint(c, extended_arg);
917 arg &= 0xffff;
918 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000919 com_addbyte(c, op);
920 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000921}
922
923static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000924com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000925{
926 /* Compile a forward reference for backpatching */
927 int here;
928 int anchor;
929 com_addbyte(c, op);
930 here = c->c_nexti;
931 anchor = *p_anchor;
932 *p_anchor = here;
933 com_addint(c, anchor == 0 ? 0 : here - anchor);
934}
935
936static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000937com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000938{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000939 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000940 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000941 int dist;
942 int prev;
943 for (;;) {
944 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000945 prev = code[anchor] + (code[anchor+1] << 8);
946 dist = target - (anchor+2);
947 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000948 dist >>= 8;
949 code[anchor+1] = dist;
950 dist >>= 8;
951 if (dist) {
952 com_error(c, PyExc_SystemError,
953 "com_backpatch: offset too large");
954 break;
955 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000956 if (!prev)
957 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000958 anchor -= prev;
959 }
960}
961
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000962/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000963
964static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000965com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000966{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000967 PyObject *w, *t, *np=NULL;
968 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000969
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000970 t = Py_BuildValue("(OO)", v, v->ob_type);
971 if (t == NULL)
972 goto fail;
973 w = PyDict_GetItem(dict, t);
974 if (w != NULL) {
975 n = PyInt_AsLong(w);
976 } else {
977 n = PyList_Size(list);
978 np = PyInt_FromLong(n);
979 if (np == NULL)
980 goto fail;
981 if (PyList_Append(list, v) != 0)
982 goto fail;
983 if (PyDict_SetItem(dict, t, np) != 0)
984 goto fail;
985 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000986 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000987 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000988 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000989 fail:
990 Py_XDECREF(np);
991 Py_XDECREF(t);
992 c->c_errors++;
993 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000994}
995
996static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000997com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000998{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000999 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001000}
1001
1002static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001003com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001004{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001005 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001006}
1007
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001008int
1009_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001010{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001011 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001012 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001013 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001014 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1015 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001016 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001017 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001018 return 0; /* Don't mangle __extremely_long_names */
1019 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1020 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001021 /* Strip leading underscores from class name */
1022 while (*p == '_')
1023 p++;
1024 if (*p == '\0')
1025 return 0; /* Don't mangle if class is just underscores */
1026 plen = strlen(p);
1027 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001028 plen = maxlen-nlen-2; /* Truncate class name if too long */
1029 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001030 buffer[0] = '_';
1031 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001032 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001033 return 1;
1034}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001035
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001036static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001037com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001038{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001039 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001040 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001041 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001042
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001043 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001044 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001045 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001046 c->c_errors++;
1047 i = 255;
1048 }
1049 else {
1050 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001051 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001052 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001053 com_addoparg(c, op, i);
1054}
1055
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001056#define NAME_LOCAL 0
1057#define NAME_GLOBAL 1
1058#define NAME_DEFAULT 2
1059#define NAME_CLOSURE 3
1060
1061static int
1062com_lookup_arg(PyObject *dict, PyObject *name)
1063{
1064 PyObject *v = PyDict_GetItem(dict, name);
1065 if (v == NULL)
1066 return -1;
1067 else
1068 return PyInt_AS_LONG(v);
1069}
1070
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001071static int
1072none_assignment_check(struct compiling *c, char *name, int assigning)
1073{
1074 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1075 char *msg;
1076 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001077 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001078 else
1079 msg = "deleting None";
1080 if (issue_warning(msg, c->c_filename, c->c_lineno) < 0) {
1081 c->c_errors++;
1082 return -1;
1083 }
1084 }
1085 return 0;
1086}
1087
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001088static void
1089com_addop_varname(struct compiling *c, int kind, char *name)
1090{
1091 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001092 int i, reftype;
1093 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001094 int op = STOP_CODE;
1095 char buffer[MANGLE_LEN];
1096
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001097 if (kind != VAR_LOAD &&
1098 none_assignment_check(c, name, kind == VAR_STORE))
1099 {
1100 c->c_errors++;
1101 i = 255;
1102 goto done;
1103 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001104 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001105 name = buffer;
1106 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1107 c->c_errors++;
1108 i = 255;
1109 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001110 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001111
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001112 reftype = get_ref_type(c, name);
1113 switch (reftype) {
1114 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001115 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001116 scope = NAME_LOCAL;
1117 break;
1118 case GLOBAL_EXPLICIT:
1119 scope = NAME_GLOBAL;
1120 break;
1121 case GLOBAL_IMPLICIT:
1122 if (c->c_flags & CO_OPTIMIZED)
1123 scope = NAME_GLOBAL;
1124 break;
1125 case FREE:
1126 case CELL:
1127 scope = NAME_CLOSURE;
1128 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001129 }
1130
1131 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001132 if (scope == NAME_LOCAL)
1133 i = com_lookup_arg(c->c_locals, v);
1134 else if (reftype == FREE)
1135 i = com_lookup_arg(c->c_freevars, v);
1136 else if (reftype == CELL)
1137 i = com_lookup_arg(c->c_cellvars, v);
1138 if (i == -1) {
1139 c->c_errors++; /* XXX no exception set */
1140 i = 255;
1141 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001142 }
1143 Py_DECREF(v);
1144
1145 switch (kind) {
1146 case VAR_LOAD:
1147 switch (scope) {
1148 case NAME_LOCAL:
1149 op = LOAD_FAST;
1150 break;
1151 case NAME_GLOBAL:
1152 op = LOAD_GLOBAL;
1153 break;
1154 case NAME_DEFAULT:
1155 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001156 break;
1157 case NAME_CLOSURE:
1158 op = LOAD_DEREF;
1159 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001160 }
1161 break;
1162 case VAR_STORE:
1163 switch (scope) {
1164 case NAME_LOCAL:
1165 op = STORE_FAST;
1166 break;
1167 case NAME_GLOBAL:
1168 op = STORE_GLOBAL;
1169 break;
1170 case NAME_DEFAULT:
1171 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001172 break;
1173 case NAME_CLOSURE:
1174 op = STORE_DEREF;
1175 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001176 }
1177 break;
1178 case VAR_DELETE:
1179 switch (scope) {
1180 case NAME_LOCAL:
1181 op = DELETE_FAST;
1182 break;
1183 case NAME_GLOBAL:
1184 op = DELETE_GLOBAL;
1185 break;
1186 case NAME_DEFAULT:
1187 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001188 break;
1189 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001190 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001191 PyOS_snprintf(buf, sizeof(buf),
1192 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001193 com_error(c, PyExc_SyntaxError, buf);
1194 i = 255;
1195 break;
1196 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001197 }
1198 break;
1199 }
1200done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001201 com_addoparg(c, op, i);
1202}
1203
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001204static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001205com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001206{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001207 char *name;
1208 char buffer[1000];
1209 /* XXX it is possible to write this code without the 1000
1210 chars on the total length of dotted names, I just can't be
1211 bothered right now */
1212 if (TYPE(n) == STAR)
1213 name = "*";
1214 else if (TYPE(n) == dotted_name) {
1215 char *p = buffer;
1216 int i;
1217 name = buffer;
1218 for (i = 0; i < NCH(n); i += 2) {
1219 char *s = STR(CHILD(n, i));
1220 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001221 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001222 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001223 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001224 break;
1225 }
1226 if (p != buffer)
1227 *p++ = '.';
1228 strcpy(p, s);
1229 p = strchr(p, '\0');
1230 }
1231 }
1232 else {
1233 REQ(n, NAME);
1234 name = STR(n);
1235 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001236 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001237}
1238
Guido van Rossum79f25d91997-04-29 20:08:16 +00001239static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001240parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001241{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001242 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001243 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001244 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001245#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001246 int imflag;
1247#endif
1248
Guido van Rossum282914b1991-04-04 10:42:56 +00001249 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001250 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001251#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001252 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001253#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001254 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001255 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001256 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001257 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001258 if (x < 0 && errno == 0) {
Guido van Rossum715eca92002-08-12 21:54:46 +00001259 if (PyErr_WarnExplicit(
Barry Warsaw9f007392002-08-14 15:51:29 +00001260 PyExc_FutureWarning,
Guido van Rossum715eca92002-08-12 21:54:46 +00001261 "hex/oct constants > sys.maxint "
1262 "will return positive values "
1263 "in Python 2.4 and up",
Martin v. Löwis95292d62002-12-11 14:04:59 +00001264 /* XXX: Give WarnExplicit
1265 a const char* argument. */
1266 (char*)c->c_filename,
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001267 c->c_lineno,
Guido van Rossum715eca92002-08-12 21:54:46 +00001268 NULL,
1269 NULL) < 0)
Guido van Rossum078151d2002-08-11 04:24:12 +00001270 return NULL;
Guido van Rossum3cb8e542002-08-11 14:06:15 +00001271 errno = 0; /* Might be changed by PyErr_Warn() */
Guido van Rossum078151d2002-08-11 04:24:12 +00001272 }
1273 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001274 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001275 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001276 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001277 if (errno != 0)
1278 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001279 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001280 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001281 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001282#ifndef WITHOUT_COMPLEX
1283 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001284 Py_complex z;
1285 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001286 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001287 z.imag = atof(s);
1288 PyFPE_END_PROTECT(z)
1289 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001290 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001291 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001292#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001293 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001294 PyFPE_START_PROTECT("atof", return 0)
1295 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001296 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001297 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001298 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001299}
1300
Guido van Rossum79f25d91997-04-29 20:08:16 +00001301static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001302decode_utf8(char **sPtr, char *end, char* encoding)
1303{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001304#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001305 Py_FatalError("decode_utf8 should not be called in this build.");
1306 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001307#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001308 PyObject *u, *v;
1309 char *s, *t;
1310 t = s = *sPtr;
1311 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1312 while (s < end && (*s & 0x80)) s++;
1313 *sPtr = s;
1314 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1315 if (u == NULL)
1316 return NULL;
1317 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1318 Py_DECREF(u);
1319 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001320#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001321}
1322
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001323/* compiler.transformer.Transformer.decode_literal depends on what
1324 might seem like minor details of this function -- changes here
1325 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001326static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001327parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001328{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001329 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001330 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001331 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001332 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001333 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001334 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001335 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001336
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001337 if (isalpha(quote) || quote == '_') {
1338 if (quote == 'u' || quote == 'U') {
1339 quote = *++s;
1340 unicode = 1;
1341 }
1342 if (quote == 'r' || quote == 'R') {
1343 quote = *++s;
1344 rawmode = 1;
1345 }
1346 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001347 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001348 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001349 return NULL;
1350 }
1351 s++;
1352 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001353 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001354 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001355 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001356 return NULL;
1357 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001358 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001359 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001360 return NULL;
1361 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001362 if (len >= 4 && s[0] == quote && s[1] == quote) {
1363 s += 2;
1364 len -= 2;
1365 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001366 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001367 return NULL;
1368 }
1369 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001370#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001371 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001372 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001373 char *buf;
1374 char *p;
1375 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001376 if (encoding == NULL) {
1377 buf = s;
1378 u = NULL;
1379 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1380 buf = s;
1381 u = NULL;
1382 } else {
1383 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1384 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1385 if (u == NULL)
1386 return NULL;
1387 p = buf = PyString_AsString(u);
1388 end = s + len;
1389 while (s < end) {
1390 if (*s == '\\') {
1391 *p++ = *s++;
1392 if (*s & 0x80) {
1393 strcpy(p, "u005c");
1394 p += 5;
1395 }
1396 }
1397 if (*s & 0x80) { /* XXX inefficient */
1398 char *r;
1399 int rn, i;
1400 w = decode_utf8(&s, end, "utf-16-be");
1401 if (w == NULL) {
1402 Py_DECREF(u);
1403 return NULL;
1404 }
1405 r = PyString_AsString(w);
1406 rn = PyString_Size(w);
1407 assert(rn % 2 == 0);
1408 for (i = 0; i < rn; i += 2) {
1409 sprintf(p, "\\u%02x%02x",
1410 r[i + 0] & 0xFF,
1411 r[i + 1] & 0xFF);
1412 p += 6;
1413 }
1414 Py_DECREF(w);
1415 } else {
1416 *p++ = *s++;
1417 }
1418 }
1419 len = p - buf;
1420 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001421 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001422 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001423 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001424 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1425 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001426 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001427 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001428 return v;
1429
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001430 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001431#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001432 need_encoding = (encoding != NULL &&
1433 strcmp(encoding, "utf-8") != 0 &&
1434 strcmp(encoding, "iso-8859-1") != 0);
1435 if (rawmode || strchr(s, '\\') == NULL) {
1436 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001437#ifndef Py_USING_UNICODE
1438 /* This should not happen - we never see any other
1439 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001440 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001441#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001442 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1443 if (u == NULL)
1444 return NULL;
1445 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1446 Py_DECREF(u);
1447 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001448#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001449 } else {
1450 return PyString_FromStringAndSize(s, len);
1451 }
1452 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001453
1454 v = PyString_DecodeEscape(s, len, NULL, unicode,
1455 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001456 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001457 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001458 return v;
1459}
1460
Guido van Rossum79f25d91997-04-29 20:08:16 +00001461static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001462parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001463{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001464 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001465 int i;
1466 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001467 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001468 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001469 for (i = 1; i < NCH(n); i++) {
1470 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001471 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001472 if (s == NULL)
1473 goto onError;
1474 if (PyString_Check(v) && PyString_Check(s)) {
1475 PyString_ConcatAndDel(&v, s);
1476 if (v == NULL)
1477 goto onError;
1478 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001479#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001480 else {
1481 PyObject *temp;
1482 temp = PyUnicode_Concat(v, s);
1483 Py_DECREF(s);
1484 if (temp == NULL)
1485 goto onError;
1486 Py_DECREF(v);
1487 v = temp;
1488 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001489#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001490 }
1491 }
1492 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001493
1494 onError:
1495 Py_XDECREF(v);
1496 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001497}
1498
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001499static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001500com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001501{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001502 int anchor = 0;
1503 int save_begin = c->c_begin;
1504
1505 /* list_iter: for v in expr [list_iter] */
1506 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001507 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001508 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001509 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001510 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001511 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001512 c->c_loops++;
1513 com_list_iter(c, n, e, t);
1514 c->c_loops--;
1515 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1516 c->c_begin = save_begin;
1517 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001518 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001519}
1520
1521static void
1522com_list_if(struct compiling *c, node *n, node *e, char *t)
1523{
1524 int anchor = 0;
1525 int a = 0;
1526 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001527 com_node(c, CHILD(n, 1));
1528 com_addfwref(c, JUMP_IF_FALSE, &a);
1529 com_addbyte(c, POP_TOP);
1530 com_pop(c, 1);
1531 com_list_iter(c, n, e, t);
1532 com_addfwref(c, JUMP_FORWARD, &anchor);
1533 com_backpatch(c, a);
1534 /* We jump here with an extra entry which we now pop */
1535 com_addbyte(c, POP_TOP);
1536 com_backpatch(c, anchor);
1537}
1538
1539static void
1540com_list_iter(struct compiling *c,
1541 node *p, /* parent of list_iter node */
1542 node *e, /* element expression node */
1543 char *t /* name of result list temp local */)
1544{
1545 /* list_iter is the last child in a listmaker, list_for, or list_if */
1546 node *n = CHILD(p, NCH(p)-1);
1547 if (TYPE(n) == list_iter) {
1548 n = CHILD(n, 0);
1549 switch (TYPE(n)) {
1550 case list_for:
1551 com_list_for(c, n, e, t);
1552 break;
1553 case list_if:
1554 com_list_if(c, n, e, t);
1555 break;
1556 default:
1557 com_error(c, PyExc_SystemError,
1558 "invalid list_iter node type");
1559 }
1560 }
1561 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001562 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001563 com_push(c, 1);
1564 com_node(c, e);
1565 com_addoparg(c, CALL_FUNCTION, 1);
1566 com_addbyte(c, POP_TOP);
1567 com_pop(c, 2);
1568 }
1569}
1570
1571static void
1572com_list_comprehension(struct compiling *c, node *n)
1573{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001574 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001575 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001576
1577 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001578 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001579 com_addoparg(c, BUILD_LIST, 0);
1580 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1581 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001582 com_addop_name(c, LOAD_ATTR, "append");
1583 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001584 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001585 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001586 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001587 --c->c_tmpname;
1588}
1589
1590static void
1591com_listmaker(struct compiling *c, node *n)
1592{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001593 /* listmaker: test ( list_for | (',' test)* [','] ) */
1594 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001595 com_list_comprehension(c, n);
1596 else {
1597 int len = 0;
1598 int i;
1599 for (i = 0; i < NCH(n); i += 2, len++)
1600 com_node(c, CHILD(n, i));
1601 com_addoparg(c, BUILD_LIST, len);
1602 com_pop(c, len-1);
1603 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001604}
1605
1606static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001607com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001608{
1609 int i;
1610 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1611 for (i = 0; i+2 < NCH(n); i += 4) {
1612 /* We must arrange things just right for STORE_SUBSCR.
1613 It wants the stack to look like (value) (dict) (key) */
1614 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001615 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001616 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00001617 com_node(c, CHILD(n, i+2)); /* value */
1618 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001619 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001620 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001621 }
1622}
1623
1624static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001625com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001626{
1627 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001628 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001629 int i;
1630 REQ(n, atom);
1631 ch = CHILD(n, 0);
1632 switch (TYPE(ch)) {
1633 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001634 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001635 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001636 com_push(c, 1);
1637 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001638 else
1639 com_node(c, CHILD(n, 1));
1640 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001641 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001642 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001643 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001644 com_push(c, 1);
1645 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001646 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001647 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001648 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001649 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001650 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001651 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001652 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001653 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001654 break;
1655 case BACKQUOTE:
1656 com_node(c, CHILD(n, 1));
1657 com_addbyte(c, UNARY_CONVERT);
1658 break;
1659 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001660 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001661 i = 255;
1662 }
1663 else {
1664 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001665 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001666 }
1667 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001668 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001669 break;
1670 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001671 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001672 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001673 c->c_errors++;
1674 i = 255;
1675 }
1676 else {
1677 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001678 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001679 }
1680 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001681 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001682 break;
1683 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001684 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001685 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001686 break;
1687 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001688 com_error(c, PyExc_SystemError,
1689 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001690 }
1691}
1692
1693static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001694com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001695{
1696 if (NCH(n) == 1) {
1697 com_addbyte(c, op);
1698 }
1699 else if (NCH(n) == 2) {
1700 if (TYPE(CHILD(n, 0)) != COLON) {
1701 com_node(c, CHILD(n, 0));
1702 com_addbyte(c, op+1);
1703 }
1704 else {
1705 com_node(c, CHILD(n, 1));
1706 com_addbyte(c, op+2);
1707 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001708 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001709 }
1710 else {
1711 com_node(c, CHILD(n, 0));
1712 com_node(c, CHILD(n, 2));
1713 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001714 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001715 }
1716}
1717
Guido van Rossum635abd21997-01-06 22:56:52 +00001718static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001719com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1720{
1721 if (NCH(n) == 1) {
1722 com_addbyte(c, DUP_TOP);
1723 com_push(c, 1);
1724 com_addbyte(c, SLICE);
1725 com_node(c, augn);
1726 com_addbyte(c, opcode);
1727 com_pop(c, 1);
1728 com_addbyte(c, ROT_TWO);
1729 com_addbyte(c, STORE_SLICE);
1730 com_pop(c, 2);
1731 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1732 com_node(c, CHILD(n, 0));
1733 com_addoparg(c, DUP_TOPX, 2);
1734 com_push(c, 2);
1735 com_addbyte(c, SLICE+1);
1736 com_pop(c, 1);
1737 com_node(c, augn);
1738 com_addbyte(c, opcode);
1739 com_pop(c, 1);
1740 com_addbyte(c, ROT_THREE);
1741 com_addbyte(c, STORE_SLICE+1);
1742 com_pop(c, 3);
1743 } else if (NCH(n) == 2) {
1744 com_node(c, CHILD(n, 1));
1745 com_addoparg(c, DUP_TOPX, 2);
1746 com_push(c, 2);
1747 com_addbyte(c, SLICE+2);
1748 com_pop(c, 1);
1749 com_node(c, augn);
1750 com_addbyte(c, opcode);
1751 com_pop(c, 1);
1752 com_addbyte(c, ROT_THREE);
1753 com_addbyte(c, STORE_SLICE+2);
1754 com_pop(c, 3);
1755 } else {
1756 com_node(c, CHILD(n, 0));
1757 com_node(c, CHILD(n, 2));
1758 com_addoparg(c, DUP_TOPX, 3);
1759 com_push(c, 3);
1760 com_addbyte(c, SLICE+3);
1761 com_pop(c, 2);
1762 com_node(c, augn);
1763 com_addbyte(c, opcode);
1764 com_pop(c, 1);
1765 com_addbyte(c, ROT_FOUR);
1766 com_addbyte(c, STORE_SLICE+3);
1767 com_pop(c, 4);
1768 }
1769}
1770
1771static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001772com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001773{
1774 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001775 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001776 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001777 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001778 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001779 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001780 }
1781 else {
1782 com_node(c, CHILD(n, 0));
1783 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001784 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001785 }
1786 m = n;
1787 do {
1788 m = CHILD(m, 0);
1789 } while (NCH(m) == 1);
1790 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001791 /* f(lambda x: x[0] = 3) ends up getting parsed with
1792 * LHS test = lambda x: x[0], and RHS test = 3.
1793 * SF bug 132313 points out that complaining about a keyword
1794 * then is very confusing.
1795 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001796 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001797 TYPE(m) == lambdef ?
1798 "lambda cannot contain assignment" :
1799 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001800 }
1801 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001802 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00001803 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00001804 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001805 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001806 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001807 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001808 else if (*pkeywords == NULL) {
1809 c->c_errors++;
1810 Py_DECREF(v);
1811 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001812 if (PyDict_GetItem(*pkeywords, v) != NULL)
1813 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001814 "duplicate keyword argument");
1815 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001816 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001817 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001818 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001819 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001820 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001821 }
1822 }
1823 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001824}
1825
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001826static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001827com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001828{
1829 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001830 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001831 }
1832 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001833 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001834 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001835 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001836 int star_flag = 0;
1837 int starstar_flag = 0;
1838 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001839 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001840 na = 0;
1841 nk = 0;
1842 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001843 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001844 if (TYPE(ch) == STAR ||
1845 TYPE(ch) == DOUBLESTAR)
1846 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001847 if (ch->n_lineno != lineno) {
1848 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001849 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00001850 }
1851 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001852 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001853 na++;
1854 else
1855 nk++;
1856 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001857 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001858 while (i < NCH(n)) {
1859 node *tok = CHILD(n, i);
1860 node *ch = CHILD(n, i+1);
1861 i += 3;
1862 switch (TYPE(tok)) {
1863 case STAR: star_flag = 1; break;
1864 case DOUBLESTAR: starstar_flag = 1; break;
1865 }
1866 com_node(c, ch);
1867 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001868 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001869 com_error(c, PyExc_SyntaxError,
1870 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001871 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001872 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001873 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001874 star_flag + (starstar_flag << 1);
1875 else
1876 opcode = CALL_FUNCTION;
1877 com_addoparg(c, opcode, na | (nk << 8));
1878 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001879 }
1880}
1881
1882static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001883com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001884{
1885 com_addopname(c, LOAD_ATTR, n);
1886}
1887
1888static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001889com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001890{
1891 int i=0;
1892 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001893 node *ch;
1894
1895 /* first argument */
1896 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001897 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001898 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001899 i++;
1900 }
1901 else {
1902 com_node(c, CHILD(n,i));
1903 i++;
1904 REQ(CHILD(n,i),COLON);
1905 i++;
1906 }
1907 /* second argument */
1908 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1909 com_node(c, CHILD(n,i));
1910 i++;
1911 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001912 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001913 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001914 com_push(c, 1);
1915 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001916 /* remaining arguments */
1917 for (; i < NCH(n); i++) {
1918 ns++;
1919 ch=CHILD(n,i);
1920 REQ(ch, sliceop);
1921 if (NCH(ch) == 1) {
1922 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001923 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001924 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001925 }
1926 else
1927 com_node(c, CHILD(ch,1));
1928 }
1929 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001930 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001931}
1932
1933static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001934com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001935{
1936 node *ch;
1937 REQ(n, subscript);
1938 ch = CHILD(n,0);
1939 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001940 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001941 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001942 com_push(c, 1);
1943 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001944 else {
1945 /* check for slice */
1946 if ((TYPE(ch) == COLON || NCH(n) > 1))
1947 com_sliceobj(c, n);
1948 else {
1949 REQ(ch, test);
1950 com_node(c, ch);
1951 }
1952 }
1953}
1954
1955static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001956com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001957{
1958 int i, op;
1959 REQ(n, subscriptlist);
1960 /* Check to make backward compatible slice behavior for '[i:j]' */
1961 if (NCH(n) == 1) {
1962 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001963 /* 'Basic' slice, should have exactly one colon. */
1964 if ((TYPE(CHILD(sub, 0)) == COLON
1965 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1966 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1967 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001968 switch (assigning) {
1969 case OP_DELETE:
1970 op = DELETE_SLICE;
1971 break;
1972 case OP_ASSIGN:
1973 op = STORE_SLICE;
1974 break;
1975 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001976 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001977 break;
1978 default:
1979 com_augassign_slice(c, sub, assigning, augn);
1980 return;
1981 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001982 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001983 if (op == STORE_SLICE)
1984 com_pop(c, 2);
1985 else if (op == DELETE_SLICE)
1986 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001987 return;
1988 }
1989 }
1990 /* Else normal subscriptlist. Compile each subscript. */
1991 for (i = 0; i < NCH(n); i += 2)
1992 com_subscript(c, CHILD(n, i));
1993 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001994 if (NCH(n) > 1) {
1995 i = (NCH(n)+1) / 2;
1996 com_addoparg(c, BUILD_TUPLE, i);
1997 com_pop(c, i-1);
1998 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001999 switch (assigning) {
2000 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002001 op = DELETE_SUBSCR;
2002 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002003 break;
2004 default:
2005 case OP_ASSIGN:
2006 op = STORE_SUBSCR;
2007 i = 3;
2008 break;
2009 case OP_APPLY:
2010 op = BINARY_SUBSCR;
2011 i = 1;
2012 break;
2013 }
2014 if (assigning > OP_APPLY) {
2015 com_addoparg(c, DUP_TOPX, 2);
2016 com_push(c, 2);
2017 com_addbyte(c, BINARY_SUBSCR);
2018 com_pop(c, 1);
2019 com_node(c, augn);
2020 com_addbyte(c, assigning);
2021 com_pop(c, 1);
2022 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002023 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002024 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002025 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002026}
2027
2028static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002029com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002030{
2031 REQ(n, trailer);
2032 switch (TYPE(CHILD(n, 0))) {
2033 case LPAR:
2034 com_call_function(c, CHILD(n, 1));
2035 break;
2036 case DOT:
2037 com_select_member(c, CHILD(n, 1));
2038 break;
2039 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002040 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002041 break;
2042 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002043 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002044 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002045 }
2046}
2047
2048static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002049com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002050{
2051 int i;
2052 REQ(n, power);
2053 com_atom(c, CHILD(n, 0));
2054 for (i = 1; i < NCH(n); i++) {
2055 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2056 com_factor(c, CHILD(n, i+1));
2057 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002058 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002059 break;
2060 }
2061 else
2062 com_apply_trailer(c, CHILD(n, i));
2063 }
2064}
2065
2066static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002067com_invert_constant(struct compiling *c, node *n)
2068{
2069 /* Compute the inverse of int and longs and use them directly,
2070 but be prepared to generate code for all other
2071 possibilities (invalid numbers, floats, complex).
2072 */
2073 PyObject *num, *inv = NULL;
2074 int i;
2075
2076 REQ(n, NUMBER);
2077 num = parsenumber(c, STR(n));
2078 if (num == NULL)
2079 i = 255;
2080 else {
2081 inv = PyNumber_Invert(num);
2082 if (inv == NULL) {
2083 PyErr_Clear();
2084 i = com_addconst(c, num);
2085 } else {
2086 i = com_addconst(c, inv);
2087 Py_DECREF(inv);
2088 }
2089 Py_DECREF(num);
2090 }
2091 com_addoparg(c, LOAD_CONST, i);
2092 com_push(c, 1);
2093 if (num != NULL && inv == NULL)
2094 com_addbyte(c, UNARY_INVERT);
2095}
2096
Tim Peters51e26512001-09-07 08:45:55 +00002097static int
2098is_float_zero(const char *p)
2099{
2100 int found_radix_point = 0;
2101 int ch;
2102 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2103 switch (ch) {
2104 case '0':
2105 /* no reason to believe it's not 0 -- continue */
2106 break;
2107
2108 case 'e': case 'E': case 'j': case 'J':
2109 /* If this was a hex constant, we already would have
2110 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2111 must be an exponent marker, and we haven't yet
2112 seen a non-zero digit, and it doesn't matter what
2113 the exponent is then. For 'j' or 'J' similarly,
2114 except that this is an imaginary 0 then. */
2115 return 1;
2116
2117 case '.':
2118 found_radix_point = 1;
2119 break;
2120
2121 default:
2122 return 0;
2123 }
2124 }
2125 return found_radix_point;
2126}
2127
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002128static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002129com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002130{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002131 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002132 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002133 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002134 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002135 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002136 approriate value as a constant. If the value is negative,
2137 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002138 negative in the 0th position -- unless we're doing unary minus
2139 of a floating zero! In that case the sign is significant, but
2140 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002141 */
2142 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002143 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002144 && TYPE((pfactor = CHILD(n, 1))) == factor
2145 && NCH(pfactor) == 1
2146 && TYPE((ppower = CHILD(pfactor, 0))) == power
2147 && NCH(ppower) == 1
2148 && TYPE((patom = CHILD(ppower, 0))) == atom
2149 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002150 && !(childtype == MINUS &&
2151 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002152 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002153 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002154 return;
2155 }
2156 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002157 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002158 if (s == NULL) {
2159 com_error(c, PyExc_MemoryError, "");
2160 com_addbyte(c, 255);
2161 return;
2162 }
2163 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002164 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002165 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002166 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002167 }
Tim Peters51e26512001-09-07 08:45:55 +00002168 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002169 }
2170 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002171 com_factor(c, CHILD(n, 1));
2172 com_addbyte(c, UNARY_POSITIVE);
2173 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002174 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002175 com_factor(c, CHILD(n, 1));
2176 com_addbyte(c, UNARY_NEGATIVE);
2177 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002178 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002179 com_factor(c, CHILD(n, 1));
2180 com_addbyte(c, UNARY_INVERT);
2181 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002182 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002183 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002184 }
2185}
2186
2187static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002188com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002189{
2190 int i;
2191 int op;
2192 REQ(n, term);
2193 com_factor(c, CHILD(n, 0));
2194 for (i = 2; i < NCH(n); i += 2) {
2195 com_factor(c, CHILD(n, i));
2196 switch (TYPE(CHILD(n, i-1))) {
2197 case STAR:
2198 op = BINARY_MULTIPLY;
2199 break;
2200 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002201 if (c->c_flags & CO_FUTURE_DIVISION)
2202 op = BINARY_TRUE_DIVIDE;
2203 else
2204 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002205 break;
2206 case PERCENT:
2207 op = BINARY_MODULO;
2208 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002209 case DOUBLESLASH:
2210 op = BINARY_FLOOR_DIVIDE;
2211 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002212 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002213 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002214 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002215 op = 255;
2216 }
2217 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002218 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002219 }
2220}
2221
2222static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002223com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002224{
2225 int i;
2226 int op;
2227 REQ(n, arith_expr);
2228 com_term(c, CHILD(n, 0));
2229 for (i = 2; i < NCH(n); i += 2) {
2230 com_term(c, CHILD(n, i));
2231 switch (TYPE(CHILD(n, i-1))) {
2232 case PLUS:
2233 op = BINARY_ADD;
2234 break;
2235 case MINUS:
2236 op = BINARY_SUBTRACT;
2237 break;
2238 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002239 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002240 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002241 op = 255;
2242 }
2243 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002244 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002245 }
2246}
2247
2248static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002249com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002250{
2251 int i;
2252 int op;
2253 REQ(n, shift_expr);
2254 com_arith_expr(c, CHILD(n, 0));
2255 for (i = 2; i < NCH(n); i += 2) {
2256 com_arith_expr(c, CHILD(n, i));
2257 switch (TYPE(CHILD(n, i-1))) {
2258 case LEFTSHIFT:
2259 op = BINARY_LSHIFT;
2260 break;
2261 case RIGHTSHIFT:
2262 op = BINARY_RSHIFT;
2263 break;
2264 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002265 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002266 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002267 op = 255;
2268 }
2269 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002270 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002271 }
2272}
2273
2274static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002275com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002276{
2277 int i;
2278 int op;
2279 REQ(n, and_expr);
2280 com_shift_expr(c, CHILD(n, 0));
2281 for (i = 2; i < NCH(n); i += 2) {
2282 com_shift_expr(c, CHILD(n, i));
2283 if (TYPE(CHILD(n, i-1)) == AMPER) {
2284 op = BINARY_AND;
2285 }
2286 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002287 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002288 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002289 op = 255;
2290 }
2291 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002292 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002293 }
2294}
2295
2296static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002297com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002298{
2299 int i;
2300 int op;
2301 REQ(n, xor_expr);
2302 com_and_expr(c, CHILD(n, 0));
2303 for (i = 2; i < NCH(n); i += 2) {
2304 com_and_expr(c, CHILD(n, i));
2305 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2306 op = BINARY_XOR;
2307 }
2308 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002309 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002310 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002311 op = 255;
2312 }
2313 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002314 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002315 }
2316}
2317
2318static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002319com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002320{
2321 int i;
2322 int op;
2323 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002324 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002325 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002326 com_xor_expr(c, CHILD(n, i));
2327 if (TYPE(CHILD(n, i-1)) == VBAR) {
2328 op = BINARY_OR;
2329 }
2330 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002331 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002332 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002333 op = 255;
2334 }
2335 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002336 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002337 }
2338}
2339
2340static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002341cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002342{
2343 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00002344 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002345 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2346 if (NCH(n) == 1) {
2347 n = CHILD(n, 0);
2348 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002349 case LESS: return PyCmp_LT;
2350 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00002351 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00002352 case LESSEQUAL: return PyCmp_LE;
2353 case GREATEREQUAL: return PyCmp_GE;
2354 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2355 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2356 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002357 }
2358 }
2359 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002360 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002361 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002362 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002363 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002364 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002365 }
2366 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002367 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002368}
2369
2370static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002371com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002372{
2373 int i;
2374 enum cmp_op op;
2375 int anchor;
2376 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2377 com_expr(c, CHILD(n, 0));
2378 if (NCH(n) == 1)
2379 return;
2380
2381 /****************************************************************
2382 The following code is generated for all but the last
2383 comparison in a chain:
2384
2385 label: on stack: opcode: jump to:
2386
2387 a <code to load b>
2388 a, b DUP_TOP
2389 a, b, b ROT_THREE
2390 b, a, b COMPARE_OP
2391 b, 0-or-1 JUMP_IF_FALSE L1
2392 b, 1 POP_TOP
2393 b
2394
2395 We are now ready to repeat this sequence for the next
2396 comparison in the chain.
2397
2398 For the last we generate:
2399
2400 b <code to load c>
2401 b, c COMPARE_OP
2402 0-or-1
2403
2404 If there were any jumps to L1 (i.e., there was more than one
2405 comparison), we generate:
2406
2407 0-or-1 JUMP_FORWARD L2
2408 L1: b, 0 ROT_TWO
2409 0, b POP_TOP
2410 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002411 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002412 ****************************************************************/
2413
2414 anchor = 0;
2415
2416 for (i = 2; i < NCH(n); i += 2) {
2417 com_expr(c, CHILD(n, i));
2418 if (i+2 < NCH(n)) {
2419 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002420 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002421 com_addbyte(c, ROT_THREE);
2422 }
2423 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002424 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002425 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002426 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002427 }
2428 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002429 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002430 if (i+2 < NCH(n)) {
2431 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2432 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002433 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002434 }
2435 }
2436
2437 if (anchor) {
2438 int anchor2 = 0;
2439 com_addfwref(c, JUMP_FORWARD, &anchor2);
2440 com_backpatch(c, anchor);
2441 com_addbyte(c, ROT_TWO);
2442 com_addbyte(c, POP_TOP);
2443 com_backpatch(c, anchor2);
2444 }
2445}
2446
2447static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002448com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002449{
2450 REQ(n, not_test); /* 'not' not_test | comparison */
2451 if (NCH(n) == 1) {
2452 com_comparison(c, CHILD(n, 0));
2453 }
2454 else {
2455 com_not_test(c, CHILD(n, 1));
2456 com_addbyte(c, UNARY_NOT);
2457 }
2458}
2459
2460static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002461com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002462{
2463 int i;
2464 int anchor;
2465 REQ(n, and_test); /* not_test ('and' not_test)* */
2466 anchor = 0;
2467 i = 0;
2468 for (;;) {
2469 com_not_test(c, CHILD(n, i));
2470 if ((i += 2) >= NCH(n))
2471 break;
2472 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2473 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002474 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002475 }
2476 if (anchor)
2477 com_backpatch(c, anchor);
2478}
2479
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002480static int
2481com_make_closure(struct compiling *c, PyCodeObject *co)
2482{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002483 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002484 if (free == 0)
2485 return 0;
2486 for (i = 0; i < free; ++i) {
2487 /* Bypass com_addop_varname because it will generate
2488 LOAD_DEREF but LOAD_CLOSURE is needed.
2489 */
2490 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2491 int arg, reftype;
2492
2493 /* Special case: If a class contains a method with a
2494 free variable that has the same name as a method,
2495 the name will be considered free *and* local in the
2496 class. It should be handled by the closure, as
2497 well as by the normal name loookup logic.
2498 */
2499 reftype = get_ref_type(c, PyString_AS_STRING(name));
2500 if (reftype == CELL)
2501 arg = com_lookup_arg(c->c_cellvars, name);
2502 else /* (reftype == FREE) */
2503 arg = com_lookup_arg(c->c_freevars, name);
2504 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002505 fprintf(stderr, "lookup %s in %s %d %d\n"
2506 "freevars of %s: %s\n",
2507 PyObject_REPR(name),
2508 c->c_name,
2509 reftype, arg,
2510 PyString_AS_STRING(co->co_name),
2511 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002512 Py_FatalError("com_make_closure()");
2513 }
2514 com_addoparg(c, LOAD_CLOSURE, arg);
2515
2516 }
2517 com_push(c, free);
2518 return 1;
2519}
2520
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002521static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002522com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002523{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002524 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002525 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002526 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002527 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002528 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002529 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2530 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002531 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002532 if (co == NULL) {
2533 c->c_errors++;
2534 return;
2535 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002536 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002537 i = com_addconst(c, (PyObject *)co);
2538 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002539 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002540 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002541 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002542 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002543 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002544 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002545 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002546 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002547 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002548 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002549 else {
2550 int anchor = 0;
2551 int i = 0;
2552 for (;;) {
2553 com_and_test(c, CHILD(n, i));
2554 if ((i += 2) >= NCH(n))
2555 break;
2556 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2557 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002558 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002559 }
2560 if (anchor)
2561 com_backpatch(c, anchor);
2562 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002563}
2564
2565static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002566com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002567{
2568 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002569 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002570 com_node(c, CHILD(n, 0));
2571 }
2572 else {
2573 int i;
2574 int len;
2575 len = (NCH(n) + 1) / 2;
2576 for (i = 0; i < NCH(n); i += 2)
2577 com_node(c, CHILD(n, i));
2578 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002579 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002580 }
2581}
2582
2583
2584/* Begin of assignment compilation */
2585
Thomas Wouters434d0822000-08-24 20:11:32 +00002586
2587static void
2588com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2589{
2590 com_addbyte(c, DUP_TOP);
2591 com_push(c, 1);
2592 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002593 com_node(c, augn);
2594 com_addbyte(c, opcode);
2595 com_pop(c, 1);
2596 com_addbyte(c, ROT_TWO);
2597 com_addopname(c, STORE_ATTR, n);
2598 com_pop(c, 2);
2599}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002600
2601static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002602com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002603{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00002604 if (none_assignment_check(c, STR(n), assigning))
2605 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002606 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002607 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002608}
2609
2610static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002611com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002612{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002613 REQ(n, trailer);
2614 switch (TYPE(CHILD(n, 0))) {
2615 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002616 if (assigning == OP_DELETE)
2617 com_error(c, PyExc_SyntaxError,
2618 "can't delete function call");
2619 else
2620 com_error(c, PyExc_SyntaxError,
2621 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002622 break;
2623 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002624 if (assigning > OP_APPLY)
2625 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2626 else
2627 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002628 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002629 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002630 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002631 break;
2632 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002633 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002634 }
2635}
2636
2637static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002638com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002639{
2640 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002641 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002642 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002643 if (assigning) {
2644 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002645 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002646 com_push(c, i-1);
2647 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002648 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002649 com_assign(c, CHILD(n, i), assigning, NULL);
2650}
2651
2652static void
2653com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2654{
2655 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002656 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002657 com_push(c, 1);
2658 com_node(c, augn);
2659 com_addbyte(c, opcode);
2660 com_pop(c, 1);
2661 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002662}
2663
2664static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002665com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002666{
2667 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002668 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002669 if (assigning)
2670 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002671}
2672
2673static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002674com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002675{
2676 /* Loop to avoid trivial recursion */
2677 for (;;) {
2678 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002679
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002680 case exprlist:
2681 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002682 case testlist1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002683 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002684 if (assigning > OP_APPLY) {
2685 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002686 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002687 return;
2688 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002689 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002690 return;
2691 }
2692 n = CHILD(n, 0);
2693 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002694
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002695 case test:
2696 case and_test:
2697 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002698 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002699 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002700 case xor_expr:
2701 case and_expr:
2702 case shift_expr:
2703 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002704 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002705 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002706 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002707 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002708 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002709 return;
2710 }
2711 n = CHILD(n, 0);
2712 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002713
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002714 case power: /* atom trailer* ('**' power)*
2715 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002716 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002717 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002718 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002719 return;
2720 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002721 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002722 int i;
2723 com_node(c, CHILD(n, 0));
2724 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002725 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002726 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002727 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002728 return;
2729 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002730 com_apply_trailer(c, CHILD(n, i));
2731 } /* NB i is still alive */
2732 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002733 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002734 return;
2735 }
2736 n = CHILD(n, 0);
2737 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002738
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002739 case atom:
2740 switch (TYPE(CHILD(n, 0))) {
2741 case LPAR:
2742 n = CHILD(n, 1);
2743 if (TYPE(n) == RPAR) {
2744 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002745 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002746 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002747 return;
2748 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002749 if (assigning > OP_APPLY) {
2750 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00002751 "augmented assign to tuple literal not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002752 return;
2753 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002754 break;
2755 case LSQB:
2756 n = CHILD(n, 1);
2757 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002758 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002759 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002760 return;
2761 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002762 if (assigning > OP_APPLY) {
2763 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00002764 "augmented assign to list literal not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002765 return;
2766 }
2767 if (NCH(n) > 1
2768 && TYPE(CHILD(n, 1)) == list_for) {
2769 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002770 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002771 return;
2772 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002773 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002774 return;
2775 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002776 if (assigning > OP_APPLY)
2777 com_augassign_name(c, CHILD(n, 0),
2778 assigning, augn);
2779 else
2780 com_assign_name(c, CHILD(n, 0),
2781 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002782 return;
2783 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002784 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002785 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002786 return;
2787 }
2788 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002789
2790 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002791 com_error(c, PyExc_SyntaxError,
2792 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002793 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002794
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002795 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002796 com_error(c, PyExc_SystemError,
2797 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002798 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002799
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002800 }
2801 }
2802}
Guido van Rossum7c531111997-03-11 18:42:21 +00002803
Thomas Wouters434d0822000-08-24 20:11:32 +00002804static void
2805com_augassign(struct compiling *c, node *n)
2806{
2807 int opcode;
2808
2809 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2810 case '+': opcode = INPLACE_ADD; break;
2811 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002812 case '/':
2813 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
2814 opcode = INPLACE_FLOOR_DIVIDE;
2815 else if (c->c_flags & CO_FUTURE_DIVISION)
2816 opcode = INPLACE_TRUE_DIVIDE;
2817 else
2818 opcode = INPLACE_DIVIDE;
2819 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00002820 case '%': opcode = INPLACE_MODULO; break;
2821 case '<': opcode = INPLACE_LSHIFT; break;
2822 case '>': opcode = INPLACE_RSHIFT; break;
2823 case '&': opcode = INPLACE_AND; break;
2824 case '^': opcode = INPLACE_XOR; break;
2825 case '|': opcode = INPLACE_OR; break;
2826 case '*':
2827 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2828 opcode = INPLACE_POWER;
2829 else
2830 opcode = INPLACE_MULTIPLY;
2831 break;
2832 default:
2833 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2834 return;
2835 }
2836 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2837}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002838
2839static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002840com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002841{
Thomas Wouters434d0822000-08-24 20:11:32 +00002842 REQ(n, expr_stmt);
2843 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002844 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002845 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002846 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002847 if (NCH(n) == 1) {
2848 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002849 if (c->c_interactive)
2850 com_addbyte(c, PRINT_EXPR);
2851 else
2852 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002853 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002854 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002855 else if (TYPE(CHILD(n,1)) == augassign)
2856 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002857 else {
2858 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002859 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002860 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002861 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002862 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002863 com_push(c, 1);
2864 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002865 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002866 }
2867 }
2868}
2869
2870static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002871com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002872{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002873 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002874 int i;
2875 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002876 if (Py_OptimizeFlag)
2877 return;
2878 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00002879
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002880 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00002881 raise AssertionError [, <message>]
2882
2883 where <message> is the second test, if present.
2884 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002885 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002886 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002887 com_addbyte(c, POP_TOP);
2888 com_pop(c, 1);
2889 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002890 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002891 com_push(c, 1);
2892 i = NCH(n)/2; /* Either 2 or 4 */
2893 if (i > 1)
2894 com_node(c, CHILD(n, 3));
2895 com_addoparg(c, RAISE_VARARGS, i);
2896 com_pop(c, i);
2897 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002898 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002899 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002900 com_addbyte(c, POP_TOP);
2901}
2902
2903static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002904com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002905{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002906 int i = 1;
2907 node* stream = NULL;
2908
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002909 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002910
2911 /* are we using the extended print form? */
2912 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2913 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002914 com_node(c, stream);
2915 /* stack: [...] => [... stream] */
2916 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002917 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2918 i = 4;
2919 else
2920 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002921 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002922 for (; i < NCH(n); i += 2) {
2923 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002924 com_addbyte(c, DUP_TOP);
2925 /* stack: [stream] => [stream stream] */
2926 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002927 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002928 /* stack: [stream stream] => [stream stream obj] */
2929 com_addbyte(c, ROT_TWO);
2930 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002931 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002932 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002933 com_pop(c, 2);
2934 }
2935 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002936 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002937 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002938 com_addbyte(c, PRINT_ITEM);
2939 com_pop(c, 1);
2940 }
2941 }
2942 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002943 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002944 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002945 /* must pop the extra stream object off the stack */
2946 com_addbyte(c, POP_TOP);
2947 /* stack: [... stream] => [...] */
2948 com_pop(c, 1);
2949 }
2950 }
2951 else {
2952 if (stream != NULL) {
2953 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002954 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002955 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002956 com_pop(c, 1);
2957 }
2958 else
2959 com_addbyte(c, PRINT_NEWLINE);
2960 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002961}
2962
2963static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002964com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002965{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002966 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002967 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002968 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002969 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002970 if (c->c_flags & CO_GENERATOR) {
2971 if (NCH(n) > 1) {
2972 com_error(c, PyExc_SyntaxError,
2973 "'return' with argument inside generator");
2974 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002975 }
2976 if (NCH(n) < 2) {
2977 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002978 com_push(c, 1);
2979 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002980 else
2981 com_node(c, CHILD(n, 1));
2982 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00002983 com_pop(c, 1);
2984}
2985
2986static void
2987com_yield_stmt(struct compiling *c, node *n)
2988{
Tim Peters95c80f82001-06-23 02:07:08 +00002989 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00002990 REQ(n, yield_stmt); /* 'yield' testlist */
2991 if (!c->c_infunction) {
2992 com_error(c, PyExc_SyntaxError, "'yield' outside function");
2993 }
Tim Peters95c80f82001-06-23 02:07:08 +00002994
2995 for (i = 0; i < c->c_nblocks; ++i) {
2996 if (c->c_block[i] == SETUP_FINALLY) {
2997 com_error(c, PyExc_SyntaxError,
2998 "'yield' not allowed in a 'try' block "
2999 "with a 'finally' clause");
3000 return;
3001 }
3002 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003003 com_node(c, CHILD(n, 1));
3004 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003005 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003006}
3007
3008static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003009com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003010{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003011 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003012 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3013 if (NCH(n) > 1) {
3014 com_node(c, CHILD(n, 1));
3015 if (NCH(n) > 3) {
3016 com_node(c, CHILD(n, 3));
3017 if (NCH(n) > 5)
3018 com_node(c, CHILD(n, 5));
3019 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003020 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003021 i = NCH(n)/2;
3022 com_addoparg(c, RAISE_VARARGS, i);
3023 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003024}
3025
3026static void
Thomas Wouters52152252000-08-17 22:55:00 +00003027com_from_import(struct compiling *c, node *n)
3028{
3029 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3030 com_push(c, 1);
3031 if (NCH(n) > 1) {
3032 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3033 com_error(c, PyExc_SyntaxError, "invalid syntax");
3034 return;
3035 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003036 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003037 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003038 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003039 com_pop(c, 1);
3040}
3041
3042static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003043com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003044{
3045 int i;
3046 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003047 /* 'import' dotted_name (',' dotted_name)* |
3048 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003049 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00003050 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003051 /* 'from' dotted_name 'import' ... */
3052 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003053
3054 if (TYPE(CHILD(n, 3)) == STAR) {
3055 tup = Py_BuildValue("(s)", "*");
3056 } else {
3057 tup = PyTuple_New((NCH(n) - 2)/2);
3058 for (i = 3; i < NCH(n); i += 2) {
3059 PyTuple_SET_ITEM(tup, (i-3)/2,
Guido van Rossum633d90c2002-12-23 16:51:42 +00003060 PyString_FromString(STR(
3061 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003062 }
3063 }
3064 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003065 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003066 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003067 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00003068 if (TYPE(CHILD(n, 3)) == STAR)
3069 com_addbyte(c, IMPORT_STAR);
3070 else {
3071 for (i = 3; i < NCH(n); i += 2)
3072 com_from_import(c, CHILD(n, i));
3073 com_addbyte(c, POP_TOP);
3074 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003075 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003076 }
3077 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003078 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003079 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003080 node *subn = CHILD(n, i);
3081 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003082 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003083 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003084 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003085 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003086 int j;
3087 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003088 com_error(c, PyExc_SyntaxError,
3089 "invalid syntax");
3090 return;
3091 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003092 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3093 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003094 CHILD(CHILD(subn, 0),
3095 j));
3096 com_addop_varname(c, VAR_STORE,
3097 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003098 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003099 com_addop_varname(c, VAR_STORE,
3100 STR(CHILD(CHILD(subn, 0),
3101 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003102 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003103 }
3104 }
3105}
3106
3107static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003108com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003109{
3110 REQ(n, exec_stmt);
3111 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3112 com_node(c, CHILD(n, 1));
3113 if (NCH(n) >= 4)
3114 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003115 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003116 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003117 com_push(c, 1);
3118 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003119 if (NCH(n) >= 6)
3120 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003121 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003122 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003123 com_push(c, 1);
3124 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003125 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003126 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003127}
3128
Guido van Rossum7c531111997-03-11 18:42:21 +00003129static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003130is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003131{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003132 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003133 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003134 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003135
3136 /* Label to avoid tail recursion */
3137 next:
3138 switch (TYPE(n)) {
3139
3140 case suite:
3141 if (NCH(n) == 1) {
3142 n = CHILD(n, 0);
3143 goto next;
3144 }
3145 /* Fall through */
3146 case file_input:
3147 for (i = 0; i < NCH(n); i++) {
3148 node *ch = CHILD(n, i);
3149 if (TYPE(ch) == stmt) {
3150 n = ch;
3151 goto next;
3152 }
3153 }
3154 break;
3155
3156 case stmt:
3157 case simple_stmt:
3158 case small_stmt:
3159 n = CHILD(n, 0);
3160 goto next;
3161
3162 case expr_stmt:
3163 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003164 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003165 case test:
3166 case and_test:
3167 case not_test:
3168 case comparison:
3169 case expr:
3170 case xor_expr:
3171 case and_expr:
3172 case shift_expr:
3173 case arith_expr:
3174 case term:
3175 case factor:
3176 case power:
3177 case atom:
3178 if (NCH(n) == 1) {
3179 n = CHILD(n, 0);
3180 goto next;
3181 }
3182 break;
3183
3184 case NAME:
3185 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3186 return 1;
3187 break;
3188
3189 case NUMBER:
3190 v = parsenumber(c, STR(n));
3191 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003192 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003193 break;
3194 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003195 i = PyObject_IsTrue(v);
3196 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003197 return i == 0;
3198
3199 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003200 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003201 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003202 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003203 break;
3204 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003205 i = PyObject_IsTrue(v);
3206 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003207 return i == 0;
3208
3209 }
3210 return 0;
3211}
3212
Tim Peters08a898f2001-06-28 01:52:22 +00003213
3214/* Look under n for a return stmt with an expression.
3215 * This hack is used to find illegal returns under "if 0:" blocks in
3216 * functions already known to be generators (as determined by the symtable
3217 * pass).
3218 * Return the offending return node if found, else NULL.
3219 */
3220static node *
3221look_for_offending_return(node *n)
3222{
3223 int i;
3224
3225 for (i = 0; i < NCH(n); ++i) {
3226 node *kid = CHILD(n, i);
3227
3228 switch (TYPE(kid)) {
3229 case classdef:
3230 case funcdef:
3231 case lambdef:
3232 /* Stuff in nested functions & classes doesn't
3233 affect the code block we started in. */
3234 return NULL;
3235
3236 case return_stmt:
3237 if (NCH(kid) > 1)
3238 return kid;
3239 break;
3240
3241 default: {
3242 node *bad = look_for_offending_return(kid);
3243 if (bad != NULL)
3244 return bad;
3245 }
3246 }
3247 }
3248
3249 return NULL;
3250}
3251
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003252static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003253com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003254{
3255 int i;
3256 int anchor = 0;
3257 REQ(n, if_stmt);
3258 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3259 for (i = 0; i+3 < NCH(n); i+=4) {
3260 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003261 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003262 if (is_constant_false(c, ch)) {
3263 /* We're going to skip this block. However, if this
3264 is a generator, we have to check the dead code
3265 anyway to make sure there aren't any return stmts
3266 with expressions, in the same scope. */
3267 if (c->c_flags & CO_GENERATOR) {
3268 node *p = look_for_offending_return(n);
3269 if (p != NULL) {
3270 int savelineno = c->c_lineno;
3271 c->c_lineno = p->n_lineno;
3272 com_error(c, PyExc_SyntaxError,
3273 "'return' with argument "
3274 "inside generator");
3275 c->c_lineno = savelineno;
3276 }
3277 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003278 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003279 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003280 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003281 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003282 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003283 com_addfwref(c, JUMP_IF_FALSE, &a);
3284 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003285 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003286 com_node(c, CHILD(n, i+3));
3287 com_addfwref(c, JUMP_FORWARD, &anchor);
3288 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003289 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003290 com_addbyte(c, POP_TOP);
3291 }
3292 if (i+2 < NCH(n))
3293 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003294 if (anchor)
3295 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003296}
3297
3298static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003299com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003300{
3301 int break_anchor = 0;
3302 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003303 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003304 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3305 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003306 block_push(c, SETUP_LOOP);
3307 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003308 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003309 com_node(c, CHILD(n, 1));
3310 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3311 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003312 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003313 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003314 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003315 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003316 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3317 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003318 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003319 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003320 com_addbyte(c, POP_TOP);
3321 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003322 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003323 if (NCH(n) > 4)
3324 com_node(c, CHILD(n, 6));
3325 com_backpatch(c, break_anchor);
3326}
3327
3328static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003329com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003330{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003331 int break_anchor = 0;
3332 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003333 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003334 REQ(n, for_stmt);
3335 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3336 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003337 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003338 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003339 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003340 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00003341 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003342 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003343 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003344 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003345 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003346 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003347 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003348 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3349 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003350 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003351 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003352 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003353 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003354 if (NCH(n) > 8)
3355 com_node(c, CHILD(n, 8));
3356 com_backpatch(c, break_anchor);
3357}
3358
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003359/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003360
3361 SETUP_FINALLY L
3362 <code for S>
3363 POP_BLOCK
3364 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003365 L: <code for Sf>
3366 END_FINALLY
3367
3368 The special instructions use the block stack. Each block
3369 stack entry contains the instruction that created it (here
3370 SETUP_FINALLY), the level of the value stack at the time the
3371 block stack entry was created, and a label (here L).
3372
3373 SETUP_FINALLY:
3374 Pushes the current value stack level and the label
3375 onto the block stack.
3376 POP_BLOCK:
3377 Pops en entry from the block stack, and pops the value
3378 stack until its level is the same as indicated on the
3379 block stack. (The label is ignored.)
3380 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003381 Pops a variable number of entries from the *value* stack
3382 and re-raises the exception they specify. The number of
3383 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003384
3385 The block stack is unwound when an exception is raised:
3386 when a SETUP_FINALLY entry is found, the exception is pushed
3387 onto the value stack (and the exception condition is cleared),
3388 and the interpreter jumps to the label gotten from the block
3389 stack.
3390
3391 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003392 (The contents of the value stack is shown in [], with the top
3393 at the right; 'tb' is trace-back info, 'val' the exception's
3394 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003395
3396 Value stack Label Instruction Argument
3397 [] SETUP_EXCEPT L1
3398 [] <code for S>
3399 [] POP_BLOCK
3400 [] JUMP_FORWARD L0
3401
Guido van Rossum3f5da241990-12-20 15:06:42 +00003402 [tb, val, exc] L1: DUP )
3403 [tb, val, exc, exc] <evaluate E1> )
3404 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3405 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3406 [tb, val, exc, 1] POP )
3407 [tb, val, exc] POP
3408 [tb, val] <assign to V1> (or POP if no V1)
3409 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003410 [] <code for S1>
3411 JUMP_FORWARD L0
3412
Guido van Rossum3f5da241990-12-20 15:06:42 +00003413 [tb, val, exc, 0] L2: POP
3414 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003415 .............................etc.......................
3416
Guido van Rossum3f5da241990-12-20 15:06:42 +00003417 [tb, val, exc, 0] Ln+1: POP
3418 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003419
3420 [] L0: <next statement>
3421
3422 Of course, parts are not generated if Vi or Ei is not present.
3423*/
3424
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003425static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003426com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003427{
3428 int except_anchor = 0;
3429 int end_anchor = 0;
3430 int else_anchor = 0;
3431 int i;
3432 node *ch;
3433
3434 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3435 block_push(c, SETUP_EXCEPT);
3436 com_node(c, CHILD(n, 2));
3437 com_addbyte(c, POP_BLOCK);
3438 block_pop(c, SETUP_EXCEPT);
3439 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3440 com_backpatch(c, except_anchor);
3441 for (i = 3;
3442 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3443 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003444 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003445 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003446 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003447 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003448 break;
3449 }
3450 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003451 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003452 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003453 if (NCH(ch) > 1) {
3454 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003455 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003456 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003457 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003458 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003459 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3460 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003461 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003462 }
3463 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003464 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003465 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003466 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003467 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003468 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003469 com_pop(c, 1);
3470 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003471 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003472 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003473 com_node(c, CHILD(n, i+2));
3474 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3475 if (except_anchor) {
3476 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003477 /* We come in with [tb, val, exc, 0] on the
3478 stack; one pop and it's the same as
3479 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003480 com_addbyte(c, POP_TOP);
3481 }
3482 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003483 /* We actually come in here with [tb, val, exc] but the
3484 END_FINALLY will zap those and jump around.
3485 The c_stacklevel does not reflect them so we need not pop
3486 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003487 com_addbyte(c, END_FINALLY);
3488 com_backpatch(c, else_anchor);
3489 if (i < NCH(n))
3490 com_node(c, CHILD(n, i+2));
3491 com_backpatch(c, end_anchor);
3492}
3493
3494static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003495com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003496{
3497 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003498 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003499
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003500 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3501 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003502 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003503 com_addbyte(c, POP_BLOCK);
3504 block_pop(c, SETUP_FINALLY);
3505 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003506 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003507 /* While the generated code pushes only one item,
3508 the try-finally handling can enter here with
3509 up to three items. OK, here are the details:
3510 3 for an exception, 2 for RETURN, 1 for BREAK. */
3511 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003512 com_backpatch(c, finally_anchor);
3513 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003514 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003515 com_node(c, ch);
3516 com_addbyte(c, END_FINALLY);
3517 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003518 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003519}
3520
3521static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003522com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003523{
3524 REQ(n, try_stmt);
3525 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3526 | 'try' ':' suite 'finally' ':' suite */
3527 if (TYPE(CHILD(n, 3)) != except_clause)
3528 com_try_finally(c, n);
3529 else
3530 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003531}
3532
Guido van Rossum8b993a91997-01-17 21:04:03 +00003533static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003534get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003535{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003536 int i;
3537
Guido van Rossum8b993a91997-01-17 21:04:03 +00003538 /* Label to avoid tail recursion */
3539 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003540 switch (TYPE(n)) {
3541
3542 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003543 if (NCH(n) == 1) {
3544 n = CHILD(n, 0);
3545 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003546 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003547 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003548 case file_input:
3549 for (i = 0; i < NCH(n); i++) {
3550 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003551 if (TYPE(ch) == stmt) {
3552 n = ch;
3553 goto next;
3554 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003555 }
3556 break;
3557
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003558 case stmt:
3559 case simple_stmt:
3560 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003561 n = CHILD(n, 0);
3562 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003563
3564 case expr_stmt:
3565 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003566 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003567 case test:
3568 case and_test:
3569 case not_test:
3570 case comparison:
3571 case expr:
3572 case xor_expr:
3573 case and_expr:
3574 case shift_expr:
3575 case arith_expr:
3576 case term:
3577 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003578 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003579 if (NCH(n) == 1) {
3580 n = CHILD(n, 0);
3581 goto next;
3582 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003583 break;
3584
3585 case atom:
3586 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003587 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003588 break;
3589
3590 }
3591 return NULL;
3592}
3593
Guido van Rossum79f25d91997-04-29 20:08:16 +00003594static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003595get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003596{
Guido van Rossum541563e1999-01-28 15:08:09 +00003597 /* Don't generate doc-strings if run with -OO */
3598 if (Py_OptimizeFlag > 1)
3599 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003600 n = get_rawdocstring(n);
3601 if (n == NULL)
3602 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003603 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003604}
3605
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003606static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003607com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003608{
3609 REQ(n, suite);
3610 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3611 if (NCH(n) == 1) {
3612 com_node(c, CHILD(n, 0));
3613 }
3614 else {
3615 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003616 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003617 node *ch = CHILD(n, i);
3618 if (TYPE(ch) == stmt)
3619 com_node(c, ch);
3620 }
3621 }
3622}
3623
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003624/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003625static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003626com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003627{
3628 int i = c->c_nblocks;
3629 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3630 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3631 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003632 else if (i <= 0) {
3633 /* at the outer level */
3634 com_error(c, PyExc_SyntaxError,
3635 "'continue' not properly in loop");
3636 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003637 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003638 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003639 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003640 if (c->c_block[j] == SETUP_LOOP)
3641 break;
3642 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003643 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003644 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003645 for (; i > j; --i) {
3646 if (c->c_block[i] == SETUP_EXCEPT ||
3647 c->c_block[i] == SETUP_FINALLY) {
3648 com_addoparg(c, CONTINUE_LOOP,
3649 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003650 return;
3651 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003652 if (c->c_block[i] == END_FINALLY) {
3653 com_error(c, PyExc_SyntaxError,
3654 "'continue' not supported inside 'finally' clause");
3655 return;
3656 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003657 }
3658 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003659 com_error(c, PyExc_SyntaxError,
3660 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003661 }
3662 /* XXX Could allow it inside a 'finally' clause
3663 XXX if we could pop the exception still on the stack */
3664}
3665
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003666/* Return the number of default values in the argument list.
3667
3668 If a non-default argument follows a default argument, set an
3669 exception and return -1.
3670*/
3671
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003672static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003673com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003674{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003675 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003676 if (TYPE(n) == lambdef) {
3677 /* lambdef: 'lambda' [varargslist] ':' test */
3678 n = CHILD(n, 1);
3679 }
3680 else {
3681 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3682 n = CHILD(n, 2);
3683 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3684 n = CHILD(n, 1);
3685 }
3686 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003687 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003688 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003689 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003690 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3691 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003692 ndefs = 0;
3693 for (i = 0; i < nch; i++) {
3694 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003695 if (TYPE(CHILD(n, i)) == STAR ||
3696 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003697 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003698 i++;
3699 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003700 t = RPAR; /* Anything except EQUAL or COMMA */
3701 else
3702 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003703 if (t == EQUAL) {
3704 i++;
3705 ndefs++;
3706 com_node(c, CHILD(n, i));
3707 i++;
3708 if (i >= nch)
3709 break;
3710 t = TYPE(CHILD(n, i));
3711 }
3712 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003713 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003714 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003715 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003716 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003717 return -1;
3718 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003719 }
3720 if (t != COMMA)
3721 break;
3722 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003723 return ndefs;
3724}
3725
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003726static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003727com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003728{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003729 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003730 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003731 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003732 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003733 if (ndefs < 0)
3734 return;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003735 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3736 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003737 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003738 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003739 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003740 c->c_errors++;
3741 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003742 int closure = com_make_closure(c, (PyCodeObject *)co);
3743 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003744 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003745 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003746 if (closure)
3747 com_addoparg(c, MAKE_CLOSURE, ndefs);
3748 else
3749 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003750 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003751 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003752 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003753 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003754 }
3755}
3756
3757static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003758com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003759{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003760 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003761 REQ(n, testlist);
3762 /* testlist: test (',' test)* [','] */
3763 for (i = 0; i < NCH(n); i += 2)
3764 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003765 i = (NCH(n)+1) / 2;
3766 com_addoparg(c, BUILD_TUPLE, i);
3767 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003768}
3769
3770static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003771com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003772{
Guido van Rossum25831651993-05-19 14:50:45 +00003773 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003774 PyObject *v;
3775 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003776 char *name;
3777
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003778 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003779 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003780 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003781 c->c_errors++;
3782 return;
3783 }
3784 /* Push the class name on the stack */
3785 i = com_addconst(c, v);
3786 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003787 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003788 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003789 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003790 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003791 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003792 com_push(c, 1);
3793 }
Guido van Rossum25831651993-05-19 14:50:45 +00003794 else
3795 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003796 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003797 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003798 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003799 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003800 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003801 c->c_errors++;
3802 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003803 int closure = com_make_closure(c, co);
3804 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003805 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003806 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003807 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003808 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003809 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003810 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003811 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003812 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003813 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003814 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003815 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003816 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003817 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003818 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003819}
3820
3821static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003822com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003823{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003824 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003825 if (c->c_errors)
3826 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003827 switch (TYPE(n)) {
3828
3829 /* Definition nodes */
3830
3831 case funcdef:
3832 com_funcdef(c, n);
3833 break;
3834 case classdef:
3835 com_classdef(c, n);
3836 break;
3837
3838 /* Trivial parse tree nodes */
3839
3840 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003841 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003842 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003843 n = CHILD(n, 0);
3844 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003845
3846 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003847 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003848 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003849 {
3850 int i;
3851 for (i = 0; i < NCH(n)-1; i += 2)
3852 com_node(c, CHILD(n, i));
3853 }
3854 break;
3855
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003856 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003857 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003858 n = CHILD(n, 0);
3859 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003860
3861 /* Statement nodes */
3862
3863 case expr_stmt:
3864 com_expr_stmt(c, n);
3865 break;
3866 case print_stmt:
3867 com_print_stmt(c, n);
3868 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003869 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003870 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003871 break;
3872 case pass_stmt:
3873 break;
3874 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003875 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003876 com_error(c, PyExc_SyntaxError,
3877 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003878 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003879 com_addbyte(c, BREAK_LOOP);
3880 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003881 case continue_stmt:
3882 com_continue_stmt(c, n);
3883 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003884 case return_stmt:
3885 com_return_stmt(c, n);
3886 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003887 case yield_stmt:
3888 com_yield_stmt(c, n);
3889 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003890 case raise_stmt:
3891 com_raise_stmt(c, n);
3892 break;
3893 case import_stmt:
3894 com_import_stmt(c, n);
3895 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003896 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003897 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003898 case exec_stmt:
3899 com_exec_stmt(c, n);
3900 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003901 case assert_stmt:
3902 com_assert_stmt(c, n);
3903 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003904 case if_stmt:
3905 com_if_stmt(c, n);
3906 break;
3907 case while_stmt:
3908 com_while_stmt(c, n);
3909 break;
3910 case for_stmt:
3911 com_for_stmt(c, n);
3912 break;
3913 case try_stmt:
3914 com_try_stmt(c, n);
3915 break;
3916 case suite:
3917 com_suite(c, n);
3918 break;
3919
3920 /* Expression nodes */
3921
3922 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003923 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00003924 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003925 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003926 break;
3927 case test:
3928 com_test(c, n);
3929 break;
3930 case and_test:
3931 com_and_test(c, n);
3932 break;
3933 case not_test:
3934 com_not_test(c, n);
3935 break;
3936 case comparison:
3937 com_comparison(c, n);
3938 break;
3939 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003940 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003941 break;
3942 case expr:
3943 com_expr(c, n);
3944 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003945 case xor_expr:
3946 com_xor_expr(c, n);
3947 break;
3948 case and_expr:
3949 com_and_expr(c, n);
3950 break;
3951 case shift_expr:
3952 com_shift_expr(c, n);
3953 break;
3954 case arith_expr:
3955 com_arith_expr(c, n);
3956 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003957 case term:
3958 com_term(c, n);
3959 break;
3960 case factor:
3961 com_factor(c, n);
3962 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003963 case power:
3964 com_power(c, n);
3965 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003966 case atom:
3967 com_atom(c, n);
3968 break;
3969
3970 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003971 com_error(c, PyExc_SystemError,
3972 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003973 }
3974}
3975
Tim Petersdbd9ba62000-07-09 03:09:57 +00003976static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003977
3978static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003979com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003980{
3981 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3982 if (TYPE(CHILD(n, 0)) == LPAR)
3983 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003984 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003985 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003986 com_pop(c, 1);
3987 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003988}
3989
3990static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003991com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003992{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003993 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003994 if (NCH(n) == 1) {
3995 com_fpdef(c, CHILD(n, 0));
3996 }
3997 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003998 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003999 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004000 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004001 for (i = 0; i < NCH(n); i += 2)
4002 com_fpdef(c, CHILD(n, i));
4003 }
4004}
4005
4006static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004007com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004008{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004009 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004010 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004011 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004012 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004013 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004014 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004015 nch = NCH(n);
4016 /* Enter all arguments in table of locals */
4017 for (i = 0, narg = 0; i < nch; i++) {
4018 node *ch = CHILD(n, i);
4019 node *fp;
4020 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004021 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004022 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4023 fp = CHILD(ch, 0);
4024 if (TYPE(fp) != NAME) {
4025 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4026 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004027 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004028 narg++;
4029 /* all name updates handled by symtable */
4030 if (++i >= nch)
4031 break;
4032 ch = CHILD(n, i);
4033 if (TYPE(ch) == EQUAL)
4034 i += 2;
4035 else
4036 REQ(ch, COMMA);
4037 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004038 if (complex) {
4039 /* Generate code for complex arguments only after
4040 having counted the simple arguments */
4041 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004042 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004043 node *ch = CHILD(n, i);
4044 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004045 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004046 break;
4047 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4048 fp = CHILD(ch, 0);
4049 if (TYPE(fp) != NAME) {
4050 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004051 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004052 com_fpdef(c, ch);
4053 }
4054 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004055 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004056 break;
4057 ch = CHILD(n, i);
4058 if (TYPE(ch) == EQUAL)
4059 i += 2;
4060 else
4061 REQ(ch, COMMA);
4062 }
4063 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004064}
4065
4066static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004067com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004068{
4069 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004070 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004071 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004072 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004073 if (doc != NULL) {
4074 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004075 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004076 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004077 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004078 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004079 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004080 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004081 for (i = 0; i < NCH(n); i++) {
4082 node *ch = CHILD(n, i);
4083 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4084 com_node(c, ch);
4085 }
4086}
4087
4088/* Top-level compile-node interface */
4089
4090static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004091compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004092{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004093 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004094 node *ch;
4095 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00004096 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004097 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004098 if (doc != NULL) {
4099 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004100 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004101 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004102 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004103 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004104 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
4105 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004106 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004107 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004108 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004109 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004110 c->c_infunction = 0;
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004111 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4112 com_push(c, 1);
4113 com_addbyte(c, RETURN_VALUE);
4114 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004115}
4116
4117static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004118compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004119{
Guido van Rossum590baa41993-11-30 13:40:46 +00004120 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004121 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004122 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004123
4124 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004125 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004126 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004127 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004128 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004129 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004130 else
4131 ch = CHILD(n, 2);
4132 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004133 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004134 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004135}
4136
4137static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004138compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004139{
4140 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004141 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004142 REQ(n, classdef);
4143 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4144 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004145 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004146 /* Initialize local __module__ from global __name__ */
4147 com_addop_name(c, LOAD_GLOBAL, "__name__");
4148 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004149 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004150 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004151 if (doc != NULL) {
4152 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004153 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004154 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004155 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004156 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004157 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004158 }
4159 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004160 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004161 com_node(c, ch);
4162 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004163 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004164 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004165 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004166}
4167
4168static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004169compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004170{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004171 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004172
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004173 switch (TYPE(n)) {
4174
Guido van Rossum4c417781991-01-21 16:09:22 +00004175 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004176 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004177 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004178 n = CHILD(n, 0);
4179 if (TYPE(n) != NEWLINE)
4180 com_node(c, n);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004181 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4182 com_push(c, 1);
4183 com_addbyte(c, RETURN_VALUE);
4184 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004185 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004186 break;
4187
Guido van Rossum4c417781991-01-21 16:09:22 +00004188 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004189 com_file_input(c, n);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004190 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4191 com_push(c, 1);
4192 com_addbyte(c, RETURN_VALUE);
4193 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004194 break;
4195
Guido van Rossum590baa41993-11-30 13:40:46 +00004196 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004197 com_node(c, CHILD(n, 0));
4198 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004199 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004200 break;
4201
Guido van Rossum590baa41993-11-30 13:40:46 +00004202 case lambdef: /* anonymous function definition */
4203 compile_lambdef(c, n);
4204 break;
4205
Guido van Rossum4c417781991-01-21 16:09:22 +00004206 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004207 compile_funcdef(c, n);
4208 break;
4209
Guido van Rossum4c417781991-01-21 16:09:22 +00004210 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004211 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004212 break;
4213
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004214 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004215 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004216 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004217 }
4218}
4219
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004220static PyObject *
4221dict_keys_inorder(PyObject *dict, int offset)
4222{
4223 PyObject *tuple, *k, *v;
4224 int i, pos = 0, size = PyDict_Size(dict);
4225
4226 tuple = PyTuple_New(size);
4227 if (tuple == NULL)
4228 return NULL;
4229 while (PyDict_Next(dict, &pos, &k, &v)) {
4230 i = PyInt_AS_LONG(v);
4231 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004232 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004233 PyTuple_SET_ITEM(tuple, i - offset, k);
4234 }
4235 return tuple;
4236}
4237
Guido van Rossum79f25d91997-04-29 20:08:16 +00004238PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004239PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004240{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004241 return PyNode_CompileFlags(n, filename, NULL);
4242}
4243
4244PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004245PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004246{
4247 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004248}
4249
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004250struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004251PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004252{
4253 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004254 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004255
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004256 ff = PyNode_Future(n, filename);
4257 if (ff == NULL)
4258 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004259 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00004260 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004261 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004262 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004263 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004264 return st;
4265}
4266
Guido van Rossum79f25d91997-04-29 20:08:16 +00004267static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004268icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004269{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004270 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004271}
4272
Guido van Rossum79f25d91997-04-29 20:08:16 +00004273static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004274jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004275 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004276{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004277 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004278 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004279 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004280 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004281 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4282 sc.c_encoding = "utf-8";
4283 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004284 sc.c_encoding = STR(n);
4285 n = CHILD(n, 0);
4286 } else {
4287 sc.c_encoding = NULL;
4288 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004289 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004290 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004291 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004292 /* c_symtable still points to parent's symbols */
4293 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004294 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004295 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004296 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004297 if (base->c_encoding != NULL) {
4298 assert(sc.c_encoding == NULL);
4299 sc.c_encoding = base->c_encoding;
4300 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004301 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004302 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004303 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004304 if (sc.c_future == NULL) {
4305 com_free(&sc);
4306 return NULL;
4307 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004308 if (flags) {
4309 int merged = sc.c_future->ff_features |
4310 flags->cf_flags;
4311 sc.c_future->ff_features = merged;
4312 flags->cf_flags = merged;
4313 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004314 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
4315 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004316 com_free(&sc);
4317 return NULL;
4318 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004319 /* reset symbol table for second pass */
4320 sc.c_symtable->st_nscopes = 1;
4321 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004322 }
4323 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004324 if (symtable_load_symbols(&sc) < 0) {
4325 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004326 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004327 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004328 compile_node(&sc, n);
4329 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004330 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004331 PyObject *consts, *names, *varnames, *filename, *name,
4332 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004333 consts = PyList_AsTuple(sc.c_consts);
4334 names = PyList_AsTuple(sc.c_names);
4335 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004336 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4337 freevars = dict_keys_inorder(sc.c_freevars,
4338 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004339 filename = PyString_InternFromString(sc.c_filename);
4340 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004341 if (!PyErr_Occurred())
4342 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004343 sc.c_nlocals,
4344 sc.c_maxstacklevel,
4345 sc.c_flags,
4346 sc.c_code,
4347 consts,
4348 names,
4349 varnames,
4350 freevars,
4351 cellvars,
4352 filename,
4353 name,
4354 sc.c_firstlineno,
4355 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004356 Py_XDECREF(consts);
4357 Py_XDECREF(names);
4358 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004359 Py_XDECREF(freevars);
4360 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004361 Py_XDECREF(filename);
4362 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004363 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004364 else if (!PyErr_Occurred()) {
4365 /* This could happen if someone called PyErr_Clear() after an
4366 error was reported above. That's not supposed to happen,
4367 but I just plugged one case and I'm not sure there can't be
4368 others. In that case, raise SystemError so that at least
4369 it gets reported instead dumping core. */
4370 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4371 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004372 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004373 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004374 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004375 sc.c_symtable = NULL;
4376 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004377 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004378 return co;
4379}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004380
4381int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004382PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004383{
4384 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004385 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004386 int line = co->co_firstlineno;
4387 int addr = 0;
4388 while (--size >= 0) {
4389 addr += *p++;
4390 if (addr > addrq)
4391 break;
4392 line += *p++;
4393 }
4394 return line;
4395}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004396
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004397/* The test for LOCAL must come before the test for FREE in order to
4398 handle classes where name is both local and free. The local var is
4399 a method and the free var is a free var referenced within a method.
4400*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004401
4402static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004403get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004404{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004405 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004406 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004407
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004408 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4409 return CELL;
4410 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4411 return LOCAL;
4412 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4413 return FREE;
4414 v = PyDict_GetItemString(c->c_globals, name);
4415 if (v) {
4416 if (v == Py_None)
4417 return GLOBAL_EXPLICIT;
4418 else {
4419 return GLOBAL_IMPLICIT;
4420 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004421 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004422 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004423 "unknown scope for %.100s in %.100s(%s) "
4424 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4425 name, c->c_name,
4426 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4427 c->c_filename,
4428 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4429 PyObject_REPR(c->c_locals),
4430 PyObject_REPR(c->c_globals)
4431 );
4432
4433 Py_FatalError(buf);
4434 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004435}
4436
Guido van Rossum207fda62001-03-02 03:30:41 +00004437/* Helper functions to issue warnings */
4438
4439static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004440issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004441{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004442 if (PyErr_Occurred()) {
4443 /* This can happen because symtable_node continues
4444 processing even after raising a SyntaxError.
4445 Calling PyErr_WarnExplicit now would clobber the
4446 pending exception; instead we fail and let that
4447 exception propagate.
4448 */
4449 return -1;
4450 }
Guido van Rossum207fda62001-03-02 03:30:41 +00004451 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4452 lineno, NULL, NULL) < 0) {
4453 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4454 PyErr_SetString(PyExc_SyntaxError, msg);
4455 PyErr_SyntaxLocation(filename, lineno);
4456 }
4457 return -1;
4458 }
4459 return 0;
4460}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004461
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004462static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004463symtable_warn(struct symtable *st, char *msg)
4464{
Guido van Rossum207fda62001-03-02 03:30:41 +00004465 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004466 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004467 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004468 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004469 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004470}
4471
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004472/* Helper function for setting lineno and filename */
4473
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004474static struct symtable *
4475symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004476{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004477 struct symtable *st;
4478
4479 st = symtable_init();
4480 if (st == NULL)
4481 return NULL;
4482 st->st_future = ff;
4483 st->st_filename = filename;
4484 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
4485 if (st->st_errors > 0)
4486 goto fail;
4487 symtable_node(st, n);
4488 if (st->st_errors > 0)
4489 goto fail;
4490 return st;
4491 fail:
4492 if (!PyErr_Occurred()) {
4493 /* This could happen because after a syntax error is
4494 detected, the symbol-table-building continues for
4495 a while, and PyErr_Clear() might erroneously be
4496 called during that process. One such case has been
4497 fixed, but there might be more (now or later).
4498 */
4499 PyErr_SetString(PyExc_SystemError, "lost exception");
4500 }
4501 st->st_future = NULL;
4502 st->st_filename = NULL;
4503 PySymtable_Free(st);
4504 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004505}
4506
4507static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004508symtable_init_compiling_symbols(struct compiling *c)
4509{
4510 PyObject *varnames;
4511
4512 varnames = c->c_symtable->st_cur->ste_varnames;
4513 if (varnames == NULL) {
4514 varnames = PyList_New(0);
4515 if (varnames == NULL)
4516 return -1;
4517 c->c_symtable->st_cur->ste_varnames = varnames;
4518 Py_INCREF(varnames);
4519 } else
4520 Py_INCREF(varnames);
4521 c->c_varnames = varnames;
4522
4523 c->c_globals = PyDict_New();
4524 if (c->c_globals == NULL)
4525 return -1;
4526 c->c_freevars = PyDict_New();
4527 if (c->c_freevars == NULL)
4528 return -1;
4529 c->c_cellvars = PyDict_New();
4530 if (c->c_cellvars == NULL)
4531 return -1;
4532 return 0;
4533}
4534
4535struct symbol_info {
4536 int si_nlocals;
4537 int si_ncells;
4538 int si_nfrees;
4539 int si_nimplicit;
4540};
4541
4542static void
4543symtable_init_info(struct symbol_info *si)
4544{
4545 si->si_nlocals = 0;
4546 si->si_ncells = 0;
4547 si->si_nfrees = 0;
4548 si->si_nimplicit = 0;
4549}
4550
4551static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004552symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004553 struct symbol_info *si)
4554{
4555 PyObject *dict, *v;
4556
4557 /* Seperate logic for DEF_FREE. If it occurs in a function,
4558 it indicates a local that we must allocate storage for (a
4559 cell var). If it occurs in a class, then the class has a
4560 method and a free variable with the same name.
4561 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004562 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004563 /* If it isn't declared locally, it can't be a cell. */
4564 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4565 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004566 v = PyInt_FromLong(si->si_ncells++);
4567 dict = c->c_cellvars;
4568 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004569 /* If it is free anyway, then there is no need to do
4570 anything here.
4571 */
4572 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004573 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004574 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004575 v = PyInt_FromLong(si->si_nfrees++);
4576 dict = c->c_freevars;
4577 }
4578 if (v == NULL)
4579 return -1;
4580 if (PyDict_SetItem(dict, name, v) < 0) {
4581 Py_DECREF(v);
4582 return -1;
4583 }
4584 Py_DECREF(v);
4585 return 0;
4586}
4587
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004588/* If a variable is a cell and an argument, make sure that appears in
4589 co_cellvars before any variable to its right in varnames.
4590*/
4591
4592
4593static int
4594symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4595 PyObject *varnames, int flags)
4596{
Tim Petersb39903b2003-03-24 17:22:24 +00004597 PyObject *v = NULL;
4598 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004599 int i, pos;
4600
4601 if (flags & CO_VARARGS)
4602 argcount++;
4603 if (flags & CO_VARKEYWORDS)
4604 argcount++;
4605 for (i = argcount; --i >= 0; ) {
4606 v = PyList_GET_ITEM(varnames, i);
4607 if (PyDict_GetItem(*cellvars, v)) {
4608 if (list == NULL) {
4609 list = PyList_New(1);
4610 if (list == NULL)
4611 return -1;
4612 PyList_SET_ITEM(list, 0, v);
4613 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004614 } else {
4615 if (PyList_Insert(list, 0, v) < 0) {
4616 Py_DECREF(list);
4617 return -1;
4618 }
4619 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004620 }
4621 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00004622 if (list == NULL)
4623 return 0;
4624
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004625 /* There are cellvars that are also arguments. Create a dict
4626 to replace cellvars and put the args at the front.
4627 */
4628 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004629 if (d == NULL)
4630 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004631 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4632 v = PyInt_FromLong(i);
4633 if (v == NULL)
4634 goto fail;
4635 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4636 goto fail;
4637 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4638 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00004639 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004640 }
4641 pos = 0;
4642 i = PyList_GET_SIZE(list);
4643 Py_DECREF(list);
4644 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4645 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004646 if (w == NULL)
4647 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004648 if (PyDict_SetItem(d, v, w) < 0) {
4649 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00004650 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004651 goto fail;
4652 }
4653 Py_DECREF(w);
4654 }
4655 Py_DECREF(*cellvars);
4656 *cellvars = d;
4657 return 1;
4658 fail:
4659 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00004660 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004661 return -1;
4662}
4663
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004664static int
4665symtable_freevar_offsets(PyObject *freevars, int offset)
4666{
4667 PyObject *name, *v;
4668 int pos;
4669
4670 /* The cell vars are the first elements of the closure,
4671 followed by the free vars. Update the offsets in
4672 c_freevars to account for number of cellvars. */
4673 pos = 0;
4674 while (PyDict_Next(freevars, &pos, &name, &v)) {
4675 int i = PyInt_AS_LONG(v) + offset;
4676 PyObject *o = PyInt_FromLong(i);
4677 if (o == NULL)
4678 return -1;
4679 if (PyDict_SetItem(freevars, name, o) < 0) {
4680 Py_DECREF(o);
4681 return -1;
4682 }
4683 Py_DECREF(o);
4684 }
4685 return 0;
4686}
4687
4688static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004689symtable_check_unoptimized(struct compiling *c,
4690 PySymtableEntryObject *ste,
4691 struct symbol_info *si)
4692{
4693 char buf[300];
4694
4695 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4696 || (ste->ste_nested && si->si_nimplicit)))
4697 return 0;
4698
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004699#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4700
4701#define ILLEGAL_IS "is a nested function"
4702
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004703#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004704"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004705
4706#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004707"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004708
4709#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00004710"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004711"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004712
4713 /* XXX perhaps the linenos for these opt-breaking statements
4714 should be stored so the exception can point to them. */
4715
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004716 if (ste->ste_child_free) {
4717 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004718 PyOS_snprintf(buf, sizeof(buf),
4719 ILLEGAL_IMPORT_STAR,
4720 PyString_AS_STRING(ste->ste_name),
4721 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004722 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004723 PyOS_snprintf(buf, sizeof(buf),
4724 ILLEGAL_BARE_EXEC,
4725 PyString_AS_STRING(ste->ste_name),
4726 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004727 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004728 PyOS_snprintf(buf, sizeof(buf),
4729 ILLEGAL_EXEC_AND_IMPORT_STAR,
4730 PyString_AS_STRING(ste->ste_name),
4731 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004732 }
4733 } else {
4734 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004735 PyOS_snprintf(buf, sizeof(buf),
4736 ILLEGAL_IMPORT_STAR,
4737 PyString_AS_STRING(ste->ste_name),
4738 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004739 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004740 PyOS_snprintf(buf, sizeof(buf),
4741 ILLEGAL_BARE_EXEC,
4742 PyString_AS_STRING(ste->ste_name),
4743 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004744 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004745 PyOS_snprintf(buf, sizeof(buf),
4746 ILLEGAL_EXEC_AND_IMPORT_STAR,
4747 PyString_AS_STRING(ste->ste_name),
4748 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004749 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004750 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004751
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004752 PyErr_SetString(PyExc_SyntaxError, buf);
4753 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4754 ste->ste_opt_lineno);
4755 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004756}
4757
4758static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004759symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4760 struct symbol_info *si)
4761{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004762 if (c->c_future)
4763 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004764 if (ste->ste_generator)
4765 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004766 if (ste->ste_type != TYPE_MODULE)
4767 c->c_flags |= CO_NEWLOCALS;
4768 if (ste->ste_type == TYPE_FUNCTION) {
4769 c->c_nlocals = si->si_nlocals;
4770 if (ste->ste_optimized == 0)
4771 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004772 else if (ste->ste_optimized != OPT_EXEC)
4773 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004774 }
4775 return 0;
4776}
4777
4778static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004779symtable_load_symbols(struct compiling *c)
4780{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004781 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004782 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004783 PyObject *name, *varnames, *v;
4784 int i, flags, pos;
4785 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004786
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004787 v = NULL;
4788
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004789 if (symtable_init_compiling_symbols(c) < 0)
4790 goto fail;
4791 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004792 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004793 si.si_nlocals = PyList_GET_SIZE(varnames);
4794 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004795
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004796 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004797 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004798 if (v == NULL)
4799 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004800 if (PyDict_SetItem(c->c_locals,
4801 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004802 goto fail;
4803 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004804 }
4805
4806 /* XXX The cases below define the rules for whether a name is
4807 local or global. The logic could probably be clearer. */
4808 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004809 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4810 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004811
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004812 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004813 /* undo the original DEF_FREE */
4814 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004815
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004816 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004817 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004818 2. Free variables in methods that are also class
4819 variables or declared global.
4820 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004821 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004822 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004823
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004824 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004825 c->c_argcount--;
4826 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004827 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004828 c->c_argcount--;
4829 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004830 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004831 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004832 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004833 if (flags & DEF_PARAM) {
4834 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004835 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004836 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004837 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004838 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004839 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004840 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004841 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4842 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004843 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004844 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00004845 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004846 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004847 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004848 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004849 if (v == NULL)
4850 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004851 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004852 goto fail;
4853 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004854 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004855 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004856 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004857 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004858 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004859 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004860 if (v == NULL)
4861 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004862 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004863 goto fail;
4864 Py_DECREF(v);
4865 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004866 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004867 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00004868 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004869 goto fail;
4870 if (st->st_nscopes != 1) {
4871 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004872 if (v == NULL)
4873 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004874 if (PyDict_SetItem(st->st_global,
4875 name, v))
4876 goto fail;
4877 Py_DECREF(v);
4878 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004879 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004880 }
4881 }
4882
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004883 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4884
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004885 if (si.si_ncells > 1) { /* one cell is always in order */
4886 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4887 c->c_varnames, c->c_flags) < 0)
4888 return -1;
4889 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004890 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4891 return -1;
4892 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004893 fail:
4894 /* is this always the right thing to do? */
4895 Py_XDECREF(v);
4896 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004897}
4898
4899static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004900symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004901{
4902 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004903
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004904 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004905 if (st == NULL)
4906 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004907 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00004908
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004909 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004910 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004911 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004912 goto fail;
4913 if ((st->st_symbols = PyDict_New()) == NULL)
4914 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004915 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004916 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004917 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004918 st->st_private = NULL;
4919 return st;
4920 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004921 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004922 return NULL;
4923}
4924
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004925void
4926PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004927{
4928 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004929 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004930 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004931 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004932}
4933
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004934/* When the compiler exits a scope, it must should update the scope's
4935 free variable information with the list of free variables in its
4936 children.
4937
4938 Variables that are free in children and defined in the current
4939 scope are cellvars.
4940
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004941 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004942 false), free variables in children that are not defined here are
4943 implicit globals.
4944
4945*/
4946
4947static int
4948symtable_update_free_vars(struct symtable *st)
4949{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004950 int i, j, def;
4951 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004952 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004953
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004954 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004955 def = DEF_FREE_CLASS;
4956 else
4957 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004958 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004959 int pos = 0;
4960
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00004961 if (list && PyList_SetSlice(list, 0,
4962 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004963 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00004964 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004965 PyList_GET_ITEM(ste->ste_children, i);
4966 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004967 int flags = PyInt_AS_LONG(o);
4968 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004969 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004970 if (list == NULL) {
4971 list = PyList_New(0);
4972 if (list == NULL)
4973 return -1;
4974 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004975 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004976 if (PyList_Append(list, name) < 0) {
4977 Py_DECREF(list);
4978 return -1;
4979 }
4980 }
4981 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004982 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004983 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004984 v = PyDict_GetItem(ste->ste_symbols, name);
4985 /* If a name N is declared global in scope A and
4986 referenced in scope B contained (perhaps
4987 indirectly) in A and there are no scopes
4988 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004989 is global in B. Unless A is a class scope,
4990 because class scopes are not considered for
4991 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004992 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004993 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004994 int flags = PyInt_AS_LONG(v);
4995 if (flags & DEF_GLOBAL) {
4996 symtable_undo_free(st, child->ste_id,
4997 name);
4998 continue;
4999 }
5000 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005001 if (ste->ste_nested) {
5002 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005003 name, def) < 0) {
5004 Py_DECREF(list);
5005 return -1;
5006 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005007 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005008 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005009 name) < 0) {
5010 Py_DECREF(list);
5011 return -1;
5012 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005013 }
5014 }
5015 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005016
5017 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005018 return 0;
5019}
5020
5021/* If the current scope is a non-nested class or if name is not
5022 defined in the current, non-nested scope, then it is an implicit
5023 global in all nested scopes.
5024*/
5025
5026static int
5027symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5028{
5029 PyObject *o;
5030 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005031 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005032
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005033 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005034 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005035 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005036 if (o == NULL)
5037 return symtable_undo_free(st, child, name);
5038 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005039
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005040 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005041 return symtable_undo_free(st, child, name);
5042 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005043 return symtable_add_def_o(st, ste->ste_symbols,
5044 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005045}
5046
5047static int
5048symtable_undo_free(struct symtable *st, PyObject *id,
5049 PyObject *name)
5050{
5051 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005052 PyObject *info;
5053 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005054
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005055 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5056 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005057 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005058
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005059 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005060 if (info == NULL)
5061 return 0;
5062 v = PyInt_AS_LONG(info);
5063 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005064 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005065 DEF_FREE_GLOBAL) < 0)
5066 return -1;
5067 } else
5068 /* If the name is defined here or declared global,
5069 then the recursion stops. */
5070 return 0;
5071
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005072 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5073 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005074 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005075 PyList_GET_ITEM(ste->ste_children, i);
5076 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005077 if (x < 0)
5078 return x;
5079 }
5080 return 0;
5081}
5082
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005083/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5084 This reference is released when the scope is exited, via the DECREF
5085 in symtable_exit_scope().
5086*/
5087
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005088static int
5089symtable_exit_scope(struct symtable *st)
5090{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005091 int end;
5092
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005093 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005094 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005095 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005096 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005097 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5098 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005099 if (PySequence_DelItem(st->st_stack, end) < 0)
5100 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005101 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005102}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005103
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005104static void
5105symtable_enter_scope(struct symtable *st, char *name, int type,
5106 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005107{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005108 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005109
5110 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005111 prev = st->st_cur;
5112 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005113 st->st_errors++;
5114 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005115 }
5116 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005117 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005118 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005119 if (st->st_cur == NULL) {
5120 st->st_errors++;
5121 return;
5122 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005123 if (strcmp(name, TOP) == 0)
5124 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005125 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005126 if (PyList_Append(prev->ste_children,
5127 (PyObject *)st->st_cur) < 0)
5128 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005129 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005130}
5131
5132static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005133symtable_lookup(struct symtable *st, char *name)
5134{
5135 char buffer[MANGLE_LEN];
5136 PyObject *v;
5137 int flags;
5138
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005139 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005140 name = buffer;
5141 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5142 if (v == NULL) {
5143 if (PyErr_Occurred())
5144 return -1;
5145 else
5146 return 0;
5147 }
5148
5149 flags = PyInt_AS_LONG(v);
5150 return flags;
5151}
5152
5153static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005154symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005155{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005156 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005157 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005158 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005159
Guido van Rossumb7164622002-08-16 02:48:11 +00005160 /* Warn about None, except inside a tuple (where the assignment
5161 code already issues a warning). */
5162 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5163 *name == 'N' && strcmp(name, "None") == 0)
5164 {
5165 if (symtable_warn(st, "argument named None"))
5166 return -1;
5167 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005168 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005169 name = buffer;
5170 if ((s = PyString_InternFromString(name)) == NULL)
5171 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005172 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5173 Py_DECREF(s);
5174 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005175}
5176
5177/* Must only be called with mangled names */
5178
5179static int
5180symtable_add_def_o(struct symtable *st, PyObject *dict,
5181 PyObject *name, int flag)
5182{
5183 PyObject *o;
5184 int val;
5185
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005186 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005187 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005188 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005189 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005190 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005191 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005192 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005193 return -1;
5194 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005195 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005196 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005197 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005198 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005199 if (o == NULL)
5200 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005201 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005202 Py_DECREF(o);
5203 return -1;
5204 }
5205 Py_DECREF(o);
5206
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005207 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005208 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005209 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005210 } else if (flag & DEF_GLOBAL) {
5211 /* XXX need to update DEF_GLOBAL for other flags too;
5212 perhaps only DEF_FREE_GLOBAL */
5213 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005214 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005215 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005216 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005217 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005218 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005219 if (o == NULL)
5220 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005221 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005222 Py_DECREF(o);
5223 return -1;
5224 }
5225 Py_DECREF(o);
5226 }
5227 return 0;
5228}
5229
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005230#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005231
Tim Peters08a898f2001-06-28 01:52:22 +00005232/* Look for a yield stmt under n. Return 1 if found, else 0.
5233 This hack is used to look inside "if 0:" blocks (which are normally
5234 ignored) in case those are the only places a yield occurs (so that this
5235 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005236static int
5237look_for_yield(node *n)
5238{
5239 int i;
5240
5241 for (i = 0; i < NCH(n); ++i) {
5242 node *kid = CHILD(n, i);
5243
5244 switch (TYPE(kid)) {
5245
5246 case classdef:
5247 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005248 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005249 /* Stuff in nested functions and classes can't make
5250 the parent a generator. */
5251 return 0;
5252
5253 case yield_stmt:
5254 return 1;
5255
5256 default:
5257 if (look_for_yield(kid))
5258 return 1;
5259 }
5260 }
5261 return 0;
5262}
5263
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005264static void
5265symtable_node(struct symtable *st, node *n)
5266{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005267 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005268
5269 loop:
5270 switch (TYPE(n)) {
5271 case funcdef: {
5272 char *func_name = STR(CHILD(n, 1));
5273 symtable_add_def(st, func_name, DEF_LOCAL);
5274 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005275 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005276 symtable_funcdef(st, n);
5277 symtable_exit_scope(st);
5278 break;
5279 }
5280 case lambdef:
5281 if (NCH(n) == 4)
5282 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005283 symtable_enter_scope(st, "lambda", 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 case classdef: {
5288 char *tmp, *class_name = STR(CHILD(n, 1));
5289 symtable_add_def(st, class_name, DEF_LOCAL);
5290 if (TYPE(CHILD(n, 2)) == LPAR) {
5291 node *bases = CHILD(n, 3);
5292 int i;
5293 for (i = 0; i < NCH(bases); i += 2) {
5294 symtable_node(st, CHILD(bases, i));
5295 }
5296 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005297 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005298 tmp = st->st_private;
5299 st->st_private = class_name;
5300 symtable_node(st, CHILD(n, NCH(n) - 1));
5301 st->st_private = tmp;
5302 symtable_exit_scope(st);
5303 break;
5304 }
5305 case if_stmt:
5306 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005307 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5308 if (st->st_cur->ste_generator == 0)
5309 st->st_cur->ste_generator =
5310 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005311 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005312 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005313 symtable_node(st, CHILD(n, i + 1));
5314 symtable_node(st, CHILD(n, i + 3));
5315 }
5316 if (i + 2 < NCH(n))
5317 symtable_node(st, CHILD(n, i + 2));
5318 break;
5319 case global_stmt:
5320 symtable_global(st, n);
5321 break;
5322 case import_stmt:
5323 symtable_import(st, n);
5324 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005325 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005326 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005327 symtable_node(st, CHILD(n, 1));
5328 if (NCH(n) > 2)
5329 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005330 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005331 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005332 st->st_cur->ste_opt_lineno = n->n_lineno;
5333 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005334 if (NCH(n) > 4)
5335 symtable_node(st, CHILD(n, 5));
5336 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005337
5338 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005339 case assert_stmt:
5340 if (Py_OptimizeFlag)
5341 return;
5342 if (NCH(n) == 2) {
5343 n = CHILD(n, 1);
5344 goto loop;
5345 } else {
5346 symtable_node(st, CHILD(n, 1));
5347 n = CHILD(n, 3);
5348 goto loop;
5349 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005350 case except_clause:
5351 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005352 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005353 if (NCH(n) > 1) {
5354 n = CHILD(n, 1);
5355 goto loop;
5356 }
5357 break;
5358 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005359 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005360 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005361 case yield_stmt:
5362 st->st_cur->ste_generator = 1;
5363 n = CHILD(n, 1);
5364 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005365 case expr_stmt:
5366 if (NCH(n) == 1)
5367 n = CHILD(n, 0);
5368 else {
5369 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005370 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005371 symtable_node(st, CHILD(n, 2));
5372 break;
5373 } else {
5374 int i;
5375 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005376 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005377 n = CHILD(n, NCH(n) - 1);
5378 }
5379 }
5380 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005381 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005382 /* only occurs when there are multiple for loops
5383 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005384 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005385 if (TYPE(n) == list_for)
5386 symtable_list_for(st, n);
5387 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005388 REQ(n, list_if);
5389 symtable_node(st, CHILD(n, 1));
5390 if (NCH(n) == 3) {
5391 n = CHILD(n, 2);
5392 goto loop;
5393 }
5394 }
5395 break;
5396 case for_stmt:
5397 symtable_assign(st, CHILD(n, 1), 0);
5398 for (i = 3; i < NCH(n); ++i)
5399 if (TYPE(CHILD(n, i)) >= single_input)
5400 symtable_node(st, CHILD(n, i));
5401 break;
5402 /* The remaining cases fall through to default except in
5403 special circumstances. This requires the individual cases
5404 to be coded with great care, even though they look like
5405 rather innocuous. Each case must double-check TYPE(n).
5406 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005407 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005408 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005409 n = CHILD(n, 2);
5410 goto loop;
5411 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005412 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005413 case listmaker:
5414 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005415 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005416 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005417 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005418 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005419 case atom:
5420 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5421 symtable_add_use(st, STR(CHILD(n, 0)));
5422 break;
5423 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005424 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005425 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005426 /* Walk over every non-token child with a special case
5427 for one child.
5428 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005429 if (NCH(n) == 1) {
5430 n = CHILD(n, 0);
5431 goto loop;
5432 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005433 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005434 if (TYPE(CHILD(n, i)) >= single_input)
5435 symtable_node(st, CHILD(n, i));
5436 }
5437}
5438
5439static void
5440symtable_funcdef(struct symtable *st, node *n)
5441{
5442 node *body;
5443
5444 if (TYPE(n) == lambdef) {
5445 if (NCH(n) == 4)
5446 symtable_params(st, CHILD(n, 1));
5447 } else
5448 symtable_params(st, CHILD(n, 2));
5449 body = CHILD(n, NCH(n) - 1);
5450 symtable_node(st, body);
5451}
5452
5453/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00005454 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005455 which are references in the defining scope. symtable_params()
5456 parses the parameter names, which are defined in the function's
5457 body.
5458
5459 varargslist:
5460 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5461 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5462*/
5463
5464static void
5465symtable_default_args(struct symtable *st, node *n)
5466{
5467 node *c;
5468 int i;
5469
5470 if (TYPE(n) == parameters) {
5471 n = CHILD(n, 1);
5472 if (TYPE(n) == RPAR)
5473 return;
5474 }
5475 REQ(n, varargslist);
5476 for (i = 0; i < NCH(n); i += 2) {
5477 c = CHILD(n, i);
5478 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5479 break;
5480 }
5481 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5482 symtable_node(st, CHILD(n, i));
5483 }
5484}
5485
5486static void
5487symtable_params(struct symtable *st, node *n)
5488{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005489 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00005490 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005491
5492 if (TYPE(n) == parameters) {
5493 n = CHILD(n, 1);
5494 if (TYPE(n) == RPAR)
5495 return;
5496 }
5497 REQ(n, varargslist);
5498 for (i = 0; i < NCH(n); i += 2) {
5499 c = CHILD(n, i);
5500 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5501 ext = 1;
5502 break;
5503 }
5504 if (TYPE(c) == test) {
5505 continue;
5506 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00005507 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005508 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00005509 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005510 char nbuf[30];
5511 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005512 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005513 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005514 }
5515 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005516 if (ext) {
5517 c = CHILD(n, i);
5518 if (TYPE(c) == STAR) {
5519 i++;
5520 symtable_add_def(st, STR(CHILD(n, i)),
5521 DEF_PARAM | DEF_STAR);
5522 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005523 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005524 c = NULL;
5525 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005526 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005527 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005528 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005529 i++;
5530 symtable_add_def(st, STR(CHILD(n, i)),
5531 DEF_PARAM | DEF_DOUBLESTAR);
5532 }
5533 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005534 if (complex >= 0) {
5535 int j;
5536 for (j = 0; j <= complex; j++) {
5537 c = CHILD(n, j);
5538 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005539 c = CHILD(n, ++j);
5540 else if (TYPE(c) == EQUAL)
5541 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005542 if (TYPE(CHILD(c, 0)) == LPAR)
5543 symtable_params_fplist(st, CHILD(c, 1));
5544 }
5545 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005546}
5547
5548static void
5549symtable_params_fplist(struct symtable *st, node *n)
5550{
5551 int i;
5552 node *c;
5553
5554 REQ(n, fplist);
5555 for (i = 0; i < NCH(n); i += 2) {
5556 c = CHILD(n, i);
5557 REQ(c, fpdef);
5558 if (NCH(c) == 1)
5559 symtable_add_def(st, STR(CHILD(c, 0)),
5560 DEF_PARAM | DEF_INTUPLE);
5561 else
5562 symtable_params_fplist(st, CHILD(c, 1));
5563 }
5564
5565}
5566
5567static void
5568symtable_global(struct symtable *st, node *n)
5569{
5570 int i;
5571
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005572 /* XXX It might be helpful to warn about module-level global
5573 statements, but it's hard to tell the difference between
5574 module-level and a string passed to exec.
5575 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005576
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005577 for (i = 1; i < NCH(n); i += 2) {
5578 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005579 int flags;
5580
5581 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005582 if (flags < 0)
5583 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005584 if (flags && flags != DEF_GLOBAL) {
5585 char buf[500];
5586 if (flags & DEF_PARAM) {
5587 PyErr_Format(PyExc_SyntaxError,
5588 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005589 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005590 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005591 st->st_cur->ste_lineno);
5592 st->st_errors++;
5593 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005594 }
5595 else {
5596 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005597 PyOS_snprintf(buf, sizeof(buf),
5598 GLOBAL_AFTER_ASSIGN,
5599 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005600 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005601 PyOS_snprintf(buf, sizeof(buf),
5602 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005603 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005604 }
5605 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005606 symtable_add_def(st, name, DEF_GLOBAL);
5607 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005608}
5609
5610static void
5611symtable_list_comprehension(struct symtable *st, node *n)
5612{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005613 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005614 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005615
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005616 REQ(n, listmaker);
5617 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
5618 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005619 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005620 symtable_list_for(st, CHILD(n, 1));
5621 symtable_node(st, CHILD(n, 0));
5622 --st->st_cur->ste_tmpname;
5623}
5624
5625static void
5626symtable_list_for(struct symtable *st, node *n)
5627{
5628 REQ(n, list_for);
5629 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005630 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005631 symtable_node(st, CHILD(n, 3));
5632 if (NCH(n) == 5)
5633 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005634}
5635
5636static void
5637symtable_import(struct symtable *st, node *n)
5638{
5639 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005640 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005641 | 'from' dotted_name 'import'
5642 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005643 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005644 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005645 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005646 node *dotname = CHILD(n, 1);
5647 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5648 /* check for bogus imports */
5649 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5650 PyErr_SetString(PyExc_SyntaxError,
5651 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005652 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005653 n->n_lineno);
5654 st->st_errors++;
5655 return;
5656 }
5657 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005658 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005659 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005660 if (symtable_warn(st,
5661 "import * only allowed at module level") < 0)
5662 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005663 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005664 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005665 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005666 } else {
5667 for (i = 3; i < NCH(n); i += 2) {
5668 node *c = CHILD(n, i);
5669 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005670 symtable_assign(st, CHILD(c, 2),
5671 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005672 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005673 symtable_assign(st, CHILD(c, 0),
5674 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005675 }
5676 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005677 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005678 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005679 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005680 }
5681 }
5682}
5683
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005684/* The third argument to symatble_assign() is a flag to be passed to
5685 symtable_add_def() if it is eventually called. The flag is useful
5686 to specify the particular type of assignment that should be
5687 recorded, e.g. an assignment caused by import.
5688 */
5689
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005690static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005691symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005692{
5693 node *tmp;
5694 int i;
5695
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005696 loop:
5697 switch (TYPE(n)) {
5698 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005699 /* invalid assignment, e.g. lambda x:x=2. The next
5700 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005701 return;
5702 case power:
5703 if (NCH(n) > 2) {
5704 for (i = 2; i < NCH(n); ++i)
5705 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5706 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005707 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005708 if (NCH(n) > 1) {
5709 symtable_node(st, CHILD(n, 0));
5710 symtable_node(st, CHILD(n, 1));
5711 } else {
5712 n = CHILD(n, 0);
5713 goto loop;
5714 }
5715 return;
5716 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005717 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5718 /* XXX This is an error, but the next pass
5719 will catch it. */
5720 return;
5721 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005722 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005723 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005724 }
5725 return;
5726 case exprlist:
5727 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00005728 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005729 if (NCH(n) == 1) {
5730 n = CHILD(n, 0);
5731 goto loop;
5732 }
5733 else {
5734 int i;
5735 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005736 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005737 return;
5738 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005739 case atom:
5740 tmp = CHILD(n, 0);
5741 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5742 n = CHILD(n, 1);
5743 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005744 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00005745 if (strcmp(STR(tmp), "__debug__") == 0) {
5746 PyErr_SetString(PyExc_SyntaxError,
5747 ASSIGN_DEBUG);
5748 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton86424e32001-12-04 02:41:46 +00005749 n->n_lineno);
Jeremy Hylton778e2652001-11-09 19:50:08 +00005750 st->st_errors++;
5751 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005752 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005753 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005754 return;
5755 case dotted_as_name:
5756 if (NCH(n) == 3)
5757 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005758 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005759 else
5760 symtable_add_def(st,
5761 STR(CHILD(CHILD(n,
5762 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005763 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005764 return;
5765 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005766 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005767 return;
5768 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005769 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005770 return;
5771 default:
5772 if (NCH(n) == 0)
5773 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005774 if (NCH(n) == 1) {
5775 n = CHILD(n, 0);
5776 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005777 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005778 /* Should only occur for errors like x + 1 = 1,
5779 which will be caught in the next pass. */
5780 for (i = 0; i < NCH(n); ++i)
5781 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005782 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005783 }
5784}