blob: 8c259c12305dfdaad62d815e0d81be5104cd00d4 [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)
328#define GETJUMPTGT(arr, i) (GETARG(arr,i) + (arr[i]==JUMP_ABSOLUTE ? 0 : i+3))
329#define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255
330
331static PyObject *
332optimize_code(PyObject *code, PyObject* consts)
333{
334 int i, j, codelen;
335 int tgt, tgttgt, opcode;
336 unsigned char *codestr;
337
338 /* Make a modifiable copy of the code string */
339 if (!PyString_Check(code))
340 goto exitUnchanged;
341 codelen = PyString_Size(code);
342 codestr = PyMem_Malloc(codelen);
343 if (codestr == NULL)
344 goto exitUnchanged;
345 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
346 assert(PyTuple_Check(consts));
347
348 for (i=0 ; i<codelen-7 ; i += HAS_ARG(codestr[i]) ? 3 : 1) {
349 opcode = codestr[i];
350 switch (opcode) {
351
352 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP.
353 Note, only the first opcode is changed, the others still
354 perform normally if they happen to be jump targets. */
355 case LOAD_CONST:
356 j = GETARG(codestr, i);
357 if (codestr[i+3] != JUMP_IF_FALSE ||
358 codestr[i+6] != POP_TOP ||
359 !PyObject_IsTrue(PyTuple_GET_ITEM(consts, j)))
360 continue;
361 codestr[i] = JUMP_FORWARD;
362 SETARG(codestr, i, 4);
363 break;
364
365 /* Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2 JMP+2.
366 Note, these opcodes occur together only in assignment
367 statements. Accordingly, the unpack opcode is never
368 a jump target. */
369 case BUILD_TUPLE:
370 case BUILD_LIST:
371 if (codestr[i+3] != UNPACK_SEQUENCE ||
372 GETARG(codestr, i) != 2 ||
373 GETARG(codestr, i+3) != 2)
374 continue;
375 codestr[i] = ROT_TWO;
376 codestr[i+1] = JUMP_FORWARD;
377 SETARG(codestr, i+1, 2);
378 codestr[i+4] = DUP_TOP; /* Filler codes used as NOPs */
379 codestr[i+5] = POP_TOP;
380 break;
381
382 /* Replace jumps to unconditional jumps */
383 case JUMP_FORWARD:
384 case JUMP_IF_FALSE:
385 case JUMP_IF_TRUE:
386 case JUMP_ABSOLUTE:
387 case CONTINUE_LOOP:
388 case SETUP_LOOP:
389 case SETUP_EXCEPT:
390 case SETUP_FINALLY:
391 tgt = GETJUMPTGT(codestr, i);
392 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
393 continue;
394 tgttgt = GETJUMPTGT(codestr, tgt);
395 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
396 opcode = JUMP_ABSOLUTE;
397 if (opcode != JUMP_ABSOLUTE && opcode != CONTINUE_LOOP)
398 tgttgt -= i + 3; /* Calc relative jump addr */
399 if (tgttgt < 0) /* No backward relative jumps */
400 continue;
401 codestr[i] = opcode;
402 SETARG(codestr, i, tgttgt);
403 break;
404
405 case EXTENDED_ARG:
406 PyMem_Free(codestr);
407 goto exitUnchanged;
408 }
409 }
410 code = PyString_FromStringAndSize(codestr, codelen);
411 PyMem_Free(codestr);
412 return code;
413
414exitUnchanged:
415 Py_INCREF(code);
416 return code;
417}
418
Guido van Rossum79f25d91997-04-29 20:08:16 +0000419PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000420PyCode_New(int argcount, int nlocals, int stacksize, int flags,
421 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000422 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
423 PyObject *filename, PyObject *name, int firstlineno,
424 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000425{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000426 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000427 int i;
428 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000429 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000430 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000431 consts == NULL || !PyTuple_Check(consts) ||
432 names == NULL || !PyTuple_Check(names) ||
433 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000434 freevars == NULL || !PyTuple_Check(freevars) ||
435 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000436 name == NULL || !PyString_Check(name) ||
437 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000438 lnotab == NULL || !PyString_Check(lnotab) ||
439 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000440 PyErr_BadInternalCall();
441 return NULL;
442 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000443 intern_strings(names);
444 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000445 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000446 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000447 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000448 for (i = PyTuple_Size(consts); --i >= 0; ) {
449 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000450 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000451 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000452 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000453 continue;
454 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000455 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000456 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000457 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000458 co->co_argcount = argcount;
459 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000460 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000461 co->co_flags = flags;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000462 co->co_code = optimize_code(code, consts);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000463 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000464 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000465 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000466 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000467 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000468 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000469 Py_INCREF(freevars);
470 co->co_freevars = freevars;
471 Py_INCREF(cellvars);
472 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000473 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000474 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000475 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000476 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000477 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000478 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000479 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000480 if (PyTuple_GET_SIZE(freevars) == 0 &&
481 PyTuple_GET_SIZE(cellvars) == 0)
482 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000483 }
484 return co;
485}
486
487
488/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000489
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000490/* The compiler uses two passes to generate bytecodes. The first pass
491 builds the symbol table. The second pass generates the bytecode.
492
493 The first pass uses a single symtable struct. The second pass uses
494 a compiling struct for each code block. The compiling structs
495 share a reference to the symtable.
496
497 The two passes communicate via symtable_load_symbols() and via
498 is_local() and is_global(). The former initializes several slots
499 in the compiling struct: c_varnames, c_locals, c_nlocals,
500 c_argcount, c_globals, and c_flags.
501*/
502
Tim Peters2a7f3842001-06-09 09:26:21 +0000503/* All about c_lnotab.
504
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000505c_lnotab is an array of unsigned bytes disguised as a Python string. Since
506version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
507mapped to source code line #s via c_lnotab instead.
508
Tim Peters2a7f3842001-06-09 09:26:21 +0000509The array is conceptually a list of
510 (bytecode offset increment, line number increment)
511pairs. The details are important and delicate, best illustrated by example:
512
513 byte code offset source code line number
514 0 1
515 6 2
516 50 7
517 350 307
518 361 308
519
520The first trick is that these numbers aren't stored, only the increments
521from one row to the next (this doesn't really work, but it's a start):
522
523 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
524
525The second trick is that an unsigned byte can't hold negative values, or
526values larger than 255, so (a) there's a deep assumption that byte code
527offsets and their corresponding line #s both increase monotonically, and (b)
528if at least one column jumps by more than 255 from one row to the next, more
529than one pair is written to the table. In case #b, there's no way to know
530from looking at the table later how many were written. That's the delicate
531part. A user of c_lnotab desiring to find the source line number
532corresponding to a bytecode address A should do something like this
533
534 lineno = addr = 0
535 for addr_incr, line_incr in c_lnotab:
536 addr += addr_incr
537 if addr > A:
538 return lineno
539 lineno += line_incr
540
541In order for this to work, when the addr field increments by more than 255,
542the line # increment in each pair generated must be 0 until the remaining addr
543increment is < 256. So, in the example above, com_set_lineno should not (as
544was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
545255, 0, 45, 255, 0, 45.
546*/
547
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000548struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000549 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000550 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000551 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000552 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000553 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +0000554 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000555 PyObject *c_locals; /* dictionary (value=localID) */
556 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000557 PyObject *c_freevars; /* dictionary (value=None) */
558 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000559 int c_nlocals; /* index of next local */
560 int c_argcount; /* number of top-level arguments */
561 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000562 int c_nexti; /* index into c_code */
563 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000564 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000565 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000566 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000567 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000568 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000569 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +0000570 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000571 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000572 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000573 int c_stacklevel; /* Current stack level */
574 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000575 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000576 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000577 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000578 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000579 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000580 int c_nested; /* Is block nested funcdef or lamdef? */
581 int c_closure; /* Is nested w/freevars? */
582 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000583 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000584 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000585};
586
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000587static int
588is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000589{
590 if ((v & (USE | DEF_FREE))
591 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
592 return 1;
593 if (v & DEF_FREE_CLASS)
594 return 1;
595 return 0;
596}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000597
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000598static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000599com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000600{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000601 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
602
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000603 if (c == NULL) {
604 /* Error occurred via symtable call to
605 is_constant_false */
606 PyErr_SetString(exc, msg);
607 return;
608 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000609 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000610 if (c->c_lineno < 1 || c->c_interactive) {
611 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000612 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000613 return;
614 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000615 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000616 if (v == NULL)
617 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000618
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000619 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000620 if (line == NULL) {
621 Py_INCREF(Py_None);
622 line = Py_None;
623 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000624 if (exc == PyExc_SyntaxError) {
625 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
626 Py_None, line);
627 if (t == NULL)
628 goto exit;
629 w = Py_BuildValue("(OO)", v, t);
630 if (w == NULL)
631 goto exit;
632 PyErr_SetObject(exc, w);
633 } else {
634 /* Make sure additional exceptions are printed with
635 file and line, also. */
636 PyErr_SetObject(exc, v);
637 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
638 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000639 exit:
640 Py_XDECREF(t);
641 Py_XDECREF(v);
642 Py_XDECREF(w);
643 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000644}
645
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000646/* Interface to the block stack */
647
648static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000649block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000650{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000651 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000652 com_error(c, PyExc_SystemError,
653 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000654 }
655 else {
656 c->c_block[c->c_nblocks++] = type;
657 }
658}
659
660static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000661block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000662{
663 if (c->c_nblocks > 0)
664 c->c_nblocks--;
665 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000666 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000667 }
668}
669
Guido van Rossum681d79a1995-07-18 14:51:37 +0000670/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000671
Martin v. Löwis95292d62002-12-11 14:04:59 +0000672static int issue_warning(const char *, const char *, int);
673static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000674static void com_free(struct compiling *);
675static void com_push(struct compiling *, int);
676static void com_pop(struct compiling *, int);
677static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000678static void com_node(struct compiling *, node *);
679static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000680static void com_addbyte(struct compiling *, int);
681static void com_addint(struct compiling *, int);
682static void com_addoparg(struct compiling *, int, int);
683static void com_addfwref(struct compiling *, int, int *);
684static void com_backpatch(struct compiling *, int);
685static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
686static int com_addconst(struct compiling *, PyObject *);
687static int com_addname(struct compiling *, PyObject *);
688static void com_addopname(struct compiling *, int, node *);
689static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000690static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000691static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000692static void com_assign(struct compiling *, node *, int, node *);
693static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000694static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +0000695static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000696 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000697static PyObject *parsestrplus(struct compiling*, node *);
698static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000699static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000700
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000701static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000702
703/* symtable operations */
704static int symtable_build(struct compiling *, node *);
705static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000706static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000707static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000708static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000709static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000710static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000711
712static void symtable_node(struct symtable *, node *);
713static void symtable_funcdef(struct symtable *, node *);
714static void symtable_default_args(struct symtable *, node *);
715static void symtable_params(struct symtable *, node *);
716static void symtable_params_fplist(struct symtable *, node *n);
717static void symtable_global(struct symtable *, node *);
718static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000719static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000720static void symtable_list_comprehension(struct symtable *, node *);
721
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000722static int symtable_update_free_vars(struct symtable *);
723static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
724static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
725
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000726/* helper */
727static void
728do_pad(int pad)
729{
730 int i;
731 for (i = 0; i < pad; ++i)
732 fprintf(stderr, " ");
733}
734
735static void
736dump(node *n, int pad, int depth)
737{
738 int i;
739 if (depth == 0)
740 return;
741 do_pad(pad);
742 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
743 if (depth > 0)
744 depth--;
745 for (i = 0; i < NCH(n); ++i)
746 dump(CHILD(n, i), pad + 1, depth);
747}
748
749#define DUMP(N) dump(N, 0, -1)
750
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000751static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000752com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000753{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000754 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000755 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
756 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000757 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000758 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000759 goto fail;
760 if ((c->c_const_dict = PyDict_New()) == NULL)
761 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000762 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000763 goto fail;
764 if ((c->c_name_dict = PyDict_New()) == NULL)
765 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000766 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000767 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000768 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
769 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000770 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000771 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000772 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000773 c->c_freevars = NULL;
774 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000775 c->c_nlocals = 0;
776 c->c_argcount = 0;
777 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000778 c->c_nexti = 0;
779 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000780 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000781 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000782 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000783 c->c_begin = 0;
784 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000785 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000786 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000787 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000788 c->c_stacklevel = 0;
789 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000790 c->c_firstlineno = 0;
791 c->c_last_addr = 0;
792 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000793 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000794 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000795 c->c_nested = 0;
796 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000797 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000798 return 1;
799
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000800 fail:
801 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000802 return 0;
803}
804
805static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000806com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000807{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000808 Py_XDECREF(c->c_code);
809 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000810 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000811 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000812 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000813 Py_XDECREF(c->c_globals);
814 Py_XDECREF(c->c_locals);
815 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000816 Py_XDECREF(c->c_freevars);
817 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000818 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000819 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +0000820 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000821}
822
823static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000824com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000825{
826 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000827 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +0000828 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000829 /*
830 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
831 c->c_filename, c->c_name, c->c_lineno,
832 c->c_nexti, c->c_stacklevel, n);
833 */
834 }
Guido van Rossum8b993a91997-01-17 21:04:03 +0000835}
836
837static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000838com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000839{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000840 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000841 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000842 else
843 c->c_stacklevel -= n;
844}
845
846static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000847com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000848{
849 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000850 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000851 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000852 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000853}
854
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000855static int
856com_check_size(PyObject **s, int offset)
857{
858 int len = PyString_GET_SIZE(*s);
859 if (offset >= len)
860 return _PyString_Resize(s, len * 2);
861 return 0;
862}
863
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000864static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000865com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000866{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000867 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000868 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +0000869 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000870 if (com_check_size(&c->c_code, c->c_nexti)) {
871 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000872 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000873 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000874 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000875}
876
877static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000878com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000879{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000880 com_addbyte(c, x & 0xff);
881 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000882}
883
884static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000885com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000886{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000887 char *p;
888 if (c->c_lnotab == NULL)
889 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000890 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
891 c->c_errors++;
892 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000893 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000894 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000895 *p++ = addr;
896 *p++ = line;
897 c->c_lnotab_next += 2;
898}
899
900static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000901com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000902{
903 c->c_lineno = lineno;
904 if (c->c_firstlineno == 0) {
905 c->c_firstlineno = c->c_last_line = lineno;
906 }
907 else {
908 int incr_addr = c->c_nexti - c->c_last_addr;
909 int incr_line = lineno - c->c_last_line;
Tim Peters2a7f3842001-06-09 09:26:21 +0000910 while (incr_addr > 255) {
911 com_add_lnotab(c, 255, 0);
912 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000913 }
Tim Peters2a7f3842001-06-09 09:26:21 +0000914 while (incr_line > 255) {
915 com_add_lnotab(c, incr_addr, 255);
916 incr_line -=255;
917 incr_addr = 0;
918 }
919 if (incr_addr > 0 || incr_line > 0)
920 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000921 c->c_last_addr = c->c_nexti;
922 c->c_last_line = lineno;
923 }
924}
925
926static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000927com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000928{
Fred Drakeef8ace32000-08-24 00:32:09 +0000929 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +0000930 if (extended_arg){
931 com_addbyte(c, EXTENDED_ARG);
932 com_addint(c, extended_arg);
933 arg &= 0xffff;
934 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000935 com_addbyte(c, op);
936 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000937}
938
939static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000940com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000941{
942 /* Compile a forward reference for backpatching */
943 int here;
944 int anchor;
945 com_addbyte(c, op);
946 here = c->c_nexti;
947 anchor = *p_anchor;
948 *p_anchor = here;
949 com_addint(c, anchor == 0 ? 0 : here - anchor);
950}
951
952static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000953com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000954{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000955 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000956 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000957 int dist;
958 int prev;
959 for (;;) {
960 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000961 prev = code[anchor] + (code[anchor+1] << 8);
962 dist = target - (anchor+2);
963 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000964 dist >>= 8;
965 code[anchor+1] = dist;
966 dist >>= 8;
967 if (dist) {
968 com_error(c, PyExc_SystemError,
969 "com_backpatch: offset too large");
970 break;
971 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000972 if (!prev)
973 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000974 anchor -= prev;
975 }
976}
977
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000978/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000979
980static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000981com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000982{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000983 PyObject *w, *t, *np=NULL;
984 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000985
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000986 t = Py_BuildValue("(OO)", v, v->ob_type);
987 if (t == NULL)
988 goto fail;
989 w = PyDict_GetItem(dict, t);
990 if (w != NULL) {
991 n = PyInt_AsLong(w);
992 } else {
993 n = PyList_Size(list);
994 np = PyInt_FromLong(n);
995 if (np == NULL)
996 goto fail;
997 if (PyList_Append(list, v) != 0)
998 goto fail;
999 if (PyDict_SetItem(dict, t, np) != 0)
1000 goto fail;
1001 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001002 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001003 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001004 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001005 fail:
1006 Py_XDECREF(np);
1007 Py_XDECREF(t);
1008 c->c_errors++;
1009 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001010}
1011
1012static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001013com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001014{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001015 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001016}
1017
1018static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001019com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001020{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001021 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001022}
1023
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001024int
1025_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001026{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001027 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001028 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001029 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001030 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1031 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001032 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001033 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001034 return 0; /* Don't mangle __extremely_long_names */
1035 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1036 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001037 /* Strip leading underscores from class name */
1038 while (*p == '_')
1039 p++;
1040 if (*p == '\0')
1041 return 0; /* Don't mangle if class is just underscores */
1042 plen = strlen(p);
1043 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001044 plen = maxlen-nlen-2; /* Truncate class name if too long */
1045 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001046 buffer[0] = '_';
1047 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001048 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001049 return 1;
1050}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001051
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001052static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001053com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001054{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001055 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001056 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001057 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001058
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001059 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001060 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001061 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001062 c->c_errors++;
1063 i = 255;
1064 }
1065 else {
1066 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001067 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001068 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001069 com_addoparg(c, op, i);
1070}
1071
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001072#define NAME_LOCAL 0
1073#define NAME_GLOBAL 1
1074#define NAME_DEFAULT 2
1075#define NAME_CLOSURE 3
1076
1077static int
1078com_lookup_arg(PyObject *dict, PyObject *name)
1079{
1080 PyObject *v = PyDict_GetItem(dict, name);
1081 if (v == NULL)
1082 return -1;
1083 else
1084 return PyInt_AS_LONG(v);
1085}
1086
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001087static int
1088none_assignment_check(struct compiling *c, char *name, int assigning)
1089{
1090 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1091 char *msg;
1092 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001093 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001094 else
1095 msg = "deleting None";
1096 if (issue_warning(msg, c->c_filename, c->c_lineno) < 0) {
1097 c->c_errors++;
1098 return -1;
1099 }
1100 }
1101 return 0;
1102}
1103
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001104static void
1105com_addop_varname(struct compiling *c, int kind, char *name)
1106{
1107 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001108 int i, reftype;
1109 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001110 int op = STOP_CODE;
1111 char buffer[MANGLE_LEN];
1112
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001113 if (kind != VAR_LOAD &&
1114 none_assignment_check(c, name, kind == VAR_STORE))
1115 {
1116 c->c_errors++;
1117 i = 255;
1118 goto done;
1119 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001120 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001121 name = buffer;
1122 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1123 c->c_errors++;
1124 i = 255;
1125 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001126 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001127
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001128 reftype = get_ref_type(c, name);
1129 switch (reftype) {
1130 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001131 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001132 scope = NAME_LOCAL;
1133 break;
1134 case GLOBAL_EXPLICIT:
1135 scope = NAME_GLOBAL;
1136 break;
1137 case GLOBAL_IMPLICIT:
1138 if (c->c_flags & CO_OPTIMIZED)
1139 scope = NAME_GLOBAL;
1140 break;
1141 case FREE:
1142 case CELL:
1143 scope = NAME_CLOSURE;
1144 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001145 }
1146
1147 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001148 if (scope == NAME_LOCAL)
1149 i = com_lookup_arg(c->c_locals, v);
1150 else if (reftype == FREE)
1151 i = com_lookup_arg(c->c_freevars, v);
1152 else if (reftype == CELL)
1153 i = com_lookup_arg(c->c_cellvars, v);
1154 if (i == -1) {
1155 c->c_errors++; /* XXX no exception set */
1156 i = 255;
1157 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001158 }
1159 Py_DECREF(v);
1160
1161 switch (kind) {
1162 case VAR_LOAD:
1163 switch (scope) {
1164 case NAME_LOCAL:
1165 op = LOAD_FAST;
1166 break;
1167 case NAME_GLOBAL:
1168 op = LOAD_GLOBAL;
1169 break;
1170 case NAME_DEFAULT:
1171 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001172 break;
1173 case NAME_CLOSURE:
1174 op = LOAD_DEREF;
1175 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001176 }
1177 break;
1178 case VAR_STORE:
1179 switch (scope) {
1180 case NAME_LOCAL:
1181 op = STORE_FAST;
1182 break;
1183 case NAME_GLOBAL:
1184 op = STORE_GLOBAL;
1185 break;
1186 case NAME_DEFAULT:
1187 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001188 break;
1189 case NAME_CLOSURE:
1190 op = STORE_DEREF;
1191 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001192 }
1193 break;
1194 case VAR_DELETE:
1195 switch (scope) {
1196 case NAME_LOCAL:
1197 op = DELETE_FAST;
1198 break;
1199 case NAME_GLOBAL:
1200 op = DELETE_GLOBAL;
1201 break;
1202 case NAME_DEFAULT:
1203 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001204 break;
1205 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001206 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001207 PyOS_snprintf(buf, sizeof(buf),
1208 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001209 com_error(c, PyExc_SyntaxError, buf);
1210 i = 255;
1211 break;
1212 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001213 }
1214 break;
1215 }
1216done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001217 com_addoparg(c, op, i);
1218}
1219
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001220static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001221com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001222{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001223 char *name;
1224 char buffer[1000];
1225 /* XXX it is possible to write this code without the 1000
1226 chars on the total length of dotted names, I just can't be
1227 bothered right now */
1228 if (TYPE(n) == STAR)
1229 name = "*";
1230 else if (TYPE(n) == dotted_name) {
1231 char *p = buffer;
1232 int i;
1233 name = buffer;
1234 for (i = 0; i < NCH(n); i += 2) {
1235 char *s = STR(CHILD(n, i));
1236 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001237 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001238 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001239 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001240 break;
1241 }
1242 if (p != buffer)
1243 *p++ = '.';
1244 strcpy(p, s);
1245 p = strchr(p, '\0');
1246 }
1247 }
1248 else {
1249 REQ(n, NAME);
1250 name = STR(n);
1251 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001252 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001253}
1254
Guido van Rossum79f25d91997-04-29 20:08:16 +00001255static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001256parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001257{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001258 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001259 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001260 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001261#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001262 int imflag;
1263#endif
1264
Guido van Rossum282914b1991-04-04 10:42:56 +00001265 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001266 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001267#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001268 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001269#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001270 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001271 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001272 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001273 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001274 if (x < 0 && errno == 0) {
Guido van Rossum715eca92002-08-12 21:54:46 +00001275 if (PyErr_WarnExplicit(
Barry Warsaw9f007392002-08-14 15:51:29 +00001276 PyExc_FutureWarning,
Guido van Rossum715eca92002-08-12 21:54:46 +00001277 "hex/oct constants > sys.maxint "
1278 "will return positive values "
1279 "in Python 2.4 and up",
Martin v. Löwis95292d62002-12-11 14:04:59 +00001280 /* XXX: Give WarnExplicit
1281 a const char* argument. */
1282 (char*)c->c_filename,
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001283 c->c_lineno,
Guido van Rossum715eca92002-08-12 21:54:46 +00001284 NULL,
1285 NULL) < 0)
Guido van Rossum078151d2002-08-11 04:24:12 +00001286 return NULL;
Guido van Rossum3cb8e542002-08-11 14:06:15 +00001287 errno = 0; /* Might be changed by PyErr_Warn() */
Guido van Rossum078151d2002-08-11 04:24:12 +00001288 }
1289 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001290 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001291 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001292 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001293 if (errno != 0)
1294 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001295 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001296 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001297 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001298#ifndef WITHOUT_COMPLEX
1299 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001300 Py_complex z;
1301 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001302 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001303 z.imag = atof(s);
1304 PyFPE_END_PROTECT(z)
1305 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001306 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001307 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001308#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001309 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001310 PyFPE_START_PROTECT("atof", return 0)
1311 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001312 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001313 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001314 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001315}
1316
Guido van Rossum79f25d91997-04-29 20:08:16 +00001317static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001318decode_utf8(char **sPtr, char *end, char* encoding)
1319{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001320#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001321 Py_FatalError("decode_utf8 should not be called in this build.");
1322 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001323#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001324 PyObject *u, *v;
1325 char *s, *t;
1326 t = s = *sPtr;
1327 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1328 while (s < end && (*s & 0x80)) s++;
1329 *sPtr = s;
1330 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1331 if (u == NULL)
1332 return NULL;
1333 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1334 Py_DECREF(u);
1335 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001336#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001337}
1338
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001339/* compiler.transformer.Transformer.decode_literal depends on what
1340 might seem like minor details of this function -- changes here
1341 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001342static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001343parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001344{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001345 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001346 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001347 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001348 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001349 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001350 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001351 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001352
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001353 if (isalpha(quote) || quote == '_') {
1354 if (quote == 'u' || quote == 'U') {
1355 quote = *++s;
1356 unicode = 1;
1357 }
1358 if (quote == 'r' || quote == 'R') {
1359 quote = *++s;
1360 rawmode = 1;
1361 }
1362 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001363 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001364 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001365 return NULL;
1366 }
1367 s++;
1368 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001369 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001370 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001371 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001372 return NULL;
1373 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001374 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001375 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001376 return NULL;
1377 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001378 if (len >= 4 && s[0] == quote && s[1] == quote) {
1379 s += 2;
1380 len -= 2;
1381 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001382 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001383 return NULL;
1384 }
1385 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001386#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001387 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001388 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001389 char *buf;
1390 char *p;
1391 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001392 if (encoding == NULL) {
1393 buf = s;
1394 u = NULL;
1395 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1396 buf = s;
1397 u = NULL;
1398 } else {
1399 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1400 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1401 if (u == NULL)
1402 return NULL;
1403 p = buf = PyString_AsString(u);
1404 end = s + len;
1405 while (s < end) {
1406 if (*s == '\\') {
1407 *p++ = *s++;
1408 if (*s & 0x80) {
1409 strcpy(p, "u005c");
1410 p += 5;
1411 }
1412 }
1413 if (*s & 0x80) { /* XXX inefficient */
1414 char *r;
1415 int rn, i;
1416 w = decode_utf8(&s, end, "utf-16-be");
1417 if (w == NULL) {
1418 Py_DECREF(u);
1419 return NULL;
1420 }
1421 r = PyString_AsString(w);
1422 rn = PyString_Size(w);
1423 assert(rn % 2 == 0);
1424 for (i = 0; i < rn; i += 2) {
1425 sprintf(p, "\\u%02x%02x",
1426 r[i + 0] & 0xFF,
1427 r[i + 1] & 0xFF);
1428 p += 6;
1429 }
1430 Py_DECREF(w);
1431 } else {
1432 *p++ = *s++;
1433 }
1434 }
1435 len = p - buf;
1436 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001437 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001438 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001439 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001440 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1441 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001442 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001443 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001444 return v;
1445
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001446 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001447#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001448 need_encoding = (encoding != NULL &&
1449 strcmp(encoding, "utf-8") != 0 &&
1450 strcmp(encoding, "iso-8859-1") != 0);
1451 if (rawmode || strchr(s, '\\') == NULL) {
1452 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001453#ifndef Py_USING_UNICODE
1454 /* This should not happen - we never see any other
1455 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001456 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001457#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001458 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1459 if (u == NULL)
1460 return NULL;
1461 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1462 Py_DECREF(u);
1463 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001464#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001465 } else {
1466 return PyString_FromStringAndSize(s, len);
1467 }
1468 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001469
1470 v = PyString_DecodeEscape(s, len, NULL, unicode,
1471 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001472 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001473 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001474 return v;
1475}
1476
Guido van Rossum79f25d91997-04-29 20:08:16 +00001477static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001478parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001479{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001480 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001481 int i;
1482 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001483 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001484 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001485 for (i = 1; i < NCH(n); i++) {
1486 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001487 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001488 if (s == NULL)
1489 goto onError;
1490 if (PyString_Check(v) && PyString_Check(s)) {
1491 PyString_ConcatAndDel(&v, s);
1492 if (v == NULL)
1493 goto onError;
1494 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001495#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001496 else {
1497 PyObject *temp;
1498 temp = PyUnicode_Concat(v, s);
1499 Py_DECREF(s);
1500 if (temp == NULL)
1501 goto onError;
1502 Py_DECREF(v);
1503 v = temp;
1504 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001505#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001506 }
1507 }
1508 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001509
1510 onError:
1511 Py_XDECREF(v);
1512 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001513}
1514
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001515static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001516com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001517{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001518 int anchor = 0;
1519 int save_begin = c->c_begin;
1520
1521 /* list_iter: for v in expr [list_iter] */
1522 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001523 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001524 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001525 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001526 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001527 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001528 c->c_loops++;
1529 com_list_iter(c, n, e, t);
1530 c->c_loops--;
1531 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1532 c->c_begin = save_begin;
1533 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001534 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001535}
1536
1537static void
1538com_list_if(struct compiling *c, node *n, node *e, char *t)
1539{
1540 int anchor = 0;
1541 int a = 0;
1542 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001543 com_node(c, CHILD(n, 1));
1544 com_addfwref(c, JUMP_IF_FALSE, &a);
1545 com_addbyte(c, POP_TOP);
1546 com_pop(c, 1);
1547 com_list_iter(c, n, e, t);
1548 com_addfwref(c, JUMP_FORWARD, &anchor);
1549 com_backpatch(c, a);
1550 /* We jump here with an extra entry which we now pop */
1551 com_addbyte(c, POP_TOP);
1552 com_backpatch(c, anchor);
1553}
1554
1555static void
1556com_list_iter(struct compiling *c,
1557 node *p, /* parent of list_iter node */
1558 node *e, /* element expression node */
1559 char *t /* name of result list temp local */)
1560{
1561 /* list_iter is the last child in a listmaker, list_for, or list_if */
1562 node *n = CHILD(p, NCH(p)-1);
1563 if (TYPE(n) == list_iter) {
1564 n = CHILD(n, 0);
1565 switch (TYPE(n)) {
1566 case list_for:
1567 com_list_for(c, n, e, t);
1568 break;
1569 case list_if:
1570 com_list_if(c, n, e, t);
1571 break;
1572 default:
1573 com_error(c, PyExc_SystemError,
1574 "invalid list_iter node type");
1575 }
1576 }
1577 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001578 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001579 com_push(c, 1);
1580 com_node(c, e);
1581 com_addoparg(c, CALL_FUNCTION, 1);
1582 com_addbyte(c, POP_TOP);
1583 com_pop(c, 2);
1584 }
1585}
1586
1587static void
1588com_list_comprehension(struct compiling *c, node *n)
1589{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001590 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001591 char tmpname[30];
1592 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001593 com_addoparg(c, BUILD_LIST, 0);
1594 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1595 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001596 com_addop_name(c, LOAD_ATTR, "append");
1597 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001598 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001599 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001600 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001601 --c->c_tmpname;
1602}
1603
1604static void
1605com_listmaker(struct compiling *c, node *n)
1606{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001607 /* listmaker: test ( list_for | (',' test)* [','] ) */
1608 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001609 com_list_comprehension(c, n);
1610 else {
1611 int len = 0;
1612 int i;
1613 for (i = 0; i < NCH(n); i += 2, len++)
1614 com_node(c, CHILD(n, i));
1615 com_addoparg(c, BUILD_LIST, len);
1616 com_pop(c, len-1);
1617 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001618}
1619
1620static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001621com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001622{
1623 int i;
1624 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1625 for (i = 0; i+2 < NCH(n); i += 4) {
1626 /* We must arrange things just right for STORE_SUBSCR.
1627 It wants the stack to look like (value) (dict) (key) */
1628 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001629 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001630 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00001631 com_node(c, CHILD(n, i+2)); /* value */
1632 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001633 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001634 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001635 }
1636}
1637
1638static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001639com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001640{
1641 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001642 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001643 int i;
1644 REQ(n, atom);
1645 ch = CHILD(n, 0);
1646 switch (TYPE(ch)) {
1647 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001648 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001649 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001650 com_push(c, 1);
1651 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001652 else
1653 com_node(c, CHILD(n, 1));
1654 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001655 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001656 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001657 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001658 com_push(c, 1);
1659 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001660 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001661 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001662 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001663 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001664 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001665 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001666 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001667 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001668 break;
1669 case BACKQUOTE:
1670 com_node(c, CHILD(n, 1));
1671 com_addbyte(c, UNARY_CONVERT);
1672 break;
1673 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001674 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001675 i = 255;
1676 }
1677 else {
1678 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001679 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001680 }
1681 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001682 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001683 break;
1684 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001685 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001686 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001687 c->c_errors++;
1688 i = 255;
1689 }
1690 else {
1691 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001692 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001693 }
1694 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001695 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001696 break;
1697 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001698 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001699 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001700 break;
1701 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001702 com_error(c, PyExc_SystemError,
1703 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001704 }
1705}
1706
1707static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001708com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001709{
1710 if (NCH(n) == 1) {
1711 com_addbyte(c, op);
1712 }
1713 else if (NCH(n) == 2) {
1714 if (TYPE(CHILD(n, 0)) != COLON) {
1715 com_node(c, CHILD(n, 0));
1716 com_addbyte(c, op+1);
1717 }
1718 else {
1719 com_node(c, CHILD(n, 1));
1720 com_addbyte(c, op+2);
1721 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001722 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001723 }
1724 else {
1725 com_node(c, CHILD(n, 0));
1726 com_node(c, CHILD(n, 2));
1727 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001728 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001729 }
1730}
1731
Guido van Rossum635abd21997-01-06 22:56:52 +00001732static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001733com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1734{
1735 if (NCH(n) == 1) {
1736 com_addbyte(c, DUP_TOP);
1737 com_push(c, 1);
1738 com_addbyte(c, SLICE);
1739 com_node(c, augn);
1740 com_addbyte(c, opcode);
1741 com_pop(c, 1);
1742 com_addbyte(c, ROT_TWO);
1743 com_addbyte(c, STORE_SLICE);
1744 com_pop(c, 2);
1745 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1746 com_node(c, CHILD(n, 0));
1747 com_addoparg(c, DUP_TOPX, 2);
1748 com_push(c, 2);
1749 com_addbyte(c, SLICE+1);
1750 com_pop(c, 1);
1751 com_node(c, augn);
1752 com_addbyte(c, opcode);
1753 com_pop(c, 1);
1754 com_addbyte(c, ROT_THREE);
1755 com_addbyte(c, STORE_SLICE+1);
1756 com_pop(c, 3);
1757 } else if (NCH(n) == 2) {
1758 com_node(c, CHILD(n, 1));
1759 com_addoparg(c, DUP_TOPX, 2);
1760 com_push(c, 2);
1761 com_addbyte(c, SLICE+2);
1762 com_pop(c, 1);
1763 com_node(c, augn);
1764 com_addbyte(c, opcode);
1765 com_pop(c, 1);
1766 com_addbyte(c, ROT_THREE);
1767 com_addbyte(c, STORE_SLICE+2);
1768 com_pop(c, 3);
1769 } else {
1770 com_node(c, CHILD(n, 0));
1771 com_node(c, CHILD(n, 2));
1772 com_addoparg(c, DUP_TOPX, 3);
1773 com_push(c, 3);
1774 com_addbyte(c, SLICE+3);
1775 com_pop(c, 2);
1776 com_node(c, augn);
1777 com_addbyte(c, opcode);
1778 com_pop(c, 1);
1779 com_addbyte(c, ROT_FOUR);
1780 com_addbyte(c, STORE_SLICE+3);
1781 com_pop(c, 4);
1782 }
1783}
1784
1785static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001786com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001787{
1788 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001789 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001790 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001791 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001792 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001793 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001794 }
1795 else {
1796 com_node(c, CHILD(n, 0));
1797 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001798 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001799 }
1800 m = n;
1801 do {
1802 m = CHILD(m, 0);
1803 } while (NCH(m) == 1);
1804 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001805 /* f(lambda x: x[0] = 3) ends up getting parsed with
1806 * LHS test = lambda x: x[0], and RHS test = 3.
1807 * SF bug 132313 points out that complaining about a keyword
1808 * then is very confusing.
1809 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001810 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001811 TYPE(m) == lambdef ?
1812 "lambda cannot contain assignment" :
1813 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001814 }
1815 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001816 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00001817 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00001818 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001819 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001820 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001821 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001822 else if (*pkeywords == NULL) {
1823 c->c_errors++;
1824 Py_DECREF(v);
1825 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001826 if (PyDict_GetItem(*pkeywords, v) != NULL)
1827 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001828 "duplicate keyword argument");
1829 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001830 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001831 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001832 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001833 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001834 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001835 }
1836 }
1837 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001838}
1839
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001840static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001841com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001842{
1843 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001844 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001845 }
1846 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001847 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001848 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001849 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001850 int star_flag = 0;
1851 int starstar_flag = 0;
1852 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001853 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001854 na = 0;
1855 nk = 0;
1856 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001857 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001858 if (TYPE(ch) == STAR ||
1859 TYPE(ch) == DOUBLESTAR)
1860 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001861 if (ch->n_lineno != lineno) {
1862 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001863 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00001864 }
1865 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001866 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001867 na++;
1868 else
1869 nk++;
1870 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001871 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001872 while (i < NCH(n)) {
1873 node *tok = CHILD(n, i);
1874 node *ch = CHILD(n, i+1);
1875 i += 3;
1876 switch (TYPE(tok)) {
1877 case STAR: star_flag = 1; break;
1878 case DOUBLESTAR: starstar_flag = 1; break;
1879 }
1880 com_node(c, ch);
1881 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001882 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001883 com_error(c, PyExc_SyntaxError,
1884 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001885 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001886 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001887 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001888 star_flag + (starstar_flag << 1);
1889 else
1890 opcode = CALL_FUNCTION;
1891 com_addoparg(c, opcode, na | (nk << 8));
1892 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001893 }
1894}
1895
1896static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001897com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001898{
1899 com_addopname(c, LOAD_ATTR, n);
1900}
1901
1902static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001903com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001904{
1905 int i=0;
1906 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001907 node *ch;
1908
1909 /* first argument */
1910 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001911 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001912 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001913 i++;
1914 }
1915 else {
1916 com_node(c, CHILD(n,i));
1917 i++;
1918 REQ(CHILD(n,i),COLON);
1919 i++;
1920 }
1921 /* second argument */
1922 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1923 com_node(c, CHILD(n,i));
1924 i++;
1925 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001926 else {
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);
1929 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001930 /* remaining arguments */
1931 for (; i < NCH(n); i++) {
1932 ns++;
1933 ch=CHILD(n,i);
1934 REQ(ch, sliceop);
1935 if (NCH(ch) == 1) {
1936 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001937 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001938 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001939 }
1940 else
1941 com_node(c, CHILD(ch,1));
1942 }
1943 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001944 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001945}
1946
1947static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001948com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001949{
1950 node *ch;
1951 REQ(n, subscript);
1952 ch = CHILD(n,0);
1953 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001954 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001955 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001956 com_push(c, 1);
1957 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001958 else {
1959 /* check for slice */
1960 if ((TYPE(ch) == COLON || NCH(n) > 1))
1961 com_sliceobj(c, n);
1962 else {
1963 REQ(ch, test);
1964 com_node(c, ch);
1965 }
1966 }
1967}
1968
1969static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001970com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001971{
1972 int i, op;
1973 REQ(n, subscriptlist);
1974 /* Check to make backward compatible slice behavior for '[i:j]' */
1975 if (NCH(n) == 1) {
1976 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001977 /* 'Basic' slice, should have exactly one colon. */
1978 if ((TYPE(CHILD(sub, 0)) == COLON
1979 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1980 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1981 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001982 switch (assigning) {
1983 case OP_DELETE:
1984 op = DELETE_SLICE;
1985 break;
1986 case OP_ASSIGN:
1987 op = STORE_SLICE;
1988 break;
1989 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001990 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001991 break;
1992 default:
1993 com_augassign_slice(c, sub, assigning, augn);
1994 return;
1995 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001996 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001997 if (op == STORE_SLICE)
1998 com_pop(c, 2);
1999 else if (op == DELETE_SLICE)
2000 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002001 return;
2002 }
2003 }
2004 /* Else normal subscriptlist. Compile each subscript. */
2005 for (i = 0; i < NCH(n); i += 2)
2006 com_subscript(c, CHILD(n, i));
2007 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002008 if (NCH(n) > 1) {
2009 i = (NCH(n)+1) / 2;
2010 com_addoparg(c, BUILD_TUPLE, i);
2011 com_pop(c, i-1);
2012 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002013 switch (assigning) {
2014 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002015 op = DELETE_SUBSCR;
2016 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002017 break;
2018 default:
2019 case OP_ASSIGN:
2020 op = STORE_SUBSCR;
2021 i = 3;
2022 break;
2023 case OP_APPLY:
2024 op = BINARY_SUBSCR;
2025 i = 1;
2026 break;
2027 }
2028 if (assigning > OP_APPLY) {
2029 com_addoparg(c, DUP_TOPX, 2);
2030 com_push(c, 2);
2031 com_addbyte(c, BINARY_SUBSCR);
2032 com_pop(c, 1);
2033 com_node(c, augn);
2034 com_addbyte(c, assigning);
2035 com_pop(c, 1);
2036 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002037 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002038 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002039 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002040}
2041
2042static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002043com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002044{
2045 REQ(n, trailer);
2046 switch (TYPE(CHILD(n, 0))) {
2047 case LPAR:
2048 com_call_function(c, CHILD(n, 1));
2049 break;
2050 case DOT:
2051 com_select_member(c, CHILD(n, 1));
2052 break;
2053 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002054 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002055 break;
2056 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002057 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002058 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002059 }
2060}
2061
2062static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002063com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002064{
2065 int i;
2066 REQ(n, power);
2067 com_atom(c, CHILD(n, 0));
2068 for (i = 1; i < NCH(n); i++) {
2069 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2070 com_factor(c, CHILD(n, i+1));
2071 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002072 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002073 break;
2074 }
2075 else
2076 com_apply_trailer(c, CHILD(n, i));
2077 }
2078}
2079
2080static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002081com_invert_constant(struct compiling *c, node *n)
2082{
2083 /* Compute the inverse of int and longs and use them directly,
2084 but be prepared to generate code for all other
2085 possibilities (invalid numbers, floats, complex).
2086 */
2087 PyObject *num, *inv = NULL;
2088 int i;
2089
2090 REQ(n, NUMBER);
2091 num = parsenumber(c, STR(n));
2092 if (num == NULL)
2093 i = 255;
2094 else {
2095 inv = PyNumber_Invert(num);
2096 if (inv == NULL) {
2097 PyErr_Clear();
2098 i = com_addconst(c, num);
2099 } else {
2100 i = com_addconst(c, inv);
2101 Py_DECREF(inv);
2102 }
2103 Py_DECREF(num);
2104 }
2105 com_addoparg(c, LOAD_CONST, i);
2106 com_push(c, 1);
2107 if (num != NULL && inv == NULL)
2108 com_addbyte(c, UNARY_INVERT);
2109}
2110
Tim Peters51e26512001-09-07 08:45:55 +00002111static int
2112is_float_zero(const char *p)
2113{
2114 int found_radix_point = 0;
2115 int ch;
2116 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2117 switch (ch) {
2118 case '0':
2119 /* no reason to believe it's not 0 -- continue */
2120 break;
2121
2122 case 'e': case 'E': case 'j': case 'J':
2123 /* If this was a hex constant, we already would have
2124 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2125 must be an exponent marker, and we haven't yet
2126 seen a non-zero digit, and it doesn't matter what
2127 the exponent is then. For 'j' or 'J' similarly,
2128 except that this is an imaginary 0 then. */
2129 return 1;
2130
2131 case '.':
2132 found_radix_point = 1;
2133 break;
2134
2135 default:
2136 return 0;
2137 }
2138 }
2139 return found_radix_point;
2140}
2141
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002142static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002143com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002144{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002145 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002146 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002147 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002148 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002149 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002150 approriate value as a constant. If the value is negative,
2151 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002152 negative in the 0th position -- unless we're doing unary minus
2153 of a floating zero! In that case the sign is significant, but
2154 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002155 */
2156 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002157 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002158 && TYPE((pfactor = CHILD(n, 1))) == factor
2159 && NCH(pfactor) == 1
2160 && TYPE((ppower = CHILD(pfactor, 0))) == power
2161 && NCH(ppower) == 1
2162 && TYPE((patom = CHILD(ppower, 0))) == atom
2163 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002164 && !(childtype == MINUS &&
2165 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002166 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002167 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002168 return;
2169 }
2170 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002171 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002172 if (s == NULL) {
2173 com_error(c, PyExc_MemoryError, "");
2174 com_addbyte(c, 255);
2175 return;
2176 }
2177 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002178 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002179 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002180 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002181 }
Tim Peters51e26512001-09-07 08:45:55 +00002182 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002183 }
2184 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002185 com_factor(c, CHILD(n, 1));
2186 com_addbyte(c, UNARY_POSITIVE);
2187 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002188 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002189 com_factor(c, CHILD(n, 1));
2190 com_addbyte(c, UNARY_NEGATIVE);
2191 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002192 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002193 com_factor(c, CHILD(n, 1));
2194 com_addbyte(c, UNARY_INVERT);
2195 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002196 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002197 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002198 }
2199}
2200
2201static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002202com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002203{
2204 int i;
2205 int op;
2206 REQ(n, term);
2207 com_factor(c, CHILD(n, 0));
2208 for (i = 2; i < NCH(n); i += 2) {
2209 com_factor(c, CHILD(n, i));
2210 switch (TYPE(CHILD(n, i-1))) {
2211 case STAR:
2212 op = BINARY_MULTIPLY;
2213 break;
2214 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002215 if (c->c_flags & CO_FUTURE_DIVISION)
2216 op = BINARY_TRUE_DIVIDE;
2217 else
2218 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002219 break;
2220 case PERCENT:
2221 op = BINARY_MODULO;
2222 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002223 case DOUBLESLASH:
2224 op = BINARY_FLOOR_DIVIDE;
2225 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002226 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002227 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002228 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002229 op = 255;
2230 }
2231 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002232 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002233 }
2234}
2235
2236static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002237com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002238{
2239 int i;
2240 int op;
2241 REQ(n, arith_expr);
2242 com_term(c, CHILD(n, 0));
2243 for (i = 2; i < NCH(n); i += 2) {
2244 com_term(c, CHILD(n, i));
2245 switch (TYPE(CHILD(n, i-1))) {
2246 case PLUS:
2247 op = BINARY_ADD;
2248 break;
2249 case MINUS:
2250 op = BINARY_SUBTRACT;
2251 break;
2252 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002253 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002254 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002255 op = 255;
2256 }
2257 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002258 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002259 }
2260}
2261
2262static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002263com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002264{
2265 int i;
2266 int op;
2267 REQ(n, shift_expr);
2268 com_arith_expr(c, CHILD(n, 0));
2269 for (i = 2; i < NCH(n); i += 2) {
2270 com_arith_expr(c, CHILD(n, i));
2271 switch (TYPE(CHILD(n, i-1))) {
2272 case LEFTSHIFT:
2273 op = BINARY_LSHIFT;
2274 break;
2275 case RIGHTSHIFT:
2276 op = BINARY_RSHIFT;
2277 break;
2278 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002279 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002280 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002281 op = 255;
2282 }
2283 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002284 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002285 }
2286}
2287
2288static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002289com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002290{
2291 int i;
2292 int op;
2293 REQ(n, and_expr);
2294 com_shift_expr(c, CHILD(n, 0));
2295 for (i = 2; i < NCH(n); i += 2) {
2296 com_shift_expr(c, CHILD(n, i));
2297 if (TYPE(CHILD(n, i-1)) == AMPER) {
2298 op = BINARY_AND;
2299 }
2300 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002301 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002302 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002303 op = 255;
2304 }
2305 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002306 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002307 }
2308}
2309
2310static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002311com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002312{
2313 int i;
2314 int op;
2315 REQ(n, xor_expr);
2316 com_and_expr(c, CHILD(n, 0));
2317 for (i = 2; i < NCH(n); i += 2) {
2318 com_and_expr(c, CHILD(n, i));
2319 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2320 op = BINARY_XOR;
2321 }
2322 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002323 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002324 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002325 op = 255;
2326 }
2327 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002328 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002329 }
2330}
2331
2332static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002333com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002334{
2335 int i;
2336 int op;
2337 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002338 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002339 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002340 com_xor_expr(c, CHILD(n, i));
2341 if (TYPE(CHILD(n, i-1)) == VBAR) {
2342 op = BINARY_OR;
2343 }
2344 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002345 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002346 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002347 op = 255;
2348 }
2349 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002350 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002351 }
2352}
2353
2354static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002355cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002356{
2357 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00002358 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002359 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2360 if (NCH(n) == 1) {
2361 n = CHILD(n, 0);
2362 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002363 case LESS: return PyCmp_LT;
2364 case GREATER: return PyCmp_GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002365 case EQEQUAL: /* == */
Martin v. Löwis7198a522002-01-01 19:59:11 +00002366 case EQUAL: return PyCmp_EQ;
2367 case LESSEQUAL: return PyCmp_LE;
2368 case GREATEREQUAL: return PyCmp_GE;
2369 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2370 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2371 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002372 }
2373 }
2374 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002375 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002376 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002377 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002378 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002379 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002380 }
2381 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002382 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002383}
2384
2385static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002386com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002387{
2388 int i;
2389 enum cmp_op op;
2390 int anchor;
2391 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2392 com_expr(c, CHILD(n, 0));
2393 if (NCH(n) == 1)
2394 return;
2395
2396 /****************************************************************
2397 The following code is generated for all but the last
2398 comparison in a chain:
2399
2400 label: on stack: opcode: jump to:
2401
2402 a <code to load b>
2403 a, b DUP_TOP
2404 a, b, b ROT_THREE
2405 b, a, b COMPARE_OP
2406 b, 0-or-1 JUMP_IF_FALSE L1
2407 b, 1 POP_TOP
2408 b
2409
2410 We are now ready to repeat this sequence for the next
2411 comparison in the chain.
2412
2413 For the last we generate:
2414
2415 b <code to load c>
2416 b, c COMPARE_OP
2417 0-or-1
2418
2419 If there were any jumps to L1 (i.e., there was more than one
2420 comparison), we generate:
2421
2422 0-or-1 JUMP_FORWARD L2
2423 L1: b, 0 ROT_TWO
2424 0, b POP_TOP
2425 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002426 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002427 ****************************************************************/
2428
2429 anchor = 0;
2430
2431 for (i = 2; i < NCH(n); i += 2) {
2432 com_expr(c, CHILD(n, i));
2433 if (i+2 < NCH(n)) {
2434 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002435 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002436 com_addbyte(c, ROT_THREE);
2437 }
2438 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002439 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002440 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002441 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002442 }
2443 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002444 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002445 if (i+2 < NCH(n)) {
2446 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2447 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002448 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002449 }
2450 }
2451
2452 if (anchor) {
2453 int anchor2 = 0;
2454 com_addfwref(c, JUMP_FORWARD, &anchor2);
2455 com_backpatch(c, anchor);
2456 com_addbyte(c, ROT_TWO);
2457 com_addbyte(c, POP_TOP);
2458 com_backpatch(c, anchor2);
2459 }
2460}
2461
2462static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002463com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002464{
2465 REQ(n, not_test); /* 'not' not_test | comparison */
2466 if (NCH(n) == 1) {
2467 com_comparison(c, CHILD(n, 0));
2468 }
2469 else {
2470 com_not_test(c, CHILD(n, 1));
2471 com_addbyte(c, UNARY_NOT);
2472 }
2473}
2474
2475static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002476com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002477{
2478 int i;
2479 int anchor;
2480 REQ(n, and_test); /* not_test ('and' not_test)* */
2481 anchor = 0;
2482 i = 0;
2483 for (;;) {
2484 com_not_test(c, CHILD(n, i));
2485 if ((i += 2) >= NCH(n))
2486 break;
2487 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2488 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002489 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002490 }
2491 if (anchor)
2492 com_backpatch(c, anchor);
2493}
2494
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002495static int
2496com_make_closure(struct compiling *c, PyCodeObject *co)
2497{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002498 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002499 if (free == 0)
2500 return 0;
2501 for (i = 0; i < free; ++i) {
2502 /* Bypass com_addop_varname because it will generate
2503 LOAD_DEREF but LOAD_CLOSURE is needed.
2504 */
2505 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2506 int arg, reftype;
2507
2508 /* Special case: If a class contains a method with a
2509 free variable that has the same name as a method,
2510 the name will be considered free *and* local in the
2511 class. It should be handled by the closure, as
2512 well as by the normal name loookup logic.
2513 */
2514 reftype = get_ref_type(c, PyString_AS_STRING(name));
2515 if (reftype == CELL)
2516 arg = com_lookup_arg(c->c_cellvars, name);
2517 else /* (reftype == FREE) */
2518 arg = com_lookup_arg(c->c_freevars, name);
2519 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002520 fprintf(stderr, "lookup %s in %s %d %d\n"
2521 "freevars of %s: %s\n",
2522 PyObject_REPR(name),
2523 c->c_name,
2524 reftype, arg,
2525 PyString_AS_STRING(co->co_name),
2526 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002527 Py_FatalError("com_make_closure()");
2528 }
2529 com_addoparg(c, LOAD_CLOSURE, arg);
2530
2531 }
2532 com_push(c, free);
2533 return 1;
2534}
2535
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002536static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002537com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002538{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002539 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002540 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002541 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002542 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002543 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002544 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2545 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002546 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002547 if (co == NULL) {
2548 c->c_errors++;
2549 return;
2550 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002551 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002552 i = com_addconst(c, (PyObject *)co);
2553 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002554 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002555 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002556 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002557 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002558 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002559 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002560 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002561 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002562 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002563 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002564 else {
2565 int anchor = 0;
2566 int i = 0;
2567 for (;;) {
2568 com_and_test(c, CHILD(n, i));
2569 if ((i += 2) >= NCH(n))
2570 break;
2571 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2572 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002573 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002574 }
2575 if (anchor)
2576 com_backpatch(c, anchor);
2577 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002578}
2579
2580static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002581com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002582{
2583 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002584 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002585 com_node(c, CHILD(n, 0));
2586 }
2587 else {
2588 int i;
2589 int len;
2590 len = (NCH(n) + 1) / 2;
2591 for (i = 0; i < NCH(n); i += 2)
2592 com_node(c, CHILD(n, i));
2593 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002594 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002595 }
2596}
2597
2598
2599/* Begin of assignment compilation */
2600
Thomas Wouters434d0822000-08-24 20:11:32 +00002601
2602static void
2603com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2604{
2605 com_addbyte(c, DUP_TOP);
2606 com_push(c, 1);
2607 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002608 com_node(c, augn);
2609 com_addbyte(c, opcode);
2610 com_pop(c, 1);
2611 com_addbyte(c, ROT_TWO);
2612 com_addopname(c, STORE_ATTR, n);
2613 com_pop(c, 2);
2614}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002615
2616static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002617com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002618{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00002619 if (none_assignment_check(c, STR(n), assigning))
2620 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002621 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002622 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002623}
2624
2625static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002626com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002627{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002628 REQ(n, trailer);
2629 switch (TYPE(CHILD(n, 0))) {
2630 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002631 if (assigning == OP_DELETE)
2632 com_error(c, PyExc_SyntaxError,
2633 "can't delete function call");
2634 else
2635 com_error(c, PyExc_SyntaxError,
2636 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002637 break;
2638 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002639 if (assigning > OP_APPLY)
2640 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2641 else
2642 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002643 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002644 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002645 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002646 break;
2647 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002648 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002649 }
2650}
2651
2652static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002653com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002654{
2655 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002656 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002657 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002658 if (assigning) {
2659 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002660 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002661 com_push(c, i-1);
2662 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002663 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002664 com_assign(c, CHILD(n, i), assigning, NULL);
2665}
2666
2667static void
2668com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2669{
2670 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002671 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002672 com_push(c, 1);
2673 com_node(c, augn);
2674 com_addbyte(c, opcode);
2675 com_pop(c, 1);
2676 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002677}
2678
2679static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002680com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002681{
2682 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002683 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002684 if (assigning)
2685 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002686}
2687
2688static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002689com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002690{
2691 /* Loop to avoid trivial recursion */
2692 for (;;) {
2693 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002694
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002695 case exprlist:
2696 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002697 case testlist1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002698 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002699 if (assigning > OP_APPLY) {
2700 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002701 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002702 return;
2703 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002704 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002705 return;
2706 }
2707 n = CHILD(n, 0);
2708 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002709
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002710 case test:
2711 case and_test:
2712 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002713 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002714 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002715 case xor_expr:
2716 case and_expr:
2717 case shift_expr:
2718 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002719 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002720 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002721 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002722 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002723 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002724 return;
2725 }
2726 n = CHILD(n, 0);
2727 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002728
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002729 case power: /* atom trailer* ('**' power)*
2730 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002731 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002732 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002733 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002734 return;
2735 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002736 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002737 int i;
2738 com_node(c, CHILD(n, 0));
2739 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002740 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002741 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002742 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002743 return;
2744 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002745 com_apply_trailer(c, CHILD(n, i));
2746 } /* NB i is still alive */
2747 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002748 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002749 return;
2750 }
2751 n = CHILD(n, 0);
2752 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002753
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002754 case atom:
2755 switch (TYPE(CHILD(n, 0))) {
2756 case LPAR:
2757 n = CHILD(n, 1);
2758 if (TYPE(n) == RPAR) {
2759 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002760 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002761 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002762 return;
2763 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002764 if (assigning > OP_APPLY) {
2765 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002766 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002767 return;
2768 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002769 break;
2770 case LSQB:
2771 n = CHILD(n, 1);
2772 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002773 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002774 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002775 return;
2776 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002777 if (assigning > OP_APPLY) {
2778 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002779 "augmented assign to list not possible");
2780 return;
2781 }
2782 if (NCH(n) > 1
2783 && TYPE(CHILD(n, 1)) == list_for) {
2784 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002785 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002786 return;
2787 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002788 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002789 return;
2790 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002791 if (assigning > OP_APPLY)
2792 com_augassign_name(c, CHILD(n, 0),
2793 assigning, augn);
2794 else
2795 com_assign_name(c, CHILD(n, 0),
2796 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002797 return;
2798 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002799 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002800 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002801 return;
2802 }
2803 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002804
2805 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002806 com_error(c, PyExc_SyntaxError,
2807 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002808 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002809
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002810 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002811 com_error(c, PyExc_SystemError,
2812 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002813 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002814
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002815 }
2816 }
2817}
Guido van Rossum7c531111997-03-11 18:42:21 +00002818
Thomas Wouters434d0822000-08-24 20:11:32 +00002819static void
2820com_augassign(struct compiling *c, node *n)
2821{
2822 int opcode;
2823
2824 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2825 case '+': opcode = INPLACE_ADD; break;
2826 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002827 case '/':
2828 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
2829 opcode = INPLACE_FLOOR_DIVIDE;
2830 else if (c->c_flags & CO_FUTURE_DIVISION)
2831 opcode = INPLACE_TRUE_DIVIDE;
2832 else
2833 opcode = INPLACE_DIVIDE;
2834 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00002835 case '%': opcode = INPLACE_MODULO; break;
2836 case '<': opcode = INPLACE_LSHIFT; break;
2837 case '>': opcode = INPLACE_RSHIFT; break;
2838 case '&': opcode = INPLACE_AND; break;
2839 case '^': opcode = INPLACE_XOR; break;
2840 case '|': opcode = INPLACE_OR; break;
2841 case '*':
2842 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2843 opcode = INPLACE_POWER;
2844 else
2845 opcode = INPLACE_MULTIPLY;
2846 break;
2847 default:
2848 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2849 return;
2850 }
2851 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2852}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002853
2854static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002855com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002856{
Thomas Wouters434d0822000-08-24 20:11:32 +00002857 REQ(n, expr_stmt);
2858 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002859 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002860 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002861 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002862 if (NCH(n) == 1) {
2863 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002864 if (c->c_interactive)
2865 com_addbyte(c, PRINT_EXPR);
2866 else
2867 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002868 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002869 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002870 else if (TYPE(CHILD(n,1)) == augassign)
2871 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002872 else {
2873 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002874 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002875 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002876 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002877 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002878 com_push(c, 1);
2879 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002880 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002881 }
2882 }
2883}
2884
2885static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002886com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002887{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002888 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002889 int i;
2890 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002891 if (Py_OptimizeFlag)
2892 return;
2893 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00002894
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002895 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00002896 raise AssertionError [, <message>]
2897
2898 where <message> is the second test, if present.
2899 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002900 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002901 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002902 com_addbyte(c, POP_TOP);
2903 com_pop(c, 1);
2904 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002905 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002906 com_push(c, 1);
2907 i = NCH(n)/2; /* Either 2 or 4 */
2908 if (i > 1)
2909 com_node(c, CHILD(n, 3));
2910 com_addoparg(c, RAISE_VARARGS, i);
2911 com_pop(c, i);
2912 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002913 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002914 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002915 com_addbyte(c, POP_TOP);
2916}
2917
2918static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002919com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002920{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002921 int i = 1;
2922 node* stream = NULL;
2923
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002924 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002925
2926 /* are we using the extended print form? */
2927 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2928 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002929 com_node(c, stream);
2930 /* stack: [...] => [... stream] */
2931 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002932 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2933 i = 4;
2934 else
2935 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002936 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002937 for (; i < NCH(n); i += 2) {
2938 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002939 com_addbyte(c, DUP_TOP);
2940 /* stack: [stream] => [stream stream] */
2941 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002942 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002943 /* stack: [stream stream] => [stream stream obj] */
2944 com_addbyte(c, ROT_TWO);
2945 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002946 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002947 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002948 com_pop(c, 2);
2949 }
2950 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002951 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002952 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002953 com_addbyte(c, PRINT_ITEM);
2954 com_pop(c, 1);
2955 }
2956 }
2957 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002958 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002959 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002960 /* must pop the extra stream object off the stack */
2961 com_addbyte(c, POP_TOP);
2962 /* stack: [... stream] => [...] */
2963 com_pop(c, 1);
2964 }
2965 }
2966 else {
2967 if (stream != NULL) {
2968 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002969 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002970 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002971 com_pop(c, 1);
2972 }
2973 else
2974 com_addbyte(c, PRINT_NEWLINE);
2975 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002976}
2977
2978static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002979com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002980{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002981 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002982 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002983 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002984 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002985 if (c->c_flags & CO_GENERATOR) {
2986 if (NCH(n) > 1) {
2987 com_error(c, PyExc_SyntaxError,
2988 "'return' with argument inside generator");
2989 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002990 }
2991 if (NCH(n) < 2) {
2992 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002993 com_push(c, 1);
2994 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002995 else
2996 com_node(c, CHILD(n, 1));
2997 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00002998 com_pop(c, 1);
2999}
3000
3001static void
3002com_yield_stmt(struct compiling *c, node *n)
3003{
Tim Peters95c80f82001-06-23 02:07:08 +00003004 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003005 REQ(n, yield_stmt); /* 'yield' testlist */
3006 if (!c->c_infunction) {
3007 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3008 }
Tim Peters95c80f82001-06-23 02:07:08 +00003009
3010 for (i = 0; i < c->c_nblocks; ++i) {
3011 if (c->c_block[i] == SETUP_FINALLY) {
3012 com_error(c, PyExc_SyntaxError,
3013 "'yield' not allowed in a 'try' block "
3014 "with a 'finally' clause");
3015 return;
3016 }
3017 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003018 com_node(c, CHILD(n, 1));
3019 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003020 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003021}
3022
3023static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003024com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003025{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003026 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003027 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3028 if (NCH(n) > 1) {
3029 com_node(c, CHILD(n, 1));
3030 if (NCH(n) > 3) {
3031 com_node(c, CHILD(n, 3));
3032 if (NCH(n) > 5)
3033 com_node(c, CHILD(n, 5));
3034 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003035 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003036 i = NCH(n)/2;
3037 com_addoparg(c, RAISE_VARARGS, i);
3038 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003039}
3040
3041static void
Thomas Wouters52152252000-08-17 22:55:00 +00003042com_from_import(struct compiling *c, node *n)
3043{
3044 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3045 com_push(c, 1);
3046 if (NCH(n) > 1) {
3047 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3048 com_error(c, PyExc_SyntaxError, "invalid syntax");
3049 return;
3050 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003051 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003052 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003053 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003054 com_pop(c, 1);
3055}
3056
3057static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003058com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003059{
3060 int i;
3061 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003062 /* 'import' dotted_name (',' dotted_name)* |
3063 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003064 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00003065 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003066 /* 'from' dotted_name 'import' ... */
3067 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003068
3069 if (TYPE(CHILD(n, 3)) == STAR) {
3070 tup = Py_BuildValue("(s)", "*");
3071 } else {
3072 tup = PyTuple_New((NCH(n) - 2)/2);
3073 for (i = 3; i < NCH(n); i += 2) {
3074 PyTuple_SET_ITEM(tup, (i-3)/2,
Guido van Rossum633d90c2002-12-23 16:51:42 +00003075 PyString_FromString(STR(
3076 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003077 }
3078 }
3079 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003080 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003081 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003082 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00003083 if (TYPE(CHILD(n, 3)) == STAR)
3084 com_addbyte(c, IMPORT_STAR);
3085 else {
3086 for (i = 3; i < NCH(n); i += 2)
3087 com_from_import(c, CHILD(n, i));
3088 com_addbyte(c, POP_TOP);
3089 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003090 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003091 }
3092 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003093 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003094 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003095 node *subn = CHILD(n, i);
3096 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003097 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003098 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003099 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003100 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003101 int j;
3102 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003103 com_error(c, PyExc_SyntaxError,
3104 "invalid syntax");
3105 return;
3106 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003107 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3108 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003109 CHILD(CHILD(subn, 0),
3110 j));
3111 com_addop_varname(c, VAR_STORE,
3112 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003113 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003114 com_addop_varname(c, VAR_STORE,
3115 STR(CHILD(CHILD(subn, 0),
3116 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003117 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003118 }
3119 }
3120}
3121
3122static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003123com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003124{
3125 REQ(n, exec_stmt);
3126 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3127 com_node(c, CHILD(n, 1));
3128 if (NCH(n) >= 4)
3129 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003130 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003131 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003132 com_push(c, 1);
3133 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003134 if (NCH(n) >= 6)
3135 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003136 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003137 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003138 com_push(c, 1);
3139 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003140 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003141 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003142}
3143
Guido van Rossum7c531111997-03-11 18:42:21 +00003144static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003145is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003146{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003147 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003148 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003149 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003150
3151 /* Label to avoid tail recursion */
3152 next:
3153 switch (TYPE(n)) {
3154
3155 case suite:
3156 if (NCH(n) == 1) {
3157 n = CHILD(n, 0);
3158 goto next;
3159 }
3160 /* Fall through */
3161 case file_input:
3162 for (i = 0; i < NCH(n); i++) {
3163 node *ch = CHILD(n, i);
3164 if (TYPE(ch) == stmt) {
3165 n = ch;
3166 goto next;
3167 }
3168 }
3169 break;
3170
3171 case stmt:
3172 case simple_stmt:
3173 case small_stmt:
3174 n = CHILD(n, 0);
3175 goto next;
3176
3177 case expr_stmt:
3178 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003179 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003180 case test:
3181 case and_test:
3182 case not_test:
3183 case comparison:
3184 case expr:
3185 case xor_expr:
3186 case and_expr:
3187 case shift_expr:
3188 case arith_expr:
3189 case term:
3190 case factor:
3191 case power:
3192 case atom:
3193 if (NCH(n) == 1) {
3194 n = CHILD(n, 0);
3195 goto next;
3196 }
3197 break;
3198
3199 case NAME:
3200 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3201 return 1;
3202 break;
3203
3204 case NUMBER:
3205 v = parsenumber(c, STR(n));
3206 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003207 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003208 break;
3209 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003210 i = PyObject_IsTrue(v);
3211 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003212 return i == 0;
3213
3214 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003215 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003216 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003217 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003218 break;
3219 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003220 i = PyObject_IsTrue(v);
3221 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003222 return i == 0;
3223
3224 }
3225 return 0;
3226}
3227
Tim Peters08a898f2001-06-28 01:52:22 +00003228
3229/* Look under n for a return stmt with an expression.
3230 * This hack is used to find illegal returns under "if 0:" blocks in
3231 * functions already known to be generators (as determined by the symtable
3232 * pass).
3233 * Return the offending return node if found, else NULL.
3234 */
3235static node *
3236look_for_offending_return(node *n)
3237{
3238 int i;
3239
3240 for (i = 0; i < NCH(n); ++i) {
3241 node *kid = CHILD(n, i);
3242
3243 switch (TYPE(kid)) {
3244 case classdef:
3245 case funcdef:
3246 case lambdef:
3247 /* Stuff in nested functions & classes doesn't
3248 affect the code block we started in. */
3249 return NULL;
3250
3251 case return_stmt:
3252 if (NCH(kid) > 1)
3253 return kid;
3254 break;
3255
3256 default: {
3257 node *bad = look_for_offending_return(kid);
3258 if (bad != NULL)
3259 return bad;
3260 }
3261 }
3262 }
3263
3264 return NULL;
3265}
3266
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003267static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003268com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003269{
3270 int i;
3271 int anchor = 0;
3272 REQ(n, if_stmt);
3273 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3274 for (i = 0; i+3 < NCH(n); i+=4) {
3275 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003276 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003277 if (is_constant_false(c, ch)) {
3278 /* We're going to skip this block. However, if this
3279 is a generator, we have to check the dead code
3280 anyway to make sure there aren't any return stmts
3281 with expressions, in the same scope. */
3282 if (c->c_flags & CO_GENERATOR) {
3283 node *p = look_for_offending_return(n);
3284 if (p != NULL) {
3285 int savelineno = c->c_lineno;
3286 c->c_lineno = p->n_lineno;
3287 com_error(c, PyExc_SyntaxError,
3288 "'return' with argument "
3289 "inside generator");
3290 c->c_lineno = savelineno;
3291 }
3292 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003293 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003294 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003295 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003296 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003297 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003298 com_addfwref(c, JUMP_IF_FALSE, &a);
3299 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003300 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003301 com_node(c, CHILD(n, i+3));
3302 com_addfwref(c, JUMP_FORWARD, &anchor);
3303 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003304 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003305 com_addbyte(c, POP_TOP);
3306 }
3307 if (i+2 < NCH(n))
3308 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003309 if (anchor)
3310 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003311}
3312
3313static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003314com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003315{
3316 int break_anchor = 0;
3317 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003318 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003319 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3320 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003321 block_push(c, SETUP_LOOP);
3322 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003323 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003324 com_node(c, CHILD(n, 1));
3325 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3326 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003327 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003328 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003329 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003330 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003331 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3332 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003333 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003334 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003335 com_addbyte(c, POP_TOP);
3336 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003337 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003338 if (NCH(n) > 4)
3339 com_node(c, CHILD(n, 6));
3340 com_backpatch(c, break_anchor);
3341}
3342
3343static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003344com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003345{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003346 int break_anchor = 0;
3347 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003348 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003349 REQ(n, for_stmt);
3350 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3351 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003352 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003353 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003354 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003355 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003356 com_set_lineno(c, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003357 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003358 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003359 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003360 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003361 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003362 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003363 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3364 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003365 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003366 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003367 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003368 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003369 if (NCH(n) > 8)
3370 com_node(c, CHILD(n, 8));
3371 com_backpatch(c, break_anchor);
3372}
3373
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003374/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003375
3376 SETUP_FINALLY L
3377 <code for S>
3378 POP_BLOCK
3379 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003380 L: <code for Sf>
3381 END_FINALLY
3382
3383 The special instructions use the block stack. Each block
3384 stack entry contains the instruction that created it (here
3385 SETUP_FINALLY), the level of the value stack at the time the
3386 block stack entry was created, and a label (here L).
3387
3388 SETUP_FINALLY:
3389 Pushes the current value stack level and the label
3390 onto the block stack.
3391 POP_BLOCK:
3392 Pops en entry from the block stack, and pops the value
3393 stack until its level is the same as indicated on the
3394 block stack. (The label is ignored.)
3395 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003396 Pops a variable number of entries from the *value* stack
3397 and re-raises the exception they specify. The number of
3398 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003399
3400 The block stack is unwound when an exception is raised:
3401 when a SETUP_FINALLY entry is found, the exception is pushed
3402 onto the value stack (and the exception condition is cleared),
3403 and the interpreter jumps to the label gotten from the block
3404 stack.
3405
3406 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003407 (The contents of the value stack is shown in [], with the top
3408 at the right; 'tb' is trace-back info, 'val' the exception's
3409 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003410
3411 Value stack Label Instruction Argument
3412 [] SETUP_EXCEPT L1
3413 [] <code for S>
3414 [] POP_BLOCK
3415 [] JUMP_FORWARD L0
3416
Guido van Rossum3f5da241990-12-20 15:06:42 +00003417 [tb, val, exc] L1: DUP )
3418 [tb, val, exc, exc] <evaluate E1> )
3419 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3420 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3421 [tb, val, exc, 1] POP )
3422 [tb, val, exc] POP
3423 [tb, val] <assign to V1> (or POP if no V1)
3424 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003425 [] <code for S1>
3426 JUMP_FORWARD L0
3427
Guido van Rossum3f5da241990-12-20 15:06:42 +00003428 [tb, val, exc, 0] L2: POP
3429 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003430 .............................etc.......................
3431
Guido van Rossum3f5da241990-12-20 15:06:42 +00003432 [tb, val, exc, 0] Ln+1: POP
3433 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003434
3435 [] L0: <next statement>
3436
3437 Of course, parts are not generated if Vi or Ei is not present.
3438*/
3439
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003440static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003441com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003442{
3443 int except_anchor = 0;
3444 int end_anchor = 0;
3445 int else_anchor = 0;
3446 int i;
3447 node *ch;
3448
3449 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3450 block_push(c, SETUP_EXCEPT);
3451 com_node(c, CHILD(n, 2));
3452 com_addbyte(c, POP_BLOCK);
3453 block_pop(c, SETUP_EXCEPT);
3454 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3455 com_backpatch(c, except_anchor);
3456 for (i = 3;
3457 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3458 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003459 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003460 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003461 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003462 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003463 break;
3464 }
3465 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003466 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003467 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003468 if (NCH(ch) > 1) {
3469 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003470 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003471 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003472 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003473 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003474 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3475 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003476 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003477 }
3478 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003479 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003480 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003481 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003482 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003483 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003484 com_pop(c, 1);
3485 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003486 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003487 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003488 com_node(c, CHILD(n, i+2));
3489 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3490 if (except_anchor) {
3491 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003492 /* We come in with [tb, val, exc, 0] on the
3493 stack; one pop and it's the same as
3494 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003495 com_addbyte(c, POP_TOP);
3496 }
3497 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003498 /* We actually come in here with [tb, val, exc] but the
3499 END_FINALLY will zap those and jump around.
3500 The c_stacklevel does not reflect them so we need not pop
3501 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003502 com_addbyte(c, END_FINALLY);
3503 com_backpatch(c, else_anchor);
3504 if (i < NCH(n))
3505 com_node(c, CHILD(n, i+2));
3506 com_backpatch(c, end_anchor);
3507}
3508
3509static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003510com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003511{
3512 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003513 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003514
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003515 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3516 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003517 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003518 com_addbyte(c, POP_BLOCK);
3519 block_pop(c, SETUP_FINALLY);
3520 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003521 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003522 /* While the generated code pushes only one item,
3523 the try-finally handling can enter here with
3524 up to three items. OK, here are the details:
3525 3 for an exception, 2 for RETURN, 1 for BREAK. */
3526 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003527 com_backpatch(c, finally_anchor);
3528 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003529 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003530 com_node(c, ch);
3531 com_addbyte(c, END_FINALLY);
3532 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003533 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003534}
3535
3536static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003537com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003538{
3539 REQ(n, try_stmt);
3540 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3541 | 'try' ':' suite 'finally' ':' suite */
3542 if (TYPE(CHILD(n, 3)) != except_clause)
3543 com_try_finally(c, n);
3544 else
3545 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003546}
3547
Guido van Rossum8b993a91997-01-17 21:04:03 +00003548static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003549get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003550{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003551 int i;
3552
Guido van Rossum8b993a91997-01-17 21:04:03 +00003553 /* Label to avoid tail recursion */
3554 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003555 switch (TYPE(n)) {
3556
3557 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003558 if (NCH(n) == 1) {
3559 n = CHILD(n, 0);
3560 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003561 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003562 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003563 case file_input:
3564 for (i = 0; i < NCH(n); i++) {
3565 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003566 if (TYPE(ch) == stmt) {
3567 n = ch;
3568 goto next;
3569 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003570 }
3571 break;
3572
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003573 case stmt:
3574 case simple_stmt:
3575 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003576 n = CHILD(n, 0);
3577 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003578
3579 case expr_stmt:
3580 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003581 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003582 case test:
3583 case and_test:
3584 case not_test:
3585 case comparison:
3586 case expr:
3587 case xor_expr:
3588 case and_expr:
3589 case shift_expr:
3590 case arith_expr:
3591 case term:
3592 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003593 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003594 if (NCH(n) == 1) {
3595 n = CHILD(n, 0);
3596 goto next;
3597 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003598 break;
3599
3600 case atom:
3601 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003602 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003603 break;
3604
3605 }
3606 return NULL;
3607}
3608
Guido van Rossum79f25d91997-04-29 20:08:16 +00003609static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003610get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003611{
Guido van Rossum541563e1999-01-28 15:08:09 +00003612 /* Don't generate doc-strings if run with -OO */
3613 if (Py_OptimizeFlag > 1)
3614 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003615 n = get_rawdocstring(n);
3616 if (n == NULL)
3617 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003618 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003619}
3620
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003621static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003622com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003623{
3624 REQ(n, suite);
3625 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3626 if (NCH(n) == 1) {
3627 com_node(c, CHILD(n, 0));
3628 }
3629 else {
3630 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003631 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003632 node *ch = CHILD(n, i);
3633 if (TYPE(ch) == stmt)
3634 com_node(c, ch);
3635 }
3636 }
3637}
3638
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003639/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003640static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003641com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003642{
3643 int i = c->c_nblocks;
3644 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3645 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3646 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003647 else if (i <= 0) {
3648 /* at the outer level */
3649 com_error(c, PyExc_SyntaxError,
3650 "'continue' not properly in loop");
3651 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003652 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003653 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003654 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003655 if (c->c_block[j] == SETUP_LOOP)
3656 break;
3657 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003658 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003659 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003660 for (; i > j; --i) {
3661 if (c->c_block[i] == SETUP_EXCEPT ||
3662 c->c_block[i] == SETUP_FINALLY) {
3663 com_addoparg(c, CONTINUE_LOOP,
3664 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003665 return;
3666 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003667 if (c->c_block[i] == END_FINALLY) {
3668 com_error(c, PyExc_SyntaxError,
3669 "'continue' not supported inside 'finally' clause");
3670 return;
3671 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003672 }
3673 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003674 com_error(c, PyExc_SyntaxError,
3675 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003676 }
3677 /* XXX Could allow it inside a 'finally' clause
3678 XXX if we could pop the exception still on the stack */
3679}
3680
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003681static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003682com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003683{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003684 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003685 if (TYPE(n) == lambdef) {
3686 /* lambdef: 'lambda' [varargslist] ':' test */
3687 n = CHILD(n, 1);
3688 }
3689 else {
3690 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3691 n = CHILD(n, 2);
3692 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3693 n = CHILD(n, 1);
3694 }
3695 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003696 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003697 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003698 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003699 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3700 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003701 nargs = 0;
3702 ndefs = 0;
3703 for (i = 0; i < nch; i++) {
3704 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003705 if (TYPE(CHILD(n, i)) == STAR ||
3706 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003707 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003708 nargs++;
3709 i++;
3710 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003711 t = RPAR; /* Anything except EQUAL or COMMA */
3712 else
3713 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003714 if (t == EQUAL) {
3715 i++;
3716 ndefs++;
3717 com_node(c, CHILD(n, i));
3718 i++;
3719 if (i >= nch)
3720 break;
3721 t = TYPE(CHILD(n, i));
3722 }
3723 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003724 /* Treat "(a=1, b)" as an error */
3725 if (ndefs)
3726 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003727 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003728 }
3729 if (t != COMMA)
3730 break;
3731 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003732 return ndefs;
3733}
3734
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003735static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003736com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003737{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003738 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003739 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003740 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003741 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003742 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3743 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003744 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003745 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003746 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003747 c->c_errors++;
3748 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003749 int closure = com_make_closure(c, (PyCodeObject *)co);
3750 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003751 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003752 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003753 if (closure)
3754 com_addoparg(c, MAKE_CLOSURE, ndefs);
3755 else
3756 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003757 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003758 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003759 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003760 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003761 }
3762}
3763
3764static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003765com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003766{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003767 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003768 REQ(n, testlist);
3769 /* testlist: test (',' test)* [','] */
3770 for (i = 0; i < NCH(n); i += 2)
3771 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003772 i = (NCH(n)+1) / 2;
3773 com_addoparg(c, BUILD_TUPLE, i);
3774 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003775}
3776
3777static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003778com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003779{
Guido van Rossum25831651993-05-19 14:50:45 +00003780 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003781 PyObject *v;
3782 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003783 char *name;
3784
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003785 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003786 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003787 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003788 c->c_errors++;
3789 return;
3790 }
3791 /* Push the class name on the stack */
3792 i = com_addconst(c, v);
3793 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003794 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003795 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003796 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003797 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003798 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003799 com_push(c, 1);
3800 }
Guido van Rossum25831651993-05-19 14:50:45 +00003801 else
3802 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003803 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003804 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003805 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003806 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003807 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003808 c->c_errors++;
3809 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003810 int closure = com_make_closure(c, co);
3811 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003812 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003813 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003814 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003815 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003816 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003817 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003818 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003819 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003820 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003821 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003822 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003823 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003824 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003825 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003826}
3827
3828static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003829com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003830{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003831 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003832 if (c->c_errors)
3833 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003834 switch (TYPE(n)) {
3835
3836 /* Definition nodes */
3837
3838 case funcdef:
3839 com_funcdef(c, n);
3840 break;
3841 case classdef:
3842 com_classdef(c, n);
3843 break;
3844
3845 /* Trivial parse tree nodes */
3846
3847 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003848 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003849 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003850 n = CHILD(n, 0);
3851 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003852
3853 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003854 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003855 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003856 {
3857 int i;
3858 for (i = 0; i < NCH(n)-1; i += 2)
3859 com_node(c, CHILD(n, i));
3860 }
3861 break;
3862
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003863 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003864 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003865 n = CHILD(n, 0);
3866 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003867
3868 /* Statement nodes */
3869
3870 case expr_stmt:
3871 com_expr_stmt(c, n);
3872 break;
3873 case print_stmt:
3874 com_print_stmt(c, n);
3875 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003876 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003877 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003878 break;
3879 case pass_stmt:
3880 break;
3881 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003882 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003883 com_error(c, PyExc_SyntaxError,
3884 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003885 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003886 com_addbyte(c, BREAK_LOOP);
3887 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003888 case continue_stmt:
3889 com_continue_stmt(c, n);
3890 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003891 case return_stmt:
3892 com_return_stmt(c, n);
3893 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003894 case yield_stmt:
3895 com_yield_stmt(c, n);
3896 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003897 case raise_stmt:
3898 com_raise_stmt(c, n);
3899 break;
3900 case import_stmt:
3901 com_import_stmt(c, n);
3902 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003903 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003904 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003905 case exec_stmt:
3906 com_exec_stmt(c, n);
3907 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003908 case assert_stmt:
3909 com_assert_stmt(c, n);
3910 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003911 case if_stmt:
3912 com_if_stmt(c, n);
3913 break;
3914 case while_stmt:
3915 com_while_stmt(c, n);
3916 break;
3917 case for_stmt:
3918 com_for_stmt(c, n);
3919 break;
3920 case try_stmt:
3921 com_try_stmt(c, n);
3922 break;
3923 case suite:
3924 com_suite(c, n);
3925 break;
3926
3927 /* Expression nodes */
3928
3929 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003930 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00003931 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003932 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003933 break;
3934 case test:
3935 com_test(c, n);
3936 break;
3937 case and_test:
3938 com_and_test(c, n);
3939 break;
3940 case not_test:
3941 com_not_test(c, n);
3942 break;
3943 case comparison:
3944 com_comparison(c, n);
3945 break;
3946 case exprlist:
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 expr:
3950 com_expr(c, n);
3951 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003952 case xor_expr:
3953 com_xor_expr(c, n);
3954 break;
3955 case and_expr:
3956 com_and_expr(c, n);
3957 break;
3958 case shift_expr:
3959 com_shift_expr(c, n);
3960 break;
3961 case arith_expr:
3962 com_arith_expr(c, n);
3963 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003964 case term:
3965 com_term(c, n);
3966 break;
3967 case factor:
3968 com_factor(c, n);
3969 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003970 case power:
3971 com_power(c, n);
3972 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003973 case atom:
3974 com_atom(c, n);
3975 break;
3976
3977 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003978 com_error(c, PyExc_SystemError,
3979 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003980 }
3981}
3982
Tim Petersdbd9ba62000-07-09 03:09:57 +00003983static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003984
3985static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003986com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003987{
3988 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3989 if (TYPE(CHILD(n, 0)) == LPAR)
3990 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003991 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003992 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003993 com_pop(c, 1);
3994 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003995}
3996
3997static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003998com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003999{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004000 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004001 if (NCH(n) == 1) {
4002 com_fpdef(c, CHILD(n, 0));
4003 }
4004 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004005 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004006 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004007 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004008 for (i = 0; i < NCH(n); i += 2)
4009 com_fpdef(c, CHILD(n, i));
4010 }
4011}
4012
4013static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004014com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004015{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004016 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004017 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004018 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004019 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004020 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004021 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004022 nch = NCH(n);
4023 /* Enter all arguments in table of locals */
4024 for (i = 0, narg = 0; i < nch; i++) {
4025 node *ch = CHILD(n, i);
4026 node *fp;
4027 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004028 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004029 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4030 fp = CHILD(ch, 0);
4031 if (TYPE(fp) != NAME) {
4032 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4033 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004034 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004035 narg++;
4036 /* all name updates handled by symtable */
4037 if (++i >= nch)
4038 break;
4039 ch = CHILD(n, i);
4040 if (TYPE(ch) == EQUAL)
4041 i += 2;
4042 else
4043 REQ(ch, COMMA);
4044 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004045 if (complex) {
4046 /* Generate code for complex arguments only after
4047 having counted the simple arguments */
4048 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004049 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004050 node *ch = CHILD(n, i);
4051 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004052 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004053 break;
4054 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4055 fp = CHILD(ch, 0);
4056 if (TYPE(fp) != NAME) {
4057 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004058 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004059 com_fpdef(c, ch);
4060 }
4061 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004062 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004063 break;
4064 ch = CHILD(n, i);
4065 if (TYPE(ch) == EQUAL)
4066 i += 2;
4067 else
4068 REQ(ch, COMMA);
4069 }
4070 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004071}
4072
4073static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004074com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004075{
4076 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004077 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004078 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004079 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004080 if (doc != NULL) {
4081 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004082 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004083 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004084 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004085 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004086 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004087 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004088 for (i = 0; i < NCH(n); i++) {
4089 node *ch = CHILD(n, i);
4090 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4091 com_node(c, ch);
4092 }
4093}
4094
4095/* Top-level compile-node interface */
4096
4097static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004098compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004099{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004100 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004101 node *ch;
4102 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00004103 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004104 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004105 if (doc != NULL) {
4106 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004107 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004108 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004109 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004110 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004111 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
4112 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004113 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004114 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004115 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004116 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004117 c->c_infunction = 0;
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004118 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4119 com_push(c, 1);
4120 com_addbyte(c, RETURN_VALUE);
4121 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004122}
4123
4124static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004125compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004126{
Guido van Rossum590baa41993-11-30 13:40:46 +00004127 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004128 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004129 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004130
4131 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004132 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004133 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004134 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004135 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004136 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004137 else
4138 ch = CHILD(n, 2);
4139 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004140 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004141 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004142}
4143
4144static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004145compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004146{
4147 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004148 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004149 REQ(n, classdef);
4150 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4151 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004152 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004153 /* Initialize local __module__ from global __name__ */
4154 com_addop_name(c, LOAD_GLOBAL, "__name__");
4155 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004156 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004157 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004158 if (doc != NULL) {
4159 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004160 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004161 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004162 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004163 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004164 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004165 }
4166 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004167 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004168 com_node(c, ch);
4169 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004170 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004171 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004172 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004173}
4174
4175static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004176compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004177{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004178 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004179
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004180 switch (TYPE(n)) {
4181
Guido van Rossum4c417781991-01-21 16:09:22 +00004182 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004183 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004184 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004185 n = CHILD(n, 0);
4186 if (TYPE(n) != NEWLINE)
4187 com_node(c, n);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004188 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4189 com_push(c, 1);
4190 com_addbyte(c, RETURN_VALUE);
4191 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004192 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004193 break;
4194
Guido van Rossum4c417781991-01-21 16:09:22 +00004195 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004196 com_file_input(c, n);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004197 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4198 com_push(c, 1);
4199 com_addbyte(c, RETURN_VALUE);
4200 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004201 break;
4202
Guido van Rossum590baa41993-11-30 13:40:46 +00004203 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004204 com_node(c, CHILD(n, 0));
4205 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004206 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004207 break;
4208
Guido van Rossum590baa41993-11-30 13:40:46 +00004209 case lambdef: /* anonymous function definition */
4210 compile_lambdef(c, n);
4211 break;
4212
Guido van Rossum4c417781991-01-21 16:09:22 +00004213 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004214 compile_funcdef(c, n);
4215 break;
4216
Guido van Rossum4c417781991-01-21 16:09:22 +00004217 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004218 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004219 break;
4220
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004221 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004222 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004223 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004224 }
4225}
4226
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004227static PyObject *
4228dict_keys_inorder(PyObject *dict, int offset)
4229{
4230 PyObject *tuple, *k, *v;
4231 int i, pos = 0, size = PyDict_Size(dict);
4232
4233 tuple = PyTuple_New(size);
4234 if (tuple == NULL)
4235 return NULL;
4236 while (PyDict_Next(dict, &pos, &k, &v)) {
4237 i = PyInt_AS_LONG(v);
4238 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004239 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004240 PyTuple_SET_ITEM(tuple, i - offset, k);
4241 }
4242 return tuple;
4243}
4244
Guido van Rossum79f25d91997-04-29 20:08:16 +00004245PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004246PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004247{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004248 return PyNode_CompileFlags(n, filename, NULL);
4249}
4250
4251PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004252PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004253{
4254 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004255}
4256
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004257struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004258PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004259{
4260 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004261 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004262
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004263 ff = PyNode_Future(n, filename);
4264 if (ff == NULL)
4265 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004266
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004267 st = symtable_init();
Tim Peters8c5e4152001-11-04 19:26:58 +00004268 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004269 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004270 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004271 }
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004272 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004273 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004274 if (st->st_errors > 0)
4275 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004276 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004277 if (st->st_errors > 0)
4278 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004279
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004280 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004281 fail:
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004282 PyObject_FREE((void *)ff);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004283 st->st_future = NULL;
4284 PySymtable_Free(st);
4285 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004286}
4287
Guido van Rossum79f25d91997-04-29 20:08:16 +00004288static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004289icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004290{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004291 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004292}
4293
Guido van Rossum79f25d91997-04-29 20:08:16 +00004294static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004295jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004296 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004297{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004298 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004299 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004300 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004301 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004302 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4303 sc.c_encoding = "utf-8";
4304 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004305 sc.c_encoding = STR(n);
4306 n = CHILD(n, 0);
4307 } else {
4308 sc.c_encoding = NULL;
4309 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004310 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004311 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004312 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004313 /* c_symtable still points to parent's symbols */
4314 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004315 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004316 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004317 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004318 if (base->c_encoding != NULL) {
4319 assert(sc.c_encoding == NULL);
4320 sc.c_encoding = base->c_encoding;
4321 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004322 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004323 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004324 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004325 if (sc.c_future == NULL) {
4326 com_free(&sc);
4327 return NULL;
4328 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004329 if (flags) {
4330 int merged = sc.c_future->ff_features |
4331 flags->cf_flags;
4332 sc.c_future->ff_features = merged;
4333 flags->cf_flags = merged;
4334 }
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004335 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004336 com_free(&sc);
4337 return NULL;
4338 }
4339 }
4340 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004341 if (symtable_load_symbols(&sc) < 0) {
4342 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004343 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004344 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004345 compile_node(&sc, n);
4346 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004347 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004348 PyObject *consts, *names, *varnames, *filename, *name,
4349 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004350 consts = PyList_AsTuple(sc.c_consts);
4351 names = PyList_AsTuple(sc.c_names);
4352 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004353 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4354 freevars = dict_keys_inorder(sc.c_freevars,
4355 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004356 filename = PyString_InternFromString(sc.c_filename);
4357 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004358 if (!PyErr_Occurred())
4359 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004360 sc.c_nlocals,
4361 sc.c_maxstacklevel,
4362 sc.c_flags,
4363 sc.c_code,
4364 consts,
4365 names,
4366 varnames,
4367 freevars,
4368 cellvars,
4369 filename,
4370 name,
4371 sc.c_firstlineno,
4372 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004373 Py_XDECREF(consts);
4374 Py_XDECREF(names);
4375 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004376 Py_XDECREF(freevars);
4377 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004378 Py_XDECREF(filename);
4379 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004380 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004381 else if (!PyErr_Occurred()) {
4382 /* This could happen if someone called PyErr_Clear() after an
4383 error was reported above. That's not supposed to happen,
4384 but I just plugged one case and I'm not sure there can't be
4385 others. In that case, raise SystemError so that at least
4386 it gets reported instead dumping core. */
4387 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4388 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004389 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004390 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004391 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004392 sc.c_symtable = NULL;
4393 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004394 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004395 return co;
4396}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004397
4398int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004399PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004400{
4401 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004402 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004403 int line = co->co_firstlineno;
4404 int addr = 0;
4405 while (--size >= 0) {
4406 addr += *p++;
4407 if (addr > addrq)
4408 break;
4409 line += *p++;
4410 }
4411 return line;
4412}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004413
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004414/* The test for LOCAL must come before the test for FREE in order to
4415 handle classes where name is both local and free. The local var is
4416 a method and the free var is a free var referenced within a method.
4417*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004418
4419static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004420get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004421{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004422 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004423 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004424
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004425 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4426 return CELL;
4427 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4428 return LOCAL;
4429 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4430 return FREE;
4431 v = PyDict_GetItemString(c->c_globals, name);
4432 if (v) {
4433 if (v == Py_None)
4434 return GLOBAL_EXPLICIT;
4435 else {
4436 return GLOBAL_IMPLICIT;
4437 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004438 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004439 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004440 "unknown scope for %.100s in %.100s(%s) "
4441 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4442 name, c->c_name,
4443 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4444 c->c_filename,
4445 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4446 PyObject_REPR(c->c_locals),
4447 PyObject_REPR(c->c_globals)
4448 );
4449
4450 Py_FatalError(buf);
4451 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004452}
4453
Guido van Rossum207fda62001-03-02 03:30:41 +00004454/* Helper functions to issue warnings */
4455
4456static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004457issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004458{
4459 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4460 lineno, NULL, NULL) < 0) {
4461 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4462 PyErr_SetString(PyExc_SyntaxError, msg);
4463 PyErr_SyntaxLocation(filename, lineno);
4464 }
4465 return -1;
4466 }
4467 return 0;
4468}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004469
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004470static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004471symtable_warn(struct symtable *st, char *msg)
4472{
Guido van Rossum207fda62001-03-02 03:30:41 +00004473 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004474 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004475 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004476 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004477 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004478}
4479
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004480/* Helper function for setting lineno and filename */
4481
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004482static int
4483symtable_build(struct compiling *c, node *n)
4484{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004485 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004486 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004487 c->c_symtable->st_future = c->c_future;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004488 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004489 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4490 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004491 return -1;
4492 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004493 if (c->c_symtable->st_errors > 0)
4494 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004495 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004496 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004497 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004498 return 0;
4499}
4500
4501static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004502symtable_init_compiling_symbols(struct compiling *c)
4503{
4504 PyObject *varnames;
4505
4506 varnames = c->c_symtable->st_cur->ste_varnames;
4507 if (varnames == NULL) {
4508 varnames = PyList_New(0);
4509 if (varnames == NULL)
4510 return -1;
4511 c->c_symtable->st_cur->ste_varnames = varnames;
4512 Py_INCREF(varnames);
4513 } else
4514 Py_INCREF(varnames);
4515 c->c_varnames = varnames;
4516
4517 c->c_globals = PyDict_New();
4518 if (c->c_globals == NULL)
4519 return -1;
4520 c->c_freevars = PyDict_New();
4521 if (c->c_freevars == NULL)
4522 return -1;
4523 c->c_cellvars = PyDict_New();
4524 if (c->c_cellvars == NULL)
4525 return -1;
4526 return 0;
4527}
4528
4529struct symbol_info {
4530 int si_nlocals;
4531 int si_ncells;
4532 int si_nfrees;
4533 int si_nimplicit;
4534};
4535
4536static void
4537symtable_init_info(struct symbol_info *si)
4538{
4539 si->si_nlocals = 0;
4540 si->si_ncells = 0;
4541 si->si_nfrees = 0;
4542 si->si_nimplicit = 0;
4543}
4544
4545static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004546symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004547 struct symbol_info *si)
4548{
4549 PyObject *dict, *v;
4550
4551 /* Seperate logic for DEF_FREE. If it occurs in a function,
4552 it indicates a local that we must allocate storage for (a
4553 cell var). If it occurs in a class, then the class has a
4554 method and a free variable with the same name.
4555 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004556 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004557 /* If it isn't declared locally, it can't be a cell. */
4558 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4559 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004560 v = PyInt_FromLong(si->si_ncells++);
4561 dict = c->c_cellvars;
4562 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004563 /* If it is free anyway, then there is no need to do
4564 anything here.
4565 */
4566 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004567 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004568 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004569 v = PyInt_FromLong(si->si_nfrees++);
4570 dict = c->c_freevars;
4571 }
4572 if (v == NULL)
4573 return -1;
4574 if (PyDict_SetItem(dict, name, v) < 0) {
4575 Py_DECREF(v);
4576 return -1;
4577 }
4578 Py_DECREF(v);
4579 return 0;
4580}
4581
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004582/* If a variable is a cell and an argument, make sure that appears in
4583 co_cellvars before any variable to its right in varnames.
4584*/
4585
4586
4587static int
4588symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4589 PyObject *varnames, int flags)
4590{
Tim Petersb39903b2003-03-24 17:22:24 +00004591 PyObject *v = NULL;
4592 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004593 int i, pos;
4594
4595 if (flags & CO_VARARGS)
4596 argcount++;
4597 if (flags & CO_VARKEYWORDS)
4598 argcount++;
4599 for (i = argcount; --i >= 0; ) {
4600 v = PyList_GET_ITEM(varnames, i);
4601 if (PyDict_GetItem(*cellvars, v)) {
4602 if (list == NULL) {
4603 list = PyList_New(1);
4604 if (list == NULL)
4605 return -1;
4606 PyList_SET_ITEM(list, 0, v);
4607 Py_INCREF(v);
4608 } else
4609 PyList_Insert(list, 0, v);
4610 }
4611 }
4612 if (list == NULL || PyList_GET_SIZE(list) == 0)
4613 return 0;
4614 /* There are cellvars that are also arguments. Create a dict
4615 to replace cellvars and put the args at the front.
4616 */
4617 d = PyDict_New();
4618 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4619 v = PyInt_FromLong(i);
4620 if (v == NULL)
4621 goto fail;
4622 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4623 goto fail;
4624 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4625 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00004626 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004627 }
4628 pos = 0;
4629 i = PyList_GET_SIZE(list);
4630 Py_DECREF(list);
4631 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4632 w = PyInt_FromLong(i++); /* don't care about the old key */
4633 if (PyDict_SetItem(d, v, w) < 0) {
4634 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00004635 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004636 goto fail;
4637 }
4638 Py_DECREF(w);
4639 }
4640 Py_DECREF(*cellvars);
4641 *cellvars = d;
4642 return 1;
4643 fail:
4644 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00004645 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004646 return -1;
4647}
4648
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004649static int
4650symtable_freevar_offsets(PyObject *freevars, int offset)
4651{
4652 PyObject *name, *v;
4653 int pos;
4654
4655 /* The cell vars are the first elements of the closure,
4656 followed by the free vars. Update the offsets in
4657 c_freevars to account for number of cellvars. */
4658 pos = 0;
4659 while (PyDict_Next(freevars, &pos, &name, &v)) {
4660 int i = PyInt_AS_LONG(v) + offset;
4661 PyObject *o = PyInt_FromLong(i);
4662 if (o == NULL)
4663 return -1;
4664 if (PyDict_SetItem(freevars, name, o) < 0) {
4665 Py_DECREF(o);
4666 return -1;
4667 }
4668 Py_DECREF(o);
4669 }
4670 return 0;
4671}
4672
4673static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004674symtable_check_unoptimized(struct compiling *c,
4675 PySymtableEntryObject *ste,
4676 struct symbol_info *si)
4677{
4678 char buf[300];
4679
4680 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4681 || (ste->ste_nested && si->si_nimplicit)))
4682 return 0;
4683
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004684#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4685
4686#define ILLEGAL_IS "is a nested function"
4687
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004688#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004689"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004690
4691#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004692"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004693
4694#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00004695"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004696"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004697
4698 /* XXX perhaps the linenos for these opt-breaking statements
4699 should be stored so the exception can point to them. */
4700
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004701 if (ste->ste_child_free) {
4702 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004703 PyOS_snprintf(buf, sizeof(buf),
4704 ILLEGAL_IMPORT_STAR,
4705 PyString_AS_STRING(ste->ste_name),
4706 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004707 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004708 PyOS_snprintf(buf, sizeof(buf),
4709 ILLEGAL_BARE_EXEC,
4710 PyString_AS_STRING(ste->ste_name),
4711 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004712 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004713 PyOS_snprintf(buf, sizeof(buf),
4714 ILLEGAL_EXEC_AND_IMPORT_STAR,
4715 PyString_AS_STRING(ste->ste_name),
4716 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004717 }
4718 } else {
4719 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004720 PyOS_snprintf(buf, sizeof(buf),
4721 ILLEGAL_IMPORT_STAR,
4722 PyString_AS_STRING(ste->ste_name),
4723 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004724 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004725 PyOS_snprintf(buf, sizeof(buf),
4726 ILLEGAL_BARE_EXEC,
4727 PyString_AS_STRING(ste->ste_name),
4728 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004729 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004730 PyOS_snprintf(buf, sizeof(buf),
4731 ILLEGAL_EXEC_AND_IMPORT_STAR,
4732 PyString_AS_STRING(ste->ste_name),
4733 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004734 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004735 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004736
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004737 PyErr_SetString(PyExc_SyntaxError, buf);
4738 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4739 ste->ste_opt_lineno);
4740 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004741}
4742
4743static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004744symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4745 struct symbol_info *si)
4746{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004747 if (c->c_future)
4748 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004749 if (ste->ste_generator)
4750 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004751 if (ste->ste_type != TYPE_MODULE)
4752 c->c_flags |= CO_NEWLOCALS;
4753 if (ste->ste_type == TYPE_FUNCTION) {
4754 c->c_nlocals = si->si_nlocals;
4755 if (ste->ste_optimized == 0)
4756 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004757 else if (ste->ste_optimized != OPT_EXEC)
4758 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004759 }
4760 return 0;
4761}
4762
4763static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004764symtable_load_symbols(struct compiling *c)
4765{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004766 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004767 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004768 PyObject *name, *varnames, *v;
4769 int i, flags, pos;
4770 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004771
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004772 v = NULL;
4773
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004774 if (symtable_init_compiling_symbols(c) < 0)
4775 goto fail;
4776 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004777 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004778 si.si_nlocals = PyList_GET_SIZE(varnames);
4779 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004780
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004781 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004782 v = PyInt_FromLong(i);
4783 if (PyDict_SetItem(c->c_locals,
4784 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004785 goto fail;
4786 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004787 }
4788
4789 /* XXX The cases below define the rules for whether a name is
4790 local or global. The logic could probably be clearer. */
4791 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004792 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4793 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004794
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004795 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004796 /* undo the original DEF_FREE */
4797 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004798
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004799 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004800 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004801 2. Free variables in methods that are also class
4802 variables or declared global.
4803 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004804 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004805 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004806
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004807 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004808 c->c_argcount--;
4809 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004810 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004811 c->c_argcount--;
4812 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004813 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004814 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004815 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004816 if (flags & DEF_PARAM) {
4817 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004818 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004819 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004820 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004821 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004822 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004823 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004824 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4825 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004826 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004827 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00004828 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004829 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004830 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004831 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004832 if (v == NULL)
4833 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004834 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004835 goto fail;
4836 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004837 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004838 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004839 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004840 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004841 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004842 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004843 if (v == NULL)
4844 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004845 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004846 goto fail;
4847 Py_DECREF(v);
4848 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004849 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004850 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00004851 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004852 goto fail;
4853 if (st->st_nscopes != 1) {
4854 v = PyInt_FromLong(flags);
4855 if (PyDict_SetItem(st->st_global,
4856 name, v))
4857 goto fail;
4858 Py_DECREF(v);
4859 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004860 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004861 }
4862 }
4863
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004864 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4865
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004866 if (si.si_ncells > 1) { /* one cell is always in order */
4867 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4868 c->c_varnames, c->c_flags) < 0)
4869 return -1;
4870 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004871 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4872 return -1;
4873 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004874 fail:
4875 /* is this always the right thing to do? */
4876 Py_XDECREF(v);
4877 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004878}
4879
4880static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004881symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004882{
4883 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004884
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004885 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004886 if (st == NULL)
4887 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004888 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00004889
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004890 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004891 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004892 goto fail;
4893 if ((st->st_symbols = PyDict_New()) == NULL)
4894 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004895 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004896 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004897 st->st_errors = 0;
4898 st->st_tmpname = 0;
4899 st->st_private = NULL;
4900 return st;
4901 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004902 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004903 return NULL;
4904}
4905
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004906void
4907PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004908{
4909 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004910 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004911 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004912 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004913}
4914
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004915/* When the compiler exits a scope, it must should update the scope's
4916 free variable information with the list of free variables in its
4917 children.
4918
4919 Variables that are free in children and defined in the current
4920 scope are cellvars.
4921
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004922 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004923 false), free variables in children that are not defined here are
4924 implicit globals.
4925
4926*/
4927
4928static int
4929symtable_update_free_vars(struct symtable *st)
4930{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004931 int i, j, def;
4932 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004933 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004934
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004935 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004936 def = DEF_FREE_CLASS;
4937 else
4938 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004939 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004940 int pos = 0;
4941
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004942 if (list)
4943 PyList_SetSlice(list, 0,
4944 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004945 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004946 PyList_GET_ITEM(ste->ste_children, i);
4947 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004948 int flags = PyInt_AS_LONG(o);
4949 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004950 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004951 if (list == NULL) {
4952 list = PyList_New(0);
4953 if (list == NULL)
4954 return -1;
4955 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004956 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004957 if (PyList_Append(list, name) < 0) {
4958 Py_DECREF(list);
4959 return -1;
4960 }
4961 }
4962 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004963 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004964 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004965 v = PyDict_GetItem(ste->ste_symbols, name);
4966 /* If a name N is declared global in scope A and
4967 referenced in scope B contained (perhaps
4968 indirectly) in A and there are no scopes
4969 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004970 is global in B. Unless A is a class scope,
4971 because class scopes are not considered for
4972 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004973 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004974 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004975 int flags = PyInt_AS_LONG(v);
4976 if (flags & DEF_GLOBAL) {
4977 symtable_undo_free(st, child->ste_id,
4978 name);
4979 continue;
4980 }
4981 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004982 if (ste->ste_nested) {
4983 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004984 name, def) < 0) {
4985 Py_DECREF(list);
4986 return -1;
4987 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004988 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004989 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004990 name) < 0) {
4991 Py_DECREF(list);
4992 return -1;
4993 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004994 }
4995 }
4996 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004997
4998 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004999 return 0;
5000}
5001
5002/* If the current scope is a non-nested class or if name is not
5003 defined in the current, non-nested scope, then it is an implicit
5004 global in all nested scopes.
5005*/
5006
5007static int
5008symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5009{
5010 PyObject *o;
5011 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005012 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005013
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005014 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005015 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005016 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005017 if (o == NULL)
5018 return symtable_undo_free(st, child, name);
5019 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005020
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005021 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005022 return symtable_undo_free(st, child, name);
5023 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005024 return symtable_add_def_o(st, ste->ste_symbols,
5025 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005026}
5027
5028static int
5029symtable_undo_free(struct symtable *st, PyObject *id,
5030 PyObject *name)
5031{
5032 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005033 PyObject *info;
5034 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005035
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005036 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5037 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005038 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005039
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005040 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005041 if (info == NULL)
5042 return 0;
5043 v = PyInt_AS_LONG(info);
5044 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005045 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005046 DEF_FREE_GLOBAL) < 0)
5047 return -1;
5048 } else
5049 /* If the name is defined here or declared global,
5050 then the recursion stops. */
5051 return 0;
5052
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005053 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5054 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005055 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005056 PyList_GET_ITEM(ste->ste_children, i);
5057 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005058 if (x < 0)
5059 return x;
5060 }
5061 return 0;
5062}
5063
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005064/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5065 This reference is released when the scope is exited, via the DECREF
5066 in symtable_exit_scope().
5067*/
5068
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005069static int
5070symtable_exit_scope(struct symtable *st)
5071{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005072 int end;
5073
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005074 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005075 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005076 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005077 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005078 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5079 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005080 if (PySequence_DelItem(st->st_stack, end) < 0)
5081 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005082 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005083}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005084
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005085static void
5086symtable_enter_scope(struct symtable *st, char *name, int type,
5087 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005088{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005089 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005090
5091 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005092 prev = st->st_cur;
5093 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
5094 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005095 st->st_errors++;
5096 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005097 }
5098 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005099 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005100 PySymtableEntry_New(st, name, type, lineno);
5101 if (strcmp(name, TOP) == 0)
5102 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005103 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005104 if (PyList_Append(prev->ste_children,
5105 (PyObject *)st->st_cur) < 0)
5106 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005107 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005108}
5109
5110static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005111symtable_lookup(struct symtable *st, char *name)
5112{
5113 char buffer[MANGLE_LEN];
5114 PyObject *v;
5115 int flags;
5116
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005117 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005118 name = buffer;
5119 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5120 if (v == NULL) {
5121 if (PyErr_Occurred())
5122 return -1;
5123 else
5124 return 0;
5125 }
5126
5127 flags = PyInt_AS_LONG(v);
5128 return flags;
5129}
5130
5131static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005132symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005133{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005134 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005135 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005136 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005137
Guido van Rossumb7164622002-08-16 02:48:11 +00005138 /* Warn about None, except inside a tuple (where the assignment
5139 code already issues a warning). */
5140 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5141 *name == 'N' && strcmp(name, "None") == 0)
5142 {
5143 if (symtable_warn(st, "argument named None"))
5144 return -1;
5145 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005146 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005147 name = buffer;
5148 if ((s = PyString_InternFromString(name)) == NULL)
5149 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005150 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5151 Py_DECREF(s);
5152 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005153}
5154
5155/* Must only be called with mangled names */
5156
5157static int
5158symtable_add_def_o(struct symtable *st, PyObject *dict,
5159 PyObject *name, int flag)
5160{
5161 PyObject *o;
5162 int val;
5163
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005164 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005165 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005166 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005167 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005168 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005169 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005170 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005171 return -1;
5172 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005173 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005174 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005175 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005176 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005177 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005178 Py_DECREF(o);
5179 return -1;
5180 }
5181 Py_DECREF(o);
5182
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005183 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005184 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005185 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005186 } else if (flag & DEF_GLOBAL) {
5187 /* XXX need to update DEF_GLOBAL for other flags too;
5188 perhaps only DEF_FREE_GLOBAL */
5189 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005190 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005191 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005192 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005193 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005194 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005195 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005196 Py_DECREF(o);
5197 return -1;
5198 }
5199 Py_DECREF(o);
5200 }
5201 return 0;
5202}
5203
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005204#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005205
Tim Peters08a898f2001-06-28 01:52:22 +00005206/* Look for a yield stmt under n. Return 1 if found, else 0.
5207 This hack is used to look inside "if 0:" blocks (which are normally
5208 ignored) in case those are the only places a yield occurs (so that this
5209 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005210static int
5211look_for_yield(node *n)
5212{
5213 int i;
5214
5215 for (i = 0; i < NCH(n); ++i) {
5216 node *kid = CHILD(n, i);
5217
5218 switch (TYPE(kid)) {
5219
5220 case classdef:
5221 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005222 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005223 /* Stuff in nested functions and classes can't make
5224 the parent a generator. */
5225 return 0;
5226
5227 case yield_stmt:
5228 return 1;
5229
5230 default:
5231 if (look_for_yield(kid))
5232 return 1;
5233 }
5234 }
5235 return 0;
5236}
5237
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005238static void
5239symtable_node(struct symtable *st, node *n)
5240{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005241 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005242
5243 loop:
5244 switch (TYPE(n)) {
5245 case funcdef: {
5246 char *func_name = STR(CHILD(n, 1));
5247 symtable_add_def(st, func_name, DEF_LOCAL);
5248 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005249 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005250 symtable_funcdef(st, n);
5251 symtable_exit_scope(st);
5252 break;
5253 }
5254 case lambdef:
5255 if (NCH(n) == 4)
5256 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005257 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005258 symtable_funcdef(st, n);
5259 symtable_exit_scope(st);
5260 break;
5261 case classdef: {
5262 char *tmp, *class_name = STR(CHILD(n, 1));
5263 symtable_add_def(st, class_name, DEF_LOCAL);
5264 if (TYPE(CHILD(n, 2)) == LPAR) {
5265 node *bases = CHILD(n, 3);
5266 int i;
5267 for (i = 0; i < NCH(bases); i += 2) {
5268 symtable_node(st, CHILD(bases, i));
5269 }
5270 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005271 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005272 tmp = st->st_private;
5273 st->st_private = class_name;
5274 symtable_node(st, CHILD(n, NCH(n) - 1));
5275 st->st_private = tmp;
5276 symtable_exit_scope(st);
5277 break;
5278 }
5279 case if_stmt:
5280 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005281 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5282 if (st->st_cur->ste_generator == 0)
5283 st->st_cur->ste_generator =
5284 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005285 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005286 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005287 symtable_node(st, CHILD(n, i + 1));
5288 symtable_node(st, CHILD(n, i + 3));
5289 }
5290 if (i + 2 < NCH(n))
5291 symtable_node(st, CHILD(n, i + 2));
5292 break;
5293 case global_stmt:
5294 symtable_global(st, n);
5295 break;
5296 case import_stmt:
5297 symtable_import(st, n);
5298 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005299 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005300 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005301 symtable_node(st, CHILD(n, 1));
5302 if (NCH(n) > 2)
5303 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005304 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005305 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005306 st->st_cur->ste_opt_lineno = n->n_lineno;
5307 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005308 if (NCH(n) > 4)
5309 symtable_node(st, CHILD(n, 5));
5310 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005311
5312 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005313 case assert_stmt:
5314 if (Py_OptimizeFlag)
5315 return;
5316 if (NCH(n) == 2) {
5317 n = CHILD(n, 1);
5318 goto loop;
5319 } else {
5320 symtable_node(st, CHILD(n, 1));
5321 n = CHILD(n, 3);
5322 goto loop;
5323 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005324 case except_clause:
5325 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005326 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005327 if (NCH(n) > 1) {
5328 n = CHILD(n, 1);
5329 goto loop;
5330 }
5331 break;
5332 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005333 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005334 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005335 case yield_stmt:
5336 st->st_cur->ste_generator = 1;
5337 n = CHILD(n, 1);
5338 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005339 case expr_stmt:
5340 if (NCH(n) == 1)
5341 n = CHILD(n, 0);
5342 else {
5343 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005344 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005345 symtable_node(st, CHILD(n, 2));
5346 break;
5347 } else {
5348 int i;
5349 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005350 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005351 n = CHILD(n, NCH(n) - 1);
5352 }
5353 }
5354 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005355 case list_iter:
5356 n = CHILD(n, 0);
5357 if (TYPE(n) == list_for) {
5358 st->st_tmpname++;
5359 symtable_list_comprehension(st, n);
5360 st->st_tmpname--;
5361 } else {
5362 REQ(n, list_if);
5363 symtable_node(st, CHILD(n, 1));
5364 if (NCH(n) == 3) {
5365 n = CHILD(n, 2);
5366 goto loop;
5367 }
5368 }
5369 break;
5370 case for_stmt:
5371 symtable_assign(st, CHILD(n, 1), 0);
5372 for (i = 3; i < NCH(n); ++i)
5373 if (TYPE(CHILD(n, i)) >= single_input)
5374 symtable_node(st, CHILD(n, i));
5375 break;
5376 /* The remaining cases fall through to default except in
5377 special circumstances. This requires the individual cases
5378 to be coded with great care, even though they look like
5379 rather innocuous. Each case must double-check TYPE(n).
5380 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005381 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005382 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005383 n = CHILD(n, 2);
5384 goto loop;
5385 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005386 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005387 case listmaker:
5388 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00005389 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005390 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00005391 symtable_node(st, CHILD(n, 0));
5392 st->st_tmpname--;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005393 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005394 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005395 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005396 case atom:
5397 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5398 symtable_add_use(st, STR(CHILD(n, 0)));
5399 break;
5400 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005401 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005402 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005403 /* Walk over every non-token child with a special case
5404 for one child.
5405 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005406 if (NCH(n) == 1) {
5407 n = CHILD(n, 0);
5408 goto loop;
5409 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005410 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005411 if (TYPE(CHILD(n, i)) >= single_input)
5412 symtable_node(st, CHILD(n, i));
5413 }
5414}
5415
5416static void
5417symtable_funcdef(struct symtable *st, node *n)
5418{
5419 node *body;
5420
5421 if (TYPE(n) == lambdef) {
5422 if (NCH(n) == 4)
5423 symtable_params(st, CHILD(n, 1));
5424 } else
5425 symtable_params(st, CHILD(n, 2));
5426 body = CHILD(n, NCH(n) - 1);
5427 symtable_node(st, body);
5428}
5429
5430/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00005431 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005432 which are references in the defining scope. symtable_params()
5433 parses the parameter names, which are defined in the function's
5434 body.
5435
5436 varargslist:
5437 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5438 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5439*/
5440
5441static void
5442symtable_default_args(struct symtable *st, node *n)
5443{
5444 node *c;
5445 int i;
5446
5447 if (TYPE(n) == parameters) {
5448 n = CHILD(n, 1);
5449 if (TYPE(n) == RPAR)
5450 return;
5451 }
5452 REQ(n, varargslist);
5453 for (i = 0; i < NCH(n); i += 2) {
5454 c = CHILD(n, i);
5455 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5456 break;
5457 }
5458 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5459 symtable_node(st, CHILD(n, i));
5460 }
5461}
5462
5463static void
5464symtable_params(struct symtable *st, node *n)
5465{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005466 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00005467 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005468
5469 if (TYPE(n) == parameters) {
5470 n = CHILD(n, 1);
5471 if (TYPE(n) == RPAR)
5472 return;
5473 }
5474 REQ(n, varargslist);
5475 for (i = 0; i < NCH(n); i += 2) {
5476 c = CHILD(n, i);
5477 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5478 ext = 1;
5479 break;
5480 }
5481 if (TYPE(c) == test) {
5482 continue;
5483 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00005484 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005485 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00005486 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005487 char nbuf[30];
5488 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005489 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005490 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005491 }
5492 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005493 if (ext) {
5494 c = CHILD(n, i);
5495 if (TYPE(c) == STAR) {
5496 i++;
5497 symtable_add_def(st, STR(CHILD(n, i)),
5498 DEF_PARAM | DEF_STAR);
5499 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005500 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005501 c = NULL;
5502 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005503 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005504 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005505 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005506 i++;
5507 symtable_add_def(st, STR(CHILD(n, i)),
5508 DEF_PARAM | DEF_DOUBLESTAR);
5509 }
5510 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005511 if (complex >= 0) {
5512 int j;
5513 for (j = 0; j <= complex; j++) {
5514 c = CHILD(n, j);
5515 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005516 c = CHILD(n, ++j);
5517 else if (TYPE(c) == EQUAL)
5518 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005519 if (TYPE(CHILD(c, 0)) == LPAR)
5520 symtable_params_fplist(st, CHILD(c, 1));
5521 }
5522 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005523}
5524
5525static void
5526symtable_params_fplist(struct symtable *st, node *n)
5527{
5528 int i;
5529 node *c;
5530
5531 REQ(n, fplist);
5532 for (i = 0; i < NCH(n); i += 2) {
5533 c = CHILD(n, i);
5534 REQ(c, fpdef);
5535 if (NCH(c) == 1)
5536 symtable_add_def(st, STR(CHILD(c, 0)),
5537 DEF_PARAM | DEF_INTUPLE);
5538 else
5539 symtable_params_fplist(st, CHILD(c, 1));
5540 }
5541
5542}
5543
5544static void
5545symtable_global(struct symtable *st, node *n)
5546{
5547 int i;
5548
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005549 /* XXX It might be helpful to warn about module-level global
5550 statements, but it's hard to tell the difference between
5551 module-level and a string passed to exec.
5552 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005553
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005554 for (i = 1; i < NCH(n); i += 2) {
5555 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005556 int flags;
5557
5558 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005559 if (flags < 0)
5560 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005561 if (flags && flags != DEF_GLOBAL) {
5562 char buf[500];
5563 if (flags & DEF_PARAM) {
5564 PyErr_Format(PyExc_SyntaxError,
5565 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005566 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005567 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005568 st->st_cur->ste_lineno);
5569 st->st_errors++;
5570 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005571 }
5572 else {
5573 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005574 PyOS_snprintf(buf, sizeof(buf),
5575 GLOBAL_AFTER_ASSIGN,
5576 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005577 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005578 PyOS_snprintf(buf, sizeof(buf),
5579 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005580 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005581 }
5582 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005583 symtable_add_def(st, name, DEF_GLOBAL);
5584 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005585}
5586
5587static void
5588symtable_list_comprehension(struct symtable *st, node *n)
5589{
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005590 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005591
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005592 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005593 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005594 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005595 symtable_node(st, CHILD(n, 3));
5596 if (NCH(n) == 5)
5597 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005598}
5599
5600static void
5601symtable_import(struct symtable *st, node *n)
5602{
5603 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005604 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005605 | 'from' dotted_name 'import'
5606 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005607 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005608 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005609 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005610 node *dotname = CHILD(n, 1);
5611 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5612 /* check for bogus imports */
5613 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5614 PyErr_SetString(PyExc_SyntaxError,
5615 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005616 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005617 n->n_lineno);
5618 st->st_errors++;
5619 return;
5620 }
5621 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005622 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005623 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005624 if (symtable_warn(st,
5625 "import * only allowed at module level") < 0)
5626 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005627 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005628 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005629 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005630 } else {
5631 for (i = 3; i < NCH(n); i += 2) {
5632 node *c = CHILD(n, i);
5633 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005634 symtable_assign(st, CHILD(c, 2),
5635 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005636 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005637 symtable_assign(st, CHILD(c, 0),
5638 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005639 }
5640 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005641 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005642 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005643 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005644 }
5645 }
5646}
5647
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005648/* The third argument to symatble_assign() is a flag to be passed to
5649 symtable_add_def() if it is eventually called. The flag is useful
5650 to specify the particular type of assignment that should be
5651 recorded, e.g. an assignment caused by import.
5652 */
5653
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005654static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005655symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005656{
5657 node *tmp;
5658 int i;
5659
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005660 loop:
5661 switch (TYPE(n)) {
5662 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005663 /* invalid assignment, e.g. lambda x:x=2. The next
5664 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005665 return;
5666 case power:
5667 if (NCH(n) > 2) {
5668 for (i = 2; i < NCH(n); ++i)
5669 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5670 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005671 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005672 if (NCH(n) > 1) {
5673 symtable_node(st, CHILD(n, 0));
5674 symtable_node(st, CHILD(n, 1));
5675 } else {
5676 n = CHILD(n, 0);
5677 goto loop;
5678 }
5679 return;
5680 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005681 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5682 /* XXX This is an error, but the next pass
5683 will catch it. */
5684 return;
5685 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005686 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005687 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005688 }
5689 return;
5690 case exprlist:
5691 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00005692 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005693 if (NCH(n) == 1) {
5694 n = CHILD(n, 0);
5695 goto loop;
5696 }
5697 else {
5698 int i;
5699 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005700 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005701 return;
5702 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005703 case atom:
5704 tmp = CHILD(n, 0);
5705 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5706 n = CHILD(n, 1);
5707 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005708 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00005709 if (strcmp(STR(tmp), "__debug__") == 0) {
5710 PyErr_SetString(PyExc_SyntaxError,
5711 ASSIGN_DEBUG);
5712 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton86424e32001-12-04 02:41:46 +00005713 n->n_lineno);
Jeremy Hylton778e2652001-11-09 19:50:08 +00005714 st->st_errors++;
5715 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005716 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005717 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005718 return;
5719 case dotted_as_name:
5720 if (NCH(n) == 3)
5721 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005722 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005723 else
5724 symtable_add_def(st,
5725 STR(CHILD(CHILD(n,
5726 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005727 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005728 return;
5729 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005730 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005731 return;
5732 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005733 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005734 return;
5735 default:
5736 if (NCH(n) == 0)
5737 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005738 if (NCH(n) == 1) {
5739 n = CHILD(n, 0);
5740 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005741 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005742 /* Should only occur for errors like x + 1 = 1,
5743 which will be caught in the next pass. */
5744 for (i = 0; i < NCH(n); ++i)
5745 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005746 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005747 }
5748}