blob: 76a37115105c9c6178fcf967f311444362aba61c [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;
107 PyObject *code;
108 PyObject *consts;
109 PyObject *names;
110 PyObject *varnames;
111 PyObject *freevars = NULL;
112 PyObject *cellvars = NULL;
113 PyObject *filename;
114 PyObject *name;
115 int firstlineno;
116 PyObject *lnotab;
117
118 if (!PyArg_ParseTuple(args, "iiiiSO!O!O!SSiS|O!O!:code",
119 &argcount, &nlocals, &stacksize, &flags,
120 &code,
121 &PyTuple_Type, &consts,
122 &PyTuple_Type, &names,
123 &PyTuple_Type, &varnames,
124 &filename, &name,
125 &firstlineno, &lnotab,
126 &PyTuple_Type, &freevars,
127 &PyTuple_Type, &cellvars))
128 return NULL;
129
130 if (freevars == NULL || cellvars == NULL) {
131 PyObject *empty = PyTuple_New(0);
132 if (empty == NULL)
133 return NULL;
134 if (freevars == NULL) {
135 freevars = empty;
136 Py_INCREF(freevars);
137 }
138 if (cellvars == NULL) {
139 cellvars = empty;
140 Py_INCREF(cellvars);
141 }
142 Py_DECREF(empty);
143 }
144
145 if (!PyObject_CheckReadBuffer(code)) {
146 PyErr_SetString(PyExc_TypeError,
147 "bytecode object must be a single-segment read-only buffer");
148 return NULL;
149 }
150
151 return (PyObject *)PyCode_New(argcount, nlocals, stacksize, flags,
152 code, consts, names, varnames,
153 freevars, cellvars, filename, name,
154 firstlineno, lnotab);
155}
156
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000157static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000158code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000159{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000160 Py_XDECREF(co->co_code);
161 Py_XDECREF(co->co_consts);
162 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000163 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000164 Py_XDECREF(co->co_freevars);
165 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000166 Py_XDECREF(co->co_filename);
167 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000168 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000169 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000170}
171
Guido van Rossum79f25d91997-04-29 20:08:16 +0000172static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000173code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000174{
175 char buf[500];
176 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000177 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000178 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000179
Guido van Rossuma396a882000-04-07 01:21:36 +0000180 if (co->co_firstlineno != 0)
181 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000182 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000183 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000184 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000185 name = PyString_AS_STRING(co->co_name);
Barry Warsaw8f6d8682001-11-28 21:10:39 +0000186 PyOS_snprintf(buf, sizeof(buf),
187 "<code object %.100s at %p, file \"%.300s\", line %d>",
188 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000189 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000190}
191
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000192static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000193code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000194{
195 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000196 cmp = PyObject_Compare(co->co_name, cp->co_name);
197 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000198 cmp = co->co_argcount - cp->co_argcount;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000199 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000200 cmp = co->co_nlocals - cp->co_nlocals;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000201 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000202 cmp = co->co_flags - cp->co_flags;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000203 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000204 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000205 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000206 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000207 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000208 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000209 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000210 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000211 if (cmp) return cmp;
212 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
213 if (cmp) return cmp;
214 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000215 return cmp;
216}
217
218static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000219code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000220{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000221 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000222 h0 = PyObject_Hash(co->co_name);
223 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000224 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000225 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000227 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000228 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000229 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000230 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000231 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000232 h5 = PyObject_Hash(co->co_freevars);
233 if (h5 == -1) return -1;
234 h6 = PyObject_Hash(co->co_cellvars);
235 if (h6 == -1) return -1;
236 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000237 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000238 if (h == -1) h = -2;
239 return h;
240}
241
Jeremy Hylton78891072001-03-01 06:09:34 +0000242/* XXX code objects need to participate in GC? */
243
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244PyTypeObject PyCode_Type = {
245 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000246 0,
247 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000248 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000249 0,
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000250 (destructor)code_dealloc, /* tp_dealloc */
251 0, /* tp_print */
252 0, /* tp_getattr */
253 0, /* tp_setattr */
254 (cmpfunc)code_compare, /* tp_compare */
255 (reprfunc)code_repr, /* tp_repr */
256 0, /* tp_as_number */
257 0, /* tp_as_sequence */
258 0, /* tp_as_mapping */
259 (hashfunc)code_hash, /* tp_hash */
260 0, /* tp_call */
261 0, /* tp_str */
262 PyObject_GenericGetAttr, /* tp_getattro */
263 0, /* tp_setattro */
264 0, /* tp_as_buffer */
265 Py_TPFLAGS_DEFAULT, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000266 code_doc, /* tp_doc */
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000267 0, /* tp_traverse */
268 0, /* tp_clear */
269 0, /* tp_richcompare */
270 0, /* tp_weaklistoffset */
271 0, /* tp_iter */
272 0, /* tp_iternext */
273 0, /* tp_methods */
274 code_memberlist, /* tp_members */
275 0, /* tp_getset */
276 0, /* tp_base */
277 0, /* tp_dict */
278 0, /* tp_descr_get */
279 0, /* tp_descr_set */
280 0, /* tp_dictoffset */
281 0, /* tp_init */
282 0, /* tp_alloc */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000283 code_new, /* tp_new */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000284};
285
Guido van Rossum644a12b1997-04-09 19:24:53 +0000286#define NAME_CHARS \
287 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
288
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000289/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
290
291static int
292all_name_chars(unsigned char *s)
293{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000294 static char ok_name_char[256];
295 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000296
Guido van Rossumcd90c202001-02-09 15:06:42 +0000297 if (ok_name_char[*name_chars] == 0) {
298 unsigned char *p;
299 for (p = name_chars; *p; p++)
300 ok_name_char[*p] = 1;
301 }
302 while (*s) {
303 if (ok_name_char[*s++] == 0)
304 return 0;
305 }
306 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000307}
308
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000309static int
310intern_strings(PyObject *tuple)
311{
312 int i;
313
314 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
315 PyObject *v = PyTuple_GET_ITEM(tuple, i);
316 if (v == NULL || !PyString_Check(v)) {
317 Py_FatalError("non-string found in code slot");
318 PyErr_BadInternalCall();
319 return -1;
320 }
321 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
322 }
323 return 0;
324}
325
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000326#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
327#define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD)
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000328#define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE || op==CONTINUE_LOOP)
329#define GETJUMPTGT(arr, i) (GETARG(arr,i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+3))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000330#define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255
331
332static PyObject *
333optimize_code(PyObject *code, PyObject* consts)
334{
335 int i, j, codelen;
336 int tgt, tgttgt, opcode;
337 unsigned char *codestr;
338
339 /* Make a modifiable copy of the code string */
340 if (!PyString_Check(code))
341 goto exitUnchanged;
342 codelen = PyString_Size(code);
343 codestr = PyMem_Malloc(codelen);
Raymond Hettingerf4cf76d2003-04-24 05:45:23 +0000344 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000345 goto exitUnchanged;
346 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
347 assert(PyTuple_Check(consts));
348
Raymond Hettingerf4cf76d2003-04-24 05:45:23 +0000349 for (i=0 ; i<codelen-7 ; i += HAS_ARG(codestr[i]) ? 3 : 1) {
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000350 opcode = codestr[i];
351 switch (opcode) {
352
353 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP.
354 Note, only the first opcode is changed, the others still
355 perform normally if they happen to be jump targets. */
356 case LOAD_CONST:
357 j = GETARG(codestr, i);
358 if (codestr[i+3] != JUMP_IF_FALSE ||
359 codestr[i+6] != POP_TOP ||
360 !PyObject_IsTrue(PyTuple_GET_ITEM(consts, j)))
361 continue;
362 codestr[i] = JUMP_FORWARD;
363 SETARG(codestr, i, 4);
364 break;
365
Raymond Hettingerf4cf76d2003-04-24 05:45:23 +0000366 /* Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2 JMP+2.
367 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2 JMP+1.
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000368 Note, these opcodes occur together only in assignment
369 statements. Accordingly, the unpack opcode is never
370 a jump target. */
371 case BUILD_TUPLE:
372 case BUILD_LIST:
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000373 if (codestr[i+3] != UNPACK_SEQUENCE)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000374 continue;
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000375 if (GETARG(codestr, i) == 2 && \
376 GETARG(codestr, i+3) == 2) {
377 codestr[i] = ROT_TWO;
378 codestr[i+1] = JUMP_FORWARD;
379 SETARG(codestr, i+1, 2);
Raymond Hettingerf4cf76d2003-04-24 05:45:23 +0000380 codestr[i+4] = DUP_TOP; /* Filler codes used as NOPs */
381 codestr[i+5] = POP_TOP;
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000382 continue;
383 }
384 if (GETARG(codestr, i) == 3 && \
385 GETARG(codestr, i+3) == 3) {
386 codestr[i] = ROT_THREE;
387 codestr[i+1] = ROT_TWO;
388 codestr[i+2] = JUMP_FORWARD;
Raymond Hettingerf4cf76d2003-04-24 05:45:23 +0000389 SETARG(codestr, i+2, 1);
390 codestr[i+5] = DUP_TOP;
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000391 }
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000392 break;
393
394 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000395 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000396 case JUMP_FORWARD:
397 case JUMP_IF_FALSE:
398 case JUMP_IF_TRUE:
399 case JUMP_ABSOLUTE:
400 case CONTINUE_LOOP:
401 case SETUP_LOOP:
402 case SETUP_EXCEPT:
403 case SETUP_FINALLY:
404 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerf4cf76d2003-04-24 05:45:23 +0000405 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000406 continue;
407 tgttgt = GETJUMPTGT(codestr, tgt);
408 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
409 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000410 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000411 tgttgt -= i + 3; /* Calc relative jump addr */
412 if (tgttgt < 0) /* No backward relative jumps */
413 continue;
414 codestr[i] = opcode;
415 SETARG(codestr, i, tgttgt);
416 break;
417
418 case EXTENDED_ARG:
419 PyMem_Free(codestr);
420 goto exitUnchanged;
421 }
422 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000423 code = PyString_FromStringAndSize((char *)codestr, codelen);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000424 PyMem_Free(codestr);
425 return code;
426
427exitUnchanged:
428 Py_INCREF(code);
429 return code;
430}
431
Guido van Rossum79f25d91997-04-29 20:08:16 +0000432PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000433PyCode_New(int argcount, int nlocals, int stacksize, int flags,
434 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000435 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
436 PyObject *filename, PyObject *name, int firstlineno,
437 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000438{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000439 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000440 int i;
441 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000442 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000443 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000444 consts == NULL || !PyTuple_Check(consts) ||
445 names == NULL || !PyTuple_Check(names) ||
446 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000447 freevars == NULL || !PyTuple_Check(freevars) ||
448 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000449 name == NULL || !PyString_Check(name) ||
450 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000451 lnotab == NULL || !PyString_Check(lnotab) ||
452 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000453 PyErr_BadInternalCall();
454 return NULL;
455 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000456 intern_strings(names);
457 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000458 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000459 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000460 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000461 for (i = PyTuple_Size(consts); --i >= 0; ) {
462 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000463 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000464 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000465 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000466 continue;
467 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000468 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000469 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000470 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000471 co->co_argcount = argcount;
472 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000473 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000474 co->co_flags = flags;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000475 co->co_code = optimize_code(code, consts);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000476 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000477 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000478 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000479 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000480 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000481 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000482 Py_INCREF(freevars);
483 co->co_freevars = freevars;
484 Py_INCREF(cellvars);
485 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000486 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000487 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000488 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000489 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000490 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000491 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000492 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000493 if (PyTuple_GET_SIZE(freevars) == 0 &&
494 PyTuple_GET_SIZE(cellvars) == 0)
495 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000496 }
497 return co;
498}
499
500
501/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000502
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000503/* The compiler uses two passes to generate bytecodes. The first pass
504 builds the symbol table. The second pass generates the bytecode.
505
506 The first pass uses a single symtable struct. The second pass uses
507 a compiling struct for each code block. The compiling structs
508 share a reference to the symtable.
509
510 The two passes communicate via symtable_load_symbols() and via
511 is_local() and is_global(). The former initializes several slots
512 in the compiling struct: c_varnames, c_locals, c_nlocals,
513 c_argcount, c_globals, and c_flags.
514*/
515
Tim Peters2a7f3842001-06-09 09:26:21 +0000516/* All about c_lnotab.
517
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000518c_lnotab is an array of unsigned bytes disguised as a Python string. Since
519version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
520mapped to source code line #s via c_lnotab instead.
521
Tim Peters2a7f3842001-06-09 09:26:21 +0000522The array is conceptually a list of
523 (bytecode offset increment, line number increment)
524pairs. The details are important and delicate, best illustrated by example:
525
526 byte code offset source code line number
527 0 1
528 6 2
529 50 7
530 350 307
531 361 308
532
533The first trick is that these numbers aren't stored, only the increments
534from one row to the next (this doesn't really work, but it's a start):
535
536 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
537
538The second trick is that an unsigned byte can't hold negative values, or
539values larger than 255, so (a) there's a deep assumption that byte code
540offsets and their corresponding line #s both increase monotonically, and (b)
541if at least one column jumps by more than 255 from one row to the next, more
542than one pair is written to the table. In case #b, there's no way to know
543from looking at the table later how many were written. That's the delicate
544part. A user of c_lnotab desiring to find the source line number
545corresponding to a bytecode address A should do something like this
546
547 lineno = addr = 0
548 for addr_incr, line_incr in c_lnotab:
549 addr += addr_incr
550 if addr > A:
551 return lineno
552 lineno += line_incr
553
554In order for this to work, when the addr field increments by more than 255,
555the line # increment in each pair generated must be 0 until the remaining addr
556increment is < 256. So, in the example above, com_set_lineno should not (as
557was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
558255, 0, 45, 255, 0, 45.
559*/
560
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000561struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000562 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000563 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000564 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000565 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000566 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +0000567 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000568 PyObject *c_locals; /* dictionary (value=localID) */
569 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000570 PyObject *c_freevars; /* dictionary (value=None) */
571 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000572 int c_nlocals; /* index of next local */
573 int c_argcount; /* number of top-level arguments */
574 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000575 int c_nexti; /* index into c_code */
576 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000577 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000578 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000579 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000580 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000581 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000582 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +0000583 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000584 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000585 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000586 int c_stacklevel; /* Current stack level */
587 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000588 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000589 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000590 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000591 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000592 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000593 int c_nested; /* Is block nested funcdef or lamdef? */
594 int c_closure; /* Is nested w/freevars? */
595 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000596 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000597 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000598};
599
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000600static int
601is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000602{
603 if ((v & (USE | DEF_FREE))
604 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
605 return 1;
606 if (v & DEF_FREE_CLASS)
607 return 1;
608 return 0;
609}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000610
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000611static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000612com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000613{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000614 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
615
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000616 if (c == NULL) {
617 /* Error occurred via symtable call to
618 is_constant_false */
619 PyErr_SetString(exc, msg);
620 return;
621 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000622 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000623 if (c->c_lineno < 1 || c->c_interactive) {
624 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000625 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000626 return;
627 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000628 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000629 if (v == NULL)
630 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000631
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000632 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000633 if (line == NULL) {
634 Py_INCREF(Py_None);
635 line = Py_None;
636 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000637 if (exc == PyExc_SyntaxError) {
638 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
639 Py_None, line);
640 if (t == NULL)
641 goto exit;
642 w = Py_BuildValue("(OO)", v, t);
643 if (w == NULL)
644 goto exit;
645 PyErr_SetObject(exc, w);
646 } else {
647 /* Make sure additional exceptions are printed with
648 file and line, also. */
649 PyErr_SetObject(exc, v);
650 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
651 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000652 exit:
653 Py_XDECREF(t);
654 Py_XDECREF(v);
655 Py_XDECREF(w);
656 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000657}
658
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000659/* Interface to the block stack */
660
661static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000662block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000663{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000664 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000665 com_error(c, PyExc_SystemError,
666 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000667 }
668 else {
669 c->c_block[c->c_nblocks++] = type;
670 }
671}
672
673static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000674block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000675{
676 if (c->c_nblocks > 0)
677 c->c_nblocks--;
678 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000679 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000680 }
681}
682
Guido van Rossum681d79a1995-07-18 14:51:37 +0000683/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000684
Martin v. Löwis95292d62002-12-11 14:04:59 +0000685static int issue_warning(const char *, const char *, int);
686static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000687static void com_free(struct compiling *);
688static void com_push(struct compiling *, int);
689static void com_pop(struct compiling *, int);
690static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000691static void com_node(struct compiling *, node *);
692static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000693static void com_addbyte(struct compiling *, int);
694static void com_addint(struct compiling *, int);
695static void com_addoparg(struct compiling *, int, int);
696static void com_addfwref(struct compiling *, int, int *);
697static void com_backpatch(struct compiling *, int);
698static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
699static int com_addconst(struct compiling *, PyObject *);
700static int com_addname(struct compiling *, PyObject *);
701static void com_addopname(struct compiling *, int, node *);
702static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000703static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000704static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000705static void com_assign(struct compiling *, node *, int, node *);
706static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000707static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +0000708static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000709 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000710static PyObject *parsestrplus(struct compiling*, node *);
711static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000712static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000713
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000714static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000715
716/* symtable operations */
717static int symtable_build(struct compiling *, node *);
718static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000719static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000720static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000721static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000722static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000723static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000724
725static void symtable_node(struct symtable *, node *);
726static void symtable_funcdef(struct symtable *, node *);
727static void symtable_default_args(struct symtable *, node *);
728static void symtable_params(struct symtable *, node *);
729static void symtable_params_fplist(struct symtable *, node *n);
730static void symtable_global(struct symtable *, node *);
731static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000732static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000733static void symtable_list_comprehension(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +0000734static void symtable_list_for(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000735
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000736static int symtable_update_free_vars(struct symtable *);
737static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
738static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
739
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000740/* helper */
741static void
742do_pad(int pad)
743{
744 int i;
745 for (i = 0; i < pad; ++i)
746 fprintf(stderr, " ");
747}
748
749static void
750dump(node *n, int pad, int depth)
751{
752 int i;
753 if (depth == 0)
754 return;
755 do_pad(pad);
756 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
757 if (depth > 0)
758 depth--;
759 for (i = 0; i < NCH(n); ++i)
760 dump(CHILD(n, i), pad + 1, depth);
761}
762
763#define DUMP(N) dump(N, 0, -1)
764
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000765static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000766com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000767{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000768 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000769 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
770 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000771 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000772 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000773 goto fail;
774 if ((c->c_const_dict = PyDict_New()) == NULL)
775 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000776 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000777 goto fail;
778 if ((c->c_name_dict = PyDict_New()) == NULL)
779 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000780 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000781 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000782 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
783 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000784 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000785 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000786 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000787 c->c_freevars = NULL;
788 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000789 c->c_nlocals = 0;
790 c->c_argcount = 0;
791 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000792 c->c_nexti = 0;
793 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000794 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000795 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000796 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000797 c->c_begin = 0;
798 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000799 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000800 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000801 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000802 c->c_stacklevel = 0;
803 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000804 c->c_firstlineno = 0;
805 c->c_last_addr = 0;
806 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000807 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000808 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000809 c->c_nested = 0;
810 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000811 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000812 return 1;
813
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000814 fail:
815 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000816 return 0;
817}
818
819static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000820com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000821{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000822 Py_XDECREF(c->c_code);
823 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000824 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000825 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000826 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000827 Py_XDECREF(c->c_globals);
828 Py_XDECREF(c->c_locals);
829 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000830 Py_XDECREF(c->c_freevars);
831 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000832 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000833 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +0000834 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000835}
836
837static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000838com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000839{
840 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000841 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +0000842 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000843 /*
844 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
845 c->c_filename, c->c_name, c->c_lineno,
846 c->c_nexti, c->c_stacklevel, n);
847 */
848 }
Guido van Rossum8b993a91997-01-17 21:04:03 +0000849}
850
851static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000852com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000853{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000854 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000855 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000856 else
857 c->c_stacklevel -= n;
858}
859
860static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000861com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000862{
863 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000864 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000865 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000866 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000867}
868
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000869static int
870com_check_size(PyObject **s, int offset)
871{
872 int len = PyString_GET_SIZE(*s);
873 if (offset >= len)
874 return _PyString_Resize(s, len * 2);
875 return 0;
876}
877
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000878static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000879com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000880{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000881 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000882 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +0000883 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000884 if (com_check_size(&c->c_code, c->c_nexti)) {
885 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000886 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000887 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000888 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000889}
890
891static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000892com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000893{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000894 com_addbyte(c, x & 0xff);
895 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000896}
897
898static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000899com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000900{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000901 char *p;
902 if (c->c_lnotab == NULL)
903 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000904 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
905 c->c_errors++;
906 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000907 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000908 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000909 *p++ = addr;
910 *p++ = line;
911 c->c_lnotab_next += 2;
912}
913
914static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000915com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000916{
917 c->c_lineno = lineno;
918 if (c->c_firstlineno == 0) {
919 c->c_firstlineno = c->c_last_line = lineno;
920 }
921 else {
922 int incr_addr = c->c_nexti - c->c_last_addr;
923 int incr_line = lineno - c->c_last_line;
Tim Peters2a7f3842001-06-09 09:26:21 +0000924 while (incr_addr > 255) {
925 com_add_lnotab(c, 255, 0);
926 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000927 }
Tim Peters2a7f3842001-06-09 09:26:21 +0000928 while (incr_line > 255) {
929 com_add_lnotab(c, incr_addr, 255);
930 incr_line -=255;
931 incr_addr = 0;
932 }
933 if (incr_addr > 0 || incr_line > 0)
934 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000935 c->c_last_addr = c->c_nexti;
936 c->c_last_line = lineno;
937 }
938}
939
940static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000941com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000942{
Fred Drakeef8ace32000-08-24 00:32:09 +0000943 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +0000944 if (extended_arg){
945 com_addbyte(c, EXTENDED_ARG);
946 com_addint(c, extended_arg);
947 arg &= 0xffff;
948 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000949 com_addbyte(c, op);
950 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000951}
952
953static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000954com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000955{
956 /* Compile a forward reference for backpatching */
957 int here;
958 int anchor;
959 com_addbyte(c, op);
960 here = c->c_nexti;
961 anchor = *p_anchor;
962 *p_anchor = here;
963 com_addint(c, anchor == 0 ? 0 : here - anchor);
964}
965
966static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000967com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000968{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000969 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000970 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000971 int dist;
972 int prev;
973 for (;;) {
974 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000975 prev = code[anchor] + (code[anchor+1] << 8);
976 dist = target - (anchor+2);
977 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000978 dist >>= 8;
979 code[anchor+1] = dist;
980 dist >>= 8;
981 if (dist) {
982 com_error(c, PyExc_SystemError,
983 "com_backpatch: offset too large");
984 break;
985 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000986 if (!prev)
987 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000988 anchor -= prev;
989 }
990}
991
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000992/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000993
994static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000995com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000996{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000997 PyObject *w, *t, *np=NULL;
998 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000999
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001000 t = Py_BuildValue("(OO)", v, v->ob_type);
1001 if (t == NULL)
1002 goto fail;
1003 w = PyDict_GetItem(dict, t);
1004 if (w != NULL) {
1005 n = PyInt_AsLong(w);
1006 } else {
1007 n = PyList_Size(list);
1008 np = PyInt_FromLong(n);
1009 if (np == NULL)
1010 goto fail;
1011 if (PyList_Append(list, v) != 0)
1012 goto fail;
1013 if (PyDict_SetItem(dict, t, np) != 0)
1014 goto fail;
1015 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001016 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001017 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001018 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001019 fail:
1020 Py_XDECREF(np);
1021 Py_XDECREF(t);
1022 c->c_errors++;
1023 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001024}
1025
1026static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001027com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001028{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001029 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001030}
1031
1032static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001033com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001034{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001035 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001036}
1037
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001038int
1039_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001040{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001041 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001042 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001043 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001044 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1045 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001046 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001047 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001048 return 0; /* Don't mangle __extremely_long_names */
1049 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1050 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001051 /* Strip leading underscores from class name */
1052 while (*p == '_')
1053 p++;
1054 if (*p == '\0')
1055 return 0; /* Don't mangle if class is just underscores */
1056 plen = strlen(p);
1057 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001058 plen = maxlen-nlen-2; /* Truncate class name if too long */
1059 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001060 buffer[0] = '_';
1061 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001062 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001063 return 1;
1064}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001065
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001066static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001067com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001068{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001069 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001070 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001071 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001072
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001073 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001074 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001075 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001076 c->c_errors++;
1077 i = 255;
1078 }
1079 else {
1080 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001081 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001082 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001083 com_addoparg(c, op, i);
1084}
1085
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001086#define NAME_LOCAL 0
1087#define NAME_GLOBAL 1
1088#define NAME_DEFAULT 2
1089#define NAME_CLOSURE 3
1090
1091static int
1092com_lookup_arg(PyObject *dict, PyObject *name)
1093{
1094 PyObject *v = PyDict_GetItem(dict, name);
1095 if (v == NULL)
1096 return -1;
1097 else
1098 return PyInt_AS_LONG(v);
1099}
1100
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001101static int
1102none_assignment_check(struct compiling *c, char *name, int assigning)
1103{
1104 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1105 char *msg;
1106 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001107 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001108 else
1109 msg = "deleting None";
1110 if (issue_warning(msg, c->c_filename, c->c_lineno) < 0) {
1111 c->c_errors++;
1112 return -1;
1113 }
1114 }
1115 return 0;
1116}
1117
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001118static void
1119com_addop_varname(struct compiling *c, int kind, char *name)
1120{
1121 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001122 int i, reftype;
1123 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001124 int op = STOP_CODE;
1125 char buffer[MANGLE_LEN];
1126
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001127 if (kind != VAR_LOAD &&
1128 none_assignment_check(c, name, kind == VAR_STORE))
1129 {
1130 c->c_errors++;
1131 i = 255;
1132 goto done;
1133 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001134 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001135 name = buffer;
1136 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1137 c->c_errors++;
1138 i = 255;
1139 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001140 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001141
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001142 reftype = get_ref_type(c, name);
1143 switch (reftype) {
1144 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001145 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001146 scope = NAME_LOCAL;
1147 break;
1148 case GLOBAL_EXPLICIT:
1149 scope = NAME_GLOBAL;
1150 break;
1151 case GLOBAL_IMPLICIT:
1152 if (c->c_flags & CO_OPTIMIZED)
1153 scope = NAME_GLOBAL;
1154 break;
1155 case FREE:
1156 case CELL:
1157 scope = NAME_CLOSURE;
1158 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001159 }
1160
1161 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001162 if (scope == NAME_LOCAL)
1163 i = com_lookup_arg(c->c_locals, v);
1164 else if (reftype == FREE)
1165 i = com_lookup_arg(c->c_freevars, v);
1166 else if (reftype == CELL)
1167 i = com_lookup_arg(c->c_cellvars, v);
1168 if (i == -1) {
1169 c->c_errors++; /* XXX no exception set */
1170 i = 255;
1171 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001172 }
1173 Py_DECREF(v);
1174
1175 switch (kind) {
1176 case VAR_LOAD:
1177 switch (scope) {
1178 case NAME_LOCAL:
1179 op = LOAD_FAST;
1180 break;
1181 case NAME_GLOBAL:
1182 op = LOAD_GLOBAL;
1183 break;
1184 case NAME_DEFAULT:
1185 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001186 break;
1187 case NAME_CLOSURE:
1188 op = LOAD_DEREF;
1189 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001190 }
1191 break;
1192 case VAR_STORE:
1193 switch (scope) {
1194 case NAME_LOCAL:
1195 op = STORE_FAST;
1196 break;
1197 case NAME_GLOBAL:
1198 op = STORE_GLOBAL;
1199 break;
1200 case NAME_DEFAULT:
1201 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001202 break;
1203 case NAME_CLOSURE:
1204 op = STORE_DEREF;
1205 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001206 }
1207 break;
1208 case VAR_DELETE:
1209 switch (scope) {
1210 case NAME_LOCAL:
1211 op = DELETE_FAST;
1212 break;
1213 case NAME_GLOBAL:
1214 op = DELETE_GLOBAL;
1215 break;
1216 case NAME_DEFAULT:
1217 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001218 break;
1219 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001220 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001221 PyOS_snprintf(buf, sizeof(buf),
1222 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001223 com_error(c, PyExc_SyntaxError, buf);
1224 i = 255;
1225 break;
1226 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001227 }
1228 break;
1229 }
1230done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001231 com_addoparg(c, op, i);
1232}
1233
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001234static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001235com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001236{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001237 char *name;
1238 char buffer[1000];
1239 /* XXX it is possible to write this code without the 1000
1240 chars on the total length of dotted names, I just can't be
1241 bothered right now */
1242 if (TYPE(n) == STAR)
1243 name = "*";
1244 else if (TYPE(n) == dotted_name) {
1245 char *p = buffer;
1246 int i;
1247 name = buffer;
1248 for (i = 0; i < NCH(n); i += 2) {
1249 char *s = STR(CHILD(n, i));
1250 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001251 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001252 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001253 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001254 break;
1255 }
1256 if (p != buffer)
1257 *p++ = '.';
1258 strcpy(p, s);
1259 p = strchr(p, '\0');
1260 }
1261 }
1262 else {
1263 REQ(n, NAME);
1264 name = STR(n);
1265 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001266 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001267}
1268
Guido van Rossum79f25d91997-04-29 20:08:16 +00001269static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001270parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001271{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001272 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001273 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001274 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001275#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001276 int imflag;
1277#endif
1278
Guido van Rossum282914b1991-04-04 10:42:56 +00001279 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001280 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001281#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001282 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001283#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001284 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001285 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001286 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001287 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001288 if (x < 0 && errno == 0) {
Guido van Rossum715eca92002-08-12 21:54:46 +00001289 if (PyErr_WarnExplicit(
Barry Warsaw9f007392002-08-14 15:51:29 +00001290 PyExc_FutureWarning,
Guido van Rossum715eca92002-08-12 21:54:46 +00001291 "hex/oct constants > sys.maxint "
1292 "will return positive values "
1293 "in Python 2.4 and up",
Martin v. Löwis95292d62002-12-11 14:04:59 +00001294 /* XXX: Give WarnExplicit
1295 a const char* argument. */
1296 (char*)c->c_filename,
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001297 c->c_lineno,
Guido van Rossum715eca92002-08-12 21:54:46 +00001298 NULL,
1299 NULL) < 0)
Guido van Rossum078151d2002-08-11 04:24:12 +00001300 return NULL;
Guido van Rossum3cb8e542002-08-11 14:06:15 +00001301 errno = 0; /* Might be changed by PyErr_Warn() */
Guido van Rossum078151d2002-08-11 04:24:12 +00001302 }
1303 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001304 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001305 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001306 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001307 if (errno != 0)
1308 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001309 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001310 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001311 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001312#ifndef WITHOUT_COMPLEX
1313 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001314 Py_complex z;
1315 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001316 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001317 z.imag = atof(s);
1318 PyFPE_END_PROTECT(z)
1319 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001320 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001321 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001322#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001323 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001324 PyFPE_START_PROTECT("atof", return 0)
1325 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001326 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001327 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001328 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001329}
1330
Guido van Rossum79f25d91997-04-29 20:08:16 +00001331static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001332decode_utf8(char **sPtr, char *end, char* encoding)
1333{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001334#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001335 Py_FatalError("decode_utf8 should not be called in this build.");
1336 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001337#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001338 PyObject *u, *v;
1339 char *s, *t;
1340 t = s = *sPtr;
1341 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1342 while (s < end && (*s & 0x80)) s++;
1343 *sPtr = s;
1344 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1345 if (u == NULL)
1346 return NULL;
1347 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1348 Py_DECREF(u);
1349 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001350#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001351}
1352
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001353/* compiler.transformer.Transformer.decode_literal depends on what
1354 might seem like minor details of this function -- changes here
1355 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001356static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001357parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001358{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001359 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001360 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001361 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001362 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001363 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001364 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001365 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001366
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001367 if (isalpha(quote) || quote == '_') {
1368 if (quote == 'u' || quote == 'U') {
1369 quote = *++s;
1370 unicode = 1;
1371 }
1372 if (quote == 'r' || quote == 'R') {
1373 quote = *++s;
1374 rawmode = 1;
1375 }
1376 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001377 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001378 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001379 return NULL;
1380 }
1381 s++;
1382 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001383 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001384 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001385 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001386 return NULL;
1387 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001388 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001389 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001390 return NULL;
1391 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001392 if (len >= 4 && s[0] == quote && s[1] == quote) {
1393 s += 2;
1394 len -= 2;
1395 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001396 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001397 return NULL;
1398 }
1399 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001400#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001401 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001402 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001403 char *buf;
1404 char *p;
1405 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001406 if (encoding == NULL) {
1407 buf = s;
1408 u = NULL;
1409 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1410 buf = s;
1411 u = NULL;
1412 } else {
1413 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1414 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1415 if (u == NULL)
1416 return NULL;
1417 p = buf = PyString_AsString(u);
1418 end = s + len;
1419 while (s < end) {
1420 if (*s == '\\') {
1421 *p++ = *s++;
1422 if (*s & 0x80) {
1423 strcpy(p, "u005c");
1424 p += 5;
1425 }
1426 }
1427 if (*s & 0x80) { /* XXX inefficient */
1428 char *r;
1429 int rn, i;
1430 w = decode_utf8(&s, end, "utf-16-be");
1431 if (w == NULL) {
1432 Py_DECREF(u);
1433 return NULL;
1434 }
1435 r = PyString_AsString(w);
1436 rn = PyString_Size(w);
1437 assert(rn % 2 == 0);
1438 for (i = 0; i < rn; i += 2) {
1439 sprintf(p, "\\u%02x%02x",
1440 r[i + 0] & 0xFF,
1441 r[i + 1] & 0xFF);
1442 p += 6;
1443 }
1444 Py_DECREF(w);
1445 } else {
1446 *p++ = *s++;
1447 }
1448 }
1449 len = p - buf;
1450 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001451 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001452 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001453 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001454 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1455 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001456 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001457 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001458 return v;
1459
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001460 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001461#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001462 need_encoding = (encoding != NULL &&
1463 strcmp(encoding, "utf-8") != 0 &&
1464 strcmp(encoding, "iso-8859-1") != 0);
1465 if (rawmode || strchr(s, '\\') == NULL) {
1466 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001467#ifndef Py_USING_UNICODE
1468 /* This should not happen - we never see any other
1469 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001470 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001471#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001472 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1473 if (u == NULL)
1474 return NULL;
1475 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1476 Py_DECREF(u);
1477 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001478#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001479 } else {
1480 return PyString_FromStringAndSize(s, len);
1481 }
1482 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001483
1484 v = PyString_DecodeEscape(s, len, NULL, unicode,
1485 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001486 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001487 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001488 return v;
1489}
1490
Guido van Rossum79f25d91997-04-29 20:08:16 +00001491static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001492parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001493{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001494 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001495 int i;
1496 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001497 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001498 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001499 for (i = 1; i < NCH(n); i++) {
1500 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001501 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001502 if (s == NULL)
1503 goto onError;
1504 if (PyString_Check(v) && PyString_Check(s)) {
1505 PyString_ConcatAndDel(&v, s);
1506 if (v == NULL)
1507 goto onError;
1508 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001509#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001510 else {
1511 PyObject *temp;
1512 temp = PyUnicode_Concat(v, s);
1513 Py_DECREF(s);
1514 if (temp == NULL)
1515 goto onError;
1516 Py_DECREF(v);
1517 v = temp;
1518 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001519#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001520 }
1521 }
1522 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001523
1524 onError:
1525 Py_XDECREF(v);
1526 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001527}
1528
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001529static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001530com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001531{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001532 int anchor = 0;
1533 int save_begin = c->c_begin;
1534
1535 /* list_iter: for v in expr [list_iter] */
1536 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001537 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001538 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001539 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001540 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001541 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001542 c->c_loops++;
1543 com_list_iter(c, n, e, t);
1544 c->c_loops--;
1545 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1546 c->c_begin = save_begin;
1547 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001548 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001549}
1550
1551static void
1552com_list_if(struct compiling *c, node *n, node *e, char *t)
1553{
1554 int anchor = 0;
1555 int a = 0;
1556 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001557 com_node(c, CHILD(n, 1));
1558 com_addfwref(c, JUMP_IF_FALSE, &a);
1559 com_addbyte(c, POP_TOP);
1560 com_pop(c, 1);
1561 com_list_iter(c, n, e, t);
1562 com_addfwref(c, JUMP_FORWARD, &anchor);
1563 com_backpatch(c, a);
1564 /* We jump here with an extra entry which we now pop */
1565 com_addbyte(c, POP_TOP);
1566 com_backpatch(c, anchor);
1567}
1568
1569static void
1570com_list_iter(struct compiling *c,
1571 node *p, /* parent of list_iter node */
1572 node *e, /* element expression node */
1573 char *t /* name of result list temp local */)
1574{
1575 /* list_iter is the last child in a listmaker, list_for, or list_if */
1576 node *n = CHILD(p, NCH(p)-1);
1577 if (TYPE(n) == list_iter) {
1578 n = CHILD(n, 0);
1579 switch (TYPE(n)) {
1580 case list_for:
1581 com_list_for(c, n, e, t);
1582 break;
1583 case list_if:
1584 com_list_if(c, n, e, t);
1585 break;
1586 default:
1587 com_error(c, PyExc_SystemError,
1588 "invalid list_iter node type");
1589 }
1590 }
1591 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001592 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001593 com_push(c, 1);
1594 com_node(c, e);
1595 com_addoparg(c, CALL_FUNCTION, 1);
1596 com_addbyte(c, POP_TOP);
1597 com_pop(c, 2);
1598 }
1599}
1600
1601static void
1602com_list_comprehension(struct compiling *c, node *n)
1603{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001604 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001605 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001606
1607 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001608 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001609 com_addoparg(c, BUILD_LIST, 0);
1610 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1611 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001612 com_addop_name(c, LOAD_ATTR, "append");
1613 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001614 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001615 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001616 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001617 --c->c_tmpname;
1618}
1619
1620static void
1621com_listmaker(struct compiling *c, node *n)
1622{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001623 /* listmaker: test ( list_for | (',' test)* [','] ) */
1624 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001625 com_list_comprehension(c, n);
1626 else {
1627 int len = 0;
1628 int i;
1629 for (i = 0; i < NCH(n); i += 2, len++)
1630 com_node(c, CHILD(n, i));
1631 com_addoparg(c, BUILD_LIST, len);
1632 com_pop(c, len-1);
1633 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001634}
1635
1636static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001637com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001638{
1639 int i;
1640 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1641 for (i = 0; i+2 < NCH(n); i += 4) {
1642 /* We must arrange things just right for STORE_SUBSCR.
1643 It wants the stack to look like (value) (dict) (key) */
1644 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001645 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001646 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00001647 com_node(c, CHILD(n, i+2)); /* value */
1648 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001649 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001650 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001651 }
1652}
1653
1654static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001655com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001656{
1657 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001658 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001659 int i;
1660 REQ(n, atom);
1661 ch = CHILD(n, 0);
1662 switch (TYPE(ch)) {
1663 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001664 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001665 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001666 com_push(c, 1);
1667 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001668 else
1669 com_node(c, CHILD(n, 1));
1670 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001671 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001672 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001673 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001674 com_push(c, 1);
1675 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001676 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001677 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001678 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001679 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001680 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001681 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001682 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001683 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001684 break;
1685 case BACKQUOTE:
1686 com_node(c, CHILD(n, 1));
1687 com_addbyte(c, UNARY_CONVERT);
1688 break;
1689 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001690 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001691 i = 255;
1692 }
1693 else {
1694 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001695 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001696 }
1697 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001698 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001699 break;
1700 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001701 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001702 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001703 c->c_errors++;
1704 i = 255;
1705 }
1706 else {
1707 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001708 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001709 }
1710 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001711 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001712 break;
1713 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001714 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001715 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001716 break;
1717 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001718 com_error(c, PyExc_SystemError,
1719 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001720 }
1721}
1722
1723static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001724com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001725{
1726 if (NCH(n) == 1) {
1727 com_addbyte(c, op);
1728 }
1729 else if (NCH(n) == 2) {
1730 if (TYPE(CHILD(n, 0)) != COLON) {
1731 com_node(c, CHILD(n, 0));
1732 com_addbyte(c, op+1);
1733 }
1734 else {
1735 com_node(c, CHILD(n, 1));
1736 com_addbyte(c, op+2);
1737 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001738 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001739 }
1740 else {
1741 com_node(c, CHILD(n, 0));
1742 com_node(c, CHILD(n, 2));
1743 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001744 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001745 }
1746}
1747
Guido van Rossum635abd21997-01-06 22:56:52 +00001748static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001749com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1750{
1751 if (NCH(n) == 1) {
1752 com_addbyte(c, DUP_TOP);
1753 com_push(c, 1);
1754 com_addbyte(c, SLICE);
1755 com_node(c, augn);
1756 com_addbyte(c, opcode);
1757 com_pop(c, 1);
1758 com_addbyte(c, ROT_TWO);
1759 com_addbyte(c, STORE_SLICE);
1760 com_pop(c, 2);
1761 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1762 com_node(c, CHILD(n, 0));
1763 com_addoparg(c, DUP_TOPX, 2);
1764 com_push(c, 2);
1765 com_addbyte(c, SLICE+1);
1766 com_pop(c, 1);
1767 com_node(c, augn);
1768 com_addbyte(c, opcode);
1769 com_pop(c, 1);
1770 com_addbyte(c, ROT_THREE);
1771 com_addbyte(c, STORE_SLICE+1);
1772 com_pop(c, 3);
1773 } else if (NCH(n) == 2) {
1774 com_node(c, CHILD(n, 1));
1775 com_addoparg(c, DUP_TOPX, 2);
1776 com_push(c, 2);
1777 com_addbyte(c, SLICE+2);
1778 com_pop(c, 1);
1779 com_node(c, augn);
1780 com_addbyte(c, opcode);
1781 com_pop(c, 1);
1782 com_addbyte(c, ROT_THREE);
1783 com_addbyte(c, STORE_SLICE+2);
1784 com_pop(c, 3);
1785 } else {
1786 com_node(c, CHILD(n, 0));
1787 com_node(c, CHILD(n, 2));
1788 com_addoparg(c, DUP_TOPX, 3);
1789 com_push(c, 3);
1790 com_addbyte(c, SLICE+3);
1791 com_pop(c, 2);
1792 com_node(c, augn);
1793 com_addbyte(c, opcode);
1794 com_pop(c, 1);
1795 com_addbyte(c, ROT_FOUR);
1796 com_addbyte(c, STORE_SLICE+3);
1797 com_pop(c, 4);
1798 }
1799}
1800
1801static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001802com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001803{
1804 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001805 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001806 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001807 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001808 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001809 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001810 }
1811 else {
1812 com_node(c, CHILD(n, 0));
1813 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001814 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001815 }
1816 m = n;
1817 do {
1818 m = CHILD(m, 0);
1819 } while (NCH(m) == 1);
1820 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001821 /* f(lambda x: x[0] = 3) ends up getting parsed with
1822 * LHS test = lambda x: x[0], and RHS test = 3.
1823 * SF bug 132313 points out that complaining about a keyword
1824 * then is very confusing.
1825 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001826 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001827 TYPE(m) == lambdef ?
1828 "lambda cannot contain assignment" :
1829 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001830 }
1831 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001832 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00001833 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00001834 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001835 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001836 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001837 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001838 else if (*pkeywords == NULL) {
1839 c->c_errors++;
1840 Py_DECREF(v);
1841 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001842 if (PyDict_GetItem(*pkeywords, v) != NULL)
1843 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001844 "duplicate keyword argument");
1845 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001846 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001847 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001848 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001849 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001850 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001851 }
1852 }
1853 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001854}
1855
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001856static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001857com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001858{
1859 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001860 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001861 }
1862 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001863 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001864 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001865 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001866 int star_flag = 0;
1867 int starstar_flag = 0;
1868 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001869 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001870 na = 0;
1871 nk = 0;
1872 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001873 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001874 if (TYPE(ch) == STAR ||
1875 TYPE(ch) == DOUBLESTAR)
1876 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001877 if (ch->n_lineno != lineno) {
1878 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001879 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00001880 }
1881 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001882 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001883 na++;
1884 else
1885 nk++;
1886 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001887 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001888 while (i < NCH(n)) {
1889 node *tok = CHILD(n, i);
1890 node *ch = CHILD(n, i+1);
1891 i += 3;
1892 switch (TYPE(tok)) {
1893 case STAR: star_flag = 1; break;
1894 case DOUBLESTAR: starstar_flag = 1; break;
1895 }
1896 com_node(c, ch);
1897 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001898 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001899 com_error(c, PyExc_SyntaxError,
1900 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001901 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001902 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001903 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001904 star_flag + (starstar_flag << 1);
1905 else
1906 opcode = CALL_FUNCTION;
1907 com_addoparg(c, opcode, na | (nk << 8));
1908 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001909 }
1910}
1911
1912static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001913com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001914{
1915 com_addopname(c, LOAD_ATTR, n);
1916}
1917
1918static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001919com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001920{
1921 int i=0;
1922 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001923 node *ch;
1924
1925 /* first argument */
1926 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001927 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001928 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001929 i++;
1930 }
1931 else {
1932 com_node(c, CHILD(n,i));
1933 i++;
1934 REQ(CHILD(n,i),COLON);
1935 i++;
1936 }
1937 /* second argument */
1938 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1939 com_node(c, CHILD(n,i));
1940 i++;
1941 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001942 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001943 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001944 com_push(c, 1);
1945 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001946 /* remaining arguments */
1947 for (; i < NCH(n); i++) {
1948 ns++;
1949 ch=CHILD(n,i);
1950 REQ(ch, sliceop);
1951 if (NCH(ch) == 1) {
1952 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001953 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001954 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001955 }
1956 else
1957 com_node(c, CHILD(ch,1));
1958 }
1959 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001960 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001961}
1962
1963static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001964com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001965{
1966 node *ch;
1967 REQ(n, subscript);
1968 ch = CHILD(n,0);
1969 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001970 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001971 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001972 com_push(c, 1);
1973 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001974 else {
1975 /* check for slice */
1976 if ((TYPE(ch) == COLON || NCH(n) > 1))
1977 com_sliceobj(c, n);
1978 else {
1979 REQ(ch, test);
1980 com_node(c, ch);
1981 }
1982 }
1983}
1984
1985static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001986com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001987{
1988 int i, op;
1989 REQ(n, subscriptlist);
1990 /* Check to make backward compatible slice behavior for '[i:j]' */
1991 if (NCH(n) == 1) {
1992 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001993 /* 'Basic' slice, should have exactly one colon. */
1994 if ((TYPE(CHILD(sub, 0)) == COLON
1995 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1996 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1997 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001998 switch (assigning) {
1999 case OP_DELETE:
2000 op = DELETE_SLICE;
2001 break;
2002 case OP_ASSIGN:
2003 op = STORE_SLICE;
2004 break;
2005 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002006 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002007 break;
2008 default:
2009 com_augassign_slice(c, sub, assigning, augn);
2010 return;
2011 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002012 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002013 if (op == STORE_SLICE)
2014 com_pop(c, 2);
2015 else if (op == DELETE_SLICE)
2016 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002017 return;
2018 }
2019 }
2020 /* Else normal subscriptlist. Compile each subscript. */
2021 for (i = 0; i < NCH(n); i += 2)
2022 com_subscript(c, CHILD(n, i));
2023 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002024 if (NCH(n) > 1) {
2025 i = (NCH(n)+1) / 2;
2026 com_addoparg(c, BUILD_TUPLE, i);
2027 com_pop(c, i-1);
2028 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002029 switch (assigning) {
2030 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002031 op = DELETE_SUBSCR;
2032 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002033 break;
2034 default:
2035 case OP_ASSIGN:
2036 op = STORE_SUBSCR;
2037 i = 3;
2038 break;
2039 case OP_APPLY:
2040 op = BINARY_SUBSCR;
2041 i = 1;
2042 break;
2043 }
2044 if (assigning > OP_APPLY) {
2045 com_addoparg(c, DUP_TOPX, 2);
2046 com_push(c, 2);
2047 com_addbyte(c, BINARY_SUBSCR);
2048 com_pop(c, 1);
2049 com_node(c, augn);
2050 com_addbyte(c, assigning);
2051 com_pop(c, 1);
2052 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002053 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002054 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002055 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002056}
2057
2058static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002059com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002060{
2061 REQ(n, trailer);
2062 switch (TYPE(CHILD(n, 0))) {
2063 case LPAR:
2064 com_call_function(c, CHILD(n, 1));
2065 break;
2066 case DOT:
2067 com_select_member(c, CHILD(n, 1));
2068 break;
2069 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002070 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002071 break;
2072 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002073 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002074 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002075 }
2076}
2077
2078static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002079com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002080{
2081 int i;
2082 REQ(n, power);
2083 com_atom(c, CHILD(n, 0));
2084 for (i = 1; i < NCH(n); i++) {
2085 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2086 com_factor(c, CHILD(n, i+1));
2087 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002088 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002089 break;
2090 }
2091 else
2092 com_apply_trailer(c, CHILD(n, i));
2093 }
2094}
2095
2096static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002097com_invert_constant(struct compiling *c, node *n)
2098{
2099 /* Compute the inverse of int and longs and use them directly,
2100 but be prepared to generate code for all other
2101 possibilities (invalid numbers, floats, complex).
2102 */
2103 PyObject *num, *inv = NULL;
2104 int i;
2105
2106 REQ(n, NUMBER);
2107 num = parsenumber(c, STR(n));
2108 if (num == NULL)
2109 i = 255;
2110 else {
2111 inv = PyNumber_Invert(num);
2112 if (inv == NULL) {
2113 PyErr_Clear();
2114 i = com_addconst(c, num);
2115 } else {
2116 i = com_addconst(c, inv);
2117 Py_DECREF(inv);
2118 }
2119 Py_DECREF(num);
2120 }
2121 com_addoparg(c, LOAD_CONST, i);
2122 com_push(c, 1);
2123 if (num != NULL && inv == NULL)
2124 com_addbyte(c, UNARY_INVERT);
2125}
2126
Tim Peters51e26512001-09-07 08:45:55 +00002127static int
2128is_float_zero(const char *p)
2129{
2130 int found_radix_point = 0;
2131 int ch;
2132 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2133 switch (ch) {
2134 case '0':
2135 /* no reason to believe it's not 0 -- continue */
2136 break;
2137
2138 case 'e': case 'E': case 'j': case 'J':
2139 /* If this was a hex constant, we already would have
2140 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2141 must be an exponent marker, and we haven't yet
2142 seen a non-zero digit, and it doesn't matter what
2143 the exponent is then. For 'j' or 'J' similarly,
2144 except that this is an imaginary 0 then. */
2145 return 1;
2146
2147 case '.':
2148 found_radix_point = 1;
2149 break;
2150
2151 default:
2152 return 0;
2153 }
2154 }
2155 return found_radix_point;
2156}
2157
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002158static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002159com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002160{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002161 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002162 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002163 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002164 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002165 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002166 approriate value as a constant. If the value is negative,
2167 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002168 negative in the 0th position -- unless we're doing unary minus
2169 of a floating zero! In that case the sign is significant, but
2170 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002171 */
2172 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002173 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002174 && TYPE((pfactor = CHILD(n, 1))) == factor
2175 && NCH(pfactor) == 1
2176 && TYPE((ppower = CHILD(pfactor, 0))) == power
2177 && NCH(ppower) == 1
2178 && TYPE((patom = CHILD(ppower, 0))) == atom
2179 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002180 && !(childtype == MINUS &&
2181 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002182 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002183 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002184 return;
2185 }
2186 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002187 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002188 if (s == NULL) {
2189 com_error(c, PyExc_MemoryError, "");
2190 com_addbyte(c, 255);
2191 return;
2192 }
2193 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002194 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002195 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002196 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002197 }
Tim Peters51e26512001-09-07 08:45:55 +00002198 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002199 }
2200 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002201 com_factor(c, CHILD(n, 1));
2202 com_addbyte(c, UNARY_POSITIVE);
2203 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002204 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002205 com_factor(c, CHILD(n, 1));
2206 com_addbyte(c, UNARY_NEGATIVE);
2207 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002208 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002209 com_factor(c, CHILD(n, 1));
2210 com_addbyte(c, UNARY_INVERT);
2211 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002212 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002213 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002214 }
2215}
2216
2217static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002218com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002219{
2220 int i;
2221 int op;
2222 REQ(n, term);
2223 com_factor(c, CHILD(n, 0));
2224 for (i = 2; i < NCH(n); i += 2) {
2225 com_factor(c, CHILD(n, i));
2226 switch (TYPE(CHILD(n, i-1))) {
2227 case STAR:
2228 op = BINARY_MULTIPLY;
2229 break;
2230 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002231 if (c->c_flags & CO_FUTURE_DIVISION)
2232 op = BINARY_TRUE_DIVIDE;
2233 else
2234 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002235 break;
2236 case PERCENT:
2237 op = BINARY_MODULO;
2238 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002239 case DOUBLESLASH:
2240 op = BINARY_FLOOR_DIVIDE;
2241 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002242 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002243 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002244 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002245 op = 255;
2246 }
2247 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002248 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002249 }
2250}
2251
2252static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002253com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002254{
2255 int i;
2256 int op;
2257 REQ(n, arith_expr);
2258 com_term(c, CHILD(n, 0));
2259 for (i = 2; i < NCH(n); i += 2) {
2260 com_term(c, CHILD(n, i));
2261 switch (TYPE(CHILD(n, i-1))) {
2262 case PLUS:
2263 op = BINARY_ADD;
2264 break;
2265 case MINUS:
2266 op = BINARY_SUBTRACT;
2267 break;
2268 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002269 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002270 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002271 op = 255;
2272 }
2273 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002274 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002275 }
2276}
2277
2278static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002279com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002280{
2281 int i;
2282 int op;
2283 REQ(n, shift_expr);
2284 com_arith_expr(c, CHILD(n, 0));
2285 for (i = 2; i < NCH(n); i += 2) {
2286 com_arith_expr(c, CHILD(n, i));
2287 switch (TYPE(CHILD(n, i-1))) {
2288 case LEFTSHIFT:
2289 op = BINARY_LSHIFT;
2290 break;
2291 case RIGHTSHIFT:
2292 op = BINARY_RSHIFT;
2293 break;
2294 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002295 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002296 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002297 op = 255;
2298 }
2299 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002300 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002301 }
2302}
2303
2304static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002305com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002306{
2307 int i;
2308 int op;
2309 REQ(n, and_expr);
2310 com_shift_expr(c, CHILD(n, 0));
2311 for (i = 2; i < NCH(n); i += 2) {
2312 com_shift_expr(c, CHILD(n, i));
2313 if (TYPE(CHILD(n, i-1)) == AMPER) {
2314 op = BINARY_AND;
2315 }
2316 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002317 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002318 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002319 op = 255;
2320 }
2321 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002322 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002323 }
2324}
2325
2326static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002327com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002328{
2329 int i;
2330 int op;
2331 REQ(n, xor_expr);
2332 com_and_expr(c, CHILD(n, 0));
2333 for (i = 2; i < NCH(n); i += 2) {
2334 com_and_expr(c, CHILD(n, i));
2335 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2336 op = BINARY_XOR;
2337 }
2338 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002339 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002340 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002341 op = 255;
2342 }
2343 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002344 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002345 }
2346}
2347
2348static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002349com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002350{
2351 int i;
2352 int op;
2353 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002354 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002355 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002356 com_xor_expr(c, CHILD(n, i));
2357 if (TYPE(CHILD(n, i-1)) == VBAR) {
2358 op = BINARY_OR;
2359 }
2360 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002361 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002362 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002363 op = 255;
2364 }
2365 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002366 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002367 }
2368}
2369
2370static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002371cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002372{
2373 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00002374 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002375 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2376 if (NCH(n) == 1) {
2377 n = CHILD(n, 0);
2378 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002379 case LESS: return PyCmp_LT;
2380 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00002381 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00002382 case LESSEQUAL: return PyCmp_LE;
2383 case GREATEREQUAL: return PyCmp_GE;
2384 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2385 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2386 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002387 }
2388 }
2389 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002390 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002391 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002392 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002393 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002394 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002395 }
2396 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002397 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002398}
2399
2400static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002401com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002402{
2403 int i;
2404 enum cmp_op op;
2405 int anchor;
2406 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2407 com_expr(c, CHILD(n, 0));
2408 if (NCH(n) == 1)
2409 return;
2410
2411 /****************************************************************
2412 The following code is generated for all but the last
2413 comparison in a chain:
2414
2415 label: on stack: opcode: jump to:
2416
2417 a <code to load b>
2418 a, b DUP_TOP
2419 a, b, b ROT_THREE
2420 b, a, b COMPARE_OP
2421 b, 0-or-1 JUMP_IF_FALSE L1
2422 b, 1 POP_TOP
2423 b
2424
2425 We are now ready to repeat this sequence for the next
2426 comparison in the chain.
2427
2428 For the last we generate:
2429
2430 b <code to load c>
2431 b, c COMPARE_OP
2432 0-or-1
2433
2434 If there were any jumps to L1 (i.e., there was more than one
2435 comparison), we generate:
2436
2437 0-or-1 JUMP_FORWARD L2
2438 L1: b, 0 ROT_TWO
2439 0, b POP_TOP
2440 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002441 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002442 ****************************************************************/
2443
2444 anchor = 0;
2445
2446 for (i = 2; i < NCH(n); i += 2) {
2447 com_expr(c, CHILD(n, i));
2448 if (i+2 < NCH(n)) {
2449 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002450 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002451 com_addbyte(c, ROT_THREE);
2452 }
2453 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002454 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002455 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002456 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002457 }
2458 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002459 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002460 if (i+2 < NCH(n)) {
2461 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2462 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002463 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002464 }
2465 }
2466
2467 if (anchor) {
2468 int anchor2 = 0;
2469 com_addfwref(c, JUMP_FORWARD, &anchor2);
2470 com_backpatch(c, anchor);
2471 com_addbyte(c, ROT_TWO);
2472 com_addbyte(c, POP_TOP);
2473 com_backpatch(c, anchor2);
2474 }
2475}
2476
2477static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002478com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002479{
2480 REQ(n, not_test); /* 'not' not_test | comparison */
2481 if (NCH(n) == 1) {
2482 com_comparison(c, CHILD(n, 0));
2483 }
2484 else {
2485 com_not_test(c, CHILD(n, 1));
2486 com_addbyte(c, UNARY_NOT);
2487 }
2488}
2489
2490static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002491com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002492{
2493 int i;
2494 int anchor;
2495 REQ(n, and_test); /* not_test ('and' not_test)* */
2496 anchor = 0;
2497 i = 0;
2498 for (;;) {
2499 com_not_test(c, CHILD(n, i));
2500 if ((i += 2) >= NCH(n))
2501 break;
2502 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2503 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002504 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002505 }
2506 if (anchor)
2507 com_backpatch(c, anchor);
2508}
2509
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002510static int
2511com_make_closure(struct compiling *c, PyCodeObject *co)
2512{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002513 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002514 if (free == 0)
2515 return 0;
2516 for (i = 0; i < free; ++i) {
2517 /* Bypass com_addop_varname because it will generate
2518 LOAD_DEREF but LOAD_CLOSURE is needed.
2519 */
2520 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2521 int arg, reftype;
2522
2523 /* Special case: If a class contains a method with a
2524 free variable that has the same name as a method,
2525 the name will be considered free *and* local in the
2526 class. It should be handled by the closure, as
2527 well as by the normal name loookup logic.
2528 */
2529 reftype = get_ref_type(c, PyString_AS_STRING(name));
2530 if (reftype == CELL)
2531 arg = com_lookup_arg(c->c_cellvars, name);
2532 else /* (reftype == FREE) */
2533 arg = com_lookup_arg(c->c_freevars, name);
2534 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002535 fprintf(stderr, "lookup %s in %s %d %d\n"
2536 "freevars of %s: %s\n",
2537 PyObject_REPR(name),
2538 c->c_name,
2539 reftype, arg,
2540 PyString_AS_STRING(co->co_name),
2541 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002542 Py_FatalError("com_make_closure()");
2543 }
2544 com_addoparg(c, LOAD_CLOSURE, arg);
2545
2546 }
2547 com_push(c, free);
2548 return 1;
2549}
2550
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002551static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002552com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002553{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002554 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002555 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002556 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002557 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002558 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002559 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2560 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002561 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002562 if (co == NULL) {
2563 c->c_errors++;
2564 return;
2565 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002566 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002567 i = com_addconst(c, (PyObject *)co);
2568 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002569 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002570 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002571 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002572 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002573 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002574 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002575 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002576 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002577 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002578 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002579 else {
2580 int anchor = 0;
2581 int i = 0;
2582 for (;;) {
2583 com_and_test(c, CHILD(n, i));
2584 if ((i += 2) >= NCH(n))
2585 break;
2586 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2587 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002588 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002589 }
2590 if (anchor)
2591 com_backpatch(c, anchor);
2592 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002593}
2594
2595static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002596com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002597{
2598 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002599 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002600 com_node(c, CHILD(n, 0));
2601 }
2602 else {
2603 int i;
2604 int len;
2605 len = (NCH(n) + 1) / 2;
2606 for (i = 0; i < NCH(n); i += 2)
2607 com_node(c, CHILD(n, i));
2608 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002609 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002610 }
2611}
2612
2613
2614/* Begin of assignment compilation */
2615
Thomas Wouters434d0822000-08-24 20:11:32 +00002616
2617static void
2618com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2619{
2620 com_addbyte(c, DUP_TOP);
2621 com_push(c, 1);
2622 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002623 com_node(c, augn);
2624 com_addbyte(c, opcode);
2625 com_pop(c, 1);
2626 com_addbyte(c, ROT_TWO);
2627 com_addopname(c, STORE_ATTR, n);
2628 com_pop(c, 2);
2629}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002630
2631static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002632com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002633{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00002634 if (none_assignment_check(c, STR(n), assigning))
2635 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002636 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002637 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002638}
2639
2640static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002641com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002642{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002643 REQ(n, trailer);
2644 switch (TYPE(CHILD(n, 0))) {
2645 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002646 if (assigning == OP_DELETE)
2647 com_error(c, PyExc_SyntaxError,
2648 "can't delete function call");
2649 else
2650 com_error(c, PyExc_SyntaxError,
2651 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002652 break;
2653 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002654 if (assigning > OP_APPLY)
2655 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2656 else
2657 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002658 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002659 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002660 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002661 break;
2662 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002663 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002664 }
2665}
2666
2667static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002668com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002669{
2670 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002671 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002672 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002673 if (assigning) {
2674 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002675 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002676 com_push(c, i-1);
2677 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002678 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002679 com_assign(c, CHILD(n, i), assigning, NULL);
2680}
2681
2682static void
2683com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2684{
2685 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002686 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002687 com_push(c, 1);
2688 com_node(c, augn);
2689 com_addbyte(c, opcode);
2690 com_pop(c, 1);
2691 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002692}
2693
2694static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002695com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002696{
2697 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002698 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002699 if (assigning)
2700 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002701}
2702
2703static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002704com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002705{
2706 /* Loop to avoid trivial recursion */
2707 for (;;) {
2708 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002709
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002710 case exprlist:
2711 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002712 case testlist1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002713 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002714 if (assigning > OP_APPLY) {
2715 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002716 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002717 return;
2718 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002719 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002720 return;
2721 }
2722 n = CHILD(n, 0);
2723 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002724
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002725 case test:
2726 case and_test:
2727 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002728 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002729 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002730 case xor_expr:
2731 case and_expr:
2732 case shift_expr:
2733 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002734 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002735 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002736 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002737 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002738 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002739 return;
2740 }
2741 n = CHILD(n, 0);
2742 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002743
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002744 case power: /* atom trailer* ('**' power)*
2745 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002746 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002747 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002748 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002749 return;
2750 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002751 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002752 int i;
2753 com_node(c, CHILD(n, 0));
2754 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002755 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002756 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002757 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002758 return;
2759 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002760 com_apply_trailer(c, CHILD(n, i));
2761 } /* NB i is still alive */
2762 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002763 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002764 return;
2765 }
2766 n = CHILD(n, 0);
2767 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002768
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002769 case atom:
2770 switch (TYPE(CHILD(n, 0))) {
2771 case LPAR:
2772 n = CHILD(n, 1);
2773 if (TYPE(n) == RPAR) {
2774 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002775 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002776 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002777 return;
2778 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002779 if (assigning > OP_APPLY) {
2780 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002781 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002782 return;
2783 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002784 break;
2785 case LSQB:
2786 n = CHILD(n, 1);
2787 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002788 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002789 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002790 return;
2791 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002792 if (assigning > OP_APPLY) {
2793 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002794 "augmented assign to list not possible");
2795 return;
2796 }
2797 if (NCH(n) > 1
2798 && TYPE(CHILD(n, 1)) == list_for) {
2799 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002800 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002801 return;
2802 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002803 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002804 return;
2805 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002806 if (assigning > OP_APPLY)
2807 com_augassign_name(c, CHILD(n, 0),
2808 assigning, augn);
2809 else
2810 com_assign_name(c, CHILD(n, 0),
2811 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002812 return;
2813 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002814 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002815 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002816 return;
2817 }
2818 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002819
2820 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002821 com_error(c, PyExc_SyntaxError,
2822 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002823 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002824
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002825 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002826 com_error(c, PyExc_SystemError,
2827 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002828 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002829
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002830 }
2831 }
2832}
Guido van Rossum7c531111997-03-11 18:42:21 +00002833
Thomas Wouters434d0822000-08-24 20:11:32 +00002834static void
2835com_augassign(struct compiling *c, node *n)
2836{
2837 int opcode;
2838
2839 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2840 case '+': opcode = INPLACE_ADD; break;
2841 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002842 case '/':
2843 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
2844 opcode = INPLACE_FLOOR_DIVIDE;
2845 else if (c->c_flags & CO_FUTURE_DIVISION)
2846 opcode = INPLACE_TRUE_DIVIDE;
2847 else
2848 opcode = INPLACE_DIVIDE;
2849 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00002850 case '%': opcode = INPLACE_MODULO; break;
2851 case '<': opcode = INPLACE_LSHIFT; break;
2852 case '>': opcode = INPLACE_RSHIFT; break;
2853 case '&': opcode = INPLACE_AND; break;
2854 case '^': opcode = INPLACE_XOR; break;
2855 case '|': opcode = INPLACE_OR; break;
2856 case '*':
2857 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2858 opcode = INPLACE_POWER;
2859 else
2860 opcode = INPLACE_MULTIPLY;
2861 break;
2862 default:
2863 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2864 return;
2865 }
2866 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2867}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002868
2869static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002870com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002871{
Thomas Wouters434d0822000-08-24 20:11:32 +00002872 REQ(n, expr_stmt);
2873 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002874 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002875 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002876 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002877 if (NCH(n) == 1) {
2878 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002879 if (c->c_interactive)
2880 com_addbyte(c, PRINT_EXPR);
2881 else
2882 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002883 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002884 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002885 else if (TYPE(CHILD(n,1)) == augassign)
2886 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002887 else {
2888 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002889 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002890 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002891 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002892 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002893 com_push(c, 1);
2894 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002895 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002896 }
2897 }
2898}
2899
2900static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002901com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002902{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002903 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002904 int i;
2905 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002906 if (Py_OptimizeFlag)
2907 return;
2908 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00002909
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002910 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00002911 raise AssertionError [, <message>]
2912
2913 where <message> is the second test, if present.
2914 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002915 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002916 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002917 com_addbyte(c, POP_TOP);
2918 com_pop(c, 1);
2919 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002920 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002921 com_push(c, 1);
2922 i = NCH(n)/2; /* Either 2 or 4 */
2923 if (i > 1)
2924 com_node(c, CHILD(n, 3));
2925 com_addoparg(c, RAISE_VARARGS, i);
2926 com_pop(c, i);
2927 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002928 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002929 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002930 com_addbyte(c, POP_TOP);
2931}
2932
2933static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002934com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002935{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002936 int i = 1;
2937 node* stream = NULL;
2938
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002939 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002940
2941 /* are we using the extended print form? */
2942 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2943 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002944 com_node(c, stream);
2945 /* stack: [...] => [... stream] */
2946 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002947 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2948 i = 4;
2949 else
2950 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002951 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002952 for (; i < NCH(n); i += 2) {
2953 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002954 com_addbyte(c, DUP_TOP);
2955 /* stack: [stream] => [stream stream] */
2956 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002957 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002958 /* stack: [stream stream] => [stream stream obj] */
2959 com_addbyte(c, ROT_TWO);
2960 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002961 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002962 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002963 com_pop(c, 2);
2964 }
2965 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002966 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002967 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002968 com_addbyte(c, PRINT_ITEM);
2969 com_pop(c, 1);
2970 }
2971 }
2972 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002973 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002974 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002975 /* must pop the extra stream object off the stack */
2976 com_addbyte(c, POP_TOP);
2977 /* stack: [... stream] => [...] */
2978 com_pop(c, 1);
2979 }
2980 }
2981 else {
2982 if (stream != NULL) {
2983 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002984 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002985 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002986 com_pop(c, 1);
2987 }
2988 else
2989 com_addbyte(c, PRINT_NEWLINE);
2990 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002991}
2992
2993static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002994com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002995{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002996 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002997 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002998 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002999 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003000 if (c->c_flags & CO_GENERATOR) {
3001 if (NCH(n) > 1) {
3002 com_error(c, PyExc_SyntaxError,
3003 "'return' with argument inside generator");
3004 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003005 }
3006 if (NCH(n) < 2) {
3007 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003008 com_push(c, 1);
3009 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003010 else
3011 com_node(c, CHILD(n, 1));
3012 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003013 com_pop(c, 1);
3014}
3015
3016static void
3017com_yield_stmt(struct compiling *c, node *n)
3018{
Tim Peters95c80f82001-06-23 02:07:08 +00003019 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003020 REQ(n, yield_stmt); /* 'yield' testlist */
3021 if (!c->c_infunction) {
3022 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3023 }
Tim Peters95c80f82001-06-23 02:07:08 +00003024
3025 for (i = 0; i < c->c_nblocks; ++i) {
3026 if (c->c_block[i] == SETUP_FINALLY) {
3027 com_error(c, PyExc_SyntaxError,
3028 "'yield' not allowed in a 'try' block "
3029 "with a 'finally' clause");
3030 return;
3031 }
3032 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003033 com_node(c, CHILD(n, 1));
3034 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003035 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003036}
3037
3038static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003039com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003040{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003041 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003042 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3043 if (NCH(n) > 1) {
3044 com_node(c, CHILD(n, 1));
3045 if (NCH(n) > 3) {
3046 com_node(c, CHILD(n, 3));
3047 if (NCH(n) > 5)
3048 com_node(c, CHILD(n, 5));
3049 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003050 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003051 i = NCH(n)/2;
3052 com_addoparg(c, RAISE_VARARGS, i);
3053 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003054}
3055
3056static void
Thomas Wouters52152252000-08-17 22:55:00 +00003057com_from_import(struct compiling *c, node *n)
3058{
3059 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3060 com_push(c, 1);
3061 if (NCH(n) > 1) {
3062 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3063 com_error(c, PyExc_SyntaxError, "invalid syntax");
3064 return;
3065 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003066 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003067 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003068 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003069 com_pop(c, 1);
3070}
3071
3072static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003073com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003074{
3075 int i;
3076 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003077 /* 'import' dotted_name (',' dotted_name)* |
3078 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003079 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00003080 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003081 /* 'from' dotted_name 'import' ... */
3082 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003083
3084 if (TYPE(CHILD(n, 3)) == STAR) {
3085 tup = Py_BuildValue("(s)", "*");
3086 } else {
3087 tup = PyTuple_New((NCH(n) - 2)/2);
3088 for (i = 3; i < NCH(n); i += 2) {
3089 PyTuple_SET_ITEM(tup, (i-3)/2,
Guido van Rossum633d90c2002-12-23 16:51:42 +00003090 PyString_FromString(STR(
3091 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003092 }
3093 }
3094 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003095 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003096 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003097 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00003098 if (TYPE(CHILD(n, 3)) == STAR)
3099 com_addbyte(c, IMPORT_STAR);
3100 else {
3101 for (i = 3; i < NCH(n); i += 2)
3102 com_from_import(c, CHILD(n, i));
3103 com_addbyte(c, POP_TOP);
3104 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003105 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003106 }
3107 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003108 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003109 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003110 node *subn = CHILD(n, i);
3111 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003112 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003113 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003114 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003115 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003116 int j;
3117 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003118 com_error(c, PyExc_SyntaxError,
3119 "invalid syntax");
3120 return;
3121 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003122 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3123 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003124 CHILD(CHILD(subn, 0),
3125 j));
3126 com_addop_varname(c, VAR_STORE,
3127 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003128 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003129 com_addop_varname(c, VAR_STORE,
3130 STR(CHILD(CHILD(subn, 0),
3131 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003132 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003133 }
3134 }
3135}
3136
3137static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003138com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003139{
3140 REQ(n, exec_stmt);
3141 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3142 com_node(c, CHILD(n, 1));
3143 if (NCH(n) >= 4)
3144 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003145 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003146 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003147 com_push(c, 1);
3148 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003149 if (NCH(n) >= 6)
3150 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003151 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003152 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003153 com_push(c, 1);
3154 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003155 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003156 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003157}
3158
Guido van Rossum7c531111997-03-11 18:42:21 +00003159static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003160is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003161{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003162 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003163 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003164 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003165
3166 /* Label to avoid tail recursion */
3167 next:
3168 switch (TYPE(n)) {
3169
3170 case suite:
3171 if (NCH(n) == 1) {
3172 n = CHILD(n, 0);
3173 goto next;
3174 }
3175 /* Fall through */
3176 case file_input:
3177 for (i = 0; i < NCH(n); i++) {
3178 node *ch = CHILD(n, i);
3179 if (TYPE(ch) == stmt) {
3180 n = ch;
3181 goto next;
3182 }
3183 }
3184 break;
3185
3186 case stmt:
3187 case simple_stmt:
3188 case small_stmt:
3189 n = CHILD(n, 0);
3190 goto next;
3191
3192 case expr_stmt:
3193 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003194 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003195 case test:
3196 case and_test:
3197 case not_test:
3198 case comparison:
3199 case expr:
3200 case xor_expr:
3201 case and_expr:
3202 case shift_expr:
3203 case arith_expr:
3204 case term:
3205 case factor:
3206 case power:
3207 case atom:
3208 if (NCH(n) == 1) {
3209 n = CHILD(n, 0);
3210 goto next;
3211 }
3212 break;
3213
3214 case NAME:
3215 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3216 return 1;
3217 break;
3218
3219 case NUMBER:
3220 v = parsenumber(c, STR(n));
3221 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003222 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003223 break;
3224 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003225 i = PyObject_IsTrue(v);
3226 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003227 return i == 0;
3228
3229 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003230 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003231 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003232 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003233 break;
3234 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003235 i = PyObject_IsTrue(v);
3236 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003237 return i == 0;
3238
3239 }
3240 return 0;
3241}
3242
Tim Peters08a898f2001-06-28 01:52:22 +00003243
3244/* Look under n for a return stmt with an expression.
3245 * This hack is used to find illegal returns under "if 0:" blocks in
3246 * functions already known to be generators (as determined by the symtable
3247 * pass).
3248 * Return the offending return node if found, else NULL.
3249 */
3250static node *
3251look_for_offending_return(node *n)
3252{
3253 int i;
3254
3255 for (i = 0; i < NCH(n); ++i) {
3256 node *kid = CHILD(n, i);
3257
3258 switch (TYPE(kid)) {
3259 case classdef:
3260 case funcdef:
3261 case lambdef:
3262 /* Stuff in nested functions & classes doesn't
3263 affect the code block we started in. */
3264 return NULL;
3265
3266 case return_stmt:
3267 if (NCH(kid) > 1)
3268 return kid;
3269 break;
3270
3271 default: {
3272 node *bad = look_for_offending_return(kid);
3273 if (bad != NULL)
3274 return bad;
3275 }
3276 }
3277 }
3278
3279 return NULL;
3280}
3281
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003282static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003283com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003284{
3285 int i;
3286 int anchor = 0;
3287 REQ(n, if_stmt);
3288 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3289 for (i = 0; i+3 < NCH(n); i+=4) {
3290 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003291 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003292 if (is_constant_false(c, ch)) {
3293 /* We're going to skip this block. However, if this
3294 is a generator, we have to check the dead code
3295 anyway to make sure there aren't any return stmts
3296 with expressions, in the same scope. */
3297 if (c->c_flags & CO_GENERATOR) {
3298 node *p = look_for_offending_return(n);
3299 if (p != NULL) {
3300 int savelineno = c->c_lineno;
3301 c->c_lineno = p->n_lineno;
3302 com_error(c, PyExc_SyntaxError,
3303 "'return' with argument "
3304 "inside generator");
3305 c->c_lineno = savelineno;
3306 }
3307 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003308 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003309 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003310 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003311 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003312 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003313 com_addfwref(c, JUMP_IF_FALSE, &a);
3314 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003315 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003316 com_node(c, CHILD(n, i+3));
3317 com_addfwref(c, JUMP_FORWARD, &anchor);
3318 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003319 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003320 com_addbyte(c, POP_TOP);
3321 }
3322 if (i+2 < NCH(n))
3323 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003324 if (anchor)
3325 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003326}
3327
3328static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003329com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003330{
3331 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, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3335 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003336 block_push(c, SETUP_LOOP);
3337 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003338 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003339 com_node(c, CHILD(n, 1));
3340 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3341 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003342 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003343 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003344 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003345 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003346 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3347 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003348 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003349 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003350 com_addbyte(c, POP_TOP);
3351 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003352 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003353 if (NCH(n) > 4)
3354 com_node(c, CHILD(n, 6));
3355 com_backpatch(c, break_anchor);
3356}
3357
3358static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003359com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003360{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003361 int break_anchor = 0;
3362 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003363 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003364 REQ(n, for_stmt);
3365 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3366 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003367 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003368 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003369 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003370 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00003371 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003372 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003373 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003374 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003375 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003376 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003377 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003378 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3379 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003380 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003381 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003382 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003383 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003384 if (NCH(n) > 8)
3385 com_node(c, CHILD(n, 8));
3386 com_backpatch(c, break_anchor);
3387}
3388
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003389/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003390
3391 SETUP_FINALLY L
3392 <code for S>
3393 POP_BLOCK
3394 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003395 L: <code for Sf>
3396 END_FINALLY
3397
3398 The special instructions use the block stack. Each block
3399 stack entry contains the instruction that created it (here
3400 SETUP_FINALLY), the level of the value stack at the time the
3401 block stack entry was created, and a label (here L).
3402
3403 SETUP_FINALLY:
3404 Pushes the current value stack level and the label
3405 onto the block stack.
3406 POP_BLOCK:
3407 Pops en entry from the block stack, and pops the value
3408 stack until its level is the same as indicated on the
3409 block stack. (The label is ignored.)
3410 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003411 Pops a variable number of entries from the *value* stack
3412 and re-raises the exception they specify. The number of
3413 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003414
3415 The block stack is unwound when an exception is raised:
3416 when a SETUP_FINALLY entry is found, the exception is pushed
3417 onto the value stack (and the exception condition is cleared),
3418 and the interpreter jumps to the label gotten from the block
3419 stack.
3420
3421 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003422 (The contents of the value stack is shown in [], with the top
3423 at the right; 'tb' is trace-back info, 'val' the exception's
3424 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003425
3426 Value stack Label Instruction Argument
3427 [] SETUP_EXCEPT L1
3428 [] <code for S>
3429 [] POP_BLOCK
3430 [] JUMP_FORWARD L0
3431
Guido van Rossum3f5da241990-12-20 15:06:42 +00003432 [tb, val, exc] L1: DUP )
3433 [tb, val, exc, exc] <evaluate E1> )
3434 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3435 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3436 [tb, val, exc, 1] POP )
3437 [tb, val, exc] POP
3438 [tb, val] <assign to V1> (or POP if no V1)
3439 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003440 [] <code for S1>
3441 JUMP_FORWARD L0
3442
Guido van Rossum3f5da241990-12-20 15:06:42 +00003443 [tb, val, exc, 0] L2: POP
3444 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003445 .............................etc.......................
3446
Guido van Rossum3f5da241990-12-20 15:06:42 +00003447 [tb, val, exc, 0] Ln+1: POP
3448 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003449
3450 [] L0: <next statement>
3451
3452 Of course, parts are not generated if Vi or Ei is not present.
3453*/
3454
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003455static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003456com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003457{
3458 int except_anchor = 0;
3459 int end_anchor = 0;
3460 int else_anchor = 0;
3461 int i;
3462 node *ch;
3463
3464 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3465 block_push(c, SETUP_EXCEPT);
3466 com_node(c, CHILD(n, 2));
3467 com_addbyte(c, POP_BLOCK);
3468 block_pop(c, SETUP_EXCEPT);
3469 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3470 com_backpatch(c, except_anchor);
3471 for (i = 3;
3472 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3473 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003474 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003475 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003476 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003477 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003478 break;
3479 }
3480 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003481 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003482 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003483 if (NCH(ch) > 1) {
3484 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003485 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003486 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003487 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003488 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003489 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3490 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003491 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003492 }
3493 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003494 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003495 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003496 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003497 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003498 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003499 com_pop(c, 1);
3500 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003501 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003502 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003503 com_node(c, CHILD(n, i+2));
3504 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3505 if (except_anchor) {
3506 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003507 /* We come in with [tb, val, exc, 0] on the
3508 stack; one pop and it's the same as
3509 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003510 com_addbyte(c, POP_TOP);
3511 }
3512 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003513 /* We actually come in here with [tb, val, exc] but the
3514 END_FINALLY will zap those and jump around.
3515 The c_stacklevel does not reflect them so we need not pop
3516 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003517 com_addbyte(c, END_FINALLY);
3518 com_backpatch(c, else_anchor);
3519 if (i < NCH(n))
3520 com_node(c, CHILD(n, i+2));
3521 com_backpatch(c, end_anchor);
3522}
3523
3524static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003525com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003526{
3527 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003528 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003529
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003530 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3531 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003532 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003533 com_addbyte(c, POP_BLOCK);
3534 block_pop(c, SETUP_FINALLY);
3535 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003536 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003537 /* While the generated code pushes only one item,
3538 the try-finally handling can enter here with
3539 up to three items. OK, here are the details:
3540 3 for an exception, 2 for RETURN, 1 for BREAK. */
3541 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003542 com_backpatch(c, finally_anchor);
3543 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003544 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003545 com_node(c, ch);
3546 com_addbyte(c, END_FINALLY);
3547 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003548 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003549}
3550
3551static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003552com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003553{
3554 REQ(n, try_stmt);
3555 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3556 | 'try' ':' suite 'finally' ':' suite */
3557 if (TYPE(CHILD(n, 3)) != except_clause)
3558 com_try_finally(c, n);
3559 else
3560 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003561}
3562
Guido van Rossum8b993a91997-01-17 21:04:03 +00003563static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003564get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003565{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003566 int i;
3567
Guido van Rossum8b993a91997-01-17 21:04:03 +00003568 /* Label to avoid tail recursion */
3569 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003570 switch (TYPE(n)) {
3571
3572 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003573 if (NCH(n) == 1) {
3574 n = CHILD(n, 0);
3575 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003576 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003577 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003578 case file_input:
3579 for (i = 0; i < NCH(n); i++) {
3580 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003581 if (TYPE(ch) == stmt) {
3582 n = ch;
3583 goto next;
3584 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003585 }
3586 break;
3587
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003588 case stmt:
3589 case simple_stmt:
3590 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003591 n = CHILD(n, 0);
3592 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003593
3594 case expr_stmt:
3595 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003596 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003597 case test:
3598 case and_test:
3599 case not_test:
3600 case comparison:
3601 case expr:
3602 case xor_expr:
3603 case and_expr:
3604 case shift_expr:
3605 case arith_expr:
3606 case term:
3607 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003608 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003609 if (NCH(n) == 1) {
3610 n = CHILD(n, 0);
3611 goto next;
3612 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003613 break;
3614
3615 case atom:
3616 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003617 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003618 break;
3619
3620 }
3621 return NULL;
3622}
3623
Guido van Rossum79f25d91997-04-29 20:08:16 +00003624static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003625get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003626{
Guido van Rossum541563e1999-01-28 15:08:09 +00003627 /* Don't generate doc-strings if run with -OO */
3628 if (Py_OptimizeFlag > 1)
3629 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003630 n = get_rawdocstring(n);
3631 if (n == NULL)
3632 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003633 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003634}
3635
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003636static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003637com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003638{
3639 REQ(n, suite);
3640 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3641 if (NCH(n) == 1) {
3642 com_node(c, CHILD(n, 0));
3643 }
3644 else {
3645 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003646 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003647 node *ch = CHILD(n, i);
3648 if (TYPE(ch) == stmt)
3649 com_node(c, ch);
3650 }
3651 }
3652}
3653
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003654/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003655static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003656com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003657{
3658 int i = c->c_nblocks;
3659 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3660 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3661 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003662 else if (i <= 0) {
3663 /* at the outer level */
3664 com_error(c, PyExc_SyntaxError,
3665 "'continue' not properly in loop");
3666 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003667 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003668 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003669 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003670 if (c->c_block[j] == SETUP_LOOP)
3671 break;
3672 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003673 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003674 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003675 for (; i > j; --i) {
3676 if (c->c_block[i] == SETUP_EXCEPT ||
3677 c->c_block[i] == SETUP_FINALLY) {
3678 com_addoparg(c, CONTINUE_LOOP,
3679 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003680 return;
3681 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003682 if (c->c_block[i] == END_FINALLY) {
3683 com_error(c, PyExc_SyntaxError,
3684 "'continue' not supported inside 'finally' clause");
3685 return;
3686 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003687 }
3688 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003689 com_error(c, PyExc_SyntaxError,
3690 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003691 }
3692 /* XXX Could allow it inside a 'finally' clause
3693 XXX if we could pop the exception still on the stack */
3694}
3695
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003696static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003697com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003698{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003699 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003700 if (TYPE(n) == lambdef) {
3701 /* lambdef: 'lambda' [varargslist] ':' test */
3702 n = CHILD(n, 1);
3703 }
3704 else {
3705 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3706 n = CHILD(n, 2);
3707 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3708 n = CHILD(n, 1);
3709 }
3710 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003711 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003712 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003713 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003714 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3715 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003716 nargs = 0;
3717 ndefs = 0;
3718 for (i = 0; i < nch; i++) {
3719 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003720 if (TYPE(CHILD(n, i)) == STAR ||
3721 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003722 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003723 nargs++;
3724 i++;
3725 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003726 t = RPAR; /* Anything except EQUAL or COMMA */
3727 else
3728 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003729 if (t == EQUAL) {
3730 i++;
3731 ndefs++;
3732 com_node(c, CHILD(n, i));
3733 i++;
3734 if (i >= nch)
3735 break;
3736 t = TYPE(CHILD(n, i));
3737 }
3738 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003739 /* Treat "(a=1, b)" as an error */
3740 if (ndefs)
3741 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003742 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003743 }
3744 if (t != COMMA)
3745 break;
3746 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003747 return ndefs;
3748}
3749
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003750static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003751com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003752{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003753 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003754 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003755 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003756 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003757 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3758 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003759 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003760 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003761 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003762 c->c_errors++;
3763 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003764 int closure = com_make_closure(c, (PyCodeObject *)co);
3765 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003766 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003767 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003768 if (closure)
3769 com_addoparg(c, MAKE_CLOSURE, ndefs);
3770 else
3771 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003772 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003773 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003774 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003775 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003776 }
3777}
3778
3779static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003780com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003781{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003782 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003783 REQ(n, testlist);
3784 /* testlist: test (',' test)* [','] */
3785 for (i = 0; i < NCH(n); i += 2)
3786 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003787 i = (NCH(n)+1) / 2;
3788 com_addoparg(c, BUILD_TUPLE, i);
3789 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003790}
3791
3792static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003793com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003794{
Guido van Rossum25831651993-05-19 14:50:45 +00003795 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003796 PyObject *v;
3797 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003798 char *name;
3799
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003800 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003801 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003802 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003803 c->c_errors++;
3804 return;
3805 }
3806 /* Push the class name on the stack */
3807 i = com_addconst(c, v);
3808 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003809 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003810 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003811 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003812 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003813 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003814 com_push(c, 1);
3815 }
Guido van Rossum25831651993-05-19 14:50:45 +00003816 else
3817 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003818 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003819 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003820 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003821 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003822 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003823 c->c_errors++;
3824 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003825 int closure = com_make_closure(c, co);
3826 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003827 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003828 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003829 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003830 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003831 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003832 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003833 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003834 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003835 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003836 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003837 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003838 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003839 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003840 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003841}
3842
3843static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003844com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003845{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003846 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003847 if (c->c_errors)
3848 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003849 switch (TYPE(n)) {
3850
3851 /* Definition nodes */
3852
3853 case funcdef:
3854 com_funcdef(c, n);
3855 break;
3856 case classdef:
3857 com_classdef(c, n);
3858 break;
3859
3860 /* Trivial parse tree nodes */
3861
3862 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003863 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003864 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003865 n = CHILD(n, 0);
3866 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003867
3868 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003869 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003870 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003871 {
3872 int i;
3873 for (i = 0; i < NCH(n)-1; i += 2)
3874 com_node(c, CHILD(n, i));
3875 }
3876 break;
3877
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003878 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003879 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003880 n = CHILD(n, 0);
3881 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003882
3883 /* Statement nodes */
3884
3885 case expr_stmt:
3886 com_expr_stmt(c, n);
3887 break;
3888 case print_stmt:
3889 com_print_stmt(c, n);
3890 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003891 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003892 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003893 break;
3894 case pass_stmt:
3895 break;
3896 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003897 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003898 com_error(c, PyExc_SyntaxError,
3899 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003900 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003901 com_addbyte(c, BREAK_LOOP);
3902 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003903 case continue_stmt:
3904 com_continue_stmt(c, n);
3905 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003906 case return_stmt:
3907 com_return_stmt(c, n);
3908 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003909 case yield_stmt:
3910 com_yield_stmt(c, n);
3911 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003912 case raise_stmt:
3913 com_raise_stmt(c, n);
3914 break;
3915 case import_stmt:
3916 com_import_stmt(c, n);
3917 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003918 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003919 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003920 case exec_stmt:
3921 com_exec_stmt(c, n);
3922 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003923 case assert_stmt:
3924 com_assert_stmt(c, n);
3925 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003926 case if_stmt:
3927 com_if_stmt(c, n);
3928 break;
3929 case while_stmt:
3930 com_while_stmt(c, n);
3931 break;
3932 case for_stmt:
3933 com_for_stmt(c, n);
3934 break;
3935 case try_stmt:
3936 com_try_stmt(c, n);
3937 break;
3938 case suite:
3939 com_suite(c, n);
3940 break;
3941
3942 /* Expression nodes */
3943
3944 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003945 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00003946 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003947 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003948 break;
3949 case test:
3950 com_test(c, n);
3951 break;
3952 case and_test:
3953 com_and_test(c, n);
3954 break;
3955 case not_test:
3956 com_not_test(c, n);
3957 break;
3958 case comparison:
3959 com_comparison(c, n);
3960 break;
3961 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003962 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003963 break;
3964 case expr:
3965 com_expr(c, n);
3966 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003967 case xor_expr:
3968 com_xor_expr(c, n);
3969 break;
3970 case and_expr:
3971 com_and_expr(c, n);
3972 break;
3973 case shift_expr:
3974 com_shift_expr(c, n);
3975 break;
3976 case arith_expr:
3977 com_arith_expr(c, n);
3978 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003979 case term:
3980 com_term(c, n);
3981 break;
3982 case factor:
3983 com_factor(c, n);
3984 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003985 case power:
3986 com_power(c, n);
3987 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003988 case atom:
3989 com_atom(c, n);
3990 break;
3991
3992 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003993 com_error(c, PyExc_SystemError,
3994 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003995 }
3996}
3997
Tim Petersdbd9ba62000-07-09 03:09:57 +00003998static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003999
4000static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004001com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004002{
4003 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4004 if (TYPE(CHILD(n, 0)) == LPAR)
4005 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004006 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004007 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004008 com_pop(c, 1);
4009 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004010}
4011
4012static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004013com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004014{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004015 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004016 if (NCH(n) == 1) {
4017 com_fpdef(c, CHILD(n, 0));
4018 }
4019 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004020 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004021 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004022 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004023 for (i = 0; i < NCH(n); i += 2)
4024 com_fpdef(c, CHILD(n, i));
4025 }
4026}
4027
4028static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004029com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004030{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004031 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004032 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004033 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004034 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004035 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004036 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004037 nch = NCH(n);
4038 /* Enter all arguments in table of locals */
4039 for (i = 0, narg = 0; i < nch; i++) {
4040 node *ch = CHILD(n, i);
4041 node *fp;
4042 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004043 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004044 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4045 fp = CHILD(ch, 0);
4046 if (TYPE(fp) != NAME) {
4047 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4048 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004049 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004050 narg++;
4051 /* all name updates handled by symtable */
4052 if (++i >= nch)
4053 break;
4054 ch = CHILD(n, i);
4055 if (TYPE(ch) == EQUAL)
4056 i += 2;
4057 else
4058 REQ(ch, COMMA);
4059 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004060 if (complex) {
4061 /* Generate code for complex arguments only after
4062 having counted the simple arguments */
4063 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004064 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004065 node *ch = CHILD(n, i);
4066 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004067 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004068 break;
4069 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4070 fp = CHILD(ch, 0);
4071 if (TYPE(fp) != NAME) {
4072 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004073 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004074 com_fpdef(c, ch);
4075 }
4076 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004077 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004078 break;
4079 ch = CHILD(n, i);
4080 if (TYPE(ch) == EQUAL)
4081 i += 2;
4082 else
4083 REQ(ch, COMMA);
4084 }
4085 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004086}
4087
4088static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004089com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004090{
4091 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004092 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004093 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004094 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004095 if (doc != NULL) {
4096 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004097 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004098 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004099 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004100 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004101 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004102 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004103 for (i = 0; i < NCH(n); i++) {
4104 node *ch = CHILD(n, i);
4105 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4106 com_node(c, ch);
4107 }
4108}
4109
4110/* Top-level compile-node interface */
4111
4112static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004113compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004114{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004115 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004116 node *ch;
4117 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00004118 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004119 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004120 if (doc != NULL) {
4121 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004122 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004123 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004124 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004125 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004126 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
4127 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004128 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004129 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004130 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004131 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004132 c->c_infunction = 0;
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004133 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4134 com_push(c, 1);
4135 com_addbyte(c, RETURN_VALUE);
4136 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004137}
4138
4139static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004140compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004141{
Guido van Rossum590baa41993-11-30 13:40:46 +00004142 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004143 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004144 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004145
4146 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004147 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004148 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004149 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004150 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004151 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004152 else
4153 ch = CHILD(n, 2);
4154 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004155 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004156 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004157}
4158
4159static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004160compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004161{
4162 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004163 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004164 REQ(n, classdef);
4165 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4166 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004167 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004168 /* Initialize local __module__ from global __name__ */
4169 com_addop_name(c, LOAD_GLOBAL, "__name__");
4170 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004171 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004172 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004173 if (doc != NULL) {
4174 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004175 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004176 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004177 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004178 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004179 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004180 }
4181 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004182 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004183 com_node(c, ch);
4184 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004185 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004186 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004187 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004188}
4189
4190static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004191compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004192{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004193 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004194
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004195 switch (TYPE(n)) {
4196
Guido van Rossum4c417781991-01-21 16:09:22 +00004197 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004198 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004199 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004200 n = CHILD(n, 0);
4201 if (TYPE(n) != NEWLINE)
4202 com_node(c, n);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004203 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4204 com_push(c, 1);
4205 com_addbyte(c, RETURN_VALUE);
4206 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004207 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004208 break;
4209
Guido van Rossum4c417781991-01-21 16:09:22 +00004210 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004211 com_file_input(c, n);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004212 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4213 com_push(c, 1);
4214 com_addbyte(c, RETURN_VALUE);
4215 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004216 break;
4217
Guido van Rossum590baa41993-11-30 13:40:46 +00004218 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004219 com_node(c, CHILD(n, 0));
4220 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004221 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004222 break;
4223
Guido van Rossum590baa41993-11-30 13:40:46 +00004224 case lambdef: /* anonymous function definition */
4225 compile_lambdef(c, n);
4226 break;
4227
Guido van Rossum4c417781991-01-21 16:09:22 +00004228 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004229 compile_funcdef(c, n);
4230 break;
4231
Guido van Rossum4c417781991-01-21 16:09:22 +00004232 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004233 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004234 break;
4235
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004236 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004237 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004238 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004239 }
4240}
4241
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004242static PyObject *
4243dict_keys_inorder(PyObject *dict, int offset)
4244{
4245 PyObject *tuple, *k, *v;
4246 int i, pos = 0, size = PyDict_Size(dict);
4247
4248 tuple = PyTuple_New(size);
4249 if (tuple == NULL)
4250 return NULL;
4251 while (PyDict_Next(dict, &pos, &k, &v)) {
4252 i = PyInt_AS_LONG(v);
4253 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004254 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004255 PyTuple_SET_ITEM(tuple, i - offset, k);
4256 }
4257 return tuple;
4258}
4259
Guido van Rossum79f25d91997-04-29 20:08:16 +00004260PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004261PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004262{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004263 return PyNode_CompileFlags(n, filename, NULL);
4264}
4265
4266PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004267PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004268{
4269 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004270}
4271
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004272struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004273PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004274{
4275 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004276 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004277
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004278 ff = PyNode_Future(n, filename);
4279 if (ff == NULL)
4280 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004281
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004282 st = symtable_init();
Tim Peters8c5e4152001-11-04 19:26:58 +00004283 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004284 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004285 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004286 }
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004287 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004288 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004289 if (st->st_errors > 0)
4290 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004291 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004292 if (st->st_errors > 0)
4293 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004294
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004295 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004296 fail:
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004297 PyObject_FREE((void *)ff);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004298 st->st_future = NULL;
4299 PySymtable_Free(st);
4300 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004301}
4302
Guido van Rossum79f25d91997-04-29 20:08:16 +00004303static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004304icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004305{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004306 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004307}
4308
Guido van Rossum79f25d91997-04-29 20:08:16 +00004309static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004310jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004311 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004312{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004313 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004314 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004315 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004316 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004317 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4318 sc.c_encoding = "utf-8";
4319 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004320 sc.c_encoding = STR(n);
4321 n = CHILD(n, 0);
4322 } else {
4323 sc.c_encoding = NULL;
4324 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004325 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004326 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004327 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004328 /* c_symtable still points to parent's symbols */
4329 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004330 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004331 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004332 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004333 if (base->c_encoding != NULL) {
4334 assert(sc.c_encoding == NULL);
4335 sc.c_encoding = base->c_encoding;
4336 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004337 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004338 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004339 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004340 if (sc.c_future == NULL) {
4341 com_free(&sc);
4342 return NULL;
4343 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004344 if (flags) {
4345 int merged = sc.c_future->ff_features |
4346 flags->cf_flags;
4347 sc.c_future->ff_features = merged;
4348 flags->cf_flags = merged;
4349 }
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004350 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004351 com_free(&sc);
4352 return NULL;
4353 }
4354 }
4355 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004356 if (symtable_load_symbols(&sc) < 0) {
4357 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004358 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004359 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004360 compile_node(&sc, n);
4361 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004362 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004363 PyObject *consts, *names, *varnames, *filename, *name,
4364 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004365 consts = PyList_AsTuple(sc.c_consts);
4366 names = PyList_AsTuple(sc.c_names);
4367 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004368 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4369 freevars = dict_keys_inorder(sc.c_freevars,
4370 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004371 filename = PyString_InternFromString(sc.c_filename);
4372 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004373 if (!PyErr_Occurred())
4374 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004375 sc.c_nlocals,
4376 sc.c_maxstacklevel,
4377 sc.c_flags,
4378 sc.c_code,
4379 consts,
4380 names,
4381 varnames,
4382 freevars,
4383 cellvars,
4384 filename,
4385 name,
4386 sc.c_firstlineno,
4387 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004388 Py_XDECREF(consts);
4389 Py_XDECREF(names);
4390 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004391 Py_XDECREF(freevars);
4392 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004393 Py_XDECREF(filename);
4394 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004395 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004396 else if (!PyErr_Occurred()) {
4397 /* This could happen if someone called PyErr_Clear() after an
4398 error was reported above. That's not supposed to happen,
4399 but I just plugged one case and I'm not sure there can't be
4400 others. In that case, raise SystemError so that at least
4401 it gets reported instead dumping core. */
4402 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4403 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004404 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004405 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004406 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004407 sc.c_symtable = NULL;
4408 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004409 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004410 return co;
4411}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004412
4413int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004414PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004415{
4416 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004417 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004418 int line = co->co_firstlineno;
4419 int addr = 0;
4420 while (--size >= 0) {
4421 addr += *p++;
4422 if (addr > addrq)
4423 break;
4424 line += *p++;
4425 }
4426 return line;
4427}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004428
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004429/* The test for LOCAL must come before the test for FREE in order to
4430 handle classes where name is both local and free. The local var is
4431 a method and the free var is a free var referenced within a method.
4432*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004433
4434static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004435get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004436{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004437 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004438 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004439
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004440 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4441 return CELL;
4442 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4443 return LOCAL;
4444 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4445 return FREE;
4446 v = PyDict_GetItemString(c->c_globals, name);
4447 if (v) {
4448 if (v == Py_None)
4449 return GLOBAL_EXPLICIT;
4450 else {
4451 return GLOBAL_IMPLICIT;
4452 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004453 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004454 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004455 "unknown scope for %.100s in %.100s(%s) "
4456 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4457 name, c->c_name,
4458 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4459 c->c_filename,
4460 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4461 PyObject_REPR(c->c_locals),
4462 PyObject_REPR(c->c_globals)
4463 );
4464
4465 Py_FatalError(buf);
4466 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004467}
4468
Guido van Rossum207fda62001-03-02 03:30:41 +00004469/* Helper functions to issue warnings */
4470
4471static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004472issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004473{
4474 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4475 lineno, NULL, NULL) < 0) {
4476 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4477 PyErr_SetString(PyExc_SyntaxError, msg);
4478 PyErr_SyntaxLocation(filename, lineno);
4479 }
4480 return -1;
4481 }
4482 return 0;
4483}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004484
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004485static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004486symtable_warn(struct symtable *st, char *msg)
4487{
Guido van Rossum207fda62001-03-02 03:30:41 +00004488 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004489 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004490 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004491 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004492 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004493}
4494
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004495/* Helper function for setting lineno and filename */
4496
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004497static int
4498symtable_build(struct compiling *c, node *n)
4499{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004500 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004501 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004502 c->c_symtable->st_future = c->c_future;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004503 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004504 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4505 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004506 return -1;
4507 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004508 if (c->c_symtable->st_errors > 0)
4509 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004510 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004511 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004512 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004513 return 0;
4514}
4515
4516static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004517symtable_init_compiling_symbols(struct compiling *c)
4518{
4519 PyObject *varnames;
4520
4521 varnames = c->c_symtable->st_cur->ste_varnames;
4522 if (varnames == NULL) {
4523 varnames = PyList_New(0);
4524 if (varnames == NULL)
4525 return -1;
4526 c->c_symtable->st_cur->ste_varnames = varnames;
4527 Py_INCREF(varnames);
4528 } else
4529 Py_INCREF(varnames);
4530 c->c_varnames = varnames;
4531
4532 c->c_globals = PyDict_New();
4533 if (c->c_globals == NULL)
4534 return -1;
4535 c->c_freevars = PyDict_New();
4536 if (c->c_freevars == NULL)
4537 return -1;
4538 c->c_cellvars = PyDict_New();
4539 if (c->c_cellvars == NULL)
4540 return -1;
4541 return 0;
4542}
4543
4544struct symbol_info {
4545 int si_nlocals;
4546 int si_ncells;
4547 int si_nfrees;
4548 int si_nimplicit;
4549};
4550
4551static void
4552symtable_init_info(struct symbol_info *si)
4553{
4554 si->si_nlocals = 0;
4555 si->si_ncells = 0;
4556 si->si_nfrees = 0;
4557 si->si_nimplicit = 0;
4558}
4559
4560static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004561symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004562 struct symbol_info *si)
4563{
4564 PyObject *dict, *v;
4565
4566 /* Seperate logic for DEF_FREE. If it occurs in a function,
4567 it indicates a local that we must allocate storage for (a
4568 cell var). If it occurs in a class, then the class has a
4569 method and a free variable with the same name.
4570 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004571 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004572 /* If it isn't declared locally, it can't be a cell. */
4573 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4574 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004575 v = PyInt_FromLong(si->si_ncells++);
4576 dict = c->c_cellvars;
4577 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004578 /* If it is free anyway, then there is no need to do
4579 anything here.
4580 */
4581 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004582 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004583 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004584 v = PyInt_FromLong(si->si_nfrees++);
4585 dict = c->c_freevars;
4586 }
4587 if (v == NULL)
4588 return -1;
4589 if (PyDict_SetItem(dict, name, v) < 0) {
4590 Py_DECREF(v);
4591 return -1;
4592 }
4593 Py_DECREF(v);
4594 return 0;
4595}
4596
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004597/* If a variable is a cell and an argument, make sure that appears in
4598 co_cellvars before any variable to its right in varnames.
4599*/
4600
4601
4602static int
4603symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4604 PyObject *varnames, int flags)
4605{
Tim Petersb39903b2003-03-24 17:22:24 +00004606 PyObject *v = NULL;
4607 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004608 int i, pos;
4609
4610 if (flags & CO_VARARGS)
4611 argcount++;
4612 if (flags & CO_VARKEYWORDS)
4613 argcount++;
4614 for (i = argcount; --i >= 0; ) {
4615 v = PyList_GET_ITEM(varnames, i);
4616 if (PyDict_GetItem(*cellvars, v)) {
4617 if (list == NULL) {
4618 list = PyList_New(1);
4619 if (list == NULL)
4620 return -1;
4621 PyList_SET_ITEM(list, 0, v);
4622 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004623 } else {
4624 if (PyList_Insert(list, 0, v) < 0) {
4625 Py_DECREF(list);
4626 return -1;
4627 }
4628 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004629 }
4630 }
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004631 if (list == NULL) /* There used to be a check here for the size of */
4632 return 0; /* the list being 0, which would have leaked the */
4633 /* list if that condition was ever possible. JRH */
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004634 /* There are cellvars that are also arguments. Create a dict
4635 to replace cellvars and put the args at the front.
4636 */
4637 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004638 if (d == NULL)
4639 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004640 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4641 v = PyInt_FromLong(i);
4642 if (v == NULL)
4643 goto fail;
4644 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4645 goto fail;
4646 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4647 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00004648 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004649 }
4650 pos = 0;
4651 i = PyList_GET_SIZE(list);
4652 Py_DECREF(list);
4653 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4654 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004655 if (w == NULL)
4656 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004657 if (PyDict_SetItem(d, v, w) < 0) {
4658 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00004659 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004660 goto fail;
4661 }
4662 Py_DECREF(w);
4663 }
4664 Py_DECREF(*cellvars);
4665 *cellvars = d;
4666 return 1;
4667 fail:
4668 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00004669 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004670 return -1;
4671}
4672
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004673static int
4674symtable_freevar_offsets(PyObject *freevars, int offset)
4675{
4676 PyObject *name, *v;
4677 int pos;
4678
4679 /* The cell vars are the first elements of the closure,
4680 followed by the free vars. Update the offsets in
4681 c_freevars to account for number of cellvars. */
4682 pos = 0;
4683 while (PyDict_Next(freevars, &pos, &name, &v)) {
4684 int i = PyInt_AS_LONG(v) + offset;
4685 PyObject *o = PyInt_FromLong(i);
4686 if (o == NULL)
4687 return -1;
4688 if (PyDict_SetItem(freevars, name, o) < 0) {
4689 Py_DECREF(o);
4690 return -1;
4691 }
4692 Py_DECREF(o);
4693 }
4694 return 0;
4695}
4696
4697static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004698symtable_check_unoptimized(struct compiling *c,
4699 PySymtableEntryObject *ste,
4700 struct symbol_info *si)
4701{
4702 char buf[300];
4703
4704 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4705 || (ste->ste_nested && si->si_nimplicit)))
4706 return 0;
4707
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004708#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4709
4710#define ILLEGAL_IS "is a nested function"
4711
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004712#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004713"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004714
4715#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004716"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004717
4718#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00004719"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004720"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004721
4722 /* XXX perhaps the linenos for these opt-breaking statements
4723 should be stored so the exception can point to them. */
4724
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004725 if (ste->ste_child_free) {
4726 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004727 PyOS_snprintf(buf, sizeof(buf),
4728 ILLEGAL_IMPORT_STAR,
4729 PyString_AS_STRING(ste->ste_name),
4730 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004731 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004732 PyOS_snprintf(buf, sizeof(buf),
4733 ILLEGAL_BARE_EXEC,
4734 PyString_AS_STRING(ste->ste_name),
4735 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004736 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004737 PyOS_snprintf(buf, sizeof(buf),
4738 ILLEGAL_EXEC_AND_IMPORT_STAR,
4739 PyString_AS_STRING(ste->ste_name),
4740 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004741 }
4742 } else {
4743 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004744 PyOS_snprintf(buf, sizeof(buf),
4745 ILLEGAL_IMPORT_STAR,
4746 PyString_AS_STRING(ste->ste_name),
4747 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004748 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004749 PyOS_snprintf(buf, sizeof(buf),
4750 ILLEGAL_BARE_EXEC,
4751 PyString_AS_STRING(ste->ste_name),
4752 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004753 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004754 PyOS_snprintf(buf, sizeof(buf),
4755 ILLEGAL_EXEC_AND_IMPORT_STAR,
4756 PyString_AS_STRING(ste->ste_name),
4757 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004758 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004759 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004760
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004761 PyErr_SetString(PyExc_SyntaxError, buf);
4762 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4763 ste->ste_opt_lineno);
4764 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004765}
4766
4767static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004768symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4769 struct symbol_info *si)
4770{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004771 if (c->c_future)
4772 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004773 if (ste->ste_generator)
4774 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004775 if (ste->ste_type != TYPE_MODULE)
4776 c->c_flags |= CO_NEWLOCALS;
4777 if (ste->ste_type == TYPE_FUNCTION) {
4778 c->c_nlocals = si->si_nlocals;
4779 if (ste->ste_optimized == 0)
4780 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004781 else if (ste->ste_optimized != OPT_EXEC)
4782 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004783 }
4784 return 0;
4785}
4786
4787static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004788symtable_load_symbols(struct compiling *c)
4789{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004790 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004791 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004792 PyObject *name, *varnames, *v;
4793 int i, flags, pos;
4794 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004795
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004796 v = NULL;
4797
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004798 if (symtable_init_compiling_symbols(c) < 0)
4799 goto fail;
4800 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004801 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004802 si.si_nlocals = PyList_GET_SIZE(varnames);
4803 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004804
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004805 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004806 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004807 if (v == NULL)
4808 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004809 if (PyDict_SetItem(c->c_locals,
4810 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004811 goto fail;
4812 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004813 }
4814
4815 /* XXX The cases below define the rules for whether a name is
4816 local or global. The logic could probably be clearer. */
4817 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004818 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4819 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004820
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004821 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004822 /* undo the original DEF_FREE */
4823 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004824
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004825 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004826 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004827 2. Free variables in methods that are also class
4828 variables or declared global.
4829 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004830 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004831 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004832
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004833 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004834 c->c_argcount--;
4835 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004836 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004837 c->c_argcount--;
4838 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004839 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004840 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004841 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004842 if (flags & DEF_PARAM) {
4843 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004844 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004845 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004846 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004847 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004848 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004849 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004850 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4851 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004852 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004853 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00004854 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004855 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004856 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004857 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004858 if (v == NULL)
4859 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004860 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004861 goto fail;
4862 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004863 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004864 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004865 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004866 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004867 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004868 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004869 if (v == NULL)
4870 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004871 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004872 goto fail;
4873 Py_DECREF(v);
4874 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004875 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004876 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00004877 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004878 goto fail;
4879 if (st->st_nscopes != 1) {
4880 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004881 if (v == NULL)
4882 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004883 if (PyDict_SetItem(st->st_global,
4884 name, v))
4885 goto fail;
4886 Py_DECREF(v);
4887 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004888 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004889 }
4890 }
4891
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004892 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4893
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004894 if (si.si_ncells > 1) { /* one cell is always in order */
4895 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4896 c->c_varnames, c->c_flags) < 0)
4897 return -1;
4898 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004899 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4900 return -1;
4901 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004902 fail:
4903 /* is this always the right thing to do? */
4904 Py_XDECREF(v);
4905 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004906}
4907
4908static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004909symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004910{
4911 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004912
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004913 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004914 if (st == NULL)
4915 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004916 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00004917
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004918 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004919 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004920 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004921 goto fail;
4922 if ((st->st_symbols = PyDict_New()) == NULL)
4923 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004924 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004925 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004926 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004927 st->st_private = NULL;
4928 return st;
4929 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004930 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004931 return NULL;
4932}
4933
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004934void
4935PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004936{
4937 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004938 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004939 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004940 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004941}
4942
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004943/* When the compiler exits a scope, it must should update the scope's
4944 free variable information with the list of free variables in its
4945 children.
4946
4947 Variables that are free in children and defined in the current
4948 scope are cellvars.
4949
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004950 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004951 false), free variables in children that are not defined here are
4952 implicit globals.
4953
4954*/
4955
4956static int
4957symtable_update_free_vars(struct symtable *st)
4958{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004959 int i, j, def;
4960 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004961 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004962
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004963 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004964 def = DEF_FREE_CLASS;
4965 else
4966 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004967 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004968 int pos = 0;
4969
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004970 if (list)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004971 if (PyList_SetSlice(list, 0,
4972 ((PyVarObject*)list)->ob_size, 0) < 0)
4973 return -1;
4974 /* Yes, the above call CAN fail, even though it's reducing
4975 the size of the list. The current implementation will
4976 allocate temp memory equal to the size of the list: this
4977 is avoidable in this specific case, but probably not
4978 worth the effort of special-casing it. - JRH */
Barry Warsaw0372af72001-02-23 18:22:59 +00004979 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004980 PyList_GET_ITEM(ste->ste_children, i);
4981 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004982 int flags = PyInt_AS_LONG(o);
4983 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004984 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004985 if (list == NULL) {
4986 list = PyList_New(0);
4987 if (list == NULL)
4988 return -1;
4989 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004990 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004991 if (PyList_Append(list, name) < 0) {
4992 Py_DECREF(list);
4993 return -1;
4994 }
4995 }
4996 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004997 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004998 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004999 v = PyDict_GetItem(ste->ste_symbols, name);
5000 /* If a name N is declared global in scope A and
5001 referenced in scope B contained (perhaps
5002 indirectly) in A and there are no scopes
5003 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005004 is global in B. Unless A is a class scope,
5005 because class scopes are not considered for
5006 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005007 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005008 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005009 int flags = PyInt_AS_LONG(v);
5010 if (flags & DEF_GLOBAL) {
5011 symtable_undo_free(st, child->ste_id,
5012 name);
5013 continue;
5014 }
5015 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005016 if (ste->ste_nested) {
5017 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005018 name, def) < 0) {
5019 Py_DECREF(list);
5020 return -1;
5021 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005022 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005023 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005024 name) < 0) {
5025 Py_DECREF(list);
5026 return -1;
5027 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005028 }
5029 }
5030 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005031
5032 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005033 return 0;
5034}
5035
5036/* If the current scope is a non-nested class or if name is not
5037 defined in the current, non-nested scope, then it is an implicit
5038 global in all nested scopes.
5039*/
5040
5041static int
5042symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5043{
5044 PyObject *o;
5045 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005046 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005047
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005048 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005049 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005050 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005051 if (o == NULL)
5052 return symtable_undo_free(st, child, name);
5053 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005054
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005055 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005056 return symtable_undo_free(st, child, name);
5057 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005058 return symtable_add_def_o(st, ste->ste_symbols,
5059 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005060}
5061
5062static int
5063symtable_undo_free(struct symtable *st, PyObject *id,
5064 PyObject *name)
5065{
5066 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005067 PyObject *info;
5068 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005069
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005070 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5071 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005072 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005073
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005074 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005075 if (info == NULL)
5076 return 0;
5077 v = PyInt_AS_LONG(info);
5078 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005079 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005080 DEF_FREE_GLOBAL) < 0)
5081 return -1;
5082 } else
5083 /* If the name is defined here or declared global,
5084 then the recursion stops. */
5085 return 0;
5086
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005087 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5088 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005089 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005090 PyList_GET_ITEM(ste->ste_children, i);
5091 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005092 if (x < 0)
5093 return x;
5094 }
5095 return 0;
5096}
5097
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005098/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5099 This reference is released when the scope is exited, via the DECREF
5100 in symtable_exit_scope().
5101*/
5102
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005103static int
5104symtable_exit_scope(struct symtable *st)
5105{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005106 int end;
5107
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005108 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005109 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005110 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005111 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005112 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5113 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005114 if (PySequence_DelItem(st->st_stack, end) < 0)
5115 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005116 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005117}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005118
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005119static void
5120symtable_enter_scope(struct symtable *st, char *name, int type,
5121 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005122{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005123 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005124
5125 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005126 prev = st->st_cur;
5127 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005128 st->st_errors++;
5129 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005130 }
5131 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005132 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005133 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005134 if (st->st_cur == NULL) {
5135 st->st_errors++;
5136 return;
5137 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005138 if (strcmp(name, TOP) == 0)
5139 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005140 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005141 if (PyList_Append(prev->ste_children,
5142 (PyObject *)st->st_cur) < 0)
5143 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005144 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005145}
5146
5147static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005148symtable_lookup(struct symtable *st, char *name)
5149{
5150 char buffer[MANGLE_LEN];
5151 PyObject *v;
5152 int flags;
5153
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005154 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005155 name = buffer;
5156 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5157 if (v == NULL) {
5158 if (PyErr_Occurred())
5159 return -1;
5160 else
5161 return 0;
5162 }
5163
5164 flags = PyInt_AS_LONG(v);
5165 return flags;
5166}
5167
5168static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005169symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005170{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005171 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005172 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005173 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005174
Guido van Rossumb7164622002-08-16 02:48:11 +00005175 /* Warn about None, except inside a tuple (where the assignment
5176 code already issues a warning). */
5177 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5178 *name == 'N' && strcmp(name, "None") == 0)
5179 {
5180 if (symtable_warn(st, "argument named None"))
5181 return -1;
5182 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005183 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005184 name = buffer;
5185 if ((s = PyString_InternFromString(name)) == NULL)
5186 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005187 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5188 Py_DECREF(s);
5189 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005190}
5191
5192/* Must only be called with mangled names */
5193
5194static int
5195symtable_add_def_o(struct symtable *st, PyObject *dict,
5196 PyObject *name, int flag)
5197{
5198 PyObject *o;
5199 int val;
5200
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005201 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005202 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005203 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005204 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005205 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005206 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005207 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005208 return -1;
5209 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005210 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005211 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005212 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005213 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005214 if (o == NULL)
5215 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005216 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005217 Py_DECREF(o);
5218 return -1;
5219 }
5220 Py_DECREF(o);
5221
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005222 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005223 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005224 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005225 } else if (flag & DEF_GLOBAL) {
5226 /* XXX need to update DEF_GLOBAL for other flags too;
5227 perhaps only DEF_FREE_GLOBAL */
5228 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005229 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005230 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005231 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005232 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005233 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005234 if (o == NULL)
5235 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005236 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005237 Py_DECREF(o);
5238 return -1;
5239 }
5240 Py_DECREF(o);
5241 }
5242 return 0;
5243}
5244
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005245#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005246
Tim Peters08a898f2001-06-28 01:52:22 +00005247/* Look for a yield stmt under n. Return 1 if found, else 0.
5248 This hack is used to look inside "if 0:" blocks (which are normally
5249 ignored) in case those are the only places a yield occurs (so that this
5250 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005251static int
5252look_for_yield(node *n)
5253{
5254 int i;
5255
5256 for (i = 0; i < NCH(n); ++i) {
5257 node *kid = CHILD(n, i);
5258
5259 switch (TYPE(kid)) {
5260
5261 case classdef:
5262 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005263 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005264 /* Stuff in nested functions and classes can't make
5265 the parent a generator. */
5266 return 0;
5267
5268 case yield_stmt:
5269 return 1;
5270
5271 default:
5272 if (look_for_yield(kid))
5273 return 1;
5274 }
5275 }
5276 return 0;
5277}
5278
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005279static void
5280symtable_node(struct symtable *st, node *n)
5281{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005282 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005283
5284 loop:
5285 switch (TYPE(n)) {
5286 case funcdef: {
5287 char *func_name = STR(CHILD(n, 1));
5288 symtable_add_def(st, func_name, DEF_LOCAL);
5289 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005290 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005291 symtable_funcdef(st, n);
5292 symtable_exit_scope(st);
5293 break;
5294 }
5295 case lambdef:
5296 if (NCH(n) == 4)
5297 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005298 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005299 symtable_funcdef(st, n);
5300 symtable_exit_scope(st);
5301 break;
5302 case classdef: {
5303 char *tmp, *class_name = STR(CHILD(n, 1));
5304 symtable_add_def(st, class_name, DEF_LOCAL);
5305 if (TYPE(CHILD(n, 2)) == LPAR) {
5306 node *bases = CHILD(n, 3);
5307 int i;
5308 for (i = 0; i < NCH(bases); i += 2) {
5309 symtable_node(st, CHILD(bases, i));
5310 }
5311 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005312 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005313 tmp = st->st_private;
5314 st->st_private = class_name;
5315 symtable_node(st, CHILD(n, NCH(n) - 1));
5316 st->st_private = tmp;
5317 symtable_exit_scope(st);
5318 break;
5319 }
5320 case if_stmt:
5321 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005322 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5323 if (st->st_cur->ste_generator == 0)
5324 st->st_cur->ste_generator =
5325 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005326 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005327 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005328 symtable_node(st, CHILD(n, i + 1));
5329 symtable_node(st, CHILD(n, i + 3));
5330 }
5331 if (i + 2 < NCH(n))
5332 symtable_node(st, CHILD(n, i + 2));
5333 break;
5334 case global_stmt:
5335 symtable_global(st, n);
5336 break;
5337 case import_stmt:
5338 symtable_import(st, n);
5339 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005340 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005341 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005342 symtable_node(st, CHILD(n, 1));
5343 if (NCH(n) > 2)
5344 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005345 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005346 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005347 st->st_cur->ste_opt_lineno = n->n_lineno;
5348 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005349 if (NCH(n) > 4)
5350 symtable_node(st, CHILD(n, 5));
5351 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005352
5353 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005354 case assert_stmt:
5355 if (Py_OptimizeFlag)
5356 return;
5357 if (NCH(n) == 2) {
5358 n = CHILD(n, 1);
5359 goto loop;
5360 } else {
5361 symtable_node(st, CHILD(n, 1));
5362 n = CHILD(n, 3);
5363 goto loop;
5364 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005365 case except_clause:
5366 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005367 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005368 if (NCH(n) > 1) {
5369 n = CHILD(n, 1);
5370 goto loop;
5371 }
5372 break;
5373 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005374 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005375 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005376 case yield_stmt:
5377 st->st_cur->ste_generator = 1;
5378 n = CHILD(n, 1);
5379 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005380 case expr_stmt:
5381 if (NCH(n) == 1)
5382 n = CHILD(n, 0);
5383 else {
5384 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005385 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005386 symtable_node(st, CHILD(n, 2));
5387 break;
5388 } else {
5389 int i;
5390 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005391 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005392 n = CHILD(n, NCH(n) - 1);
5393 }
5394 }
5395 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005396 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005397 /* only occurs when there are multiple for loops
5398 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005399 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005400 if (TYPE(n) == list_for)
5401 symtable_list_for(st, n);
5402 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005403 REQ(n, list_if);
5404 symtable_node(st, CHILD(n, 1));
5405 if (NCH(n) == 3) {
5406 n = CHILD(n, 2);
5407 goto loop;
5408 }
5409 }
5410 break;
5411 case for_stmt:
5412 symtable_assign(st, CHILD(n, 1), 0);
5413 for (i = 3; i < NCH(n); ++i)
5414 if (TYPE(CHILD(n, i)) >= single_input)
5415 symtable_node(st, CHILD(n, i));
5416 break;
5417 /* The remaining cases fall through to default except in
5418 special circumstances. This requires the individual cases
5419 to be coded with great care, even though they look like
5420 rather innocuous. Each case must double-check TYPE(n).
5421 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005422 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005423 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005424 n = CHILD(n, 2);
5425 goto loop;
5426 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005427 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005428 case listmaker:
5429 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005430 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005431 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005432 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005433 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005434 case atom:
5435 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5436 symtable_add_use(st, STR(CHILD(n, 0)));
5437 break;
5438 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005439 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005440 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005441 /* Walk over every non-token child with a special case
5442 for one child.
5443 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005444 if (NCH(n) == 1) {
5445 n = CHILD(n, 0);
5446 goto loop;
5447 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005448 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005449 if (TYPE(CHILD(n, i)) >= single_input)
5450 symtable_node(st, CHILD(n, i));
5451 }
5452}
5453
5454static void
5455symtable_funcdef(struct symtable *st, node *n)
5456{
5457 node *body;
5458
5459 if (TYPE(n) == lambdef) {
5460 if (NCH(n) == 4)
5461 symtable_params(st, CHILD(n, 1));
5462 } else
5463 symtable_params(st, CHILD(n, 2));
5464 body = CHILD(n, NCH(n) - 1);
5465 symtable_node(st, body);
5466}
5467
5468/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00005469 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005470 which are references in the defining scope. symtable_params()
5471 parses the parameter names, which are defined in the function's
5472 body.
5473
5474 varargslist:
5475 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5476 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5477*/
5478
5479static void
5480symtable_default_args(struct symtable *st, node *n)
5481{
5482 node *c;
5483 int i;
5484
5485 if (TYPE(n) == parameters) {
5486 n = CHILD(n, 1);
5487 if (TYPE(n) == RPAR)
5488 return;
5489 }
5490 REQ(n, varargslist);
5491 for (i = 0; i < NCH(n); i += 2) {
5492 c = CHILD(n, i);
5493 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5494 break;
5495 }
5496 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5497 symtable_node(st, CHILD(n, i));
5498 }
5499}
5500
5501static void
5502symtable_params(struct symtable *st, node *n)
5503{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005504 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00005505 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005506
5507 if (TYPE(n) == parameters) {
5508 n = CHILD(n, 1);
5509 if (TYPE(n) == RPAR)
5510 return;
5511 }
5512 REQ(n, varargslist);
5513 for (i = 0; i < NCH(n); i += 2) {
5514 c = CHILD(n, i);
5515 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5516 ext = 1;
5517 break;
5518 }
5519 if (TYPE(c) == test) {
5520 continue;
5521 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00005522 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005523 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00005524 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005525 char nbuf[30];
5526 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005527 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005528 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005529 }
5530 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005531 if (ext) {
5532 c = CHILD(n, i);
5533 if (TYPE(c) == STAR) {
5534 i++;
5535 symtable_add_def(st, STR(CHILD(n, i)),
5536 DEF_PARAM | DEF_STAR);
5537 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005538 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005539 c = NULL;
5540 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005541 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005542 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005543 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005544 i++;
5545 symtable_add_def(st, STR(CHILD(n, i)),
5546 DEF_PARAM | DEF_DOUBLESTAR);
5547 }
5548 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005549 if (complex >= 0) {
5550 int j;
5551 for (j = 0; j <= complex; j++) {
5552 c = CHILD(n, j);
5553 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005554 c = CHILD(n, ++j);
5555 else if (TYPE(c) == EQUAL)
5556 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005557 if (TYPE(CHILD(c, 0)) == LPAR)
5558 symtable_params_fplist(st, CHILD(c, 1));
5559 }
5560 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005561}
5562
5563static void
5564symtable_params_fplist(struct symtable *st, node *n)
5565{
5566 int i;
5567 node *c;
5568
5569 REQ(n, fplist);
5570 for (i = 0; i < NCH(n); i += 2) {
5571 c = CHILD(n, i);
5572 REQ(c, fpdef);
5573 if (NCH(c) == 1)
5574 symtable_add_def(st, STR(CHILD(c, 0)),
5575 DEF_PARAM | DEF_INTUPLE);
5576 else
5577 symtable_params_fplist(st, CHILD(c, 1));
5578 }
5579
5580}
5581
5582static void
5583symtable_global(struct symtable *st, node *n)
5584{
5585 int i;
5586
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005587 /* XXX It might be helpful to warn about module-level global
5588 statements, but it's hard to tell the difference between
5589 module-level and a string passed to exec.
5590 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005591
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005592 for (i = 1; i < NCH(n); i += 2) {
5593 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005594 int flags;
5595
5596 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005597 if (flags < 0)
5598 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005599 if (flags && flags != DEF_GLOBAL) {
5600 char buf[500];
5601 if (flags & DEF_PARAM) {
5602 PyErr_Format(PyExc_SyntaxError,
5603 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005604 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005605 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005606 st->st_cur->ste_lineno);
5607 st->st_errors++;
5608 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005609 }
5610 else {
5611 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005612 PyOS_snprintf(buf, sizeof(buf),
5613 GLOBAL_AFTER_ASSIGN,
5614 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005615 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005616 PyOS_snprintf(buf, sizeof(buf),
5617 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005618 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005619 }
5620 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005621 symtable_add_def(st, name, DEF_GLOBAL);
5622 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005623}
5624
5625static void
5626symtable_list_comprehension(struct symtable *st, node *n)
5627{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005628 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005629 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005630
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005631 REQ(n, listmaker);
5632 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
5633 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005634 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005635 symtable_list_for(st, CHILD(n, 1));
5636 symtable_node(st, CHILD(n, 0));
5637 --st->st_cur->ste_tmpname;
5638}
5639
5640static void
5641symtable_list_for(struct symtable *st, node *n)
5642{
5643 REQ(n, list_for);
5644 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005645 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005646 symtable_node(st, CHILD(n, 3));
5647 if (NCH(n) == 5)
5648 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005649}
5650
5651static void
5652symtable_import(struct symtable *st, node *n)
5653{
5654 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005655 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005656 | 'from' dotted_name 'import'
5657 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005658 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005659 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005660 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005661 node *dotname = CHILD(n, 1);
5662 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5663 /* check for bogus imports */
5664 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5665 PyErr_SetString(PyExc_SyntaxError,
5666 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005667 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005668 n->n_lineno);
5669 st->st_errors++;
5670 return;
5671 }
5672 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005673 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005674 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005675 if (symtable_warn(st,
5676 "import * only allowed at module level") < 0)
5677 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005678 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005679 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005680 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005681 } else {
5682 for (i = 3; i < NCH(n); i += 2) {
5683 node *c = CHILD(n, i);
5684 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005685 symtable_assign(st, CHILD(c, 2),
5686 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005687 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005688 symtable_assign(st, CHILD(c, 0),
5689 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005690 }
5691 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005692 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005693 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005694 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005695 }
5696 }
5697}
5698
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005699/* The third argument to symatble_assign() is a flag to be passed to
5700 symtable_add_def() if it is eventually called. The flag is useful
5701 to specify the particular type of assignment that should be
5702 recorded, e.g. an assignment caused by import.
5703 */
5704
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005705static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005706symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005707{
5708 node *tmp;
5709 int i;
5710
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005711 loop:
5712 switch (TYPE(n)) {
5713 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005714 /* invalid assignment, e.g. lambda x:x=2. The next
5715 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005716 return;
5717 case power:
5718 if (NCH(n) > 2) {
5719 for (i = 2; i < NCH(n); ++i)
5720 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5721 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005722 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005723 if (NCH(n) > 1) {
5724 symtable_node(st, CHILD(n, 0));
5725 symtable_node(st, CHILD(n, 1));
5726 } else {
5727 n = CHILD(n, 0);
5728 goto loop;
5729 }
5730 return;
5731 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005732 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5733 /* XXX This is an error, but the next pass
5734 will catch it. */
5735 return;
5736 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005737 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005738 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005739 }
5740 return;
5741 case exprlist:
5742 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00005743 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005744 if (NCH(n) == 1) {
5745 n = CHILD(n, 0);
5746 goto loop;
5747 }
5748 else {
5749 int i;
5750 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005751 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005752 return;
5753 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005754 case atom:
5755 tmp = CHILD(n, 0);
5756 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5757 n = CHILD(n, 1);
5758 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005759 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00005760 if (strcmp(STR(tmp), "__debug__") == 0) {
5761 PyErr_SetString(PyExc_SyntaxError,
5762 ASSIGN_DEBUG);
5763 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton86424e32001-12-04 02:41:46 +00005764 n->n_lineno);
Jeremy Hylton778e2652001-11-09 19:50:08 +00005765 st->st_errors++;
5766 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005767 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005768 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005769 return;
5770 case dotted_as_name:
5771 if (NCH(n) == 3)
5772 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005773 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005774 else
5775 symtable_add_def(st,
5776 STR(CHILD(CHILD(n,
5777 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005778 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005779 return;
5780 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005781 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005782 return;
5783 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005784 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005785 return;
5786 default:
5787 if (NCH(n) == 0)
5788 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005789 if (NCH(n) == 1) {
5790 n = CHILD(n, 0);
5791 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005792 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005793 /* Should only occur for errors like x + 1 = 1,
5794 which will be caught in the next pass. */
5795 for (i = 0; i < NCH(n); ++i)
5796 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005797 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005798 }
5799}