blob: 3786cd91c585c1912c1973d5c65cf6a480c99f15 [file] [log] [blame]
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001/* Compile an expression node to intermediate code */
2
Guido van Rossum3f5da241990-12-20 15:06:42 +00003/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004 XXX add __doc__ attribute == co_doc to code object attributes?
5 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +00006 XXX Generate simple jump for break/return outside 'try...finally'
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00007 XXX Allow 'continue' inside finally clause of try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +00008 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +00009 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000010*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011
Guido van Rossum79f25d91997-04-29 20:08:16 +000012#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000013
Guido van Rossum10dc2e81990-11-18 17:27:39 +000014#include "node.h"
15#include "token.h"
16#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000017#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000018#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000019#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000020#include "structmember.h"
21
22#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000023
Guido van Rossumb05a5c71997-05-07 17:46:13 +000024/* Three symbols from graminit.h are also defined in Python.h, with
25 Py_ prefixes to their names. Python.h can't include graminit.h
26 (which defines too many confusing symbols), but we can check here
27 that they haven't changed (which is very unlikely, but possible). */
28#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000029 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000030#endif
31#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000032 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000033#endif
34#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000035 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000036#endif
37
Guido van Rossum8e793d91997-03-03 19:13:14 +000038int Py_OptimizeFlag = 0;
39
Guido van Rossum8861b741996-07-30 16:49:37 +000040#define OP_DELETE 0
41#define OP_ASSIGN 1
42#define OP_APPLY 2
43
Jeremy Hyltone36f7782001-01-19 03:21:30 +000044#define VAR_LOAD 0
45#define VAR_STORE 1
46#define VAR_DELETE 2
47
Jeremy Hylton64949cb2001-01-25 20:06:59 +000048#define DEL_CLOSURE_ERROR \
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000049"can not delete variable '%.400s' referenced in nested scope"
50
51#define DUPLICATE_ARGUMENT \
52"duplicate argument '%s' in function definition"
53
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000054#define ILLEGAL_DYNAMIC_SCOPE \
55"%.100s: exec or 'import *' makes names ambiguous in nested scope"
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000056
Jeremy Hylton29906ee2001-02-27 04:23:34 +000057#define GLOBAL_AFTER_ASSIGN \
58"name '%.400s' is assigned to before global declaration"
59
60#define GLOBAL_AFTER_USE \
61"name '%.400s' is used prior to global declaration"
62
63#define LOCAL_GLOBAL \
Neal Norwitz2a47c0f2002-01-29 00:53:41 +000064"name '%.400s' is a function parameter and declared global"
Jeremy Hylton29906ee2001-02-27 04:23:34 +000065
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +000066#define LATE_FUTURE \
67"from __future__ imports must occur at the beginning of the file"
68
Jeremy Hylton897b8212001-03-23 14:08:38 +000069#define ASSIGN_DEBUG \
70"can not assign to __debug__"
71
Jeremy Hyltone36f7782001-01-19 03:21:30 +000072#define MANGLE_LEN 256
73
Guido van Rossum79f25d91997-04-29 20:08:16 +000074#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000075
Guido van Rossum6f799372001-09-20 20:46:19 +000076static PyMemberDef code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000077 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
78 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000079 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000080 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000081 {"co_code", T_OBJECT, OFF(co_code), READONLY},
82 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
83 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000084 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000085 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
86 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000087 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000088 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000089 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
90 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000091 {NULL} /* Sentinel */
92};
93
Guido van Rossumbea18cc2002-06-14 20:41:17 +000094PyDoc_STRVAR(code_doc,
95"code(argcount, nlocals, stacksize, flags, codestring, constants, names,\n\
96 varnames, filename, name, firstlineno, lnotab[, freevars[, cellvars]])\n\
97\n\
98Create a code object. Not for the faint of heart.");
99
100static PyObject *
101code_new(PyTypeObject *type, PyObject *args, PyObject *kw)
102{
103 int argcount;
104 int nlocals;
105 int stacksize;
106 int flags;
107 PyObject *code;
108 PyObject *consts;
109 PyObject *names;
110 PyObject *varnames;
111 PyObject *freevars = NULL;
112 PyObject *cellvars = NULL;
113 PyObject *filename;
114 PyObject *name;
115 int firstlineno;
116 PyObject *lnotab;
117
118 if (!PyArg_ParseTuple(args, "iiiiSO!O!O!SSiS|O!O!:code",
119 &argcount, &nlocals, &stacksize, &flags,
120 &code,
121 &PyTuple_Type, &consts,
122 &PyTuple_Type, &names,
123 &PyTuple_Type, &varnames,
124 &filename, &name,
125 &firstlineno, &lnotab,
126 &PyTuple_Type, &freevars,
127 &PyTuple_Type, &cellvars))
128 return NULL;
129
130 if (freevars == NULL || cellvars == NULL) {
131 PyObject *empty = PyTuple_New(0);
132 if (empty == NULL)
133 return NULL;
134 if (freevars == NULL) {
135 freevars = empty;
136 Py_INCREF(freevars);
137 }
138 if (cellvars == NULL) {
139 cellvars = empty;
140 Py_INCREF(cellvars);
141 }
142 Py_DECREF(empty);
143 }
144
145 if (!PyObject_CheckReadBuffer(code)) {
146 PyErr_SetString(PyExc_TypeError,
147 "bytecode object must be a single-segment read-only buffer");
148 return NULL;
149 }
150
151 return (PyObject *)PyCode_New(argcount, nlocals, stacksize, flags,
152 code, consts, names, varnames,
153 freevars, cellvars, filename, name,
154 firstlineno, lnotab);
155}
156
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000157static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000158code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000159{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000160 Py_XDECREF(co->co_code);
161 Py_XDECREF(co->co_consts);
162 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000163 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000164 Py_XDECREF(co->co_freevars);
165 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000166 Py_XDECREF(co->co_filename);
167 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000168 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000169 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000170}
171
Guido van Rossum79f25d91997-04-29 20:08:16 +0000172static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000173code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000174{
175 char buf[500];
176 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000177 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000178 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000179
Guido van Rossuma396a882000-04-07 01:21:36 +0000180 if (co->co_firstlineno != 0)
181 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000182 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000183 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000184 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000185 name = PyString_AS_STRING(co->co_name);
Barry Warsaw8f6d8682001-11-28 21:10:39 +0000186 PyOS_snprintf(buf, sizeof(buf),
187 "<code object %.100s at %p, file \"%.300s\", line %d>",
188 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000189 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000190}
191
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000192static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000193code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000194{
195 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000196 cmp = PyObject_Compare(co->co_name, cp->co_name);
197 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000198 cmp = co->co_argcount - cp->co_argcount;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000199 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000200 cmp = co->co_nlocals - cp->co_nlocals;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000201 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000202 cmp = co->co_flags - cp->co_flags;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000203 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000204 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000205 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000206 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000207 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000208 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000209 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000210 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000211 if (cmp) return cmp;
212 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
213 if (cmp) return cmp;
214 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000215 return cmp;
216}
217
218static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000219code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000220{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000221 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000222 h0 = PyObject_Hash(co->co_name);
223 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000224 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000225 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000227 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000228 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000229 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000230 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000231 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000232 h5 = PyObject_Hash(co->co_freevars);
233 if (h5 == -1) return -1;
234 h6 = PyObject_Hash(co->co_cellvars);
235 if (h6 == -1) return -1;
236 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000237 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000238 if (h == -1) h = -2;
239 return h;
240}
241
Jeremy Hylton78891072001-03-01 06:09:34 +0000242/* XXX code objects need to participate in GC? */
243
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244PyTypeObject PyCode_Type = {
245 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000246 0,
247 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000248 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000249 0,
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000250 (destructor)code_dealloc, /* tp_dealloc */
251 0, /* tp_print */
252 0, /* tp_getattr */
253 0, /* tp_setattr */
254 (cmpfunc)code_compare, /* tp_compare */
255 (reprfunc)code_repr, /* tp_repr */
256 0, /* tp_as_number */
257 0, /* tp_as_sequence */
258 0, /* tp_as_mapping */
259 (hashfunc)code_hash, /* tp_hash */
260 0, /* tp_call */
261 0, /* tp_str */
262 PyObject_GenericGetAttr, /* tp_getattro */
263 0, /* tp_setattro */
264 0, /* tp_as_buffer */
265 Py_TPFLAGS_DEFAULT, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000266 code_doc, /* tp_doc */
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000267 0, /* tp_traverse */
268 0, /* tp_clear */
269 0, /* tp_richcompare */
270 0, /* tp_weaklistoffset */
271 0, /* tp_iter */
272 0, /* tp_iternext */
273 0, /* tp_methods */
274 code_memberlist, /* tp_members */
275 0, /* tp_getset */
276 0, /* tp_base */
277 0, /* tp_dict */
278 0, /* tp_descr_get */
279 0, /* tp_descr_set */
280 0, /* tp_dictoffset */
281 0, /* tp_init */
282 0, /* tp_alloc */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000283 code_new, /* tp_new */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000284};
285
Guido van Rossum644a12b1997-04-09 19:24:53 +0000286#define NAME_CHARS \
287 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
288
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000289/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
290
291static int
292all_name_chars(unsigned char *s)
293{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000294 static char ok_name_char[256];
295 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000296
Guido van Rossumcd90c202001-02-09 15:06:42 +0000297 if (ok_name_char[*name_chars] == 0) {
298 unsigned char *p;
299 for (p = name_chars; *p; p++)
300 ok_name_char[*p] = 1;
301 }
302 while (*s) {
303 if (ok_name_char[*s++] == 0)
304 return 0;
305 }
306 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000307}
308
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000309static int
310intern_strings(PyObject *tuple)
311{
312 int i;
313
314 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
315 PyObject *v = PyTuple_GET_ITEM(tuple, i);
316 if (v == NULL || !PyString_Check(v)) {
317 Py_FatalError("non-string found in code slot");
318 PyErr_BadInternalCall();
319 return -1;
320 }
321 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
322 }
323 return 0;
324}
325
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000326#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
327#define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD)
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000328#define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE || op==CONTINUE_LOOP)
329#define GETJUMPTGT(arr, i) (GETARG(arr,i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+3))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000330#define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255
331
332static PyObject *
333optimize_code(PyObject *code, PyObject* consts)
334{
335 int i, j, codelen;
336 int tgt, tgttgt, opcode;
337 unsigned char *codestr;
338
339 /* Make a modifiable copy of the code string */
340 if (!PyString_Check(code))
341 goto exitUnchanged;
342 codelen = PyString_Size(code);
343 codestr = PyMem_Malloc(codelen);
344 if (codestr == NULL)
345 goto exitUnchanged;
346 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
347 assert(PyTuple_Check(consts));
348
349 for (i=0 ; i<codelen-7 ; i += HAS_ARG(codestr[i]) ? 3 : 1) {
350 opcode = codestr[i];
351 switch (opcode) {
352
353 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP.
354 Note, only the first opcode is changed, the others still
355 perform normally if they happen to be jump targets. */
356 case LOAD_CONST:
357 j = GETARG(codestr, i);
358 if (codestr[i+3] != JUMP_IF_FALSE ||
359 codestr[i+6] != POP_TOP ||
360 !PyObject_IsTrue(PyTuple_GET_ITEM(consts, j)))
361 continue;
362 codestr[i] = JUMP_FORWARD;
363 SETARG(codestr, i, 4);
364 break;
365
366 /* Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2 JMP+2.
367 Note, these opcodes occur together only in assignment
368 statements. Accordingly, the unpack opcode is never
369 a jump target. */
370 case BUILD_TUPLE:
371 case BUILD_LIST:
372 if (codestr[i+3] != UNPACK_SEQUENCE ||
373 GETARG(codestr, i) != 2 ||
374 GETARG(codestr, i+3) != 2)
375 continue;
376 codestr[i] = ROT_TWO;
377 codestr[i+1] = JUMP_FORWARD;
378 SETARG(codestr, i+1, 2);
379 codestr[i+4] = DUP_TOP; /* Filler codes used as NOPs */
380 codestr[i+5] = POP_TOP;
381 break;
382
383 /* Replace jumps to unconditional jumps */
384 case JUMP_FORWARD:
385 case JUMP_IF_FALSE:
386 case JUMP_IF_TRUE:
387 case JUMP_ABSOLUTE:
388 case CONTINUE_LOOP:
389 case SETUP_LOOP:
390 case SETUP_EXCEPT:
391 case SETUP_FINALLY:
392 tgt = GETJUMPTGT(codestr, i);
393 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
394 continue;
395 tgttgt = GETJUMPTGT(codestr, tgt);
396 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
397 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000398 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000399 tgttgt -= i + 3; /* Calc relative jump addr */
400 if (tgttgt < 0) /* No backward relative jumps */
401 continue;
402 codestr[i] = opcode;
403 SETARG(codestr, i, tgttgt);
404 break;
405
406 case EXTENDED_ARG:
407 PyMem_Free(codestr);
408 goto exitUnchanged;
409 }
410 }
411 code = PyString_FromStringAndSize(codestr, codelen);
412 PyMem_Free(codestr);
413 return code;
414
415exitUnchanged:
416 Py_INCREF(code);
417 return code;
418}
419
Guido van Rossum79f25d91997-04-29 20:08:16 +0000420PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000421PyCode_New(int argcount, int nlocals, int stacksize, int flags,
422 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000423 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
424 PyObject *filename, PyObject *name, int firstlineno,
425 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000426{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000427 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000428 int i;
429 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000430 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000431 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000432 consts == NULL || !PyTuple_Check(consts) ||
433 names == NULL || !PyTuple_Check(names) ||
434 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000435 freevars == NULL || !PyTuple_Check(freevars) ||
436 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000437 name == NULL || !PyString_Check(name) ||
438 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000439 lnotab == NULL || !PyString_Check(lnotab) ||
440 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000441 PyErr_BadInternalCall();
442 return NULL;
443 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000444 intern_strings(names);
445 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000446 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000447 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000448 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000449 for (i = PyTuple_Size(consts); --i >= 0; ) {
450 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000451 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000452 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000453 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000454 continue;
455 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000456 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000457 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000458 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000459 co->co_argcount = argcount;
460 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000461 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000462 co->co_flags = flags;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000463 co->co_code = optimize_code(code, consts);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000464 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000465 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000466 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000467 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000468 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000469 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000470 Py_INCREF(freevars);
471 co->co_freevars = freevars;
472 Py_INCREF(cellvars);
473 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000474 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000475 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000476 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000477 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000478 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000479 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000480 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000481 if (PyTuple_GET_SIZE(freevars) == 0 &&
482 PyTuple_GET_SIZE(cellvars) == 0)
483 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000484 }
485 return co;
486}
487
488
489/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000490
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000491/* The compiler uses two passes to generate bytecodes. The first pass
492 builds the symbol table. The second pass generates the bytecode.
493
494 The first pass uses a single symtable struct. The second pass uses
495 a compiling struct for each code block. The compiling structs
496 share a reference to the symtable.
497
498 The two passes communicate via symtable_load_symbols() and via
499 is_local() and is_global(). The former initializes several slots
500 in the compiling struct: c_varnames, c_locals, c_nlocals,
501 c_argcount, c_globals, and c_flags.
502*/
503
Tim Peters2a7f3842001-06-09 09:26:21 +0000504/* All about c_lnotab.
505
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000506c_lnotab is an array of unsigned bytes disguised as a Python string. Since
507version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
508mapped to source code line #s via c_lnotab instead.
509
Tim Peters2a7f3842001-06-09 09:26:21 +0000510The array is conceptually a list of
511 (bytecode offset increment, line number increment)
512pairs. The details are important and delicate, best illustrated by example:
513
514 byte code offset source code line number
515 0 1
516 6 2
517 50 7
518 350 307
519 361 308
520
521The first trick is that these numbers aren't stored, only the increments
522from one row to the next (this doesn't really work, but it's a start):
523
524 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
525
526The second trick is that an unsigned byte can't hold negative values, or
527values larger than 255, so (a) there's a deep assumption that byte code
528offsets and their corresponding line #s both increase monotonically, and (b)
529if at least one column jumps by more than 255 from one row to the next, more
530than one pair is written to the table. In case #b, there's no way to know
531from looking at the table later how many were written. That's the delicate
532part. A user of c_lnotab desiring to find the source line number
533corresponding to a bytecode address A should do something like this
534
535 lineno = addr = 0
536 for addr_incr, line_incr in c_lnotab:
537 addr += addr_incr
538 if addr > A:
539 return lineno
540 lineno += line_incr
541
542In order for this to work, when the addr field increments by more than 255,
543the line # increment in each pair generated must be 0 until the remaining addr
544increment is < 256. So, in the example above, com_set_lineno should not (as
545was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
546255, 0, 45, 255, 0, 45.
547*/
548
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000549struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000550 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000551 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000552 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000553 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000554 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +0000555 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000556 PyObject *c_locals; /* dictionary (value=localID) */
557 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000558 PyObject *c_freevars; /* dictionary (value=None) */
559 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000560 int c_nlocals; /* index of next local */
561 int c_argcount; /* number of top-level arguments */
562 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000563 int c_nexti; /* index into c_code */
564 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000565 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000566 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000567 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000568 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000569 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000570 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +0000571 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000572 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000573 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000574 int c_stacklevel; /* Current stack level */
575 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000576 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000577 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000578 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000579 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000580 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000581 int c_nested; /* Is block nested funcdef or lamdef? */
582 int c_closure; /* Is nested w/freevars? */
583 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000584 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000585 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000586};
587
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000588static int
589is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000590{
591 if ((v & (USE | DEF_FREE))
592 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
593 return 1;
594 if (v & DEF_FREE_CLASS)
595 return 1;
596 return 0;
597}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000598
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000599static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000600com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000601{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000602 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
603
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000604 if (c == NULL) {
605 /* Error occurred via symtable call to
606 is_constant_false */
607 PyErr_SetString(exc, msg);
608 return;
609 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000610 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000611 if (c->c_lineno < 1 || c->c_interactive) {
612 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000613 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000614 return;
615 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000616 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000617 if (v == NULL)
618 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000619
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000620 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000621 if (line == NULL) {
622 Py_INCREF(Py_None);
623 line = Py_None;
624 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000625 if (exc == PyExc_SyntaxError) {
626 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
627 Py_None, line);
628 if (t == NULL)
629 goto exit;
630 w = Py_BuildValue("(OO)", v, t);
631 if (w == NULL)
632 goto exit;
633 PyErr_SetObject(exc, w);
634 } else {
635 /* Make sure additional exceptions are printed with
636 file and line, also. */
637 PyErr_SetObject(exc, v);
638 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
639 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000640 exit:
641 Py_XDECREF(t);
642 Py_XDECREF(v);
643 Py_XDECREF(w);
644 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000645}
646
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000647/* Interface to the block stack */
648
649static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000650block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000651{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000652 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000653 com_error(c, PyExc_SystemError,
654 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000655 }
656 else {
657 c->c_block[c->c_nblocks++] = type;
658 }
659}
660
661static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000662block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000663{
664 if (c->c_nblocks > 0)
665 c->c_nblocks--;
666 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000667 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000668 }
669}
670
Guido van Rossum681d79a1995-07-18 14:51:37 +0000671/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000672
Martin v. Löwis95292d62002-12-11 14:04:59 +0000673static int issue_warning(const char *, const char *, int);
674static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000675static void com_free(struct compiling *);
676static void com_push(struct compiling *, int);
677static void com_pop(struct compiling *, int);
678static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000679static void com_node(struct compiling *, node *);
680static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000681static void com_addbyte(struct compiling *, int);
682static void com_addint(struct compiling *, int);
683static void com_addoparg(struct compiling *, int, int);
684static void com_addfwref(struct compiling *, int, int *);
685static void com_backpatch(struct compiling *, int);
686static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
687static int com_addconst(struct compiling *, PyObject *);
688static int com_addname(struct compiling *, PyObject *);
689static void com_addopname(struct compiling *, int, node *);
690static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000691static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000692static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000693static void com_assign(struct compiling *, node *, int, node *);
694static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000695static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +0000696static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000697 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000698static PyObject *parsestrplus(struct compiling*, node *);
699static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000700static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000701
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000702static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000703
704/* symtable operations */
705static int symtable_build(struct compiling *, node *);
706static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000707static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000708static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000709static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000710static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000711static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000712
713static void symtable_node(struct symtable *, node *);
714static void symtable_funcdef(struct symtable *, node *);
715static void symtable_default_args(struct symtable *, node *);
716static void symtable_params(struct symtable *, node *);
717static void symtable_params_fplist(struct symtable *, node *n);
718static void symtable_global(struct symtable *, node *);
719static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000720static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000721static void symtable_list_comprehension(struct symtable *, node *);
722
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000723static int symtable_update_free_vars(struct symtable *);
724static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
725static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
726
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000727/* helper */
728static void
729do_pad(int pad)
730{
731 int i;
732 for (i = 0; i < pad; ++i)
733 fprintf(stderr, " ");
734}
735
736static void
737dump(node *n, int pad, int depth)
738{
739 int i;
740 if (depth == 0)
741 return;
742 do_pad(pad);
743 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
744 if (depth > 0)
745 depth--;
746 for (i = 0; i < NCH(n); ++i)
747 dump(CHILD(n, i), pad + 1, depth);
748}
749
750#define DUMP(N) dump(N, 0, -1)
751
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000752static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000753com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000754{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000755 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000756 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
757 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000758 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000759 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000760 goto fail;
761 if ((c->c_const_dict = PyDict_New()) == NULL)
762 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000763 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000764 goto fail;
765 if ((c->c_name_dict = PyDict_New()) == NULL)
766 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000767 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000768 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000769 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
770 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000771 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000772 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000773 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000774 c->c_freevars = NULL;
775 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000776 c->c_nlocals = 0;
777 c->c_argcount = 0;
778 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000779 c->c_nexti = 0;
780 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000781 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000782 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000783 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000784 c->c_begin = 0;
785 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000786 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000787 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000788 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000789 c->c_stacklevel = 0;
790 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000791 c->c_firstlineno = 0;
792 c->c_last_addr = 0;
793 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000794 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000795 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000796 c->c_nested = 0;
797 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000798 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000799 return 1;
800
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000801 fail:
802 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000803 return 0;
804}
805
806static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000807com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000808{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000809 Py_XDECREF(c->c_code);
810 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000811 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000812 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000813 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000814 Py_XDECREF(c->c_globals);
815 Py_XDECREF(c->c_locals);
816 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000817 Py_XDECREF(c->c_freevars);
818 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000819 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000820 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +0000821 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000822}
823
824static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000825com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000826{
827 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000828 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +0000829 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000830 /*
831 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
832 c->c_filename, c->c_name, c->c_lineno,
833 c->c_nexti, c->c_stacklevel, n);
834 */
835 }
Guido van Rossum8b993a91997-01-17 21:04:03 +0000836}
837
838static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000839com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000840{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000841 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000842 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000843 else
844 c->c_stacklevel -= n;
845}
846
847static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000848com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000849{
850 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000851 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000852 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000853 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000854}
855
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000856static int
857com_check_size(PyObject **s, int offset)
858{
859 int len = PyString_GET_SIZE(*s);
860 if (offset >= len)
861 return _PyString_Resize(s, len * 2);
862 return 0;
863}
864
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000865static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000866com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000867{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000868 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000869 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +0000870 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000871 if (com_check_size(&c->c_code, c->c_nexti)) {
872 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000873 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000874 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000875 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000876}
877
878static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000879com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000880{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000881 com_addbyte(c, x & 0xff);
882 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000883}
884
885static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000886com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000887{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000888 char *p;
889 if (c->c_lnotab == NULL)
890 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000891 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
892 c->c_errors++;
893 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000894 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000895 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000896 *p++ = addr;
897 *p++ = line;
898 c->c_lnotab_next += 2;
899}
900
901static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000902com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000903{
904 c->c_lineno = lineno;
905 if (c->c_firstlineno == 0) {
906 c->c_firstlineno = c->c_last_line = lineno;
907 }
908 else {
909 int incr_addr = c->c_nexti - c->c_last_addr;
910 int incr_line = lineno - c->c_last_line;
Tim Peters2a7f3842001-06-09 09:26:21 +0000911 while (incr_addr > 255) {
912 com_add_lnotab(c, 255, 0);
913 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000914 }
Tim Peters2a7f3842001-06-09 09:26:21 +0000915 while (incr_line > 255) {
916 com_add_lnotab(c, incr_addr, 255);
917 incr_line -=255;
918 incr_addr = 0;
919 }
920 if (incr_addr > 0 || incr_line > 0)
921 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000922 c->c_last_addr = c->c_nexti;
923 c->c_last_line = lineno;
924 }
925}
926
927static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000928com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000929{
Fred Drakeef8ace32000-08-24 00:32:09 +0000930 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +0000931 if (extended_arg){
932 com_addbyte(c, EXTENDED_ARG);
933 com_addint(c, extended_arg);
934 arg &= 0xffff;
935 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000936 com_addbyte(c, op);
937 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000938}
939
940static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000941com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000942{
943 /* Compile a forward reference for backpatching */
944 int here;
945 int anchor;
946 com_addbyte(c, op);
947 here = c->c_nexti;
948 anchor = *p_anchor;
949 *p_anchor = here;
950 com_addint(c, anchor == 0 ? 0 : here - anchor);
951}
952
953static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000954com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000955{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000956 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000957 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000958 int dist;
959 int prev;
960 for (;;) {
961 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000962 prev = code[anchor] + (code[anchor+1] << 8);
963 dist = target - (anchor+2);
964 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000965 dist >>= 8;
966 code[anchor+1] = dist;
967 dist >>= 8;
968 if (dist) {
969 com_error(c, PyExc_SystemError,
970 "com_backpatch: offset too large");
971 break;
972 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000973 if (!prev)
974 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000975 anchor -= prev;
976 }
977}
978
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000979/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000980
981static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000982com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000983{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000984 PyObject *w, *t, *np=NULL;
985 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000986
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000987 t = Py_BuildValue("(OO)", v, v->ob_type);
988 if (t == NULL)
989 goto fail;
990 w = PyDict_GetItem(dict, t);
991 if (w != NULL) {
992 n = PyInt_AsLong(w);
993 } else {
994 n = PyList_Size(list);
995 np = PyInt_FromLong(n);
996 if (np == NULL)
997 goto fail;
998 if (PyList_Append(list, v) != 0)
999 goto fail;
1000 if (PyDict_SetItem(dict, t, np) != 0)
1001 goto fail;
1002 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001003 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001004 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001005 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001006 fail:
1007 Py_XDECREF(np);
1008 Py_XDECREF(t);
1009 c->c_errors++;
1010 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001011}
1012
1013static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001014com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001015{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001016 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001017}
1018
1019static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001020com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001021{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001022 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001023}
1024
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001025int
1026_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001027{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001028 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001029 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001030 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001031 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1032 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001033 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001034 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001035 return 0; /* Don't mangle __extremely_long_names */
1036 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1037 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001038 /* Strip leading underscores from class name */
1039 while (*p == '_')
1040 p++;
1041 if (*p == '\0')
1042 return 0; /* Don't mangle if class is just underscores */
1043 plen = strlen(p);
1044 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001045 plen = maxlen-nlen-2; /* Truncate class name if too long */
1046 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001047 buffer[0] = '_';
1048 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001049 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001050 return 1;
1051}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001052
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001053static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001054com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001055{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001056 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001057 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001058 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001059
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001060 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001061 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001062 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001063 c->c_errors++;
1064 i = 255;
1065 }
1066 else {
1067 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001068 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001069 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001070 com_addoparg(c, op, i);
1071}
1072
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001073#define NAME_LOCAL 0
1074#define NAME_GLOBAL 1
1075#define NAME_DEFAULT 2
1076#define NAME_CLOSURE 3
1077
1078static int
1079com_lookup_arg(PyObject *dict, PyObject *name)
1080{
1081 PyObject *v = PyDict_GetItem(dict, name);
1082 if (v == NULL)
1083 return -1;
1084 else
1085 return PyInt_AS_LONG(v);
1086}
1087
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001088static int
1089none_assignment_check(struct compiling *c, char *name, int assigning)
1090{
1091 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1092 char *msg;
1093 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001094 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001095 else
1096 msg = "deleting None";
1097 if (issue_warning(msg, c->c_filename, c->c_lineno) < 0) {
1098 c->c_errors++;
1099 return -1;
1100 }
1101 }
1102 return 0;
1103}
1104
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001105static void
1106com_addop_varname(struct compiling *c, int kind, char *name)
1107{
1108 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001109 int i, reftype;
1110 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001111 int op = STOP_CODE;
1112 char buffer[MANGLE_LEN];
1113
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001114 if (kind != VAR_LOAD &&
1115 none_assignment_check(c, name, kind == VAR_STORE))
1116 {
1117 c->c_errors++;
1118 i = 255;
1119 goto done;
1120 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001121 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001122 name = buffer;
1123 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1124 c->c_errors++;
1125 i = 255;
1126 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001127 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001128
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001129 reftype = get_ref_type(c, name);
1130 switch (reftype) {
1131 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001132 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001133 scope = NAME_LOCAL;
1134 break;
1135 case GLOBAL_EXPLICIT:
1136 scope = NAME_GLOBAL;
1137 break;
1138 case GLOBAL_IMPLICIT:
1139 if (c->c_flags & CO_OPTIMIZED)
1140 scope = NAME_GLOBAL;
1141 break;
1142 case FREE:
1143 case CELL:
1144 scope = NAME_CLOSURE;
1145 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001146 }
1147
1148 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001149 if (scope == NAME_LOCAL)
1150 i = com_lookup_arg(c->c_locals, v);
1151 else if (reftype == FREE)
1152 i = com_lookup_arg(c->c_freevars, v);
1153 else if (reftype == CELL)
1154 i = com_lookup_arg(c->c_cellvars, v);
1155 if (i == -1) {
1156 c->c_errors++; /* XXX no exception set */
1157 i = 255;
1158 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001159 }
1160 Py_DECREF(v);
1161
1162 switch (kind) {
1163 case VAR_LOAD:
1164 switch (scope) {
1165 case NAME_LOCAL:
1166 op = LOAD_FAST;
1167 break;
1168 case NAME_GLOBAL:
1169 op = LOAD_GLOBAL;
1170 break;
1171 case NAME_DEFAULT:
1172 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001173 break;
1174 case NAME_CLOSURE:
1175 op = LOAD_DEREF;
1176 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001177 }
1178 break;
1179 case VAR_STORE:
1180 switch (scope) {
1181 case NAME_LOCAL:
1182 op = STORE_FAST;
1183 break;
1184 case NAME_GLOBAL:
1185 op = STORE_GLOBAL;
1186 break;
1187 case NAME_DEFAULT:
1188 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001189 break;
1190 case NAME_CLOSURE:
1191 op = STORE_DEREF;
1192 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001193 }
1194 break;
1195 case VAR_DELETE:
1196 switch (scope) {
1197 case NAME_LOCAL:
1198 op = DELETE_FAST;
1199 break;
1200 case NAME_GLOBAL:
1201 op = DELETE_GLOBAL;
1202 break;
1203 case NAME_DEFAULT:
1204 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001205 break;
1206 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001207 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001208 PyOS_snprintf(buf, sizeof(buf),
1209 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001210 com_error(c, PyExc_SyntaxError, buf);
1211 i = 255;
1212 break;
1213 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001214 }
1215 break;
1216 }
1217done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001218 com_addoparg(c, op, i);
1219}
1220
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001221static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001222com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001223{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001224 char *name;
1225 char buffer[1000];
1226 /* XXX it is possible to write this code without the 1000
1227 chars on the total length of dotted names, I just can't be
1228 bothered right now */
1229 if (TYPE(n) == STAR)
1230 name = "*";
1231 else if (TYPE(n) == dotted_name) {
1232 char *p = buffer;
1233 int i;
1234 name = buffer;
1235 for (i = 0; i < NCH(n); i += 2) {
1236 char *s = STR(CHILD(n, i));
1237 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001238 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001239 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001240 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001241 break;
1242 }
1243 if (p != buffer)
1244 *p++ = '.';
1245 strcpy(p, s);
1246 p = strchr(p, '\0');
1247 }
1248 }
1249 else {
1250 REQ(n, NAME);
1251 name = STR(n);
1252 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001253 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001254}
1255
Guido van Rossum79f25d91997-04-29 20:08:16 +00001256static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001257parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001258{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001259 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001260 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001261 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001262#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001263 int imflag;
1264#endif
1265
Guido van Rossum282914b1991-04-04 10:42:56 +00001266 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001267 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001268#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001269 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001270#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001271 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001272 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001273 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001274 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001275 if (x < 0 && errno == 0) {
Guido van Rossum715eca92002-08-12 21:54:46 +00001276 if (PyErr_WarnExplicit(
Barry Warsaw9f007392002-08-14 15:51:29 +00001277 PyExc_FutureWarning,
Guido van Rossum715eca92002-08-12 21:54:46 +00001278 "hex/oct constants > sys.maxint "
1279 "will return positive values "
1280 "in Python 2.4 and up",
Martin v. Löwis95292d62002-12-11 14:04:59 +00001281 /* XXX: Give WarnExplicit
1282 a const char* argument. */
1283 (char*)c->c_filename,
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001284 c->c_lineno,
Guido van Rossum715eca92002-08-12 21:54:46 +00001285 NULL,
1286 NULL) < 0)
Guido van Rossum078151d2002-08-11 04:24:12 +00001287 return NULL;
Guido van Rossum3cb8e542002-08-11 14:06:15 +00001288 errno = 0; /* Might be changed by PyErr_Warn() */
Guido van Rossum078151d2002-08-11 04:24:12 +00001289 }
1290 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001291 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001292 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001293 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001294 if (errno != 0)
1295 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001296 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001297 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001298 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001299#ifndef WITHOUT_COMPLEX
1300 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001301 Py_complex z;
1302 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001303 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001304 z.imag = atof(s);
1305 PyFPE_END_PROTECT(z)
1306 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001307 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001308 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001309#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001310 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001311 PyFPE_START_PROTECT("atof", return 0)
1312 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001313 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001314 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001315 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001316}
1317
Guido van Rossum79f25d91997-04-29 20:08:16 +00001318static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001319decode_utf8(char **sPtr, char *end, char* encoding)
1320{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001321#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001322 Py_FatalError("decode_utf8 should not be called in this build.");
1323 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001324#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001325 PyObject *u, *v;
1326 char *s, *t;
1327 t = s = *sPtr;
1328 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1329 while (s < end && (*s & 0x80)) s++;
1330 *sPtr = s;
1331 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1332 if (u == NULL)
1333 return NULL;
1334 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1335 Py_DECREF(u);
1336 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001337#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001338}
1339
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001340/* compiler.transformer.Transformer.decode_literal depends on what
1341 might seem like minor details of this function -- changes here
1342 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001343static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001344parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001345{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001346 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001347 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001348 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001349 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001350 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001351 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001352 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001353
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001354 if (isalpha(quote) || quote == '_') {
1355 if (quote == 'u' || quote == 'U') {
1356 quote = *++s;
1357 unicode = 1;
1358 }
1359 if (quote == 'r' || quote == 'R') {
1360 quote = *++s;
1361 rawmode = 1;
1362 }
1363 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001364 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001365 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001366 return NULL;
1367 }
1368 s++;
1369 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001370 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001371 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001372 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001373 return NULL;
1374 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001375 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001376 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001377 return NULL;
1378 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001379 if (len >= 4 && s[0] == quote && s[1] == quote) {
1380 s += 2;
1381 len -= 2;
1382 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001383 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001384 return NULL;
1385 }
1386 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001387#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001388 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001389 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001390 char *buf;
1391 char *p;
1392 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001393 if (encoding == NULL) {
1394 buf = s;
1395 u = NULL;
1396 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1397 buf = s;
1398 u = NULL;
1399 } else {
1400 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1401 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1402 if (u == NULL)
1403 return NULL;
1404 p = buf = PyString_AsString(u);
1405 end = s + len;
1406 while (s < end) {
1407 if (*s == '\\') {
1408 *p++ = *s++;
1409 if (*s & 0x80) {
1410 strcpy(p, "u005c");
1411 p += 5;
1412 }
1413 }
1414 if (*s & 0x80) { /* XXX inefficient */
1415 char *r;
1416 int rn, i;
1417 w = decode_utf8(&s, end, "utf-16-be");
1418 if (w == NULL) {
1419 Py_DECREF(u);
1420 return NULL;
1421 }
1422 r = PyString_AsString(w);
1423 rn = PyString_Size(w);
1424 assert(rn % 2 == 0);
1425 for (i = 0; i < rn; i += 2) {
1426 sprintf(p, "\\u%02x%02x",
1427 r[i + 0] & 0xFF,
1428 r[i + 1] & 0xFF);
1429 p += 6;
1430 }
1431 Py_DECREF(w);
1432 } else {
1433 *p++ = *s++;
1434 }
1435 }
1436 len = p - buf;
1437 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001438 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001439 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001440 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001441 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1442 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001443 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001444 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001445 return v;
1446
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001447 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001448#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001449 need_encoding = (encoding != NULL &&
1450 strcmp(encoding, "utf-8") != 0 &&
1451 strcmp(encoding, "iso-8859-1") != 0);
1452 if (rawmode || strchr(s, '\\') == NULL) {
1453 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001454#ifndef Py_USING_UNICODE
1455 /* This should not happen - we never see any other
1456 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001457 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001458#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001459 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1460 if (u == NULL)
1461 return NULL;
1462 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1463 Py_DECREF(u);
1464 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001465#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001466 } else {
1467 return PyString_FromStringAndSize(s, len);
1468 }
1469 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001470
1471 v = PyString_DecodeEscape(s, len, NULL, unicode,
1472 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001473 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001474 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001475 return v;
1476}
1477
Guido van Rossum79f25d91997-04-29 20:08:16 +00001478static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001479parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001480{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001481 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001482 int i;
1483 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001484 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001485 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001486 for (i = 1; i < NCH(n); i++) {
1487 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001488 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001489 if (s == NULL)
1490 goto onError;
1491 if (PyString_Check(v) && PyString_Check(s)) {
1492 PyString_ConcatAndDel(&v, s);
1493 if (v == NULL)
1494 goto onError;
1495 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001496#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001497 else {
1498 PyObject *temp;
1499 temp = PyUnicode_Concat(v, s);
1500 Py_DECREF(s);
1501 if (temp == NULL)
1502 goto onError;
1503 Py_DECREF(v);
1504 v = temp;
1505 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001506#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001507 }
1508 }
1509 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001510
1511 onError:
1512 Py_XDECREF(v);
1513 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001514}
1515
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001516static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001517com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001518{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001519 int anchor = 0;
1520 int save_begin = c->c_begin;
1521
1522 /* list_iter: for v in expr [list_iter] */
1523 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001524 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001525 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001526 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001527 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001528 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001529 c->c_loops++;
1530 com_list_iter(c, n, e, t);
1531 c->c_loops--;
1532 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1533 c->c_begin = save_begin;
1534 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001535 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001536}
1537
1538static void
1539com_list_if(struct compiling *c, node *n, node *e, char *t)
1540{
1541 int anchor = 0;
1542 int a = 0;
1543 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001544 com_node(c, CHILD(n, 1));
1545 com_addfwref(c, JUMP_IF_FALSE, &a);
1546 com_addbyte(c, POP_TOP);
1547 com_pop(c, 1);
1548 com_list_iter(c, n, e, t);
1549 com_addfwref(c, JUMP_FORWARD, &anchor);
1550 com_backpatch(c, a);
1551 /* We jump here with an extra entry which we now pop */
1552 com_addbyte(c, POP_TOP);
1553 com_backpatch(c, anchor);
1554}
1555
1556static void
1557com_list_iter(struct compiling *c,
1558 node *p, /* parent of list_iter node */
1559 node *e, /* element expression node */
1560 char *t /* name of result list temp local */)
1561{
1562 /* list_iter is the last child in a listmaker, list_for, or list_if */
1563 node *n = CHILD(p, NCH(p)-1);
1564 if (TYPE(n) == list_iter) {
1565 n = CHILD(n, 0);
1566 switch (TYPE(n)) {
1567 case list_for:
1568 com_list_for(c, n, e, t);
1569 break;
1570 case list_if:
1571 com_list_if(c, n, e, t);
1572 break;
1573 default:
1574 com_error(c, PyExc_SystemError,
1575 "invalid list_iter node type");
1576 }
1577 }
1578 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001579 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001580 com_push(c, 1);
1581 com_node(c, e);
1582 com_addoparg(c, CALL_FUNCTION, 1);
1583 com_addbyte(c, POP_TOP);
1584 com_pop(c, 2);
1585 }
1586}
1587
1588static void
1589com_list_comprehension(struct compiling *c, node *n)
1590{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001591 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001592 char tmpname[30];
1593 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001594 com_addoparg(c, BUILD_LIST, 0);
1595 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1596 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001597 com_addop_name(c, LOAD_ATTR, "append");
1598 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001599 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001600 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001601 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001602 --c->c_tmpname;
1603}
1604
1605static void
1606com_listmaker(struct compiling *c, node *n)
1607{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001608 /* listmaker: test ( list_for | (',' test)* [','] ) */
1609 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001610 com_list_comprehension(c, n);
1611 else {
1612 int len = 0;
1613 int i;
1614 for (i = 0; i < NCH(n); i += 2, len++)
1615 com_node(c, CHILD(n, i));
1616 com_addoparg(c, BUILD_LIST, len);
1617 com_pop(c, len-1);
1618 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001619}
1620
1621static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001622com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001623{
1624 int i;
1625 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1626 for (i = 0; i+2 < NCH(n); i += 4) {
1627 /* We must arrange things just right for STORE_SUBSCR.
1628 It wants the stack to look like (value) (dict) (key) */
1629 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001630 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001631 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00001632 com_node(c, CHILD(n, i+2)); /* value */
1633 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001634 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001635 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001636 }
1637}
1638
1639static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001640com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001641{
1642 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001643 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001644 int i;
1645 REQ(n, atom);
1646 ch = CHILD(n, 0);
1647 switch (TYPE(ch)) {
1648 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001649 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001650 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001651 com_push(c, 1);
1652 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001653 else
1654 com_node(c, CHILD(n, 1));
1655 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001656 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001657 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001658 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001659 com_push(c, 1);
1660 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001661 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001662 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001663 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001664 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001665 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001666 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001667 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001668 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001669 break;
1670 case BACKQUOTE:
1671 com_node(c, CHILD(n, 1));
1672 com_addbyte(c, UNARY_CONVERT);
1673 break;
1674 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001675 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001676 i = 255;
1677 }
1678 else {
1679 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001680 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001681 }
1682 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001683 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001684 break;
1685 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001686 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001687 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001688 c->c_errors++;
1689 i = 255;
1690 }
1691 else {
1692 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001693 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001694 }
1695 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001696 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001697 break;
1698 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001699 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001700 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001701 break;
1702 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001703 com_error(c, PyExc_SystemError,
1704 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001705 }
1706}
1707
1708static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001709com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001710{
1711 if (NCH(n) == 1) {
1712 com_addbyte(c, op);
1713 }
1714 else if (NCH(n) == 2) {
1715 if (TYPE(CHILD(n, 0)) != COLON) {
1716 com_node(c, CHILD(n, 0));
1717 com_addbyte(c, op+1);
1718 }
1719 else {
1720 com_node(c, CHILD(n, 1));
1721 com_addbyte(c, op+2);
1722 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001723 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001724 }
1725 else {
1726 com_node(c, CHILD(n, 0));
1727 com_node(c, CHILD(n, 2));
1728 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001729 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001730 }
1731}
1732
Guido van Rossum635abd21997-01-06 22:56:52 +00001733static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001734com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1735{
1736 if (NCH(n) == 1) {
1737 com_addbyte(c, DUP_TOP);
1738 com_push(c, 1);
1739 com_addbyte(c, SLICE);
1740 com_node(c, augn);
1741 com_addbyte(c, opcode);
1742 com_pop(c, 1);
1743 com_addbyte(c, ROT_TWO);
1744 com_addbyte(c, STORE_SLICE);
1745 com_pop(c, 2);
1746 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1747 com_node(c, CHILD(n, 0));
1748 com_addoparg(c, DUP_TOPX, 2);
1749 com_push(c, 2);
1750 com_addbyte(c, SLICE+1);
1751 com_pop(c, 1);
1752 com_node(c, augn);
1753 com_addbyte(c, opcode);
1754 com_pop(c, 1);
1755 com_addbyte(c, ROT_THREE);
1756 com_addbyte(c, STORE_SLICE+1);
1757 com_pop(c, 3);
1758 } else if (NCH(n) == 2) {
1759 com_node(c, CHILD(n, 1));
1760 com_addoparg(c, DUP_TOPX, 2);
1761 com_push(c, 2);
1762 com_addbyte(c, SLICE+2);
1763 com_pop(c, 1);
1764 com_node(c, augn);
1765 com_addbyte(c, opcode);
1766 com_pop(c, 1);
1767 com_addbyte(c, ROT_THREE);
1768 com_addbyte(c, STORE_SLICE+2);
1769 com_pop(c, 3);
1770 } else {
1771 com_node(c, CHILD(n, 0));
1772 com_node(c, CHILD(n, 2));
1773 com_addoparg(c, DUP_TOPX, 3);
1774 com_push(c, 3);
1775 com_addbyte(c, SLICE+3);
1776 com_pop(c, 2);
1777 com_node(c, augn);
1778 com_addbyte(c, opcode);
1779 com_pop(c, 1);
1780 com_addbyte(c, ROT_FOUR);
1781 com_addbyte(c, STORE_SLICE+3);
1782 com_pop(c, 4);
1783 }
1784}
1785
1786static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001787com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001788{
1789 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001790 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001791 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001792 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001793 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001794 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001795 }
1796 else {
1797 com_node(c, CHILD(n, 0));
1798 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001799 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001800 }
1801 m = n;
1802 do {
1803 m = CHILD(m, 0);
1804 } while (NCH(m) == 1);
1805 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001806 /* f(lambda x: x[0] = 3) ends up getting parsed with
1807 * LHS test = lambda x: x[0], and RHS test = 3.
1808 * SF bug 132313 points out that complaining about a keyword
1809 * then is very confusing.
1810 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001811 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001812 TYPE(m) == lambdef ?
1813 "lambda cannot contain assignment" :
1814 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001815 }
1816 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001817 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00001818 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00001819 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001820 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001821 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001822 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001823 else if (*pkeywords == NULL) {
1824 c->c_errors++;
1825 Py_DECREF(v);
1826 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001827 if (PyDict_GetItem(*pkeywords, v) != NULL)
1828 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001829 "duplicate keyword argument");
1830 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001831 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001832 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001833 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001834 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001835 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001836 }
1837 }
1838 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001839}
1840
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001841static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001842com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001843{
1844 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001845 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001846 }
1847 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001848 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001849 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001850 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001851 int star_flag = 0;
1852 int starstar_flag = 0;
1853 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001854 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001855 na = 0;
1856 nk = 0;
1857 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001858 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001859 if (TYPE(ch) == STAR ||
1860 TYPE(ch) == DOUBLESTAR)
1861 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001862 if (ch->n_lineno != lineno) {
1863 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001864 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00001865 }
1866 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001867 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001868 na++;
1869 else
1870 nk++;
1871 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001872 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001873 while (i < NCH(n)) {
1874 node *tok = CHILD(n, i);
1875 node *ch = CHILD(n, i+1);
1876 i += 3;
1877 switch (TYPE(tok)) {
1878 case STAR: star_flag = 1; break;
1879 case DOUBLESTAR: starstar_flag = 1; break;
1880 }
1881 com_node(c, ch);
1882 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001883 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001884 com_error(c, PyExc_SyntaxError,
1885 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001886 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001887 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001888 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001889 star_flag + (starstar_flag << 1);
1890 else
1891 opcode = CALL_FUNCTION;
1892 com_addoparg(c, opcode, na | (nk << 8));
1893 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001894 }
1895}
1896
1897static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001898com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001899{
1900 com_addopname(c, LOAD_ATTR, n);
1901}
1902
1903static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001904com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001905{
1906 int i=0;
1907 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001908 node *ch;
1909
1910 /* first argument */
1911 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001912 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001913 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001914 i++;
1915 }
1916 else {
1917 com_node(c, CHILD(n,i));
1918 i++;
1919 REQ(CHILD(n,i),COLON);
1920 i++;
1921 }
1922 /* second argument */
1923 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1924 com_node(c, CHILD(n,i));
1925 i++;
1926 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001927 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001928 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001929 com_push(c, 1);
1930 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001931 /* remaining arguments */
1932 for (; i < NCH(n); i++) {
1933 ns++;
1934 ch=CHILD(n,i);
1935 REQ(ch, sliceop);
1936 if (NCH(ch) == 1) {
1937 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001938 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001939 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001940 }
1941 else
1942 com_node(c, CHILD(ch,1));
1943 }
1944 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001945 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001946}
1947
1948static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001949com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001950{
1951 node *ch;
1952 REQ(n, subscript);
1953 ch = CHILD(n,0);
1954 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001955 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001956 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001957 com_push(c, 1);
1958 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001959 else {
1960 /* check for slice */
1961 if ((TYPE(ch) == COLON || NCH(n) > 1))
1962 com_sliceobj(c, n);
1963 else {
1964 REQ(ch, test);
1965 com_node(c, ch);
1966 }
1967 }
1968}
1969
1970static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001971com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001972{
1973 int i, op;
1974 REQ(n, subscriptlist);
1975 /* Check to make backward compatible slice behavior for '[i:j]' */
1976 if (NCH(n) == 1) {
1977 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001978 /* 'Basic' slice, should have exactly one colon. */
1979 if ((TYPE(CHILD(sub, 0)) == COLON
1980 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1981 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1982 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001983 switch (assigning) {
1984 case OP_DELETE:
1985 op = DELETE_SLICE;
1986 break;
1987 case OP_ASSIGN:
1988 op = STORE_SLICE;
1989 break;
1990 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001991 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001992 break;
1993 default:
1994 com_augassign_slice(c, sub, assigning, augn);
1995 return;
1996 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001997 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001998 if (op == STORE_SLICE)
1999 com_pop(c, 2);
2000 else if (op == DELETE_SLICE)
2001 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002002 return;
2003 }
2004 }
2005 /* Else normal subscriptlist. Compile each subscript. */
2006 for (i = 0; i < NCH(n); i += 2)
2007 com_subscript(c, CHILD(n, i));
2008 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002009 if (NCH(n) > 1) {
2010 i = (NCH(n)+1) / 2;
2011 com_addoparg(c, BUILD_TUPLE, i);
2012 com_pop(c, i-1);
2013 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002014 switch (assigning) {
2015 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002016 op = DELETE_SUBSCR;
2017 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002018 break;
2019 default:
2020 case OP_ASSIGN:
2021 op = STORE_SUBSCR;
2022 i = 3;
2023 break;
2024 case OP_APPLY:
2025 op = BINARY_SUBSCR;
2026 i = 1;
2027 break;
2028 }
2029 if (assigning > OP_APPLY) {
2030 com_addoparg(c, DUP_TOPX, 2);
2031 com_push(c, 2);
2032 com_addbyte(c, BINARY_SUBSCR);
2033 com_pop(c, 1);
2034 com_node(c, augn);
2035 com_addbyte(c, assigning);
2036 com_pop(c, 1);
2037 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002038 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002039 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002040 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002041}
2042
2043static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002044com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002045{
2046 REQ(n, trailer);
2047 switch (TYPE(CHILD(n, 0))) {
2048 case LPAR:
2049 com_call_function(c, CHILD(n, 1));
2050 break;
2051 case DOT:
2052 com_select_member(c, CHILD(n, 1));
2053 break;
2054 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002055 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002056 break;
2057 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002058 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002059 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002060 }
2061}
2062
2063static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002064com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002065{
2066 int i;
2067 REQ(n, power);
2068 com_atom(c, CHILD(n, 0));
2069 for (i = 1; i < NCH(n); i++) {
2070 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2071 com_factor(c, CHILD(n, i+1));
2072 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002073 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002074 break;
2075 }
2076 else
2077 com_apply_trailer(c, CHILD(n, i));
2078 }
2079}
2080
2081static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002082com_invert_constant(struct compiling *c, node *n)
2083{
2084 /* Compute the inverse of int and longs and use them directly,
2085 but be prepared to generate code for all other
2086 possibilities (invalid numbers, floats, complex).
2087 */
2088 PyObject *num, *inv = NULL;
2089 int i;
2090
2091 REQ(n, NUMBER);
2092 num = parsenumber(c, STR(n));
2093 if (num == NULL)
2094 i = 255;
2095 else {
2096 inv = PyNumber_Invert(num);
2097 if (inv == NULL) {
2098 PyErr_Clear();
2099 i = com_addconst(c, num);
2100 } else {
2101 i = com_addconst(c, inv);
2102 Py_DECREF(inv);
2103 }
2104 Py_DECREF(num);
2105 }
2106 com_addoparg(c, LOAD_CONST, i);
2107 com_push(c, 1);
2108 if (num != NULL && inv == NULL)
2109 com_addbyte(c, UNARY_INVERT);
2110}
2111
Tim Peters51e26512001-09-07 08:45:55 +00002112static int
2113is_float_zero(const char *p)
2114{
2115 int found_radix_point = 0;
2116 int ch;
2117 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2118 switch (ch) {
2119 case '0':
2120 /* no reason to believe it's not 0 -- continue */
2121 break;
2122
2123 case 'e': case 'E': case 'j': case 'J':
2124 /* If this was a hex constant, we already would have
2125 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2126 must be an exponent marker, and we haven't yet
2127 seen a non-zero digit, and it doesn't matter what
2128 the exponent is then. For 'j' or 'J' similarly,
2129 except that this is an imaginary 0 then. */
2130 return 1;
2131
2132 case '.':
2133 found_radix_point = 1;
2134 break;
2135
2136 default:
2137 return 0;
2138 }
2139 }
2140 return found_radix_point;
2141}
2142
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002143static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002144com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002145{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002146 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002147 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002148 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002149 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002150 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002151 approriate value as a constant. If the value is negative,
2152 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002153 negative in the 0th position -- unless we're doing unary minus
2154 of a floating zero! In that case the sign is significant, but
2155 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002156 */
2157 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002158 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002159 && TYPE((pfactor = CHILD(n, 1))) == factor
2160 && NCH(pfactor) == 1
2161 && TYPE((ppower = CHILD(pfactor, 0))) == power
2162 && NCH(ppower) == 1
2163 && TYPE((patom = CHILD(ppower, 0))) == atom
2164 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002165 && !(childtype == MINUS &&
2166 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002167 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002168 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002169 return;
2170 }
2171 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002172 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002173 if (s == NULL) {
2174 com_error(c, PyExc_MemoryError, "");
2175 com_addbyte(c, 255);
2176 return;
2177 }
2178 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002179 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002180 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002181 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002182 }
Tim Peters51e26512001-09-07 08:45:55 +00002183 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002184 }
2185 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002186 com_factor(c, CHILD(n, 1));
2187 com_addbyte(c, UNARY_POSITIVE);
2188 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002189 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002190 com_factor(c, CHILD(n, 1));
2191 com_addbyte(c, UNARY_NEGATIVE);
2192 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002193 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002194 com_factor(c, CHILD(n, 1));
2195 com_addbyte(c, UNARY_INVERT);
2196 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002197 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002198 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002199 }
2200}
2201
2202static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002203com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002204{
2205 int i;
2206 int op;
2207 REQ(n, term);
2208 com_factor(c, CHILD(n, 0));
2209 for (i = 2; i < NCH(n); i += 2) {
2210 com_factor(c, CHILD(n, i));
2211 switch (TYPE(CHILD(n, i-1))) {
2212 case STAR:
2213 op = BINARY_MULTIPLY;
2214 break;
2215 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002216 if (c->c_flags & CO_FUTURE_DIVISION)
2217 op = BINARY_TRUE_DIVIDE;
2218 else
2219 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002220 break;
2221 case PERCENT:
2222 op = BINARY_MODULO;
2223 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002224 case DOUBLESLASH:
2225 op = BINARY_FLOOR_DIVIDE;
2226 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002227 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002228 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002229 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002230 op = 255;
2231 }
2232 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002233 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002234 }
2235}
2236
2237static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002238com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002239{
2240 int i;
2241 int op;
2242 REQ(n, arith_expr);
2243 com_term(c, CHILD(n, 0));
2244 for (i = 2; i < NCH(n); i += 2) {
2245 com_term(c, CHILD(n, i));
2246 switch (TYPE(CHILD(n, i-1))) {
2247 case PLUS:
2248 op = BINARY_ADD;
2249 break;
2250 case MINUS:
2251 op = BINARY_SUBTRACT;
2252 break;
2253 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002254 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002255 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002256 op = 255;
2257 }
2258 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002259 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002260 }
2261}
2262
2263static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002264com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002265{
2266 int i;
2267 int op;
2268 REQ(n, shift_expr);
2269 com_arith_expr(c, CHILD(n, 0));
2270 for (i = 2; i < NCH(n); i += 2) {
2271 com_arith_expr(c, CHILD(n, i));
2272 switch (TYPE(CHILD(n, i-1))) {
2273 case LEFTSHIFT:
2274 op = BINARY_LSHIFT;
2275 break;
2276 case RIGHTSHIFT:
2277 op = BINARY_RSHIFT;
2278 break;
2279 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002280 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002281 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002282 op = 255;
2283 }
2284 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002285 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002286 }
2287}
2288
2289static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002290com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002291{
2292 int i;
2293 int op;
2294 REQ(n, and_expr);
2295 com_shift_expr(c, CHILD(n, 0));
2296 for (i = 2; i < NCH(n); i += 2) {
2297 com_shift_expr(c, CHILD(n, i));
2298 if (TYPE(CHILD(n, i-1)) == AMPER) {
2299 op = BINARY_AND;
2300 }
2301 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002302 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002303 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002304 op = 255;
2305 }
2306 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002307 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002308 }
2309}
2310
2311static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002312com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002313{
2314 int i;
2315 int op;
2316 REQ(n, xor_expr);
2317 com_and_expr(c, CHILD(n, 0));
2318 for (i = 2; i < NCH(n); i += 2) {
2319 com_and_expr(c, CHILD(n, i));
2320 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2321 op = BINARY_XOR;
2322 }
2323 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002324 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002325 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002326 op = 255;
2327 }
2328 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002329 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002330 }
2331}
2332
2333static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002334com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002335{
2336 int i;
2337 int op;
2338 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002339 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002340 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002341 com_xor_expr(c, CHILD(n, i));
2342 if (TYPE(CHILD(n, i-1)) == VBAR) {
2343 op = BINARY_OR;
2344 }
2345 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002346 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002347 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002348 op = 255;
2349 }
2350 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002351 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002352 }
2353}
2354
2355static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002356cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002357{
2358 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00002359 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002360 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2361 if (NCH(n) == 1) {
2362 n = CHILD(n, 0);
2363 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002364 case LESS: return PyCmp_LT;
2365 case GREATER: return PyCmp_GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002366 case EQEQUAL: /* == */
Martin v. Löwis7198a522002-01-01 19:59:11 +00002367 case EQUAL: return PyCmp_EQ;
2368 case LESSEQUAL: return PyCmp_LE;
2369 case GREATEREQUAL: return PyCmp_GE;
2370 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2371 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2372 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002373 }
2374 }
2375 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002376 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002377 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002378 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002379 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002380 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002381 }
2382 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002383 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002384}
2385
2386static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002387com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002388{
2389 int i;
2390 enum cmp_op op;
2391 int anchor;
2392 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2393 com_expr(c, CHILD(n, 0));
2394 if (NCH(n) == 1)
2395 return;
2396
2397 /****************************************************************
2398 The following code is generated for all but the last
2399 comparison in a chain:
2400
2401 label: on stack: opcode: jump to:
2402
2403 a <code to load b>
2404 a, b DUP_TOP
2405 a, b, b ROT_THREE
2406 b, a, b COMPARE_OP
2407 b, 0-or-1 JUMP_IF_FALSE L1
2408 b, 1 POP_TOP
2409 b
2410
2411 We are now ready to repeat this sequence for the next
2412 comparison in the chain.
2413
2414 For the last we generate:
2415
2416 b <code to load c>
2417 b, c COMPARE_OP
2418 0-or-1
2419
2420 If there were any jumps to L1 (i.e., there was more than one
2421 comparison), we generate:
2422
2423 0-or-1 JUMP_FORWARD L2
2424 L1: b, 0 ROT_TWO
2425 0, b POP_TOP
2426 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002427 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002428 ****************************************************************/
2429
2430 anchor = 0;
2431
2432 for (i = 2; i < NCH(n); i += 2) {
2433 com_expr(c, CHILD(n, i));
2434 if (i+2 < NCH(n)) {
2435 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002436 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002437 com_addbyte(c, ROT_THREE);
2438 }
2439 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002440 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002441 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002442 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002443 }
2444 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002445 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002446 if (i+2 < NCH(n)) {
2447 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2448 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002449 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002450 }
2451 }
2452
2453 if (anchor) {
2454 int anchor2 = 0;
2455 com_addfwref(c, JUMP_FORWARD, &anchor2);
2456 com_backpatch(c, anchor);
2457 com_addbyte(c, ROT_TWO);
2458 com_addbyte(c, POP_TOP);
2459 com_backpatch(c, anchor2);
2460 }
2461}
2462
2463static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002464com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002465{
2466 REQ(n, not_test); /* 'not' not_test | comparison */
2467 if (NCH(n) == 1) {
2468 com_comparison(c, CHILD(n, 0));
2469 }
2470 else {
2471 com_not_test(c, CHILD(n, 1));
2472 com_addbyte(c, UNARY_NOT);
2473 }
2474}
2475
2476static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002477com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002478{
2479 int i;
2480 int anchor;
2481 REQ(n, and_test); /* not_test ('and' not_test)* */
2482 anchor = 0;
2483 i = 0;
2484 for (;;) {
2485 com_not_test(c, CHILD(n, i));
2486 if ((i += 2) >= NCH(n))
2487 break;
2488 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2489 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002490 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002491 }
2492 if (anchor)
2493 com_backpatch(c, anchor);
2494}
2495
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002496static int
2497com_make_closure(struct compiling *c, PyCodeObject *co)
2498{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002499 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002500 if (free == 0)
2501 return 0;
2502 for (i = 0; i < free; ++i) {
2503 /* Bypass com_addop_varname because it will generate
2504 LOAD_DEREF but LOAD_CLOSURE is needed.
2505 */
2506 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2507 int arg, reftype;
2508
2509 /* Special case: If a class contains a method with a
2510 free variable that has the same name as a method,
2511 the name will be considered free *and* local in the
2512 class. It should be handled by the closure, as
2513 well as by the normal name loookup logic.
2514 */
2515 reftype = get_ref_type(c, PyString_AS_STRING(name));
2516 if (reftype == CELL)
2517 arg = com_lookup_arg(c->c_cellvars, name);
2518 else /* (reftype == FREE) */
2519 arg = com_lookup_arg(c->c_freevars, name);
2520 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002521 fprintf(stderr, "lookup %s in %s %d %d\n"
2522 "freevars of %s: %s\n",
2523 PyObject_REPR(name),
2524 c->c_name,
2525 reftype, arg,
2526 PyString_AS_STRING(co->co_name),
2527 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002528 Py_FatalError("com_make_closure()");
2529 }
2530 com_addoparg(c, LOAD_CLOSURE, arg);
2531
2532 }
2533 com_push(c, free);
2534 return 1;
2535}
2536
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002537static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002538com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002539{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002540 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002541 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002542 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002543 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002544 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002545 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2546 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002547 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002548 if (co == NULL) {
2549 c->c_errors++;
2550 return;
2551 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002552 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002553 i = com_addconst(c, (PyObject *)co);
2554 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002555 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002556 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002557 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002558 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002559 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002560 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002561 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002562 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002563 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002564 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002565 else {
2566 int anchor = 0;
2567 int i = 0;
2568 for (;;) {
2569 com_and_test(c, CHILD(n, i));
2570 if ((i += 2) >= NCH(n))
2571 break;
2572 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2573 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002574 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002575 }
2576 if (anchor)
2577 com_backpatch(c, anchor);
2578 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002579}
2580
2581static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002582com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002583{
2584 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002585 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002586 com_node(c, CHILD(n, 0));
2587 }
2588 else {
2589 int i;
2590 int len;
2591 len = (NCH(n) + 1) / 2;
2592 for (i = 0; i < NCH(n); i += 2)
2593 com_node(c, CHILD(n, i));
2594 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002595 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002596 }
2597}
2598
2599
2600/* Begin of assignment compilation */
2601
Thomas Wouters434d0822000-08-24 20:11:32 +00002602
2603static void
2604com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2605{
2606 com_addbyte(c, DUP_TOP);
2607 com_push(c, 1);
2608 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002609 com_node(c, augn);
2610 com_addbyte(c, opcode);
2611 com_pop(c, 1);
2612 com_addbyte(c, ROT_TWO);
2613 com_addopname(c, STORE_ATTR, n);
2614 com_pop(c, 2);
2615}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002616
2617static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002618com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002619{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00002620 if (none_assignment_check(c, STR(n), assigning))
2621 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002622 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002623 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002624}
2625
2626static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002627com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002628{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002629 REQ(n, trailer);
2630 switch (TYPE(CHILD(n, 0))) {
2631 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002632 if (assigning == OP_DELETE)
2633 com_error(c, PyExc_SyntaxError,
2634 "can't delete function call");
2635 else
2636 com_error(c, PyExc_SyntaxError,
2637 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002638 break;
2639 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002640 if (assigning > OP_APPLY)
2641 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2642 else
2643 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002644 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002645 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002646 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002647 break;
2648 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002649 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002650 }
2651}
2652
2653static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002654com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002655{
2656 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002657 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002658 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002659 if (assigning) {
2660 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002661 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002662 com_push(c, i-1);
2663 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002664 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002665 com_assign(c, CHILD(n, i), assigning, NULL);
2666}
2667
2668static void
2669com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2670{
2671 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002672 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002673 com_push(c, 1);
2674 com_node(c, augn);
2675 com_addbyte(c, opcode);
2676 com_pop(c, 1);
2677 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002678}
2679
2680static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002681com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002682{
2683 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002684 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002685 if (assigning)
2686 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002687}
2688
2689static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002690com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002691{
2692 /* Loop to avoid trivial recursion */
2693 for (;;) {
2694 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002695
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002696 case exprlist:
2697 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002698 case testlist1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002699 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002700 if (assigning > OP_APPLY) {
2701 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002702 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002703 return;
2704 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002705 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002706 return;
2707 }
2708 n = CHILD(n, 0);
2709 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002710
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002711 case test:
2712 case and_test:
2713 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002714 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002715 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002716 case xor_expr:
2717 case and_expr:
2718 case shift_expr:
2719 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002720 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002721 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002722 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002723 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002724 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002725 return;
2726 }
2727 n = CHILD(n, 0);
2728 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002729
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002730 case power: /* atom trailer* ('**' power)*
2731 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002732 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002733 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002734 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002735 return;
2736 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002737 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002738 int i;
2739 com_node(c, CHILD(n, 0));
2740 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002741 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002742 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002743 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002744 return;
2745 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002746 com_apply_trailer(c, CHILD(n, i));
2747 } /* NB i is still alive */
2748 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002749 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002750 return;
2751 }
2752 n = CHILD(n, 0);
2753 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002754
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002755 case atom:
2756 switch (TYPE(CHILD(n, 0))) {
2757 case LPAR:
2758 n = CHILD(n, 1);
2759 if (TYPE(n) == RPAR) {
2760 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002761 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002762 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002763 return;
2764 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002765 if (assigning > OP_APPLY) {
2766 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002767 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002768 return;
2769 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002770 break;
2771 case LSQB:
2772 n = CHILD(n, 1);
2773 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002774 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002775 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002776 return;
2777 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002778 if (assigning > OP_APPLY) {
2779 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002780 "augmented assign to list not possible");
2781 return;
2782 }
2783 if (NCH(n) > 1
2784 && TYPE(CHILD(n, 1)) == list_for) {
2785 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002786 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002787 return;
2788 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002789 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002790 return;
2791 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002792 if (assigning > OP_APPLY)
2793 com_augassign_name(c, CHILD(n, 0),
2794 assigning, augn);
2795 else
2796 com_assign_name(c, CHILD(n, 0),
2797 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002798 return;
2799 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002800 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002801 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002802 return;
2803 }
2804 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002805
2806 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002807 com_error(c, PyExc_SyntaxError,
2808 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002809 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002810
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002811 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002812 com_error(c, PyExc_SystemError,
2813 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002814 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002815
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002816 }
2817 }
2818}
Guido van Rossum7c531111997-03-11 18:42:21 +00002819
Thomas Wouters434d0822000-08-24 20:11:32 +00002820static void
2821com_augassign(struct compiling *c, node *n)
2822{
2823 int opcode;
2824
2825 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2826 case '+': opcode = INPLACE_ADD; break;
2827 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002828 case '/':
2829 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
2830 opcode = INPLACE_FLOOR_DIVIDE;
2831 else if (c->c_flags & CO_FUTURE_DIVISION)
2832 opcode = INPLACE_TRUE_DIVIDE;
2833 else
2834 opcode = INPLACE_DIVIDE;
2835 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00002836 case '%': opcode = INPLACE_MODULO; break;
2837 case '<': opcode = INPLACE_LSHIFT; break;
2838 case '>': opcode = INPLACE_RSHIFT; break;
2839 case '&': opcode = INPLACE_AND; break;
2840 case '^': opcode = INPLACE_XOR; break;
2841 case '|': opcode = INPLACE_OR; break;
2842 case '*':
2843 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2844 opcode = INPLACE_POWER;
2845 else
2846 opcode = INPLACE_MULTIPLY;
2847 break;
2848 default:
2849 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2850 return;
2851 }
2852 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2853}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002854
2855static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002856com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002857{
Thomas Wouters434d0822000-08-24 20:11:32 +00002858 REQ(n, expr_stmt);
2859 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002860 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002861 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002862 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002863 if (NCH(n) == 1) {
2864 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002865 if (c->c_interactive)
2866 com_addbyte(c, PRINT_EXPR);
2867 else
2868 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002869 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002870 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002871 else if (TYPE(CHILD(n,1)) == augassign)
2872 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002873 else {
2874 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002875 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002876 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002877 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002878 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002879 com_push(c, 1);
2880 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002881 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002882 }
2883 }
2884}
2885
2886static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002887com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002888{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002889 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002890 int i;
2891 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002892 if (Py_OptimizeFlag)
2893 return;
2894 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00002895
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002896 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00002897 raise AssertionError [, <message>]
2898
2899 where <message> is the second test, if present.
2900 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002901 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002902 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002903 com_addbyte(c, POP_TOP);
2904 com_pop(c, 1);
2905 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002906 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002907 com_push(c, 1);
2908 i = NCH(n)/2; /* Either 2 or 4 */
2909 if (i > 1)
2910 com_node(c, CHILD(n, 3));
2911 com_addoparg(c, RAISE_VARARGS, i);
2912 com_pop(c, i);
2913 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002914 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002915 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002916 com_addbyte(c, POP_TOP);
2917}
2918
2919static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002920com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002921{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002922 int i = 1;
2923 node* stream = NULL;
2924
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002925 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002926
2927 /* are we using the extended print form? */
2928 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2929 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002930 com_node(c, stream);
2931 /* stack: [...] => [... stream] */
2932 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002933 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2934 i = 4;
2935 else
2936 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002937 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002938 for (; i < NCH(n); i += 2) {
2939 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002940 com_addbyte(c, DUP_TOP);
2941 /* stack: [stream] => [stream stream] */
2942 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002943 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002944 /* stack: [stream stream] => [stream stream obj] */
2945 com_addbyte(c, ROT_TWO);
2946 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002947 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002948 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002949 com_pop(c, 2);
2950 }
2951 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002952 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002953 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002954 com_addbyte(c, PRINT_ITEM);
2955 com_pop(c, 1);
2956 }
2957 }
2958 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002959 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002960 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002961 /* must pop the extra stream object off the stack */
2962 com_addbyte(c, POP_TOP);
2963 /* stack: [... stream] => [...] */
2964 com_pop(c, 1);
2965 }
2966 }
2967 else {
2968 if (stream != NULL) {
2969 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002970 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002971 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002972 com_pop(c, 1);
2973 }
2974 else
2975 com_addbyte(c, PRINT_NEWLINE);
2976 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002977}
2978
2979static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002980com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002981{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002982 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002983 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002984 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002985 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002986 if (c->c_flags & CO_GENERATOR) {
2987 if (NCH(n) > 1) {
2988 com_error(c, PyExc_SyntaxError,
2989 "'return' with argument inside generator");
2990 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002991 }
2992 if (NCH(n) < 2) {
2993 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002994 com_push(c, 1);
2995 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002996 else
2997 com_node(c, CHILD(n, 1));
2998 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00002999 com_pop(c, 1);
3000}
3001
3002static void
3003com_yield_stmt(struct compiling *c, node *n)
3004{
Tim Peters95c80f82001-06-23 02:07:08 +00003005 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003006 REQ(n, yield_stmt); /* 'yield' testlist */
3007 if (!c->c_infunction) {
3008 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3009 }
Tim Peters95c80f82001-06-23 02:07:08 +00003010
3011 for (i = 0; i < c->c_nblocks; ++i) {
3012 if (c->c_block[i] == SETUP_FINALLY) {
3013 com_error(c, PyExc_SyntaxError,
3014 "'yield' not allowed in a 'try' block "
3015 "with a 'finally' clause");
3016 return;
3017 }
3018 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003019 com_node(c, CHILD(n, 1));
3020 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003021 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003022}
3023
3024static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003025com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003026{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003027 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003028 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3029 if (NCH(n) > 1) {
3030 com_node(c, CHILD(n, 1));
3031 if (NCH(n) > 3) {
3032 com_node(c, CHILD(n, 3));
3033 if (NCH(n) > 5)
3034 com_node(c, CHILD(n, 5));
3035 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003036 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003037 i = NCH(n)/2;
3038 com_addoparg(c, RAISE_VARARGS, i);
3039 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003040}
3041
3042static void
Thomas Wouters52152252000-08-17 22:55:00 +00003043com_from_import(struct compiling *c, node *n)
3044{
3045 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3046 com_push(c, 1);
3047 if (NCH(n) > 1) {
3048 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3049 com_error(c, PyExc_SyntaxError, "invalid syntax");
3050 return;
3051 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003052 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003053 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003054 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003055 com_pop(c, 1);
3056}
3057
3058static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003059com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003060{
3061 int i;
3062 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003063 /* 'import' dotted_name (',' dotted_name)* |
3064 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003065 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00003066 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003067 /* 'from' dotted_name 'import' ... */
3068 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003069
3070 if (TYPE(CHILD(n, 3)) == STAR) {
3071 tup = Py_BuildValue("(s)", "*");
3072 } else {
3073 tup = PyTuple_New((NCH(n) - 2)/2);
3074 for (i = 3; i < NCH(n); i += 2) {
3075 PyTuple_SET_ITEM(tup, (i-3)/2,
Guido van Rossum633d90c2002-12-23 16:51:42 +00003076 PyString_FromString(STR(
3077 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003078 }
3079 }
3080 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003081 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003082 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003083 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00003084 if (TYPE(CHILD(n, 3)) == STAR)
3085 com_addbyte(c, IMPORT_STAR);
3086 else {
3087 for (i = 3; i < NCH(n); i += 2)
3088 com_from_import(c, CHILD(n, i));
3089 com_addbyte(c, POP_TOP);
3090 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003091 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003092 }
3093 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003094 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003095 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003096 node *subn = CHILD(n, i);
3097 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003098 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003099 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003100 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003101 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003102 int j;
3103 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003104 com_error(c, PyExc_SyntaxError,
3105 "invalid syntax");
3106 return;
3107 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003108 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3109 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003110 CHILD(CHILD(subn, 0),
3111 j));
3112 com_addop_varname(c, VAR_STORE,
3113 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003114 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003115 com_addop_varname(c, VAR_STORE,
3116 STR(CHILD(CHILD(subn, 0),
3117 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003118 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003119 }
3120 }
3121}
3122
3123static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003124com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003125{
3126 REQ(n, exec_stmt);
3127 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3128 com_node(c, CHILD(n, 1));
3129 if (NCH(n) >= 4)
3130 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003131 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003132 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003133 com_push(c, 1);
3134 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003135 if (NCH(n) >= 6)
3136 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003137 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003138 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003139 com_push(c, 1);
3140 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003141 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003142 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003143}
3144
Guido van Rossum7c531111997-03-11 18:42:21 +00003145static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003146is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003147{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003148 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003149 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003150 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003151
3152 /* Label to avoid tail recursion */
3153 next:
3154 switch (TYPE(n)) {
3155
3156 case suite:
3157 if (NCH(n) == 1) {
3158 n = CHILD(n, 0);
3159 goto next;
3160 }
3161 /* Fall through */
3162 case file_input:
3163 for (i = 0; i < NCH(n); i++) {
3164 node *ch = CHILD(n, i);
3165 if (TYPE(ch) == stmt) {
3166 n = ch;
3167 goto next;
3168 }
3169 }
3170 break;
3171
3172 case stmt:
3173 case simple_stmt:
3174 case small_stmt:
3175 n = CHILD(n, 0);
3176 goto next;
3177
3178 case expr_stmt:
3179 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003180 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003181 case test:
3182 case and_test:
3183 case not_test:
3184 case comparison:
3185 case expr:
3186 case xor_expr:
3187 case and_expr:
3188 case shift_expr:
3189 case arith_expr:
3190 case term:
3191 case factor:
3192 case power:
3193 case atom:
3194 if (NCH(n) == 1) {
3195 n = CHILD(n, 0);
3196 goto next;
3197 }
3198 break;
3199
3200 case NAME:
3201 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3202 return 1;
3203 break;
3204
3205 case NUMBER:
3206 v = parsenumber(c, STR(n));
3207 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003208 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003209 break;
3210 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003211 i = PyObject_IsTrue(v);
3212 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003213 return i == 0;
3214
3215 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003216 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003217 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003218 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003219 break;
3220 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003221 i = PyObject_IsTrue(v);
3222 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003223 return i == 0;
3224
3225 }
3226 return 0;
3227}
3228
Tim Peters08a898f2001-06-28 01:52:22 +00003229
3230/* Look under n for a return stmt with an expression.
3231 * This hack is used to find illegal returns under "if 0:" blocks in
3232 * functions already known to be generators (as determined by the symtable
3233 * pass).
3234 * Return the offending return node if found, else NULL.
3235 */
3236static node *
3237look_for_offending_return(node *n)
3238{
3239 int i;
3240
3241 for (i = 0; i < NCH(n); ++i) {
3242 node *kid = CHILD(n, i);
3243
3244 switch (TYPE(kid)) {
3245 case classdef:
3246 case funcdef:
3247 case lambdef:
3248 /* Stuff in nested functions & classes doesn't
3249 affect the code block we started in. */
3250 return NULL;
3251
3252 case return_stmt:
3253 if (NCH(kid) > 1)
3254 return kid;
3255 break;
3256
3257 default: {
3258 node *bad = look_for_offending_return(kid);
3259 if (bad != NULL)
3260 return bad;
3261 }
3262 }
3263 }
3264
3265 return NULL;
3266}
3267
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003268static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003269com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003270{
3271 int i;
3272 int anchor = 0;
3273 REQ(n, if_stmt);
3274 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3275 for (i = 0; i+3 < NCH(n); i+=4) {
3276 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003277 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003278 if (is_constant_false(c, ch)) {
3279 /* We're going to skip this block. However, if this
3280 is a generator, we have to check the dead code
3281 anyway to make sure there aren't any return stmts
3282 with expressions, in the same scope. */
3283 if (c->c_flags & CO_GENERATOR) {
3284 node *p = look_for_offending_return(n);
3285 if (p != NULL) {
3286 int savelineno = c->c_lineno;
3287 c->c_lineno = p->n_lineno;
3288 com_error(c, PyExc_SyntaxError,
3289 "'return' with argument "
3290 "inside generator");
3291 c->c_lineno = savelineno;
3292 }
3293 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003294 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003295 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003296 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003297 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003298 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003299 com_addfwref(c, JUMP_IF_FALSE, &a);
3300 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003301 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003302 com_node(c, CHILD(n, i+3));
3303 com_addfwref(c, JUMP_FORWARD, &anchor);
3304 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003305 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003306 com_addbyte(c, POP_TOP);
3307 }
3308 if (i+2 < NCH(n))
3309 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003310 if (anchor)
3311 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003312}
3313
3314static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003315com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003316{
3317 int break_anchor = 0;
3318 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003319 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003320 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3321 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003322 block_push(c, SETUP_LOOP);
3323 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003324 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003325 com_node(c, CHILD(n, 1));
3326 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3327 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003328 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003329 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003330 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003331 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003332 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3333 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003334 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003335 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003336 com_addbyte(c, POP_TOP);
3337 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003338 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003339 if (NCH(n) > 4)
3340 com_node(c, CHILD(n, 6));
3341 com_backpatch(c, break_anchor);
3342}
3343
3344static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003345com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003346{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003347 int break_anchor = 0;
3348 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003349 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003350 REQ(n, for_stmt);
3351 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3352 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003353 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003354 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003355 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003356 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003357 com_set_lineno(c, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003358 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003359 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003360 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003361 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003362 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003363 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003364 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3365 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003366 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003367 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003368 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003369 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003370 if (NCH(n) > 8)
3371 com_node(c, CHILD(n, 8));
3372 com_backpatch(c, break_anchor);
3373}
3374
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003375/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003376
3377 SETUP_FINALLY L
3378 <code for S>
3379 POP_BLOCK
3380 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003381 L: <code for Sf>
3382 END_FINALLY
3383
3384 The special instructions use the block stack. Each block
3385 stack entry contains the instruction that created it (here
3386 SETUP_FINALLY), the level of the value stack at the time the
3387 block stack entry was created, and a label (here L).
3388
3389 SETUP_FINALLY:
3390 Pushes the current value stack level and the label
3391 onto the block stack.
3392 POP_BLOCK:
3393 Pops en entry from the block stack, and pops the value
3394 stack until its level is the same as indicated on the
3395 block stack. (The label is ignored.)
3396 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003397 Pops a variable number of entries from the *value* stack
3398 and re-raises the exception they specify. The number of
3399 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003400
3401 The block stack is unwound when an exception is raised:
3402 when a SETUP_FINALLY entry is found, the exception is pushed
3403 onto the value stack (and the exception condition is cleared),
3404 and the interpreter jumps to the label gotten from the block
3405 stack.
3406
3407 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003408 (The contents of the value stack is shown in [], with the top
3409 at the right; 'tb' is trace-back info, 'val' the exception's
3410 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003411
3412 Value stack Label Instruction Argument
3413 [] SETUP_EXCEPT L1
3414 [] <code for S>
3415 [] POP_BLOCK
3416 [] JUMP_FORWARD L0
3417
Guido van Rossum3f5da241990-12-20 15:06:42 +00003418 [tb, val, exc] L1: DUP )
3419 [tb, val, exc, exc] <evaluate E1> )
3420 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3421 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3422 [tb, val, exc, 1] POP )
3423 [tb, val, exc] POP
3424 [tb, val] <assign to V1> (or POP if no V1)
3425 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003426 [] <code for S1>
3427 JUMP_FORWARD L0
3428
Guido van Rossum3f5da241990-12-20 15:06:42 +00003429 [tb, val, exc, 0] L2: POP
3430 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003431 .............................etc.......................
3432
Guido van Rossum3f5da241990-12-20 15:06:42 +00003433 [tb, val, exc, 0] Ln+1: POP
3434 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003435
3436 [] L0: <next statement>
3437
3438 Of course, parts are not generated if Vi or Ei is not present.
3439*/
3440
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003441static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003442com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003443{
3444 int except_anchor = 0;
3445 int end_anchor = 0;
3446 int else_anchor = 0;
3447 int i;
3448 node *ch;
3449
3450 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3451 block_push(c, SETUP_EXCEPT);
3452 com_node(c, CHILD(n, 2));
3453 com_addbyte(c, POP_BLOCK);
3454 block_pop(c, SETUP_EXCEPT);
3455 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3456 com_backpatch(c, except_anchor);
3457 for (i = 3;
3458 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3459 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003460 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003461 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003462 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003463 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003464 break;
3465 }
3466 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003467 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003468 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003469 if (NCH(ch) > 1) {
3470 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003471 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003472 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003473 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003474 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003475 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3476 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003477 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003478 }
3479 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003480 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003481 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003482 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003483 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003484 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003485 com_pop(c, 1);
3486 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003487 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003488 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003489 com_node(c, CHILD(n, i+2));
3490 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3491 if (except_anchor) {
3492 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003493 /* We come in with [tb, val, exc, 0] on the
3494 stack; one pop and it's the same as
3495 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003496 com_addbyte(c, POP_TOP);
3497 }
3498 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003499 /* We actually come in here with [tb, val, exc] but the
3500 END_FINALLY will zap those and jump around.
3501 The c_stacklevel does not reflect them so we need not pop
3502 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003503 com_addbyte(c, END_FINALLY);
3504 com_backpatch(c, else_anchor);
3505 if (i < NCH(n))
3506 com_node(c, CHILD(n, i+2));
3507 com_backpatch(c, end_anchor);
3508}
3509
3510static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003511com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003512{
3513 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003514 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003515
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003516 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3517 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003518 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003519 com_addbyte(c, POP_BLOCK);
3520 block_pop(c, SETUP_FINALLY);
3521 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003522 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003523 /* While the generated code pushes only one item,
3524 the try-finally handling can enter here with
3525 up to three items. OK, here are the details:
3526 3 for an exception, 2 for RETURN, 1 for BREAK. */
3527 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003528 com_backpatch(c, finally_anchor);
3529 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003530 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003531 com_node(c, ch);
3532 com_addbyte(c, END_FINALLY);
3533 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003534 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003535}
3536
3537static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003538com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003539{
3540 REQ(n, try_stmt);
3541 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3542 | 'try' ':' suite 'finally' ':' suite */
3543 if (TYPE(CHILD(n, 3)) != except_clause)
3544 com_try_finally(c, n);
3545 else
3546 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003547}
3548
Guido van Rossum8b993a91997-01-17 21:04:03 +00003549static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003550get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003551{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003552 int i;
3553
Guido van Rossum8b993a91997-01-17 21:04:03 +00003554 /* Label to avoid tail recursion */
3555 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003556 switch (TYPE(n)) {
3557
3558 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003559 if (NCH(n) == 1) {
3560 n = CHILD(n, 0);
3561 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003562 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003563 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003564 case file_input:
3565 for (i = 0; i < NCH(n); i++) {
3566 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003567 if (TYPE(ch) == stmt) {
3568 n = ch;
3569 goto next;
3570 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003571 }
3572 break;
3573
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003574 case stmt:
3575 case simple_stmt:
3576 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003577 n = CHILD(n, 0);
3578 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003579
3580 case expr_stmt:
3581 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003582 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003583 case test:
3584 case and_test:
3585 case not_test:
3586 case comparison:
3587 case expr:
3588 case xor_expr:
3589 case and_expr:
3590 case shift_expr:
3591 case arith_expr:
3592 case term:
3593 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003594 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003595 if (NCH(n) == 1) {
3596 n = CHILD(n, 0);
3597 goto next;
3598 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003599 break;
3600
3601 case atom:
3602 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003603 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003604 break;
3605
3606 }
3607 return NULL;
3608}
3609
Guido van Rossum79f25d91997-04-29 20:08:16 +00003610static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003611get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003612{
Guido van Rossum541563e1999-01-28 15:08:09 +00003613 /* Don't generate doc-strings if run with -OO */
3614 if (Py_OptimizeFlag > 1)
3615 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003616 n = get_rawdocstring(n);
3617 if (n == NULL)
3618 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003619 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003620}
3621
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003622static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003623com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003624{
3625 REQ(n, suite);
3626 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3627 if (NCH(n) == 1) {
3628 com_node(c, CHILD(n, 0));
3629 }
3630 else {
3631 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003632 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003633 node *ch = CHILD(n, i);
3634 if (TYPE(ch) == stmt)
3635 com_node(c, ch);
3636 }
3637 }
3638}
3639
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003640/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003641static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003642com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003643{
3644 int i = c->c_nblocks;
3645 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3646 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3647 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003648 else if (i <= 0) {
3649 /* at the outer level */
3650 com_error(c, PyExc_SyntaxError,
3651 "'continue' not properly in loop");
3652 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003653 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003654 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003655 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003656 if (c->c_block[j] == SETUP_LOOP)
3657 break;
3658 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003659 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003660 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003661 for (; i > j; --i) {
3662 if (c->c_block[i] == SETUP_EXCEPT ||
3663 c->c_block[i] == SETUP_FINALLY) {
3664 com_addoparg(c, CONTINUE_LOOP,
3665 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003666 return;
3667 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003668 if (c->c_block[i] == END_FINALLY) {
3669 com_error(c, PyExc_SyntaxError,
3670 "'continue' not supported inside 'finally' clause");
3671 return;
3672 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003673 }
3674 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003675 com_error(c, PyExc_SyntaxError,
3676 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003677 }
3678 /* XXX Could allow it inside a 'finally' clause
3679 XXX if we could pop the exception still on the stack */
3680}
3681
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003682static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003683com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003684{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003685 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003686 if (TYPE(n) == lambdef) {
3687 /* lambdef: 'lambda' [varargslist] ':' test */
3688 n = CHILD(n, 1);
3689 }
3690 else {
3691 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3692 n = CHILD(n, 2);
3693 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3694 n = CHILD(n, 1);
3695 }
3696 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003697 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003698 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003699 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003700 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3701 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003702 nargs = 0;
3703 ndefs = 0;
3704 for (i = 0; i < nch; i++) {
3705 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003706 if (TYPE(CHILD(n, i)) == STAR ||
3707 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003708 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003709 nargs++;
3710 i++;
3711 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003712 t = RPAR; /* Anything except EQUAL or COMMA */
3713 else
3714 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003715 if (t == EQUAL) {
3716 i++;
3717 ndefs++;
3718 com_node(c, CHILD(n, i));
3719 i++;
3720 if (i >= nch)
3721 break;
3722 t = TYPE(CHILD(n, i));
3723 }
3724 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003725 /* Treat "(a=1, b)" as an error */
3726 if (ndefs)
3727 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003728 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003729 }
3730 if (t != COMMA)
3731 break;
3732 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003733 return ndefs;
3734}
3735
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003736static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003737com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003738{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003739 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003740 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003741 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003742 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003743 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3744 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003745 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003746 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003747 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003748 c->c_errors++;
3749 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003750 int closure = com_make_closure(c, (PyCodeObject *)co);
3751 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003752 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003753 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003754 if (closure)
3755 com_addoparg(c, MAKE_CLOSURE, ndefs);
3756 else
3757 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003758 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003759 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003760 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003761 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003762 }
3763}
3764
3765static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003766com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003767{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003768 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003769 REQ(n, testlist);
3770 /* testlist: test (',' test)* [','] */
3771 for (i = 0; i < NCH(n); i += 2)
3772 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003773 i = (NCH(n)+1) / 2;
3774 com_addoparg(c, BUILD_TUPLE, i);
3775 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003776}
3777
3778static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003779com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003780{
Guido van Rossum25831651993-05-19 14:50:45 +00003781 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003782 PyObject *v;
3783 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003784 char *name;
3785
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003786 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003787 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003788 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003789 c->c_errors++;
3790 return;
3791 }
3792 /* Push the class name on the stack */
3793 i = com_addconst(c, v);
3794 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003795 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003796 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003797 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003798 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003799 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003800 com_push(c, 1);
3801 }
Guido van Rossum25831651993-05-19 14:50:45 +00003802 else
3803 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003804 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003805 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003806 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003807 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003808 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003809 c->c_errors++;
3810 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003811 int closure = com_make_closure(c, co);
3812 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003813 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003814 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003815 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003816 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003817 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003818 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003819 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003820 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003821 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003822 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003823 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003824 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003825 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003826 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003827}
3828
3829static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003830com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003831{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003832 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003833 if (c->c_errors)
3834 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003835 switch (TYPE(n)) {
3836
3837 /* Definition nodes */
3838
3839 case funcdef:
3840 com_funcdef(c, n);
3841 break;
3842 case classdef:
3843 com_classdef(c, n);
3844 break;
3845
3846 /* Trivial parse tree nodes */
3847
3848 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003849 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003850 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003851 n = CHILD(n, 0);
3852 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003853
3854 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003855 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003856 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003857 {
3858 int i;
3859 for (i = 0; i < NCH(n)-1; i += 2)
3860 com_node(c, CHILD(n, i));
3861 }
3862 break;
3863
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003864 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003865 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003866 n = CHILD(n, 0);
3867 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003868
3869 /* Statement nodes */
3870
3871 case expr_stmt:
3872 com_expr_stmt(c, n);
3873 break;
3874 case print_stmt:
3875 com_print_stmt(c, n);
3876 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003877 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003878 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003879 break;
3880 case pass_stmt:
3881 break;
3882 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003883 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003884 com_error(c, PyExc_SyntaxError,
3885 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003886 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003887 com_addbyte(c, BREAK_LOOP);
3888 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003889 case continue_stmt:
3890 com_continue_stmt(c, n);
3891 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003892 case return_stmt:
3893 com_return_stmt(c, n);
3894 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003895 case yield_stmt:
3896 com_yield_stmt(c, n);
3897 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003898 case raise_stmt:
3899 com_raise_stmt(c, n);
3900 break;
3901 case import_stmt:
3902 com_import_stmt(c, n);
3903 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003904 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003905 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003906 case exec_stmt:
3907 com_exec_stmt(c, n);
3908 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003909 case assert_stmt:
3910 com_assert_stmt(c, n);
3911 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003912 case if_stmt:
3913 com_if_stmt(c, n);
3914 break;
3915 case while_stmt:
3916 com_while_stmt(c, n);
3917 break;
3918 case for_stmt:
3919 com_for_stmt(c, n);
3920 break;
3921 case try_stmt:
3922 com_try_stmt(c, n);
3923 break;
3924 case suite:
3925 com_suite(c, n);
3926 break;
3927
3928 /* Expression nodes */
3929
3930 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003931 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00003932 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003933 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003934 break;
3935 case test:
3936 com_test(c, n);
3937 break;
3938 case and_test:
3939 com_and_test(c, n);
3940 break;
3941 case not_test:
3942 com_not_test(c, n);
3943 break;
3944 case comparison:
3945 com_comparison(c, n);
3946 break;
3947 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003948 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003949 break;
3950 case expr:
3951 com_expr(c, n);
3952 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003953 case xor_expr:
3954 com_xor_expr(c, n);
3955 break;
3956 case and_expr:
3957 com_and_expr(c, n);
3958 break;
3959 case shift_expr:
3960 com_shift_expr(c, n);
3961 break;
3962 case arith_expr:
3963 com_arith_expr(c, n);
3964 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003965 case term:
3966 com_term(c, n);
3967 break;
3968 case factor:
3969 com_factor(c, n);
3970 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003971 case power:
3972 com_power(c, n);
3973 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003974 case atom:
3975 com_atom(c, n);
3976 break;
3977
3978 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003979 com_error(c, PyExc_SystemError,
3980 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003981 }
3982}
3983
Tim Petersdbd9ba62000-07-09 03:09:57 +00003984static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003985
3986static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003987com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003988{
3989 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3990 if (TYPE(CHILD(n, 0)) == LPAR)
3991 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003992 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003993 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003994 com_pop(c, 1);
3995 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003996}
3997
3998static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003999com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004000{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004001 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004002 if (NCH(n) == 1) {
4003 com_fpdef(c, CHILD(n, 0));
4004 }
4005 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004006 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004007 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004008 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004009 for (i = 0; i < NCH(n); i += 2)
4010 com_fpdef(c, CHILD(n, i));
4011 }
4012}
4013
4014static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004015com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004016{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004017 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004018 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004019 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004020 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004021 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004022 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004023 nch = NCH(n);
4024 /* Enter all arguments in table of locals */
4025 for (i = 0, narg = 0; i < nch; i++) {
4026 node *ch = CHILD(n, i);
4027 node *fp;
4028 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004029 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004030 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4031 fp = CHILD(ch, 0);
4032 if (TYPE(fp) != NAME) {
4033 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4034 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004035 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004036 narg++;
4037 /* all name updates handled by symtable */
4038 if (++i >= nch)
4039 break;
4040 ch = CHILD(n, i);
4041 if (TYPE(ch) == EQUAL)
4042 i += 2;
4043 else
4044 REQ(ch, COMMA);
4045 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004046 if (complex) {
4047 /* Generate code for complex arguments only after
4048 having counted the simple arguments */
4049 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004050 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004051 node *ch = CHILD(n, i);
4052 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004053 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004054 break;
4055 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4056 fp = CHILD(ch, 0);
4057 if (TYPE(fp) != NAME) {
4058 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004059 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004060 com_fpdef(c, ch);
4061 }
4062 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004063 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004064 break;
4065 ch = CHILD(n, i);
4066 if (TYPE(ch) == EQUAL)
4067 i += 2;
4068 else
4069 REQ(ch, COMMA);
4070 }
4071 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004072}
4073
4074static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004075com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004076{
4077 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004078 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004079 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004080 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004081 if (doc != NULL) {
4082 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004083 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004084 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004085 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004086 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004087 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004088 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004089 for (i = 0; i < NCH(n); i++) {
4090 node *ch = CHILD(n, i);
4091 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4092 com_node(c, ch);
4093 }
4094}
4095
4096/* Top-level compile-node interface */
4097
4098static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004099compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004100{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004101 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004102 node *ch;
4103 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00004104 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004105 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004106 if (doc != NULL) {
4107 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004108 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004109 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004110 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004111 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004112 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
4113 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004114 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004115 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004116 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004117 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004118 c->c_infunction = 0;
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004119 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4120 com_push(c, 1);
4121 com_addbyte(c, RETURN_VALUE);
4122 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004123}
4124
4125static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004126compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004127{
Guido van Rossum590baa41993-11-30 13:40:46 +00004128 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004129 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004130 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004131
4132 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004133 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004134 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004135 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004136 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004137 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004138 else
4139 ch = CHILD(n, 2);
4140 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004141 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004142 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004143}
4144
4145static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004146compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004147{
4148 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004149 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004150 REQ(n, classdef);
4151 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4152 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004153 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004154 /* Initialize local __module__ from global __name__ */
4155 com_addop_name(c, LOAD_GLOBAL, "__name__");
4156 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004157 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004158 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004159 if (doc != NULL) {
4160 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004161 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004162 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004163 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004164 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004165 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004166 }
4167 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004168 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004169 com_node(c, ch);
4170 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004171 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004172 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004173 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004174}
4175
4176static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004177compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004178{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004179 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004180
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004181 switch (TYPE(n)) {
4182
Guido van Rossum4c417781991-01-21 16:09:22 +00004183 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004184 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004185 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004186 n = CHILD(n, 0);
4187 if (TYPE(n) != NEWLINE)
4188 com_node(c, n);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004189 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4190 com_push(c, 1);
4191 com_addbyte(c, RETURN_VALUE);
4192 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004193 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004194 break;
4195
Guido van Rossum4c417781991-01-21 16:09:22 +00004196 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004197 com_file_input(c, n);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004198 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4199 com_push(c, 1);
4200 com_addbyte(c, RETURN_VALUE);
4201 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004202 break;
4203
Guido van Rossum590baa41993-11-30 13:40:46 +00004204 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004205 com_node(c, CHILD(n, 0));
4206 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004207 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004208 break;
4209
Guido van Rossum590baa41993-11-30 13:40:46 +00004210 case lambdef: /* anonymous function definition */
4211 compile_lambdef(c, n);
4212 break;
4213
Guido van Rossum4c417781991-01-21 16:09:22 +00004214 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004215 compile_funcdef(c, n);
4216 break;
4217
Guido van Rossum4c417781991-01-21 16:09:22 +00004218 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004219 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004220 break;
4221
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004222 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004223 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004224 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004225 }
4226}
4227
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004228static PyObject *
4229dict_keys_inorder(PyObject *dict, int offset)
4230{
4231 PyObject *tuple, *k, *v;
4232 int i, pos = 0, size = PyDict_Size(dict);
4233
4234 tuple = PyTuple_New(size);
4235 if (tuple == NULL)
4236 return NULL;
4237 while (PyDict_Next(dict, &pos, &k, &v)) {
4238 i = PyInt_AS_LONG(v);
4239 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004240 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004241 PyTuple_SET_ITEM(tuple, i - offset, k);
4242 }
4243 return tuple;
4244}
4245
Guido van Rossum79f25d91997-04-29 20:08:16 +00004246PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004247PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004248{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004249 return PyNode_CompileFlags(n, filename, NULL);
4250}
4251
4252PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004253PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004254{
4255 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004256}
4257
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004258struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004259PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004260{
4261 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004262 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004263
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004264 ff = PyNode_Future(n, filename);
4265 if (ff == NULL)
4266 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004267
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004268 st = symtable_init();
Tim Peters8c5e4152001-11-04 19:26:58 +00004269 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004270 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004271 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004272 }
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004273 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004274 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004275 if (st->st_errors > 0)
4276 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004277 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004278 if (st->st_errors > 0)
4279 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004280
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004281 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004282 fail:
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004283 PyObject_FREE((void *)ff);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004284 st->st_future = NULL;
4285 PySymtable_Free(st);
4286 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004287}
4288
Guido van Rossum79f25d91997-04-29 20:08:16 +00004289static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004290icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004291{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004292 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004293}
4294
Guido van Rossum79f25d91997-04-29 20:08:16 +00004295static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004296jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004297 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004298{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004299 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004300 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004301 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004302 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004303 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4304 sc.c_encoding = "utf-8";
4305 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004306 sc.c_encoding = STR(n);
4307 n = CHILD(n, 0);
4308 } else {
4309 sc.c_encoding = NULL;
4310 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004311 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004312 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004313 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004314 /* c_symtable still points to parent's symbols */
4315 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004316 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004317 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004318 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004319 if (base->c_encoding != NULL) {
4320 assert(sc.c_encoding == NULL);
4321 sc.c_encoding = base->c_encoding;
4322 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004323 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004324 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004325 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004326 if (sc.c_future == NULL) {
4327 com_free(&sc);
4328 return NULL;
4329 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004330 if (flags) {
4331 int merged = sc.c_future->ff_features |
4332 flags->cf_flags;
4333 sc.c_future->ff_features = merged;
4334 flags->cf_flags = merged;
4335 }
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004336 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004337 com_free(&sc);
4338 return NULL;
4339 }
4340 }
4341 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004342 if (symtable_load_symbols(&sc) < 0) {
4343 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004344 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004345 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004346 compile_node(&sc, n);
4347 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004348 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004349 PyObject *consts, *names, *varnames, *filename, *name,
4350 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004351 consts = PyList_AsTuple(sc.c_consts);
4352 names = PyList_AsTuple(sc.c_names);
4353 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004354 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4355 freevars = dict_keys_inorder(sc.c_freevars,
4356 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004357 filename = PyString_InternFromString(sc.c_filename);
4358 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004359 if (!PyErr_Occurred())
4360 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004361 sc.c_nlocals,
4362 sc.c_maxstacklevel,
4363 sc.c_flags,
4364 sc.c_code,
4365 consts,
4366 names,
4367 varnames,
4368 freevars,
4369 cellvars,
4370 filename,
4371 name,
4372 sc.c_firstlineno,
4373 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004374 Py_XDECREF(consts);
4375 Py_XDECREF(names);
4376 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004377 Py_XDECREF(freevars);
4378 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004379 Py_XDECREF(filename);
4380 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004381 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004382 else if (!PyErr_Occurred()) {
4383 /* This could happen if someone called PyErr_Clear() after an
4384 error was reported above. That's not supposed to happen,
4385 but I just plugged one case and I'm not sure there can't be
4386 others. In that case, raise SystemError so that at least
4387 it gets reported instead dumping core. */
4388 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4389 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004390 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004391 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004392 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004393 sc.c_symtable = NULL;
4394 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004395 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004396 return co;
4397}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004398
4399int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004400PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004401{
4402 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004403 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004404 int line = co->co_firstlineno;
4405 int addr = 0;
4406 while (--size >= 0) {
4407 addr += *p++;
4408 if (addr > addrq)
4409 break;
4410 line += *p++;
4411 }
4412 return line;
4413}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004414
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004415/* The test for LOCAL must come before the test for FREE in order to
4416 handle classes where name is both local and free. The local var is
4417 a method and the free var is a free var referenced within a method.
4418*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004419
4420static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004421get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004422{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004423 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004424 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004425
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004426 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4427 return CELL;
4428 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4429 return LOCAL;
4430 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4431 return FREE;
4432 v = PyDict_GetItemString(c->c_globals, name);
4433 if (v) {
4434 if (v == Py_None)
4435 return GLOBAL_EXPLICIT;
4436 else {
4437 return GLOBAL_IMPLICIT;
4438 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004439 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004440 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004441 "unknown scope for %.100s in %.100s(%s) "
4442 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4443 name, c->c_name,
4444 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4445 c->c_filename,
4446 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4447 PyObject_REPR(c->c_locals),
4448 PyObject_REPR(c->c_globals)
4449 );
4450
4451 Py_FatalError(buf);
4452 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004453}
4454
Guido van Rossum207fda62001-03-02 03:30:41 +00004455/* Helper functions to issue warnings */
4456
4457static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004458issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004459{
4460 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4461 lineno, NULL, NULL) < 0) {
4462 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4463 PyErr_SetString(PyExc_SyntaxError, msg);
4464 PyErr_SyntaxLocation(filename, lineno);
4465 }
4466 return -1;
4467 }
4468 return 0;
4469}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004470
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004471static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004472symtable_warn(struct symtable *st, char *msg)
4473{
Guido van Rossum207fda62001-03-02 03:30:41 +00004474 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004475 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004476 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004477 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004478 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004479}
4480
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004481/* Helper function for setting lineno and filename */
4482
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004483static int
4484symtable_build(struct compiling *c, node *n)
4485{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004486 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004487 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004488 c->c_symtable->st_future = c->c_future;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004489 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004490 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4491 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004492 return -1;
4493 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004494 if (c->c_symtable->st_errors > 0)
4495 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004496 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004497 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004498 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004499 return 0;
4500}
4501
4502static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004503symtable_init_compiling_symbols(struct compiling *c)
4504{
4505 PyObject *varnames;
4506
4507 varnames = c->c_symtable->st_cur->ste_varnames;
4508 if (varnames == NULL) {
4509 varnames = PyList_New(0);
4510 if (varnames == NULL)
4511 return -1;
4512 c->c_symtable->st_cur->ste_varnames = varnames;
4513 Py_INCREF(varnames);
4514 } else
4515 Py_INCREF(varnames);
4516 c->c_varnames = varnames;
4517
4518 c->c_globals = PyDict_New();
4519 if (c->c_globals == NULL)
4520 return -1;
4521 c->c_freevars = PyDict_New();
4522 if (c->c_freevars == NULL)
4523 return -1;
4524 c->c_cellvars = PyDict_New();
4525 if (c->c_cellvars == NULL)
4526 return -1;
4527 return 0;
4528}
4529
4530struct symbol_info {
4531 int si_nlocals;
4532 int si_ncells;
4533 int si_nfrees;
4534 int si_nimplicit;
4535};
4536
4537static void
4538symtable_init_info(struct symbol_info *si)
4539{
4540 si->si_nlocals = 0;
4541 si->si_ncells = 0;
4542 si->si_nfrees = 0;
4543 si->si_nimplicit = 0;
4544}
4545
4546static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004547symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004548 struct symbol_info *si)
4549{
4550 PyObject *dict, *v;
4551
4552 /* Seperate logic for DEF_FREE. If it occurs in a function,
4553 it indicates a local that we must allocate storage for (a
4554 cell var). If it occurs in a class, then the class has a
4555 method and a free variable with the same name.
4556 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004557 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004558 /* If it isn't declared locally, it can't be a cell. */
4559 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4560 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004561 v = PyInt_FromLong(si->si_ncells++);
4562 dict = c->c_cellvars;
4563 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004564 /* If it is free anyway, then there is no need to do
4565 anything here.
4566 */
4567 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004568 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004569 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004570 v = PyInt_FromLong(si->si_nfrees++);
4571 dict = c->c_freevars;
4572 }
4573 if (v == NULL)
4574 return -1;
4575 if (PyDict_SetItem(dict, name, v) < 0) {
4576 Py_DECREF(v);
4577 return -1;
4578 }
4579 Py_DECREF(v);
4580 return 0;
4581}
4582
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004583/* If a variable is a cell and an argument, make sure that appears in
4584 co_cellvars before any variable to its right in varnames.
4585*/
4586
4587
4588static int
4589symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4590 PyObject *varnames, int flags)
4591{
Tim Petersb39903b2003-03-24 17:22:24 +00004592 PyObject *v = NULL;
4593 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004594 int i, pos;
4595
4596 if (flags & CO_VARARGS)
4597 argcount++;
4598 if (flags & CO_VARKEYWORDS)
4599 argcount++;
4600 for (i = argcount; --i >= 0; ) {
4601 v = PyList_GET_ITEM(varnames, i);
4602 if (PyDict_GetItem(*cellvars, v)) {
4603 if (list == NULL) {
4604 list = PyList_New(1);
4605 if (list == NULL)
4606 return -1;
4607 PyList_SET_ITEM(list, 0, v);
4608 Py_INCREF(v);
4609 } else
4610 PyList_Insert(list, 0, v);
4611 }
4612 }
4613 if (list == NULL || PyList_GET_SIZE(list) == 0)
4614 return 0;
4615 /* There are cellvars that are also arguments. Create a dict
4616 to replace cellvars and put the args at the front.
4617 */
4618 d = PyDict_New();
4619 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4620 v = PyInt_FromLong(i);
4621 if (v == NULL)
4622 goto fail;
4623 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4624 goto fail;
4625 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4626 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00004627 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004628 }
4629 pos = 0;
4630 i = PyList_GET_SIZE(list);
4631 Py_DECREF(list);
4632 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4633 w = PyInt_FromLong(i++); /* don't care about the old key */
4634 if (PyDict_SetItem(d, v, w) < 0) {
4635 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00004636 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004637 goto fail;
4638 }
4639 Py_DECREF(w);
4640 }
4641 Py_DECREF(*cellvars);
4642 *cellvars = d;
4643 return 1;
4644 fail:
4645 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00004646 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004647 return -1;
4648}
4649
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004650static int
4651symtable_freevar_offsets(PyObject *freevars, int offset)
4652{
4653 PyObject *name, *v;
4654 int pos;
4655
4656 /* The cell vars are the first elements of the closure,
4657 followed by the free vars. Update the offsets in
4658 c_freevars to account for number of cellvars. */
4659 pos = 0;
4660 while (PyDict_Next(freevars, &pos, &name, &v)) {
4661 int i = PyInt_AS_LONG(v) + offset;
4662 PyObject *o = PyInt_FromLong(i);
4663 if (o == NULL)
4664 return -1;
4665 if (PyDict_SetItem(freevars, name, o) < 0) {
4666 Py_DECREF(o);
4667 return -1;
4668 }
4669 Py_DECREF(o);
4670 }
4671 return 0;
4672}
4673
4674static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004675symtable_check_unoptimized(struct compiling *c,
4676 PySymtableEntryObject *ste,
4677 struct symbol_info *si)
4678{
4679 char buf[300];
4680
4681 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4682 || (ste->ste_nested && si->si_nimplicit)))
4683 return 0;
4684
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004685#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4686
4687#define ILLEGAL_IS "is a nested function"
4688
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004689#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004690"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004691
4692#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004693"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004694
4695#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00004696"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004697"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004698
4699 /* XXX perhaps the linenos for these opt-breaking statements
4700 should be stored so the exception can point to them. */
4701
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004702 if (ste->ste_child_free) {
4703 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004704 PyOS_snprintf(buf, sizeof(buf),
4705 ILLEGAL_IMPORT_STAR,
4706 PyString_AS_STRING(ste->ste_name),
4707 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004708 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004709 PyOS_snprintf(buf, sizeof(buf),
4710 ILLEGAL_BARE_EXEC,
4711 PyString_AS_STRING(ste->ste_name),
4712 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004713 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004714 PyOS_snprintf(buf, sizeof(buf),
4715 ILLEGAL_EXEC_AND_IMPORT_STAR,
4716 PyString_AS_STRING(ste->ste_name),
4717 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004718 }
4719 } else {
4720 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004721 PyOS_snprintf(buf, sizeof(buf),
4722 ILLEGAL_IMPORT_STAR,
4723 PyString_AS_STRING(ste->ste_name),
4724 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004725 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004726 PyOS_snprintf(buf, sizeof(buf),
4727 ILLEGAL_BARE_EXEC,
4728 PyString_AS_STRING(ste->ste_name),
4729 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004730 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004731 PyOS_snprintf(buf, sizeof(buf),
4732 ILLEGAL_EXEC_AND_IMPORT_STAR,
4733 PyString_AS_STRING(ste->ste_name),
4734 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004735 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004736 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004737
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004738 PyErr_SetString(PyExc_SyntaxError, buf);
4739 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4740 ste->ste_opt_lineno);
4741 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004742}
4743
4744static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004745symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4746 struct symbol_info *si)
4747{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004748 if (c->c_future)
4749 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004750 if (ste->ste_generator)
4751 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004752 if (ste->ste_type != TYPE_MODULE)
4753 c->c_flags |= CO_NEWLOCALS;
4754 if (ste->ste_type == TYPE_FUNCTION) {
4755 c->c_nlocals = si->si_nlocals;
4756 if (ste->ste_optimized == 0)
4757 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004758 else if (ste->ste_optimized != OPT_EXEC)
4759 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004760 }
4761 return 0;
4762}
4763
4764static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004765symtable_load_symbols(struct compiling *c)
4766{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004767 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004768 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004769 PyObject *name, *varnames, *v;
4770 int i, flags, pos;
4771 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004772
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004773 v = NULL;
4774
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004775 if (symtable_init_compiling_symbols(c) < 0)
4776 goto fail;
4777 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004778 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004779 si.si_nlocals = PyList_GET_SIZE(varnames);
4780 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004781
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004782 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004783 v = PyInt_FromLong(i);
4784 if (PyDict_SetItem(c->c_locals,
4785 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004786 goto fail;
4787 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004788 }
4789
4790 /* XXX The cases below define the rules for whether a name is
4791 local or global. The logic could probably be clearer. */
4792 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004793 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4794 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004795
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004796 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004797 /* undo the original DEF_FREE */
4798 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004799
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004800 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004801 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004802 2. Free variables in methods that are also class
4803 variables or declared global.
4804 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004805 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004806 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004807
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004808 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004809 c->c_argcount--;
4810 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004811 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004812 c->c_argcount--;
4813 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004814 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004815 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004816 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004817 if (flags & DEF_PARAM) {
4818 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004819 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004820 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004821 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004822 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004823 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004824 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004825 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4826 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004827 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004828 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00004829 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004830 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004831 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004832 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004833 if (v == NULL)
4834 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004835 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004836 goto fail;
4837 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004838 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004839 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004840 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004841 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004842 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004843 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004844 if (v == NULL)
4845 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004846 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004847 goto fail;
4848 Py_DECREF(v);
4849 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004850 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004851 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00004852 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004853 goto fail;
4854 if (st->st_nscopes != 1) {
4855 v = PyInt_FromLong(flags);
4856 if (PyDict_SetItem(st->st_global,
4857 name, v))
4858 goto fail;
4859 Py_DECREF(v);
4860 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004861 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004862 }
4863 }
4864
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004865 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4866
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004867 if (si.si_ncells > 1) { /* one cell is always in order */
4868 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4869 c->c_varnames, c->c_flags) < 0)
4870 return -1;
4871 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004872 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4873 return -1;
4874 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004875 fail:
4876 /* is this always the right thing to do? */
4877 Py_XDECREF(v);
4878 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004879}
4880
4881static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004882symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004883{
4884 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004885
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004886 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004887 if (st == NULL)
4888 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004889 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00004890
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004891 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004892 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004893 goto fail;
4894 if ((st->st_symbols = PyDict_New()) == NULL)
4895 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004896 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004897 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004898 st->st_errors = 0;
4899 st->st_tmpname = 0;
4900 st->st_private = NULL;
4901 return st;
4902 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004903 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004904 return NULL;
4905}
4906
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004907void
4908PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004909{
4910 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004911 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004912 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004913 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004914}
4915
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004916/* When the compiler exits a scope, it must should update the scope's
4917 free variable information with the list of free variables in its
4918 children.
4919
4920 Variables that are free in children and defined in the current
4921 scope are cellvars.
4922
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004923 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004924 false), free variables in children that are not defined here are
4925 implicit globals.
4926
4927*/
4928
4929static int
4930symtable_update_free_vars(struct symtable *st)
4931{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004932 int i, j, def;
4933 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004934 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004935
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004936 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004937 def = DEF_FREE_CLASS;
4938 else
4939 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004940 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004941 int pos = 0;
4942
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004943 if (list)
4944 PyList_SetSlice(list, 0,
4945 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004946 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004947 PyList_GET_ITEM(ste->ste_children, i);
4948 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004949 int flags = PyInt_AS_LONG(o);
4950 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004951 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004952 if (list == NULL) {
4953 list = PyList_New(0);
4954 if (list == NULL)
4955 return -1;
4956 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004957 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004958 if (PyList_Append(list, name) < 0) {
4959 Py_DECREF(list);
4960 return -1;
4961 }
4962 }
4963 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004964 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004965 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004966 v = PyDict_GetItem(ste->ste_symbols, name);
4967 /* If a name N is declared global in scope A and
4968 referenced in scope B contained (perhaps
4969 indirectly) in A and there are no scopes
4970 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004971 is global in B. Unless A is a class scope,
4972 because class scopes are not considered for
4973 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004974 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004975 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004976 int flags = PyInt_AS_LONG(v);
4977 if (flags & DEF_GLOBAL) {
4978 symtable_undo_free(st, child->ste_id,
4979 name);
4980 continue;
4981 }
4982 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004983 if (ste->ste_nested) {
4984 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004985 name, def) < 0) {
4986 Py_DECREF(list);
4987 return -1;
4988 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004989 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004990 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004991 name) < 0) {
4992 Py_DECREF(list);
4993 return -1;
4994 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004995 }
4996 }
4997 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004998
4999 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005000 return 0;
5001}
5002
5003/* If the current scope is a non-nested class or if name is not
5004 defined in the current, non-nested scope, then it is an implicit
5005 global in all nested scopes.
5006*/
5007
5008static int
5009symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5010{
5011 PyObject *o;
5012 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005013 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005014
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005015 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005016 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005017 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005018 if (o == NULL)
5019 return symtable_undo_free(st, child, name);
5020 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005021
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005022 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005023 return symtable_undo_free(st, child, name);
5024 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005025 return symtable_add_def_o(st, ste->ste_symbols,
5026 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005027}
5028
5029static int
5030symtable_undo_free(struct symtable *st, PyObject *id,
5031 PyObject *name)
5032{
5033 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005034 PyObject *info;
5035 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005036
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005037 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5038 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005039 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005040
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005041 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005042 if (info == NULL)
5043 return 0;
5044 v = PyInt_AS_LONG(info);
5045 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005046 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005047 DEF_FREE_GLOBAL) < 0)
5048 return -1;
5049 } else
5050 /* If the name is defined here or declared global,
5051 then the recursion stops. */
5052 return 0;
5053
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005054 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5055 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005056 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005057 PyList_GET_ITEM(ste->ste_children, i);
5058 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005059 if (x < 0)
5060 return x;
5061 }
5062 return 0;
5063}
5064
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005065/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5066 This reference is released when the scope is exited, via the DECREF
5067 in symtable_exit_scope().
5068*/
5069
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005070static int
5071symtable_exit_scope(struct symtable *st)
5072{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005073 int end;
5074
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005075 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005076 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005077 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005078 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005079 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5080 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005081 if (PySequence_DelItem(st->st_stack, end) < 0)
5082 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005083 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005084}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005085
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005086static void
5087symtable_enter_scope(struct symtable *st, char *name, int type,
5088 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005089{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005090 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005091
5092 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005093 prev = st->st_cur;
5094 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
5095 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005096 st->st_errors++;
5097 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005098 }
5099 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005100 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005101 PySymtableEntry_New(st, name, type, lineno);
5102 if (strcmp(name, TOP) == 0)
5103 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005104 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005105 if (PyList_Append(prev->ste_children,
5106 (PyObject *)st->st_cur) < 0)
5107 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005108 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005109}
5110
5111static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005112symtable_lookup(struct symtable *st, char *name)
5113{
5114 char buffer[MANGLE_LEN];
5115 PyObject *v;
5116 int flags;
5117
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005118 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005119 name = buffer;
5120 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5121 if (v == NULL) {
5122 if (PyErr_Occurred())
5123 return -1;
5124 else
5125 return 0;
5126 }
5127
5128 flags = PyInt_AS_LONG(v);
5129 return flags;
5130}
5131
5132static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005133symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005134{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005135 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005136 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005137 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005138
Guido van Rossumb7164622002-08-16 02:48:11 +00005139 /* Warn about None, except inside a tuple (where the assignment
5140 code already issues a warning). */
5141 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5142 *name == 'N' && strcmp(name, "None") == 0)
5143 {
5144 if (symtable_warn(st, "argument named None"))
5145 return -1;
5146 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005147 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005148 name = buffer;
5149 if ((s = PyString_InternFromString(name)) == NULL)
5150 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005151 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5152 Py_DECREF(s);
5153 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005154}
5155
5156/* Must only be called with mangled names */
5157
5158static int
5159symtable_add_def_o(struct symtable *st, PyObject *dict,
5160 PyObject *name, int flag)
5161{
5162 PyObject *o;
5163 int val;
5164
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005165 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005166 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005167 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005168 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005169 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005170 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005171 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005172 return -1;
5173 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005174 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005175 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005176 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005177 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005178 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005179 Py_DECREF(o);
5180 return -1;
5181 }
5182 Py_DECREF(o);
5183
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005184 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005185 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005186 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005187 } else if (flag & DEF_GLOBAL) {
5188 /* XXX need to update DEF_GLOBAL for other flags too;
5189 perhaps only DEF_FREE_GLOBAL */
5190 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005191 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005192 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005193 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005194 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005195 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005196 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005197 Py_DECREF(o);
5198 return -1;
5199 }
5200 Py_DECREF(o);
5201 }
5202 return 0;
5203}
5204
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005205#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005206
Tim Peters08a898f2001-06-28 01:52:22 +00005207/* Look for a yield stmt under n. Return 1 if found, else 0.
5208 This hack is used to look inside "if 0:" blocks (which are normally
5209 ignored) in case those are the only places a yield occurs (so that this
5210 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005211static int
5212look_for_yield(node *n)
5213{
5214 int i;
5215
5216 for (i = 0; i < NCH(n); ++i) {
5217 node *kid = CHILD(n, i);
5218
5219 switch (TYPE(kid)) {
5220
5221 case classdef:
5222 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005223 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005224 /* Stuff in nested functions and classes can't make
5225 the parent a generator. */
5226 return 0;
5227
5228 case yield_stmt:
5229 return 1;
5230
5231 default:
5232 if (look_for_yield(kid))
5233 return 1;
5234 }
5235 }
5236 return 0;
5237}
5238
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005239static void
5240symtable_node(struct symtable *st, node *n)
5241{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005242 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005243
5244 loop:
5245 switch (TYPE(n)) {
5246 case funcdef: {
5247 char *func_name = STR(CHILD(n, 1));
5248 symtable_add_def(st, func_name, DEF_LOCAL);
5249 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005250 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005251 symtable_funcdef(st, n);
5252 symtable_exit_scope(st);
5253 break;
5254 }
5255 case lambdef:
5256 if (NCH(n) == 4)
5257 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005258 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005259 symtable_funcdef(st, n);
5260 symtable_exit_scope(st);
5261 break;
5262 case classdef: {
5263 char *tmp, *class_name = STR(CHILD(n, 1));
5264 symtable_add_def(st, class_name, DEF_LOCAL);
5265 if (TYPE(CHILD(n, 2)) == LPAR) {
5266 node *bases = CHILD(n, 3);
5267 int i;
5268 for (i = 0; i < NCH(bases); i += 2) {
5269 symtable_node(st, CHILD(bases, i));
5270 }
5271 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005272 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005273 tmp = st->st_private;
5274 st->st_private = class_name;
5275 symtable_node(st, CHILD(n, NCH(n) - 1));
5276 st->st_private = tmp;
5277 symtable_exit_scope(st);
5278 break;
5279 }
5280 case if_stmt:
5281 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005282 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5283 if (st->st_cur->ste_generator == 0)
5284 st->st_cur->ste_generator =
5285 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005286 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005287 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005288 symtable_node(st, CHILD(n, i + 1));
5289 symtable_node(st, CHILD(n, i + 3));
5290 }
5291 if (i + 2 < NCH(n))
5292 symtable_node(st, CHILD(n, i + 2));
5293 break;
5294 case global_stmt:
5295 symtable_global(st, n);
5296 break;
5297 case import_stmt:
5298 symtable_import(st, n);
5299 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005300 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005301 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005302 symtable_node(st, CHILD(n, 1));
5303 if (NCH(n) > 2)
5304 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005305 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005306 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005307 st->st_cur->ste_opt_lineno = n->n_lineno;
5308 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005309 if (NCH(n) > 4)
5310 symtable_node(st, CHILD(n, 5));
5311 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005312
5313 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005314 case assert_stmt:
5315 if (Py_OptimizeFlag)
5316 return;
5317 if (NCH(n) == 2) {
5318 n = CHILD(n, 1);
5319 goto loop;
5320 } else {
5321 symtable_node(st, CHILD(n, 1));
5322 n = CHILD(n, 3);
5323 goto loop;
5324 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005325 case except_clause:
5326 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005327 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005328 if (NCH(n) > 1) {
5329 n = CHILD(n, 1);
5330 goto loop;
5331 }
5332 break;
5333 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005334 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005335 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005336 case yield_stmt:
5337 st->st_cur->ste_generator = 1;
5338 n = CHILD(n, 1);
5339 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005340 case expr_stmt:
5341 if (NCH(n) == 1)
5342 n = CHILD(n, 0);
5343 else {
5344 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005345 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005346 symtable_node(st, CHILD(n, 2));
5347 break;
5348 } else {
5349 int i;
5350 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005351 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005352 n = CHILD(n, NCH(n) - 1);
5353 }
5354 }
5355 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005356 case list_iter:
5357 n = CHILD(n, 0);
5358 if (TYPE(n) == list_for) {
5359 st->st_tmpname++;
5360 symtable_list_comprehension(st, n);
5361 st->st_tmpname--;
5362 } else {
5363 REQ(n, list_if);
5364 symtable_node(st, CHILD(n, 1));
5365 if (NCH(n) == 3) {
5366 n = CHILD(n, 2);
5367 goto loop;
5368 }
5369 }
5370 break;
5371 case for_stmt:
5372 symtable_assign(st, CHILD(n, 1), 0);
5373 for (i = 3; i < NCH(n); ++i)
5374 if (TYPE(CHILD(n, i)) >= single_input)
5375 symtable_node(st, CHILD(n, i));
5376 break;
5377 /* The remaining cases fall through to default except in
5378 special circumstances. This requires the individual cases
5379 to be coded with great care, even though they look like
5380 rather innocuous. Each case must double-check TYPE(n).
5381 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005382 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005383 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005384 n = CHILD(n, 2);
5385 goto loop;
5386 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005387 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005388 case listmaker:
5389 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00005390 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005391 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00005392 symtable_node(st, CHILD(n, 0));
5393 st->st_tmpname--;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005394 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005395 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005396 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005397 case atom:
5398 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5399 symtable_add_use(st, STR(CHILD(n, 0)));
5400 break;
5401 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005402 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005403 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005404 /* Walk over every non-token child with a special case
5405 for one child.
5406 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005407 if (NCH(n) == 1) {
5408 n = CHILD(n, 0);
5409 goto loop;
5410 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005411 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005412 if (TYPE(CHILD(n, i)) >= single_input)
5413 symtable_node(st, CHILD(n, i));
5414 }
5415}
5416
5417static void
5418symtable_funcdef(struct symtable *st, node *n)
5419{
5420 node *body;
5421
5422 if (TYPE(n) == lambdef) {
5423 if (NCH(n) == 4)
5424 symtable_params(st, CHILD(n, 1));
5425 } else
5426 symtable_params(st, CHILD(n, 2));
5427 body = CHILD(n, NCH(n) - 1);
5428 symtable_node(st, body);
5429}
5430
5431/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00005432 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005433 which are references in the defining scope. symtable_params()
5434 parses the parameter names, which are defined in the function's
5435 body.
5436
5437 varargslist:
5438 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5439 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5440*/
5441
5442static void
5443symtable_default_args(struct symtable *st, node *n)
5444{
5445 node *c;
5446 int i;
5447
5448 if (TYPE(n) == parameters) {
5449 n = CHILD(n, 1);
5450 if (TYPE(n) == RPAR)
5451 return;
5452 }
5453 REQ(n, varargslist);
5454 for (i = 0; i < NCH(n); i += 2) {
5455 c = CHILD(n, i);
5456 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5457 break;
5458 }
5459 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5460 symtable_node(st, CHILD(n, i));
5461 }
5462}
5463
5464static void
5465symtable_params(struct symtable *st, node *n)
5466{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005467 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00005468 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005469
5470 if (TYPE(n) == parameters) {
5471 n = CHILD(n, 1);
5472 if (TYPE(n) == RPAR)
5473 return;
5474 }
5475 REQ(n, varargslist);
5476 for (i = 0; i < NCH(n); i += 2) {
5477 c = CHILD(n, i);
5478 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5479 ext = 1;
5480 break;
5481 }
5482 if (TYPE(c) == test) {
5483 continue;
5484 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00005485 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005486 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00005487 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005488 char nbuf[30];
5489 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005490 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005491 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005492 }
5493 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005494 if (ext) {
5495 c = CHILD(n, i);
5496 if (TYPE(c) == STAR) {
5497 i++;
5498 symtable_add_def(st, STR(CHILD(n, i)),
5499 DEF_PARAM | DEF_STAR);
5500 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005501 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005502 c = NULL;
5503 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005504 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005505 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005506 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005507 i++;
5508 symtable_add_def(st, STR(CHILD(n, i)),
5509 DEF_PARAM | DEF_DOUBLESTAR);
5510 }
5511 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005512 if (complex >= 0) {
5513 int j;
5514 for (j = 0; j <= complex; j++) {
5515 c = CHILD(n, j);
5516 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005517 c = CHILD(n, ++j);
5518 else if (TYPE(c) == EQUAL)
5519 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005520 if (TYPE(CHILD(c, 0)) == LPAR)
5521 symtable_params_fplist(st, CHILD(c, 1));
5522 }
5523 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005524}
5525
5526static void
5527symtable_params_fplist(struct symtable *st, node *n)
5528{
5529 int i;
5530 node *c;
5531
5532 REQ(n, fplist);
5533 for (i = 0; i < NCH(n); i += 2) {
5534 c = CHILD(n, i);
5535 REQ(c, fpdef);
5536 if (NCH(c) == 1)
5537 symtable_add_def(st, STR(CHILD(c, 0)),
5538 DEF_PARAM | DEF_INTUPLE);
5539 else
5540 symtable_params_fplist(st, CHILD(c, 1));
5541 }
5542
5543}
5544
5545static void
5546symtable_global(struct symtable *st, node *n)
5547{
5548 int i;
5549
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005550 /* XXX It might be helpful to warn about module-level global
5551 statements, but it's hard to tell the difference between
5552 module-level and a string passed to exec.
5553 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005554
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005555 for (i = 1; i < NCH(n); i += 2) {
5556 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005557 int flags;
5558
5559 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005560 if (flags < 0)
5561 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005562 if (flags && flags != DEF_GLOBAL) {
5563 char buf[500];
5564 if (flags & DEF_PARAM) {
5565 PyErr_Format(PyExc_SyntaxError,
5566 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005567 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005568 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005569 st->st_cur->ste_lineno);
5570 st->st_errors++;
5571 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005572 }
5573 else {
5574 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005575 PyOS_snprintf(buf, sizeof(buf),
5576 GLOBAL_AFTER_ASSIGN,
5577 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005578 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005579 PyOS_snprintf(buf, sizeof(buf),
5580 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005581 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005582 }
5583 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005584 symtable_add_def(st, name, DEF_GLOBAL);
5585 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005586}
5587
5588static void
5589symtable_list_comprehension(struct symtable *st, node *n)
5590{
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005591 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005592
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005593 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005594 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005595 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005596 symtable_node(st, CHILD(n, 3));
5597 if (NCH(n) == 5)
5598 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005599}
5600
5601static void
5602symtable_import(struct symtable *st, node *n)
5603{
5604 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005605 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005606 | 'from' dotted_name 'import'
5607 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005608 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005609 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005610 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005611 node *dotname = CHILD(n, 1);
5612 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5613 /* check for bogus imports */
5614 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5615 PyErr_SetString(PyExc_SyntaxError,
5616 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005617 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005618 n->n_lineno);
5619 st->st_errors++;
5620 return;
5621 }
5622 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005623 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005624 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005625 if (symtable_warn(st,
5626 "import * only allowed at module level") < 0)
5627 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005628 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005629 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005630 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005631 } else {
5632 for (i = 3; i < NCH(n); i += 2) {
5633 node *c = CHILD(n, i);
5634 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005635 symtable_assign(st, CHILD(c, 2),
5636 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005637 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005638 symtable_assign(st, CHILD(c, 0),
5639 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005640 }
5641 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005642 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005643 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005644 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005645 }
5646 }
5647}
5648
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005649/* The third argument to symatble_assign() is a flag to be passed to
5650 symtable_add_def() if it is eventually called. The flag is useful
5651 to specify the particular type of assignment that should be
5652 recorded, e.g. an assignment caused by import.
5653 */
5654
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005655static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005656symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005657{
5658 node *tmp;
5659 int i;
5660
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005661 loop:
5662 switch (TYPE(n)) {
5663 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005664 /* invalid assignment, e.g. lambda x:x=2. The next
5665 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005666 return;
5667 case power:
5668 if (NCH(n) > 2) {
5669 for (i = 2; i < NCH(n); ++i)
5670 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5671 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005672 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005673 if (NCH(n) > 1) {
5674 symtable_node(st, CHILD(n, 0));
5675 symtable_node(st, CHILD(n, 1));
5676 } else {
5677 n = CHILD(n, 0);
5678 goto loop;
5679 }
5680 return;
5681 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005682 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5683 /* XXX This is an error, but the next pass
5684 will catch it. */
5685 return;
5686 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005687 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005688 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005689 }
5690 return;
5691 case exprlist:
5692 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00005693 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005694 if (NCH(n) == 1) {
5695 n = CHILD(n, 0);
5696 goto loop;
5697 }
5698 else {
5699 int i;
5700 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005701 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005702 return;
5703 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005704 case atom:
5705 tmp = CHILD(n, 0);
5706 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5707 n = CHILD(n, 1);
5708 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005709 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00005710 if (strcmp(STR(tmp), "__debug__") == 0) {
5711 PyErr_SetString(PyExc_SyntaxError,
5712 ASSIGN_DEBUG);
5713 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton86424e32001-12-04 02:41:46 +00005714 n->n_lineno);
Jeremy Hylton778e2652001-11-09 19:50:08 +00005715 st->st_errors++;
5716 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005717 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005718 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005719 return;
5720 case dotted_as_name:
5721 if (NCH(n) == 3)
5722 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005723 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005724 else
5725 symtable_add_def(st,
5726 STR(CHILD(CHILD(n,
5727 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005728 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005729 return;
5730 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005731 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005732 return;
5733 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005734 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005735 return;
5736 default:
5737 if (NCH(n) == 0)
5738 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005739 if (NCH(n) == 1) {
5740 n = CHILD(n, 0);
5741 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005742 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005743 /* Should only occur for errors like x + 1 = 1,
5744 which will be caught in the next pass. */
5745 for (i = 0; i < NCH(n); ++i)
5746 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005747 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005748 }
5749}