blob: 57f0edb8f9c0edeabcc2a3119647668e4054c8ca [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.
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000367 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2 JMP+1.
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000368 Note, these opcodes occur together only in assignment
369 statements. Accordingly, the unpack opcode is never
370 a jump target. */
371 case BUILD_TUPLE:
372 case BUILD_LIST:
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000373 if (codestr[i+3] != UNPACK_SEQUENCE)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000374 continue;
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000375 if (GETARG(codestr, i) == 2 && \
376 GETARG(codestr, i+3) == 2) {
377 codestr[i] = ROT_TWO;
378 codestr[i+1] = JUMP_FORWARD;
379 SETARG(codestr, i+1, 2);
380 codestr[i+4] = DUP_TOP; /* Filler codes used as NOPs */
381 codestr[i+5] = POP_TOP;
382 continue;
383 }
384 if (GETARG(codestr, i) == 3 && \
385 GETARG(codestr, i+3) == 3) {
386 codestr[i] = ROT_THREE;
387 codestr[i+1] = ROT_TWO;
388 codestr[i+2] = JUMP_FORWARD;
389 SETARG(codestr, i+2, 1);
390 codestr[i+5] = DUP_TOP;
391 }
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000392 break;
393
394 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000395 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000396 case JUMP_FORWARD:
397 case JUMP_IF_FALSE:
398 case JUMP_IF_TRUE:
399 case JUMP_ABSOLUTE:
400 case CONTINUE_LOOP:
401 case SETUP_LOOP:
402 case SETUP_EXCEPT:
403 case SETUP_FINALLY:
404 tgt = GETJUMPTGT(codestr, i);
405 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
406 continue;
407 tgttgt = GETJUMPTGT(codestr, tgt);
408 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
409 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000410 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000411 tgttgt -= i + 3; /* Calc relative jump addr */
412 if (tgttgt < 0) /* No backward relative jumps */
413 continue;
414 codestr[i] = opcode;
415 SETARG(codestr, i, tgttgt);
416 break;
417
418 case EXTENDED_ARG:
419 PyMem_Free(codestr);
420 goto exitUnchanged;
421 }
422 }
423 code = PyString_FromStringAndSize(codestr, codelen);
424 PyMem_Free(codestr);
425 return code;
426
427exitUnchanged:
428 Py_INCREF(code);
429 return code;
430}
431
Guido van Rossum79f25d91997-04-29 20:08:16 +0000432PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000433PyCode_New(int argcount, int nlocals, int stacksize, int flags,
434 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000435 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
436 PyObject *filename, PyObject *name, int firstlineno,
437 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000438{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000439 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000440 int i;
441 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000442 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000443 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000444 consts == NULL || !PyTuple_Check(consts) ||
445 names == NULL || !PyTuple_Check(names) ||
446 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000447 freevars == NULL || !PyTuple_Check(freevars) ||
448 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000449 name == NULL || !PyString_Check(name) ||
450 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000451 lnotab == NULL || !PyString_Check(lnotab) ||
452 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000453 PyErr_BadInternalCall();
454 return NULL;
455 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000456 intern_strings(names);
457 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000458 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000459 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000460 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000461 for (i = PyTuple_Size(consts); --i >= 0; ) {
462 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000463 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000464 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000465 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000466 continue;
467 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000468 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000469 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000470 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000471 co->co_argcount = argcount;
472 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000473 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000474 co->co_flags = flags;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000475 co->co_code = optimize_code(code, consts);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000476 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000477 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000478 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000479 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000480 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000481 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000482 Py_INCREF(freevars);
483 co->co_freevars = freevars;
484 Py_INCREF(cellvars);
485 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000486 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000487 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000488 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000489 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000490 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000491 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000492 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000493 if (PyTuple_GET_SIZE(freevars) == 0 &&
494 PyTuple_GET_SIZE(cellvars) == 0)
495 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000496 }
497 return co;
498}
499
500
501/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000502
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000503/* The compiler uses two passes to generate bytecodes. The first pass
504 builds the symbol table. The second pass generates the bytecode.
505
506 The first pass uses a single symtable struct. The second pass uses
507 a compiling struct for each code block. The compiling structs
508 share a reference to the symtable.
509
510 The two passes communicate via symtable_load_symbols() and via
511 is_local() and is_global(). The former initializes several slots
512 in the compiling struct: c_varnames, c_locals, c_nlocals,
513 c_argcount, c_globals, and c_flags.
514*/
515
Tim Peters2a7f3842001-06-09 09:26:21 +0000516/* All about c_lnotab.
517
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000518c_lnotab is an array of unsigned bytes disguised as a Python string. Since
519version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
520mapped to source code line #s via c_lnotab instead.
521
Tim Peters2a7f3842001-06-09 09:26:21 +0000522The array is conceptually a list of
523 (bytecode offset increment, line number increment)
524pairs. The details are important and delicate, best illustrated by example:
525
526 byte code offset source code line number
527 0 1
528 6 2
529 50 7
530 350 307
531 361 308
532
533The first trick is that these numbers aren't stored, only the increments
534from one row to the next (this doesn't really work, but it's a start):
535
536 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
537
538The second trick is that an unsigned byte can't hold negative values, or
539values larger than 255, so (a) there's a deep assumption that byte code
540offsets and their corresponding line #s both increase monotonically, and (b)
541if at least one column jumps by more than 255 from one row to the next, more
542than one pair is written to the table. In case #b, there's no way to know
543from looking at the table later how many were written. That's the delicate
544part. A user of c_lnotab desiring to find the source line number
545corresponding to a bytecode address A should do something like this
546
547 lineno = addr = 0
548 for addr_incr, line_incr in c_lnotab:
549 addr += addr_incr
550 if addr > A:
551 return lineno
552 lineno += line_incr
553
554In order for this to work, when the addr field increments by more than 255,
555the line # increment in each pair generated must be 0 until the remaining addr
556increment is < 256. So, in the example above, com_set_lineno should not (as
557was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
558255, 0, 45, 255, 0, 45.
559*/
560
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000561struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000562 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000563 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000564 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000565 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000566 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +0000567 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000568 PyObject *c_locals; /* dictionary (value=localID) */
569 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000570 PyObject *c_freevars; /* dictionary (value=None) */
571 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000572 int c_nlocals; /* index of next local */
573 int c_argcount; /* number of top-level arguments */
574 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000575 int c_nexti; /* index into c_code */
576 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000577 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000578 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000579 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000580 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000581 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000582 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +0000583 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000584 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000585 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000586 int c_stacklevel; /* Current stack level */
587 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000588 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000589 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000590 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000591 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000592 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000593 int c_nested; /* Is block nested funcdef or lamdef? */
594 int c_closure; /* Is nested w/freevars? */
595 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000596 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000597 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000598};
599
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000600static int
601is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000602{
603 if ((v & (USE | DEF_FREE))
604 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
605 return 1;
606 if (v & DEF_FREE_CLASS)
607 return 1;
608 return 0;
609}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000610
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000611static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000612com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000613{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000614 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
615
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000616 if (c == NULL) {
617 /* Error occurred via symtable call to
618 is_constant_false */
619 PyErr_SetString(exc, msg);
620 return;
621 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000622 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000623 if (c->c_lineno < 1 || c->c_interactive) {
624 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000625 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000626 return;
627 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000628 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000629 if (v == NULL)
630 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000631
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000632 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000633 if (line == NULL) {
634 Py_INCREF(Py_None);
635 line = Py_None;
636 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000637 if (exc == PyExc_SyntaxError) {
638 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
639 Py_None, line);
640 if (t == NULL)
641 goto exit;
642 w = Py_BuildValue("(OO)", v, t);
643 if (w == NULL)
644 goto exit;
645 PyErr_SetObject(exc, w);
646 } else {
647 /* Make sure additional exceptions are printed with
648 file and line, also. */
649 PyErr_SetObject(exc, v);
650 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
651 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000652 exit:
653 Py_XDECREF(t);
654 Py_XDECREF(v);
655 Py_XDECREF(w);
656 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000657}
658
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000659/* Interface to the block stack */
660
661static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000662block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000663{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000664 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000665 com_error(c, PyExc_SystemError,
666 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000667 }
668 else {
669 c->c_block[c->c_nblocks++] = type;
670 }
671}
672
673static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000674block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000675{
676 if (c->c_nblocks > 0)
677 c->c_nblocks--;
678 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000679 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000680 }
681}
682
Guido van Rossum681d79a1995-07-18 14:51:37 +0000683/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000684
Martin v. Löwis95292d62002-12-11 14:04:59 +0000685static int issue_warning(const char *, const char *, int);
686static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000687static void com_free(struct compiling *);
688static void com_push(struct compiling *, int);
689static void com_pop(struct compiling *, int);
690static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000691static void com_node(struct compiling *, node *);
692static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000693static void com_addbyte(struct compiling *, int);
694static void com_addint(struct compiling *, int);
695static void com_addoparg(struct compiling *, int, int);
696static void com_addfwref(struct compiling *, int, int *);
697static void com_backpatch(struct compiling *, int);
698static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
699static int com_addconst(struct compiling *, PyObject *);
700static int com_addname(struct compiling *, PyObject *);
701static void com_addopname(struct compiling *, int, node *);
702static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000703static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000704static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000705static void com_assign(struct compiling *, node *, int, node *);
706static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000707static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +0000708static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000709 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000710static PyObject *parsestrplus(struct compiling*, node *);
711static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000712static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000713
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000714static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000715
716/* symtable operations */
717static int symtable_build(struct compiling *, node *);
718static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000719static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000720static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000721static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000722static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000723static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000724
725static void symtable_node(struct symtable *, node *);
726static void symtable_funcdef(struct symtable *, node *);
727static void symtable_default_args(struct symtable *, node *);
728static void symtable_params(struct symtable *, node *);
729static void symtable_params_fplist(struct symtable *, node *n);
730static void symtable_global(struct symtable *, node *);
731static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000732static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000733static void symtable_list_comprehension(struct symtable *, node *);
734
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000735static int symtable_update_free_vars(struct symtable *);
736static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
737static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
738
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000739/* helper */
740static void
741do_pad(int pad)
742{
743 int i;
744 for (i = 0; i < pad; ++i)
745 fprintf(stderr, " ");
746}
747
748static void
749dump(node *n, int pad, int depth)
750{
751 int i;
752 if (depth == 0)
753 return;
754 do_pad(pad);
755 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
756 if (depth > 0)
757 depth--;
758 for (i = 0; i < NCH(n); ++i)
759 dump(CHILD(n, i), pad + 1, depth);
760}
761
762#define DUMP(N) dump(N, 0, -1)
763
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000764static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000765com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000766{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000767 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000768 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
769 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000770 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000771 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000772 goto fail;
773 if ((c->c_const_dict = PyDict_New()) == NULL)
774 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000775 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000776 goto fail;
777 if ((c->c_name_dict = PyDict_New()) == NULL)
778 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000779 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000780 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000781 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
782 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000783 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000784 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000785 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000786 c->c_freevars = NULL;
787 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000788 c->c_nlocals = 0;
789 c->c_argcount = 0;
790 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000791 c->c_nexti = 0;
792 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000793 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000794 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000795 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000796 c->c_begin = 0;
797 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000798 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000799 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000800 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000801 c->c_stacklevel = 0;
802 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000803 c->c_firstlineno = 0;
804 c->c_last_addr = 0;
805 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000806 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000807 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000808 c->c_nested = 0;
809 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000810 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000811 return 1;
812
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000813 fail:
814 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000815 return 0;
816}
817
818static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000819com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000820{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000821 Py_XDECREF(c->c_code);
822 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000823 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000824 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000825 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000826 Py_XDECREF(c->c_globals);
827 Py_XDECREF(c->c_locals);
828 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000829 Py_XDECREF(c->c_freevars);
830 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000831 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000832 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +0000833 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000834}
835
836static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000837com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000838{
839 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000840 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +0000841 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000842 /*
843 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
844 c->c_filename, c->c_name, c->c_lineno,
845 c->c_nexti, c->c_stacklevel, n);
846 */
847 }
Guido van Rossum8b993a91997-01-17 21:04:03 +0000848}
849
850static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000851com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000852{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000853 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000854 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000855 else
856 c->c_stacklevel -= n;
857}
858
859static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000860com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000861{
862 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000863 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000864 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000865 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000866}
867
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000868static int
869com_check_size(PyObject **s, int offset)
870{
871 int len = PyString_GET_SIZE(*s);
872 if (offset >= len)
873 return _PyString_Resize(s, len * 2);
874 return 0;
875}
876
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000877static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000878com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000879{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000880 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000881 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +0000882 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000883 if (com_check_size(&c->c_code, c->c_nexti)) {
884 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000885 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000886 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000887 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000888}
889
890static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000891com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000892{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000893 com_addbyte(c, x & 0xff);
894 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000895}
896
897static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000898com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000899{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000900 char *p;
901 if (c->c_lnotab == NULL)
902 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000903 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
904 c->c_errors++;
905 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000906 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000907 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000908 *p++ = addr;
909 *p++ = line;
910 c->c_lnotab_next += 2;
911}
912
913static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000914com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000915{
916 c->c_lineno = lineno;
917 if (c->c_firstlineno == 0) {
918 c->c_firstlineno = c->c_last_line = lineno;
919 }
920 else {
921 int incr_addr = c->c_nexti - c->c_last_addr;
922 int incr_line = lineno - c->c_last_line;
Tim Peters2a7f3842001-06-09 09:26:21 +0000923 while (incr_addr > 255) {
924 com_add_lnotab(c, 255, 0);
925 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000926 }
Tim Peters2a7f3842001-06-09 09:26:21 +0000927 while (incr_line > 255) {
928 com_add_lnotab(c, incr_addr, 255);
929 incr_line -=255;
930 incr_addr = 0;
931 }
932 if (incr_addr > 0 || incr_line > 0)
933 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000934 c->c_last_addr = c->c_nexti;
935 c->c_last_line = lineno;
936 }
937}
938
939static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000940com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000941{
Fred Drakeef8ace32000-08-24 00:32:09 +0000942 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +0000943 if (extended_arg){
944 com_addbyte(c, EXTENDED_ARG);
945 com_addint(c, extended_arg);
946 arg &= 0xffff;
947 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000948 com_addbyte(c, op);
949 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000950}
951
952static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000953com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000954{
955 /* Compile a forward reference for backpatching */
956 int here;
957 int anchor;
958 com_addbyte(c, op);
959 here = c->c_nexti;
960 anchor = *p_anchor;
961 *p_anchor = here;
962 com_addint(c, anchor == 0 ? 0 : here - anchor);
963}
964
965static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000966com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000967{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000968 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000969 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000970 int dist;
971 int prev;
972 for (;;) {
973 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000974 prev = code[anchor] + (code[anchor+1] << 8);
975 dist = target - (anchor+2);
976 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000977 dist >>= 8;
978 code[anchor+1] = dist;
979 dist >>= 8;
980 if (dist) {
981 com_error(c, PyExc_SystemError,
982 "com_backpatch: offset too large");
983 break;
984 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000985 if (!prev)
986 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000987 anchor -= prev;
988 }
989}
990
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000991/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000992
993static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000994com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000995{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000996 PyObject *w, *t, *np=NULL;
997 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000998
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000999 t = Py_BuildValue("(OO)", v, v->ob_type);
1000 if (t == NULL)
1001 goto fail;
1002 w = PyDict_GetItem(dict, t);
1003 if (w != NULL) {
1004 n = PyInt_AsLong(w);
1005 } else {
1006 n = PyList_Size(list);
1007 np = PyInt_FromLong(n);
1008 if (np == NULL)
1009 goto fail;
1010 if (PyList_Append(list, v) != 0)
1011 goto fail;
1012 if (PyDict_SetItem(dict, t, np) != 0)
1013 goto fail;
1014 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001015 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001016 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001017 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001018 fail:
1019 Py_XDECREF(np);
1020 Py_XDECREF(t);
1021 c->c_errors++;
1022 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001023}
1024
1025static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001026com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001027{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001028 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001029}
1030
1031static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001032com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001033{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001034 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001035}
1036
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001037int
1038_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001039{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001040 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001041 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001042 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001043 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1044 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001045 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001046 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001047 return 0; /* Don't mangle __extremely_long_names */
1048 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1049 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001050 /* Strip leading underscores from class name */
1051 while (*p == '_')
1052 p++;
1053 if (*p == '\0')
1054 return 0; /* Don't mangle if class is just underscores */
1055 plen = strlen(p);
1056 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001057 plen = maxlen-nlen-2; /* Truncate class name if too long */
1058 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001059 buffer[0] = '_';
1060 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001061 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001062 return 1;
1063}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001064
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001065static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001066com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001067{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001068 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001069 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001070 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001071
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001072 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001073 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001074 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001075 c->c_errors++;
1076 i = 255;
1077 }
1078 else {
1079 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001080 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001081 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001082 com_addoparg(c, op, i);
1083}
1084
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001085#define NAME_LOCAL 0
1086#define NAME_GLOBAL 1
1087#define NAME_DEFAULT 2
1088#define NAME_CLOSURE 3
1089
1090static int
1091com_lookup_arg(PyObject *dict, PyObject *name)
1092{
1093 PyObject *v = PyDict_GetItem(dict, name);
1094 if (v == NULL)
1095 return -1;
1096 else
1097 return PyInt_AS_LONG(v);
1098}
1099
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001100static int
1101none_assignment_check(struct compiling *c, char *name, int assigning)
1102{
1103 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1104 char *msg;
1105 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001106 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001107 else
1108 msg = "deleting None";
1109 if (issue_warning(msg, c->c_filename, c->c_lineno) < 0) {
1110 c->c_errors++;
1111 return -1;
1112 }
1113 }
1114 return 0;
1115}
1116
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001117static void
1118com_addop_varname(struct compiling *c, int kind, char *name)
1119{
1120 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001121 int i, reftype;
1122 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001123 int op = STOP_CODE;
1124 char buffer[MANGLE_LEN];
1125
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001126 if (kind != VAR_LOAD &&
1127 none_assignment_check(c, name, kind == VAR_STORE))
1128 {
1129 c->c_errors++;
1130 i = 255;
1131 goto done;
1132 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001133 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001134 name = buffer;
1135 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1136 c->c_errors++;
1137 i = 255;
1138 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001139 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001140
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001141 reftype = get_ref_type(c, name);
1142 switch (reftype) {
1143 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001144 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001145 scope = NAME_LOCAL;
1146 break;
1147 case GLOBAL_EXPLICIT:
1148 scope = NAME_GLOBAL;
1149 break;
1150 case GLOBAL_IMPLICIT:
1151 if (c->c_flags & CO_OPTIMIZED)
1152 scope = NAME_GLOBAL;
1153 break;
1154 case FREE:
1155 case CELL:
1156 scope = NAME_CLOSURE;
1157 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001158 }
1159
1160 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001161 if (scope == NAME_LOCAL)
1162 i = com_lookup_arg(c->c_locals, v);
1163 else if (reftype == FREE)
1164 i = com_lookup_arg(c->c_freevars, v);
1165 else if (reftype == CELL)
1166 i = com_lookup_arg(c->c_cellvars, v);
1167 if (i == -1) {
1168 c->c_errors++; /* XXX no exception set */
1169 i = 255;
1170 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001171 }
1172 Py_DECREF(v);
1173
1174 switch (kind) {
1175 case VAR_LOAD:
1176 switch (scope) {
1177 case NAME_LOCAL:
1178 op = LOAD_FAST;
1179 break;
1180 case NAME_GLOBAL:
1181 op = LOAD_GLOBAL;
1182 break;
1183 case NAME_DEFAULT:
1184 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001185 break;
1186 case NAME_CLOSURE:
1187 op = LOAD_DEREF;
1188 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001189 }
1190 break;
1191 case VAR_STORE:
1192 switch (scope) {
1193 case NAME_LOCAL:
1194 op = STORE_FAST;
1195 break;
1196 case NAME_GLOBAL:
1197 op = STORE_GLOBAL;
1198 break;
1199 case NAME_DEFAULT:
1200 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001201 break;
1202 case NAME_CLOSURE:
1203 op = STORE_DEREF;
1204 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001205 }
1206 break;
1207 case VAR_DELETE:
1208 switch (scope) {
1209 case NAME_LOCAL:
1210 op = DELETE_FAST;
1211 break;
1212 case NAME_GLOBAL:
1213 op = DELETE_GLOBAL;
1214 break;
1215 case NAME_DEFAULT:
1216 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001217 break;
1218 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001219 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001220 PyOS_snprintf(buf, sizeof(buf),
1221 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001222 com_error(c, PyExc_SyntaxError, buf);
1223 i = 255;
1224 break;
1225 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001226 }
1227 break;
1228 }
1229done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001230 com_addoparg(c, op, i);
1231}
1232
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001233static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001234com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001235{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001236 char *name;
1237 char buffer[1000];
1238 /* XXX it is possible to write this code without the 1000
1239 chars on the total length of dotted names, I just can't be
1240 bothered right now */
1241 if (TYPE(n) == STAR)
1242 name = "*";
1243 else if (TYPE(n) == dotted_name) {
1244 char *p = buffer;
1245 int i;
1246 name = buffer;
1247 for (i = 0; i < NCH(n); i += 2) {
1248 char *s = STR(CHILD(n, i));
1249 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001250 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001251 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001252 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001253 break;
1254 }
1255 if (p != buffer)
1256 *p++ = '.';
1257 strcpy(p, s);
1258 p = strchr(p, '\0');
1259 }
1260 }
1261 else {
1262 REQ(n, NAME);
1263 name = STR(n);
1264 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001265 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001266}
1267
Guido van Rossum79f25d91997-04-29 20:08:16 +00001268static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001269parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001270{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001271 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001272 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001273 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001274#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001275 int imflag;
1276#endif
1277
Guido van Rossum282914b1991-04-04 10:42:56 +00001278 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001279 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001280#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001281 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001282#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001283 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001284 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001285 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001286 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001287 if (x < 0 && errno == 0) {
Guido van Rossum715eca92002-08-12 21:54:46 +00001288 if (PyErr_WarnExplicit(
Barry Warsaw9f007392002-08-14 15:51:29 +00001289 PyExc_FutureWarning,
Guido van Rossum715eca92002-08-12 21:54:46 +00001290 "hex/oct constants > sys.maxint "
1291 "will return positive values "
1292 "in Python 2.4 and up",
Martin v. Löwis95292d62002-12-11 14:04:59 +00001293 /* XXX: Give WarnExplicit
1294 a const char* argument. */
1295 (char*)c->c_filename,
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001296 c->c_lineno,
Guido van Rossum715eca92002-08-12 21:54:46 +00001297 NULL,
1298 NULL) < 0)
Guido van Rossum078151d2002-08-11 04:24:12 +00001299 return NULL;
Guido van Rossum3cb8e542002-08-11 14:06:15 +00001300 errno = 0; /* Might be changed by PyErr_Warn() */
Guido van Rossum078151d2002-08-11 04:24:12 +00001301 }
1302 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001303 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001304 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001305 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001306 if (errno != 0)
1307 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001308 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001309 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001310 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001311#ifndef WITHOUT_COMPLEX
1312 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001313 Py_complex z;
1314 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001315 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001316 z.imag = atof(s);
1317 PyFPE_END_PROTECT(z)
1318 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001319 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001320 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001321#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001322 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001323 PyFPE_START_PROTECT("atof", return 0)
1324 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001325 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001326 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001327 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001328}
1329
Guido van Rossum79f25d91997-04-29 20:08:16 +00001330static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001331decode_utf8(char **sPtr, char *end, char* encoding)
1332{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001333#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001334 Py_FatalError("decode_utf8 should not be called in this build.");
1335 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001336#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001337 PyObject *u, *v;
1338 char *s, *t;
1339 t = s = *sPtr;
1340 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1341 while (s < end && (*s & 0x80)) s++;
1342 *sPtr = s;
1343 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1344 if (u == NULL)
1345 return NULL;
1346 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1347 Py_DECREF(u);
1348 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001349#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001350}
1351
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001352/* compiler.transformer.Transformer.decode_literal depends on what
1353 might seem like minor details of this function -- changes here
1354 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001355static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001356parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001357{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001358 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001359 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001360 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001361 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001362 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001363 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001364 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001365
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001366 if (isalpha(quote) || quote == '_') {
1367 if (quote == 'u' || quote == 'U') {
1368 quote = *++s;
1369 unicode = 1;
1370 }
1371 if (quote == 'r' || quote == 'R') {
1372 quote = *++s;
1373 rawmode = 1;
1374 }
1375 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001376 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001377 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001378 return NULL;
1379 }
1380 s++;
1381 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001382 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001383 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001384 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001385 return NULL;
1386 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001387 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001388 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001389 return NULL;
1390 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001391 if (len >= 4 && s[0] == quote && s[1] == quote) {
1392 s += 2;
1393 len -= 2;
1394 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001395 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001396 return NULL;
1397 }
1398 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001399#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001400 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001401 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001402 char *buf;
1403 char *p;
1404 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001405 if (encoding == NULL) {
1406 buf = s;
1407 u = NULL;
1408 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1409 buf = s;
1410 u = NULL;
1411 } else {
1412 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1413 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1414 if (u == NULL)
1415 return NULL;
1416 p = buf = PyString_AsString(u);
1417 end = s + len;
1418 while (s < end) {
1419 if (*s == '\\') {
1420 *p++ = *s++;
1421 if (*s & 0x80) {
1422 strcpy(p, "u005c");
1423 p += 5;
1424 }
1425 }
1426 if (*s & 0x80) { /* XXX inefficient */
1427 char *r;
1428 int rn, i;
1429 w = decode_utf8(&s, end, "utf-16-be");
1430 if (w == NULL) {
1431 Py_DECREF(u);
1432 return NULL;
1433 }
1434 r = PyString_AsString(w);
1435 rn = PyString_Size(w);
1436 assert(rn % 2 == 0);
1437 for (i = 0; i < rn; i += 2) {
1438 sprintf(p, "\\u%02x%02x",
1439 r[i + 0] & 0xFF,
1440 r[i + 1] & 0xFF);
1441 p += 6;
1442 }
1443 Py_DECREF(w);
1444 } else {
1445 *p++ = *s++;
1446 }
1447 }
1448 len = p - buf;
1449 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001450 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001451 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001452 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001453 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1454 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001455 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001456 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001457 return v;
1458
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001459 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001460#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001461 need_encoding = (encoding != NULL &&
1462 strcmp(encoding, "utf-8") != 0 &&
1463 strcmp(encoding, "iso-8859-1") != 0);
1464 if (rawmode || strchr(s, '\\') == NULL) {
1465 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001466#ifndef Py_USING_UNICODE
1467 /* This should not happen - we never see any other
1468 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001469 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001470#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001471 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1472 if (u == NULL)
1473 return NULL;
1474 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1475 Py_DECREF(u);
1476 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001477#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001478 } else {
1479 return PyString_FromStringAndSize(s, len);
1480 }
1481 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001482
1483 v = PyString_DecodeEscape(s, len, NULL, unicode,
1484 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001485 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001486 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001487 return v;
1488}
1489
Guido van Rossum79f25d91997-04-29 20:08:16 +00001490static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001491parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001492{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001493 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001494 int i;
1495 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001496 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001497 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001498 for (i = 1; i < NCH(n); i++) {
1499 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001500 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001501 if (s == NULL)
1502 goto onError;
1503 if (PyString_Check(v) && PyString_Check(s)) {
1504 PyString_ConcatAndDel(&v, s);
1505 if (v == NULL)
1506 goto onError;
1507 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001508#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001509 else {
1510 PyObject *temp;
1511 temp = PyUnicode_Concat(v, s);
1512 Py_DECREF(s);
1513 if (temp == NULL)
1514 goto onError;
1515 Py_DECREF(v);
1516 v = temp;
1517 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001518#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001519 }
1520 }
1521 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001522
1523 onError:
1524 Py_XDECREF(v);
1525 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001526}
1527
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001528static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001529com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001530{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001531 int anchor = 0;
1532 int save_begin = c->c_begin;
1533
1534 /* list_iter: for v in expr [list_iter] */
1535 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001536 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001537 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001538 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001539 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001540 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001541 c->c_loops++;
1542 com_list_iter(c, n, e, t);
1543 c->c_loops--;
1544 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1545 c->c_begin = save_begin;
1546 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001547 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001548}
1549
1550static void
1551com_list_if(struct compiling *c, node *n, node *e, char *t)
1552{
1553 int anchor = 0;
1554 int a = 0;
1555 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001556 com_node(c, CHILD(n, 1));
1557 com_addfwref(c, JUMP_IF_FALSE, &a);
1558 com_addbyte(c, POP_TOP);
1559 com_pop(c, 1);
1560 com_list_iter(c, n, e, t);
1561 com_addfwref(c, JUMP_FORWARD, &anchor);
1562 com_backpatch(c, a);
1563 /* We jump here with an extra entry which we now pop */
1564 com_addbyte(c, POP_TOP);
1565 com_backpatch(c, anchor);
1566}
1567
1568static void
1569com_list_iter(struct compiling *c,
1570 node *p, /* parent of list_iter node */
1571 node *e, /* element expression node */
1572 char *t /* name of result list temp local */)
1573{
1574 /* list_iter is the last child in a listmaker, list_for, or list_if */
1575 node *n = CHILD(p, NCH(p)-1);
1576 if (TYPE(n) == list_iter) {
1577 n = CHILD(n, 0);
1578 switch (TYPE(n)) {
1579 case list_for:
1580 com_list_for(c, n, e, t);
1581 break;
1582 case list_if:
1583 com_list_if(c, n, e, t);
1584 break;
1585 default:
1586 com_error(c, PyExc_SystemError,
1587 "invalid list_iter node type");
1588 }
1589 }
1590 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001591 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001592 com_push(c, 1);
1593 com_node(c, e);
1594 com_addoparg(c, CALL_FUNCTION, 1);
1595 com_addbyte(c, POP_TOP);
1596 com_pop(c, 2);
1597 }
1598}
1599
1600static void
1601com_list_comprehension(struct compiling *c, node *n)
1602{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001603 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001604 char tmpname[30];
1605 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001606 com_addoparg(c, BUILD_LIST, 0);
1607 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1608 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001609 com_addop_name(c, LOAD_ATTR, "append");
1610 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001611 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001612 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001613 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001614 --c->c_tmpname;
1615}
1616
1617static void
1618com_listmaker(struct compiling *c, node *n)
1619{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001620 /* listmaker: test ( list_for | (',' test)* [','] ) */
1621 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001622 com_list_comprehension(c, n);
1623 else {
1624 int len = 0;
1625 int i;
1626 for (i = 0; i < NCH(n); i += 2, len++)
1627 com_node(c, CHILD(n, i));
1628 com_addoparg(c, BUILD_LIST, len);
1629 com_pop(c, len-1);
1630 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001631}
1632
1633static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001634com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001635{
1636 int i;
1637 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1638 for (i = 0; i+2 < NCH(n); i += 4) {
1639 /* We must arrange things just right for STORE_SUBSCR.
1640 It wants the stack to look like (value) (dict) (key) */
1641 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001642 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001643 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00001644 com_node(c, CHILD(n, i+2)); /* value */
1645 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001646 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001647 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001648 }
1649}
1650
1651static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001652com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001653{
1654 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001655 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001656 int i;
1657 REQ(n, atom);
1658 ch = CHILD(n, 0);
1659 switch (TYPE(ch)) {
1660 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001661 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001662 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001663 com_push(c, 1);
1664 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001665 else
1666 com_node(c, CHILD(n, 1));
1667 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001668 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001669 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001670 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001671 com_push(c, 1);
1672 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001673 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001674 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001675 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001676 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001677 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001678 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001679 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001680 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001681 break;
1682 case BACKQUOTE:
1683 com_node(c, CHILD(n, 1));
1684 com_addbyte(c, UNARY_CONVERT);
1685 break;
1686 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001687 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001688 i = 255;
1689 }
1690 else {
1691 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001692 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001693 }
1694 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001695 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001696 break;
1697 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001698 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001699 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001700 c->c_errors++;
1701 i = 255;
1702 }
1703 else {
1704 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001705 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001706 }
1707 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001708 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001709 break;
1710 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001711 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001712 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001713 break;
1714 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001715 com_error(c, PyExc_SystemError,
1716 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001717 }
1718}
1719
1720static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001721com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001722{
1723 if (NCH(n) == 1) {
1724 com_addbyte(c, op);
1725 }
1726 else if (NCH(n) == 2) {
1727 if (TYPE(CHILD(n, 0)) != COLON) {
1728 com_node(c, CHILD(n, 0));
1729 com_addbyte(c, op+1);
1730 }
1731 else {
1732 com_node(c, CHILD(n, 1));
1733 com_addbyte(c, op+2);
1734 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001735 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001736 }
1737 else {
1738 com_node(c, CHILD(n, 0));
1739 com_node(c, CHILD(n, 2));
1740 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001741 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001742 }
1743}
1744
Guido van Rossum635abd21997-01-06 22:56:52 +00001745static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001746com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1747{
1748 if (NCH(n) == 1) {
1749 com_addbyte(c, DUP_TOP);
1750 com_push(c, 1);
1751 com_addbyte(c, SLICE);
1752 com_node(c, augn);
1753 com_addbyte(c, opcode);
1754 com_pop(c, 1);
1755 com_addbyte(c, ROT_TWO);
1756 com_addbyte(c, STORE_SLICE);
1757 com_pop(c, 2);
1758 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1759 com_node(c, CHILD(n, 0));
1760 com_addoparg(c, DUP_TOPX, 2);
1761 com_push(c, 2);
1762 com_addbyte(c, SLICE+1);
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+1);
1769 com_pop(c, 3);
1770 } else if (NCH(n) == 2) {
1771 com_node(c, CHILD(n, 1));
1772 com_addoparg(c, DUP_TOPX, 2);
1773 com_push(c, 2);
1774 com_addbyte(c, SLICE+2);
1775 com_pop(c, 1);
1776 com_node(c, augn);
1777 com_addbyte(c, opcode);
1778 com_pop(c, 1);
1779 com_addbyte(c, ROT_THREE);
1780 com_addbyte(c, STORE_SLICE+2);
1781 com_pop(c, 3);
1782 } else {
1783 com_node(c, CHILD(n, 0));
1784 com_node(c, CHILD(n, 2));
1785 com_addoparg(c, DUP_TOPX, 3);
1786 com_push(c, 3);
1787 com_addbyte(c, SLICE+3);
1788 com_pop(c, 2);
1789 com_node(c, augn);
1790 com_addbyte(c, opcode);
1791 com_pop(c, 1);
1792 com_addbyte(c, ROT_FOUR);
1793 com_addbyte(c, STORE_SLICE+3);
1794 com_pop(c, 4);
1795 }
1796}
1797
1798static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001799com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001800{
1801 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001802 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001803 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001804 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001805 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001806 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001807 }
1808 else {
1809 com_node(c, CHILD(n, 0));
1810 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001811 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001812 }
1813 m = n;
1814 do {
1815 m = CHILD(m, 0);
1816 } while (NCH(m) == 1);
1817 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001818 /* f(lambda x: x[0] = 3) ends up getting parsed with
1819 * LHS test = lambda x: x[0], and RHS test = 3.
1820 * SF bug 132313 points out that complaining about a keyword
1821 * then is very confusing.
1822 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001823 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001824 TYPE(m) == lambdef ?
1825 "lambda cannot contain assignment" :
1826 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001827 }
1828 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001829 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00001830 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00001831 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001832 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001833 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001834 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001835 else if (*pkeywords == NULL) {
1836 c->c_errors++;
1837 Py_DECREF(v);
1838 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001839 if (PyDict_GetItem(*pkeywords, v) != NULL)
1840 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001841 "duplicate keyword argument");
1842 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001843 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001844 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001845 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001846 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001847 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001848 }
1849 }
1850 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001851}
1852
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001853static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001854com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001855{
1856 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001857 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001858 }
1859 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001860 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001861 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001862 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001863 int star_flag = 0;
1864 int starstar_flag = 0;
1865 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001866 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001867 na = 0;
1868 nk = 0;
1869 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001870 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001871 if (TYPE(ch) == STAR ||
1872 TYPE(ch) == DOUBLESTAR)
1873 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001874 if (ch->n_lineno != lineno) {
1875 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001876 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00001877 }
1878 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001879 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001880 na++;
1881 else
1882 nk++;
1883 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001884 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001885 while (i < NCH(n)) {
1886 node *tok = CHILD(n, i);
1887 node *ch = CHILD(n, i+1);
1888 i += 3;
1889 switch (TYPE(tok)) {
1890 case STAR: star_flag = 1; break;
1891 case DOUBLESTAR: starstar_flag = 1; break;
1892 }
1893 com_node(c, ch);
1894 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001895 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001896 com_error(c, PyExc_SyntaxError,
1897 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001898 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001899 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001900 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001901 star_flag + (starstar_flag << 1);
1902 else
1903 opcode = CALL_FUNCTION;
1904 com_addoparg(c, opcode, na | (nk << 8));
1905 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001906 }
1907}
1908
1909static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001910com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001911{
1912 com_addopname(c, LOAD_ATTR, n);
1913}
1914
1915static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001916com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001917{
1918 int i=0;
1919 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001920 node *ch;
1921
1922 /* first argument */
1923 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001924 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001925 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001926 i++;
1927 }
1928 else {
1929 com_node(c, CHILD(n,i));
1930 i++;
1931 REQ(CHILD(n,i),COLON);
1932 i++;
1933 }
1934 /* second argument */
1935 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1936 com_node(c, CHILD(n,i));
1937 i++;
1938 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001939 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001940 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001941 com_push(c, 1);
1942 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001943 /* remaining arguments */
1944 for (; i < NCH(n); i++) {
1945 ns++;
1946 ch=CHILD(n,i);
1947 REQ(ch, sliceop);
1948 if (NCH(ch) == 1) {
1949 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001950 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001951 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001952 }
1953 else
1954 com_node(c, CHILD(ch,1));
1955 }
1956 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001957 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001958}
1959
1960static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001961com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001962{
1963 node *ch;
1964 REQ(n, subscript);
1965 ch = CHILD(n,0);
1966 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001967 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001968 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001969 com_push(c, 1);
1970 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001971 else {
1972 /* check for slice */
1973 if ((TYPE(ch) == COLON || NCH(n) > 1))
1974 com_sliceobj(c, n);
1975 else {
1976 REQ(ch, test);
1977 com_node(c, ch);
1978 }
1979 }
1980}
1981
1982static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001983com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001984{
1985 int i, op;
1986 REQ(n, subscriptlist);
1987 /* Check to make backward compatible slice behavior for '[i:j]' */
1988 if (NCH(n) == 1) {
1989 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001990 /* 'Basic' slice, should have exactly one colon. */
1991 if ((TYPE(CHILD(sub, 0)) == COLON
1992 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1993 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1994 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001995 switch (assigning) {
1996 case OP_DELETE:
1997 op = DELETE_SLICE;
1998 break;
1999 case OP_ASSIGN:
2000 op = STORE_SLICE;
2001 break;
2002 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002003 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002004 break;
2005 default:
2006 com_augassign_slice(c, sub, assigning, augn);
2007 return;
2008 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002009 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002010 if (op == STORE_SLICE)
2011 com_pop(c, 2);
2012 else if (op == DELETE_SLICE)
2013 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002014 return;
2015 }
2016 }
2017 /* Else normal subscriptlist. Compile each subscript. */
2018 for (i = 0; i < NCH(n); i += 2)
2019 com_subscript(c, CHILD(n, i));
2020 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002021 if (NCH(n) > 1) {
2022 i = (NCH(n)+1) / 2;
2023 com_addoparg(c, BUILD_TUPLE, i);
2024 com_pop(c, i-1);
2025 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002026 switch (assigning) {
2027 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002028 op = DELETE_SUBSCR;
2029 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002030 break;
2031 default:
2032 case OP_ASSIGN:
2033 op = STORE_SUBSCR;
2034 i = 3;
2035 break;
2036 case OP_APPLY:
2037 op = BINARY_SUBSCR;
2038 i = 1;
2039 break;
2040 }
2041 if (assigning > OP_APPLY) {
2042 com_addoparg(c, DUP_TOPX, 2);
2043 com_push(c, 2);
2044 com_addbyte(c, BINARY_SUBSCR);
2045 com_pop(c, 1);
2046 com_node(c, augn);
2047 com_addbyte(c, assigning);
2048 com_pop(c, 1);
2049 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002050 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002051 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002052 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002053}
2054
2055static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002056com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002057{
2058 REQ(n, trailer);
2059 switch (TYPE(CHILD(n, 0))) {
2060 case LPAR:
2061 com_call_function(c, CHILD(n, 1));
2062 break;
2063 case DOT:
2064 com_select_member(c, CHILD(n, 1));
2065 break;
2066 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002067 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002068 break;
2069 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002070 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002071 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002072 }
2073}
2074
2075static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002076com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002077{
2078 int i;
2079 REQ(n, power);
2080 com_atom(c, CHILD(n, 0));
2081 for (i = 1; i < NCH(n); i++) {
2082 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2083 com_factor(c, CHILD(n, i+1));
2084 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002085 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002086 break;
2087 }
2088 else
2089 com_apply_trailer(c, CHILD(n, i));
2090 }
2091}
2092
2093static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002094com_invert_constant(struct compiling *c, node *n)
2095{
2096 /* Compute the inverse of int and longs and use them directly,
2097 but be prepared to generate code for all other
2098 possibilities (invalid numbers, floats, complex).
2099 */
2100 PyObject *num, *inv = NULL;
2101 int i;
2102
2103 REQ(n, NUMBER);
2104 num = parsenumber(c, STR(n));
2105 if (num == NULL)
2106 i = 255;
2107 else {
2108 inv = PyNumber_Invert(num);
2109 if (inv == NULL) {
2110 PyErr_Clear();
2111 i = com_addconst(c, num);
2112 } else {
2113 i = com_addconst(c, inv);
2114 Py_DECREF(inv);
2115 }
2116 Py_DECREF(num);
2117 }
2118 com_addoparg(c, LOAD_CONST, i);
2119 com_push(c, 1);
2120 if (num != NULL && inv == NULL)
2121 com_addbyte(c, UNARY_INVERT);
2122}
2123
Tim Peters51e26512001-09-07 08:45:55 +00002124static int
2125is_float_zero(const char *p)
2126{
2127 int found_radix_point = 0;
2128 int ch;
2129 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2130 switch (ch) {
2131 case '0':
2132 /* no reason to believe it's not 0 -- continue */
2133 break;
2134
2135 case 'e': case 'E': case 'j': case 'J':
2136 /* If this was a hex constant, we already would have
2137 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2138 must be an exponent marker, and we haven't yet
2139 seen a non-zero digit, and it doesn't matter what
2140 the exponent is then. For 'j' or 'J' similarly,
2141 except that this is an imaginary 0 then. */
2142 return 1;
2143
2144 case '.':
2145 found_radix_point = 1;
2146 break;
2147
2148 default:
2149 return 0;
2150 }
2151 }
2152 return found_radix_point;
2153}
2154
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002155static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002156com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002157{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002158 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002159 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002160 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002161 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002162 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002163 approriate value as a constant. If the value is negative,
2164 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002165 negative in the 0th position -- unless we're doing unary minus
2166 of a floating zero! In that case the sign is significant, but
2167 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002168 */
2169 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002170 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002171 && TYPE((pfactor = CHILD(n, 1))) == factor
2172 && NCH(pfactor) == 1
2173 && TYPE((ppower = CHILD(pfactor, 0))) == power
2174 && NCH(ppower) == 1
2175 && TYPE((patom = CHILD(ppower, 0))) == atom
2176 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002177 && !(childtype == MINUS &&
2178 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002179 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002180 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002181 return;
2182 }
2183 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002184 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002185 if (s == NULL) {
2186 com_error(c, PyExc_MemoryError, "");
2187 com_addbyte(c, 255);
2188 return;
2189 }
2190 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002191 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002192 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002193 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002194 }
Tim Peters51e26512001-09-07 08:45:55 +00002195 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002196 }
2197 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002198 com_factor(c, CHILD(n, 1));
2199 com_addbyte(c, UNARY_POSITIVE);
2200 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002201 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002202 com_factor(c, CHILD(n, 1));
2203 com_addbyte(c, UNARY_NEGATIVE);
2204 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002205 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002206 com_factor(c, CHILD(n, 1));
2207 com_addbyte(c, UNARY_INVERT);
2208 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002209 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002210 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002211 }
2212}
2213
2214static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002215com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002216{
2217 int i;
2218 int op;
2219 REQ(n, term);
2220 com_factor(c, CHILD(n, 0));
2221 for (i = 2; i < NCH(n); i += 2) {
2222 com_factor(c, CHILD(n, i));
2223 switch (TYPE(CHILD(n, i-1))) {
2224 case STAR:
2225 op = BINARY_MULTIPLY;
2226 break;
2227 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002228 if (c->c_flags & CO_FUTURE_DIVISION)
2229 op = BINARY_TRUE_DIVIDE;
2230 else
2231 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002232 break;
2233 case PERCENT:
2234 op = BINARY_MODULO;
2235 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002236 case DOUBLESLASH:
2237 op = BINARY_FLOOR_DIVIDE;
2238 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002239 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002240 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002241 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002242 op = 255;
2243 }
2244 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002245 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002246 }
2247}
2248
2249static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002250com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002251{
2252 int i;
2253 int op;
2254 REQ(n, arith_expr);
2255 com_term(c, CHILD(n, 0));
2256 for (i = 2; i < NCH(n); i += 2) {
2257 com_term(c, CHILD(n, i));
2258 switch (TYPE(CHILD(n, i-1))) {
2259 case PLUS:
2260 op = BINARY_ADD;
2261 break;
2262 case MINUS:
2263 op = BINARY_SUBTRACT;
2264 break;
2265 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002266 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002267 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002268 op = 255;
2269 }
2270 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002271 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002272 }
2273}
2274
2275static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002276com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002277{
2278 int i;
2279 int op;
2280 REQ(n, shift_expr);
2281 com_arith_expr(c, CHILD(n, 0));
2282 for (i = 2; i < NCH(n); i += 2) {
2283 com_arith_expr(c, CHILD(n, i));
2284 switch (TYPE(CHILD(n, i-1))) {
2285 case LEFTSHIFT:
2286 op = BINARY_LSHIFT;
2287 break;
2288 case RIGHTSHIFT:
2289 op = BINARY_RSHIFT;
2290 break;
2291 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002292 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002293 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002294 op = 255;
2295 }
2296 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002297 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002298 }
2299}
2300
2301static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002302com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002303{
2304 int i;
2305 int op;
2306 REQ(n, and_expr);
2307 com_shift_expr(c, CHILD(n, 0));
2308 for (i = 2; i < NCH(n); i += 2) {
2309 com_shift_expr(c, CHILD(n, i));
2310 if (TYPE(CHILD(n, i-1)) == AMPER) {
2311 op = BINARY_AND;
2312 }
2313 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002314 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002315 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002316 op = 255;
2317 }
2318 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002319 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002320 }
2321}
2322
2323static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002324com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002325{
2326 int i;
2327 int op;
2328 REQ(n, xor_expr);
2329 com_and_expr(c, CHILD(n, 0));
2330 for (i = 2; i < NCH(n); i += 2) {
2331 com_and_expr(c, CHILD(n, i));
2332 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2333 op = BINARY_XOR;
2334 }
2335 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002336 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002337 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002338 op = 255;
2339 }
2340 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002341 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002342 }
2343}
2344
2345static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002346com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002347{
2348 int i;
2349 int op;
2350 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002351 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002352 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002353 com_xor_expr(c, CHILD(n, i));
2354 if (TYPE(CHILD(n, i-1)) == VBAR) {
2355 op = BINARY_OR;
2356 }
2357 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002358 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002359 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002360 op = 255;
2361 }
2362 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002363 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002364 }
2365}
2366
2367static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002368cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002369{
2370 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00002371 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002372 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2373 if (NCH(n) == 1) {
2374 n = CHILD(n, 0);
2375 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002376 case LESS: return PyCmp_LT;
2377 case GREATER: return PyCmp_GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002378 case EQEQUAL: /* == */
Martin v. Löwis7198a522002-01-01 19:59:11 +00002379 case EQUAL: return PyCmp_EQ;
2380 case LESSEQUAL: return PyCmp_LE;
2381 case GREATEREQUAL: return PyCmp_GE;
2382 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2383 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2384 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002385 }
2386 }
2387 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002388 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002389 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002390 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002391 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002392 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002393 }
2394 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002395 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002396}
2397
2398static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002399com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002400{
2401 int i;
2402 enum cmp_op op;
2403 int anchor;
2404 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2405 com_expr(c, CHILD(n, 0));
2406 if (NCH(n) == 1)
2407 return;
2408
2409 /****************************************************************
2410 The following code is generated for all but the last
2411 comparison in a chain:
2412
2413 label: on stack: opcode: jump to:
2414
2415 a <code to load b>
2416 a, b DUP_TOP
2417 a, b, b ROT_THREE
2418 b, a, b COMPARE_OP
2419 b, 0-or-1 JUMP_IF_FALSE L1
2420 b, 1 POP_TOP
2421 b
2422
2423 We are now ready to repeat this sequence for the next
2424 comparison in the chain.
2425
2426 For the last we generate:
2427
2428 b <code to load c>
2429 b, c COMPARE_OP
2430 0-or-1
2431
2432 If there were any jumps to L1 (i.e., there was more than one
2433 comparison), we generate:
2434
2435 0-or-1 JUMP_FORWARD L2
2436 L1: b, 0 ROT_TWO
2437 0, b POP_TOP
2438 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002439 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002440 ****************************************************************/
2441
2442 anchor = 0;
2443
2444 for (i = 2; i < NCH(n); i += 2) {
2445 com_expr(c, CHILD(n, i));
2446 if (i+2 < NCH(n)) {
2447 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002448 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002449 com_addbyte(c, ROT_THREE);
2450 }
2451 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002452 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002453 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002454 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002455 }
2456 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002457 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002458 if (i+2 < NCH(n)) {
2459 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2460 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002461 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002462 }
2463 }
2464
2465 if (anchor) {
2466 int anchor2 = 0;
2467 com_addfwref(c, JUMP_FORWARD, &anchor2);
2468 com_backpatch(c, anchor);
2469 com_addbyte(c, ROT_TWO);
2470 com_addbyte(c, POP_TOP);
2471 com_backpatch(c, anchor2);
2472 }
2473}
2474
2475static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002476com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002477{
2478 REQ(n, not_test); /* 'not' not_test | comparison */
2479 if (NCH(n) == 1) {
2480 com_comparison(c, CHILD(n, 0));
2481 }
2482 else {
2483 com_not_test(c, CHILD(n, 1));
2484 com_addbyte(c, UNARY_NOT);
2485 }
2486}
2487
2488static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002489com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002490{
2491 int i;
2492 int anchor;
2493 REQ(n, and_test); /* not_test ('and' not_test)* */
2494 anchor = 0;
2495 i = 0;
2496 for (;;) {
2497 com_not_test(c, CHILD(n, i));
2498 if ((i += 2) >= NCH(n))
2499 break;
2500 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2501 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002502 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002503 }
2504 if (anchor)
2505 com_backpatch(c, anchor);
2506}
2507
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002508static int
2509com_make_closure(struct compiling *c, PyCodeObject *co)
2510{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002511 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002512 if (free == 0)
2513 return 0;
2514 for (i = 0; i < free; ++i) {
2515 /* Bypass com_addop_varname because it will generate
2516 LOAD_DEREF but LOAD_CLOSURE is needed.
2517 */
2518 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2519 int arg, reftype;
2520
2521 /* Special case: If a class contains a method with a
2522 free variable that has the same name as a method,
2523 the name will be considered free *and* local in the
2524 class. It should be handled by the closure, as
2525 well as by the normal name loookup logic.
2526 */
2527 reftype = get_ref_type(c, PyString_AS_STRING(name));
2528 if (reftype == CELL)
2529 arg = com_lookup_arg(c->c_cellvars, name);
2530 else /* (reftype == FREE) */
2531 arg = com_lookup_arg(c->c_freevars, name);
2532 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002533 fprintf(stderr, "lookup %s in %s %d %d\n"
2534 "freevars of %s: %s\n",
2535 PyObject_REPR(name),
2536 c->c_name,
2537 reftype, arg,
2538 PyString_AS_STRING(co->co_name),
2539 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002540 Py_FatalError("com_make_closure()");
2541 }
2542 com_addoparg(c, LOAD_CLOSURE, arg);
2543
2544 }
2545 com_push(c, free);
2546 return 1;
2547}
2548
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002549static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002550com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002551{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002552 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002553 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002554 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002555 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002556 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002557 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2558 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002559 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002560 if (co == NULL) {
2561 c->c_errors++;
2562 return;
2563 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002564 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002565 i = com_addconst(c, (PyObject *)co);
2566 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002567 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002568 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002569 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002570 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002571 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002572 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002573 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002574 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002575 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002576 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002577 else {
2578 int anchor = 0;
2579 int i = 0;
2580 for (;;) {
2581 com_and_test(c, CHILD(n, i));
2582 if ((i += 2) >= NCH(n))
2583 break;
2584 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2585 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002586 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002587 }
2588 if (anchor)
2589 com_backpatch(c, anchor);
2590 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002591}
2592
2593static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002594com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002595{
2596 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002597 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002598 com_node(c, CHILD(n, 0));
2599 }
2600 else {
2601 int i;
2602 int len;
2603 len = (NCH(n) + 1) / 2;
2604 for (i = 0; i < NCH(n); i += 2)
2605 com_node(c, CHILD(n, i));
2606 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002607 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002608 }
2609}
2610
2611
2612/* Begin of assignment compilation */
2613
Thomas Wouters434d0822000-08-24 20:11:32 +00002614
2615static void
2616com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2617{
2618 com_addbyte(c, DUP_TOP);
2619 com_push(c, 1);
2620 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002621 com_node(c, augn);
2622 com_addbyte(c, opcode);
2623 com_pop(c, 1);
2624 com_addbyte(c, ROT_TWO);
2625 com_addopname(c, STORE_ATTR, n);
2626 com_pop(c, 2);
2627}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002628
2629static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002630com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002631{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00002632 if (none_assignment_check(c, STR(n), assigning))
2633 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002634 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002635 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002636}
2637
2638static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002639com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002640{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002641 REQ(n, trailer);
2642 switch (TYPE(CHILD(n, 0))) {
2643 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002644 if (assigning == OP_DELETE)
2645 com_error(c, PyExc_SyntaxError,
2646 "can't delete function call");
2647 else
2648 com_error(c, PyExc_SyntaxError,
2649 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002650 break;
2651 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002652 if (assigning > OP_APPLY)
2653 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2654 else
2655 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002656 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002657 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002658 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002659 break;
2660 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002661 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002662 }
2663}
2664
2665static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002666com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002667{
2668 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002669 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002670 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002671 if (assigning) {
2672 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002673 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002674 com_push(c, i-1);
2675 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002676 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002677 com_assign(c, CHILD(n, i), assigning, NULL);
2678}
2679
2680static void
2681com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2682{
2683 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002684 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002685 com_push(c, 1);
2686 com_node(c, augn);
2687 com_addbyte(c, opcode);
2688 com_pop(c, 1);
2689 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002690}
2691
2692static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002693com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002694{
2695 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002696 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002697 if (assigning)
2698 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002699}
2700
2701static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002702com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002703{
2704 /* Loop to avoid trivial recursion */
2705 for (;;) {
2706 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002707
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002708 case exprlist:
2709 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002710 case testlist1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002711 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002712 if (assigning > OP_APPLY) {
2713 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002714 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002715 return;
2716 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002717 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002718 return;
2719 }
2720 n = CHILD(n, 0);
2721 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002722
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002723 case test:
2724 case and_test:
2725 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002726 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002727 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002728 case xor_expr:
2729 case and_expr:
2730 case shift_expr:
2731 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002732 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002733 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002734 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002735 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002736 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002737 return;
2738 }
2739 n = CHILD(n, 0);
2740 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002741
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002742 case power: /* atom trailer* ('**' power)*
2743 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002744 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002745 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002746 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002747 return;
2748 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002749 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002750 int i;
2751 com_node(c, CHILD(n, 0));
2752 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002753 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002754 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002755 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002756 return;
2757 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002758 com_apply_trailer(c, CHILD(n, i));
2759 } /* NB i is still alive */
2760 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002761 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002762 return;
2763 }
2764 n = CHILD(n, 0);
2765 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002766
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002767 case atom:
2768 switch (TYPE(CHILD(n, 0))) {
2769 case LPAR:
2770 n = CHILD(n, 1);
2771 if (TYPE(n) == RPAR) {
2772 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002773 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002774 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002775 return;
2776 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002777 if (assigning > OP_APPLY) {
2778 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002779 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002780 return;
2781 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002782 break;
2783 case LSQB:
2784 n = CHILD(n, 1);
2785 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002786 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002787 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002788 return;
2789 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002790 if (assigning > OP_APPLY) {
2791 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002792 "augmented assign to list not possible");
2793 return;
2794 }
2795 if (NCH(n) > 1
2796 && TYPE(CHILD(n, 1)) == list_for) {
2797 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002798 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002799 return;
2800 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002801 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002802 return;
2803 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002804 if (assigning > OP_APPLY)
2805 com_augassign_name(c, CHILD(n, 0),
2806 assigning, augn);
2807 else
2808 com_assign_name(c, CHILD(n, 0),
2809 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002810 return;
2811 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002812 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002813 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002814 return;
2815 }
2816 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002817
2818 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002819 com_error(c, PyExc_SyntaxError,
2820 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002821 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002822
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002823 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002824 com_error(c, PyExc_SystemError,
2825 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002826 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002827
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002828 }
2829 }
2830}
Guido van Rossum7c531111997-03-11 18:42:21 +00002831
Thomas Wouters434d0822000-08-24 20:11:32 +00002832static void
2833com_augassign(struct compiling *c, node *n)
2834{
2835 int opcode;
2836
2837 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2838 case '+': opcode = INPLACE_ADD; break;
2839 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002840 case '/':
2841 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
2842 opcode = INPLACE_FLOOR_DIVIDE;
2843 else if (c->c_flags & CO_FUTURE_DIVISION)
2844 opcode = INPLACE_TRUE_DIVIDE;
2845 else
2846 opcode = INPLACE_DIVIDE;
2847 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00002848 case '%': opcode = INPLACE_MODULO; break;
2849 case '<': opcode = INPLACE_LSHIFT; break;
2850 case '>': opcode = INPLACE_RSHIFT; break;
2851 case '&': opcode = INPLACE_AND; break;
2852 case '^': opcode = INPLACE_XOR; break;
2853 case '|': opcode = INPLACE_OR; break;
2854 case '*':
2855 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2856 opcode = INPLACE_POWER;
2857 else
2858 opcode = INPLACE_MULTIPLY;
2859 break;
2860 default:
2861 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2862 return;
2863 }
2864 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2865}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002866
2867static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002868com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002869{
Thomas Wouters434d0822000-08-24 20:11:32 +00002870 REQ(n, expr_stmt);
2871 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002872 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002873 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002874 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002875 if (NCH(n) == 1) {
2876 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002877 if (c->c_interactive)
2878 com_addbyte(c, PRINT_EXPR);
2879 else
2880 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002881 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002882 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002883 else if (TYPE(CHILD(n,1)) == augassign)
2884 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002885 else {
2886 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002887 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002888 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002889 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002890 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002891 com_push(c, 1);
2892 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002893 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002894 }
2895 }
2896}
2897
2898static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002899com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002900{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002901 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002902 int i;
2903 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002904 if (Py_OptimizeFlag)
2905 return;
2906 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00002907
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002908 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00002909 raise AssertionError [, <message>]
2910
2911 where <message> is the second test, if present.
2912 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002913 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002914 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002915 com_addbyte(c, POP_TOP);
2916 com_pop(c, 1);
2917 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002918 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002919 com_push(c, 1);
2920 i = NCH(n)/2; /* Either 2 or 4 */
2921 if (i > 1)
2922 com_node(c, CHILD(n, 3));
2923 com_addoparg(c, RAISE_VARARGS, i);
2924 com_pop(c, i);
2925 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002926 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002927 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002928 com_addbyte(c, POP_TOP);
2929}
2930
2931static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002932com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002933{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002934 int i = 1;
2935 node* stream = NULL;
2936
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002937 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002938
2939 /* are we using the extended print form? */
2940 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2941 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002942 com_node(c, stream);
2943 /* stack: [...] => [... stream] */
2944 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002945 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2946 i = 4;
2947 else
2948 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002949 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002950 for (; i < NCH(n); i += 2) {
2951 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002952 com_addbyte(c, DUP_TOP);
2953 /* stack: [stream] => [stream stream] */
2954 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002955 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002956 /* stack: [stream stream] => [stream stream obj] */
2957 com_addbyte(c, ROT_TWO);
2958 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002959 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002960 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002961 com_pop(c, 2);
2962 }
2963 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002964 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002965 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002966 com_addbyte(c, PRINT_ITEM);
2967 com_pop(c, 1);
2968 }
2969 }
2970 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002971 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002972 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002973 /* must pop the extra stream object off the stack */
2974 com_addbyte(c, POP_TOP);
2975 /* stack: [... stream] => [...] */
2976 com_pop(c, 1);
2977 }
2978 }
2979 else {
2980 if (stream != NULL) {
2981 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002982 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002983 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002984 com_pop(c, 1);
2985 }
2986 else
2987 com_addbyte(c, PRINT_NEWLINE);
2988 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002989}
2990
2991static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002992com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002993{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002994 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002995 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002996 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002997 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002998 if (c->c_flags & CO_GENERATOR) {
2999 if (NCH(n) > 1) {
3000 com_error(c, PyExc_SyntaxError,
3001 "'return' with argument inside generator");
3002 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003003 }
3004 if (NCH(n) < 2) {
3005 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003006 com_push(c, 1);
3007 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003008 else
3009 com_node(c, CHILD(n, 1));
3010 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003011 com_pop(c, 1);
3012}
3013
3014static void
3015com_yield_stmt(struct compiling *c, node *n)
3016{
Tim Peters95c80f82001-06-23 02:07:08 +00003017 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003018 REQ(n, yield_stmt); /* 'yield' testlist */
3019 if (!c->c_infunction) {
3020 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3021 }
Tim Peters95c80f82001-06-23 02:07:08 +00003022
3023 for (i = 0; i < c->c_nblocks; ++i) {
3024 if (c->c_block[i] == SETUP_FINALLY) {
3025 com_error(c, PyExc_SyntaxError,
3026 "'yield' not allowed in a 'try' block "
3027 "with a 'finally' clause");
3028 return;
3029 }
3030 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003031 com_node(c, CHILD(n, 1));
3032 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003033 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003034}
3035
3036static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003037com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003038{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003039 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003040 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3041 if (NCH(n) > 1) {
3042 com_node(c, CHILD(n, 1));
3043 if (NCH(n) > 3) {
3044 com_node(c, CHILD(n, 3));
3045 if (NCH(n) > 5)
3046 com_node(c, CHILD(n, 5));
3047 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003048 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003049 i = NCH(n)/2;
3050 com_addoparg(c, RAISE_VARARGS, i);
3051 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003052}
3053
3054static void
Thomas Wouters52152252000-08-17 22:55:00 +00003055com_from_import(struct compiling *c, node *n)
3056{
3057 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3058 com_push(c, 1);
3059 if (NCH(n) > 1) {
3060 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3061 com_error(c, PyExc_SyntaxError, "invalid syntax");
3062 return;
3063 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003064 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003065 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003066 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003067 com_pop(c, 1);
3068}
3069
3070static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003071com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003072{
3073 int i;
3074 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003075 /* 'import' dotted_name (',' dotted_name)* |
3076 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003077 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00003078 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003079 /* 'from' dotted_name 'import' ... */
3080 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003081
3082 if (TYPE(CHILD(n, 3)) == STAR) {
3083 tup = Py_BuildValue("(s)", "*");
3084 } else {
3085 tup = PyTuple_New((NCH(n) - 2)/2);
3086 for (i = 3; i < NCH(n); i += 2) {
3087 PyTuple_SET_ITEM(tup, (i-3)/2,
Guido van Rossum633d90c2002-12-23 16:51:42 +00003088 PyString_FromString(STR(
3089 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003090 }
3091 }
3092 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003093 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003094 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003095 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00003096 if (TYPE(CHILD(n, 3)) == STAR)
3097 com_addbyte(c, IMPORT_STAR);
3098 else {
3099 for (i = 3; i < NCH(n); i += 2)
3100 com_from_import(c, CHILD(n, i));
3101 com_addbyte(c, POP_TOP);
3102 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003103 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003104 }
3105 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003106 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003107 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003108 node *subn = CHILD(n, i);
3109 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003110 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003111 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003112 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003113 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003114 int j;
3115 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003116 com_error(c, PyExc_SyntaxError,
3117 "invalid syntax");
3118 return;
3119 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003120 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3121 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003122 CHILD(CHILD(subn, 0),
3123 j));
3124 com_addop_varname(c, VAR_STORE,
3125 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003126 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003127 com_addop_varname(c, VAR_STORE,
3128 STR(CHILD(CHILD(subn, 0),
3129 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003130 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003131 }
3132 }
3133}
3134
3135static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003136com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003137{
3138 REQ(n, exec_stmt);
3139 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3140 com_node(c, CHILD(n, 1));
3141 if (NCH(n) >= 4)
3142 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003143 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003144 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003145 com_push(c, 1);
3146 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003147 if (NCH(n) >= 6)
3148 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003149 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003150 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003151 com_push(c, 1);
3152 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003153 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003154 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003155}
3156
Guido van Rossum7c531111997-03-11 18:42:21 +00003157static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003158is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003159{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003160 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003161 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003162 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003163
3164 /* Label to avoid tail recursion */
3165 next:
3166 switch (TYPE(n)) {
3167
3168 case suite:
3169 if (NCH(n) == 1) {
3170 n = CHILD(n, 0);
3171 goto next;
3172 }
3173 /* Fall through */
3174 case file_input:
3175 for (i = 0; i < NCH(n); i++) {
3176 node *ch = CHILD(n, i);
3177 if (TYPE(ch) == stmt) {
3178 n = ch;
3179 goto next;
3180 }
3181 }
3182 break;
3183
3184 case stmt:
3185 case simple_stmt:
3186 case small_stmt:
3187 n = CHILD(n, 0);
3188 goto next;
3189
3190 case expr_stmt:
3191 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003192 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003193 case test:
3194 case and_test:
3195 case not_test:
3196 case comparison:
3197 case expr:
3198 case xor_expr:
3199 case and_expr:
3200 case shift_expr:
3201 case arith_expr:
3202 case term:
3203 case factor:
3204 case power:
3205 case atom:
3206 if (NCH(n) == 1) {
3207 n = CHILD(n, 0);
3208 goto next;
3209 }
3210 break;
3211
3212 case NAME:
3213 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3214 return 1;
3215 break;
3216
3217 case NUMBER:
3218 v = parsenumber(c, STR(n));
3219 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003220 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003221 break;
3222 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003223 i = PyObject_IsTrue(v);
3224 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003225 return i == 0;
3226
3227 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003228 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003229 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003230 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003231 break;
3232 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003233 i = PyObject_IsTrue(v);
3234 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003235 return i == 0;
3236
3237 }
3238 return 0;
3239}
3240
Tim Peters08a898f2001-06-28 01:52:22 +00003241
3242/* Look under n for a return stmt with an expression.
3243 * This hack is used to find illegal returns under "if 0:" blocks in
3244 * functions already known to be generators (as determined by the symtable
3245 * pass).
3246 * Return the offending return node if found, else NULL.
3247 */
3248static node *
3249look_for_offending_return(node *n)
3250{
3251 int i;
3252
3253 for (i = 0; i < NCH(n); ++i) {
3254 node *kid = CHILD(n, i);
3255
3256 switch (TYPE(kid)) {
3257 case classdef:
3258 case funcdef:
3259 case lambdef:
3260 /* Stuff in nested functions & classes doesn't
3261 affect the code block we started in. */
3262 return NULL;
3263
3264 case return_stmt:
3265 if (NCH(kid) > 1)
3266 return kid;
3267 break;
3268
3269 default: {
3270 node *bad = look_for_offending_return(kid);
3271 if (bad != NULL)
3272 return bad;
3273 }
3274 }
3275 }
3276
3277 return NULL;
3278}
3279
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003280static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003281com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003282{
3283 int i;
3284 int anchor = 0;
3285 REQ(n, if_stmt);
3286 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3287 for (i = 0; i+3 < NCH(n); i+=4) {
3288 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003289 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003290 if (is_constant_false(c, ch)) {
3291 /* We're going to skip this block. However, if this
3292 is a generator, we have to check the dead code
3293 anyway to make sure there aren't any return stmts
3294 with expressions, in the same scope. */
3295 if (c->c_flags & CO_GENERATOR) {
3296 node *p = look_for_offending_return(n);
3297 if (p != NULL) {
3298 int savelineno = c->c_lineno;
3299 c->c_lineno = p->n_lineno;
3300 com_error(c, PyExc_SyntaxError,
3301 "'return' with argument "
3302 "inside generator");
3303 c->c_lineno = savelineno;
3304 }
3305 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003306 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003307 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003308 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003309 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003310 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003311 com_addfwref(c, JUMP_IF_FALSE, &a);
3312 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003313 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003314 com_node(c, CHILD(n, i+3));
3315 com_addfwref(c, JUMP_FORWARD, &anchor);
3316 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003317 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003318 com_addbyte(c, POP_TOP);
3319 }
3320 if (i+2 < NCH(n))
3321 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003322 if (anchor)
3323 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003324}
3325
3326static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003327com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003328{
3329 int break_anchor = 0;
3330 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003331 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003332 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3333 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003334 block_push(c, SETUP_LOOP);
3335 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003336 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003337 com_node(c, CHILD(n, 1));
3338 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3339 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003340 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003341 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003342 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003343 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003344 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3345 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003346 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003347 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003348 com_addbyte(c, POP_TOP);
3349 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003350 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003351 if (NCH(n) > 4)
3352 com_node(c, CHILD(n, 6));
3353 com_backpatch(c, break_anchor);
3354}
3355
3356static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003357com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003358{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003359 int break_anchor = 0;
3360 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003361 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003362 REQ(n, for_stmt);
3363 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3364 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003365 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003366 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003367 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003368 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003369 com_set_lineno(c, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003370 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003371 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003372 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003373 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003374 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003375 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003376 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3377 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003378 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003379 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003380 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003381 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003382 if (NCH(n) > 8)
3383 com_node(c, CHILD(n, 8));
3384 com_backpatch(c, break_anchor);
3385}
3386
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003387/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003388
3389 SETUP_FINALLY L
3390 <code for S>
3391 POP_BLOCK
3392 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003393 L: <code for Sf>
3394 END_FINALLY
3395
3396 The special instructions use the block stack. Each block
3397 stack entry contains the instruction that created it (here
3398 SETUP_FINALLY), the level of the value stack at the time the
3399 block stack entry was created, and a label (here L).
3400
3401 SETUP_FINALLY:
3402 Pushes the current value stack level and the label
3403 onto the block stack.
3404 POP_BLOCK:
3405 Pops en entry from the block stack, and pops the value
3406 stack until its level is the same as indicated on the
3407 block stack. (The label is ignored.)
3408 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003409 Pops a variable number of entries from the *value* stack
3410 and re-raises the exception they specify. The number of
3411 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003412
3413 The block stack is unwound when an exception is raised:
3414 when a SETUP_FINALLY entry is found, the exception is pushed
3415 onto the value stack (and the exception condition is cleared),
3416 and the interpreter jumps to the label gotten from the block
3417 stack.
3418
3419 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003420 (The contents of the value stack is shown in [], with the top
3421 at the right; 'tb' is trace-back info, 'val' the exception's
3422 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003423
3424 Value stack Label Instruction Argument
3425 [] SETUP_EXCEPT L1
3426 [] <code for S>
3427 [] POP_BLOCK
3428 [] JUMP_FORWARD L0
3429
Guido van Rossum3f5da241990-12-20 15:06:42 +00003430 [tb, val, exc] L1: DUP )
3431 [tb, val, exc, exc] <evaluate E1> )
3432 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3433 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3434 [tb, val, exc, 1] POP )
3435 [tb, val, exc] POP
3436 [tb, val] <assign to V1> (or POP if no V1)
3437 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003438 [] <code for S1>
3439 JUMP_FORWARD L0
3440
Guido van Rossum3f5da241990-12-20 15:06:42 +00003441 [tb, val, exc, 0] L2: POP
3442 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003443 .............................etc.......................
3444
Guido van Rossum3f5da241990-12-20 15:06:42 +00003445 [tb, val, exc, 0] Ln+1: POP
3446 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003447
3448 [] L0: <next statement>
3449
3450 Of course, parts are not generated if Vi or Ei is not present.
3451*/
3452
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003453static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003454com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003455{
3456 int except_anchor = 0;
3457 int end_anchor = 0;
3458 int else_anchor = 0;
3459 int i;
3460 node *ch;
3461
3462 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3463 block_push(c, SETUP_EXCEPT);
3464 com_node(c, CHILD(n, 2));
3465 com_addbyte(c, POP_BLOCK);
3466 block_pop(c, SETUP_EXCEPT);
3467 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3468 com_backpatch(c, except_anchor);
3469 for (i = 3;
3470 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3471 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003472 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003473 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003474 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003475 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003476 break;
3477 }
3478 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003479 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003480 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003481 if (NCH(ch) > 1) {
3482 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003483 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003484 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003485 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003486 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003487 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3488 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003489 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003490 }
3491 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003492 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003493 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003494 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003495 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003496 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003497 com_pop(c, 1);
3498 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003499 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003500 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003501 com_node(c, CHILD(n, i+2));
3502 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3503 if (except_anchor) {
3504 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003505 /* We come in with [tb, val, exc, 0] on the
3506 stack; one pop and it's the same as
3507 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003508 com_addbyte(c, POP_TOP);
3509 }
3510 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003511 /* We actually come in here with [tb, val, exc] but the
3512 END_FINALLY will zap those and jump around.
3513 The c_stacklevel does not reflect them so we need not pop
3514 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003515 com_addbyte(c, END_FINALLY);
3516 com_backpatch(c, else_anchor);
3517 if (i < NCH(n))
3518 com_node(c, CHILD(n, i+2));
3519 com_backpatch(c, end_anchor);
3520}
3521
3522static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003523com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003524{
3525 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003526 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003527
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003528 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3529 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003530 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003531 com_addbyte(c, POP_BLOCK);
3532 block_pop(c, SETUP_FINALLY);
3533 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003534 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003535 /* While the generated code pushes only one item,
3536 the try-finally handling can enter here with
3537 up to three items. OK, here are the details:
3538 3 for an exception, 2 for RETURN, 1 for BREAK. */
3539 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003540 com_backpatch(c, finally_anchor);
3541 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003542 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003543 com_node(c, ch);
3544 com_addbyte(c, END_FINALLY);
3545 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003546 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003547}
3548
3549static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003550com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003551{
3552 REQ(n, try_stmt);
3553 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3554 | 'try' ':' suite 'finally' ':' suite */
3555 if (TYPE(CHILD(n, 3)) != except_clause)
3556 com_try_finally(c, n);
3557 else
3558 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003559}
3560
Guido van Rossum8b993a91997-01-17 21:04:03 +00003561static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003562get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003563{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003564 int i;
3565
Guido van Rossum8b993a91997-01-17 21:04:03 +00003566 /* Label to avoid tail recursion */
3567 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003568 switch (TYPE(n)) {
3569
3570 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003571 if (NCH(n) == 1) {
3572 n = CHILD(n, 0);
3573 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003574 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003575 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003576 case file_input:
3577 for (i = 0; i < NCH(n); i++) {
3578 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003579 if (TYPE(ch) == stmt) {
3580 n = ch;
3581 goto next;
3582 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003583 }
3584 break;
3585
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003586 case stmt:
3587 case simple_stmt:
3588 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003589 n = CHILD(n, 0);
3590 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003591
3592 case expr_stmt:
3593 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003594 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003595 case test:
3596 case and_test:
3597 case not_test:
3598 case comparison:
3599 case expr:
3600 case xor_expr:
3601 case and_expr:
3602 case shift_expr:
3603 case arith_expr:
3604 case term:
3605 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003606 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003607 if (NCH(n) == 1) {
3608 n = CHILD(n, 0);
3609 goto next;
3610 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003611 break;
3612
3613 case atom:
3614 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003615 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003616 break;
3617
3618 }
3619 return NULL;
3620}
3621
Guido van Rossum79f25d91997-04-29 20:08:16 +00003622static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003623get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003624{
Guido van Rossum541563e1999-01-28 15:08:09 +00003625 /* Don't generate doc-strings if run with -OO */
3626 if (Py_OptimizeFlag > 1)
3627 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003628 n = get_rawdocstring(n);
3629 if (n == NULL)
3630 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003631 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003632}
3633
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003634static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003635com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003636{
3637 REQ(n, suite);
3638 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3639 if (NCH(n) == 1) {
3640 com_node(c, CHILD(n, 0));
3641 }
3642 else {
3643 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003644 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003645 node *ch = CHILD(n, i);
3646 if (TYPE(ch) == stmt)
3647 com_node(c, ch);
3648 }
3649 }
3650}
3651
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003652/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003653static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003654com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003655{
3656 int i = c->c_nblocks;
3657 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3658 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3659 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003660 else if (i <= 0) {
3661 /* at the outer level */
3662 com_error(c, PyExc_SyntaxError,
3663 "'continue' not properly in loop");
3664 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003665 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003666 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003667 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003668 if (c->c_block[j] == SETUP_LOOP)
3669 break;
3670 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003671 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003672 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003673 for (; i > j; --i) {
3674 if (c->c_block[i] == SETUP_EXCEPT ||
3675 c->c_block[i] == SETUP_FINALLY) {
3676 com_addoparg(c, CONTINUE_LOOP,
3677 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003678 return;
3679 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003680 if (c->c_block[i] == END_FINALLY) {
3681 com_error(c, PyExc_SyntaxError,
3682 "'continue' not supported inside 'finally' clause");
3683 return;
3684 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003685 }
3686 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003687 com_error(c, PyExc_SyntaxError,
3688 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003689 }
3690 /* XXX Could allow it inside a 'finally' clause
3691 XXX if we could pop the exception still on the stack */
3692}
3693
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003694static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003695com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003696{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003697 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003698 if (TYPE(n) == lambdef) {
3699 /* lambdef: 'lambda' [varargslist] ':' test */
3700 n = CHILD(n, 1);
3701 }
3702 else {
3703 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3704 n = CHILD(n, 2);
3705 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3706 n = CHILD(n, 1);
3707 }
3708 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003709 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003710 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003711 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003712 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3713 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003714 nargs = 0;
3715 ndefs = 0;
3716 for (i = 0; i < nch; i++) {
3717 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003718 if (TYPE(CHILD(n, i)) == STAR ||
3719 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003720 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003721 nargs++;
3722 i++;
3723 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003724 t = RPAR; /* Anything except EQUAL or COMMA */
3725 else
3726 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003727 if (t == EQUAL) {
3728 i++;
3729 ndefs++;
3730 com_node(c, CHILD(n, i));
3731 i++;
3732 if (i >= nch)
3733 break;
3734 t = TYPE(CHILD(n, i));
3735 }
3736 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003737 /* Treat "(a=1, b)" as an error */
3738 if (ndefs)
3739 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003740 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003741 }
3742 if (t != COMMA)
3743 break;
3744 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003745 return ndefs;
3746}
3747
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003748static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003749com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003750{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003751 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003752 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003753 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003754 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003755 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3756 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003757 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003758 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003759 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003760 c->c_errors++;
3761 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003762 int closure = com_make_closure(c, (PyCodeObject *)co);
3763 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003764 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003765 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003766 if (closure)
3767 com_addoparg(c, MAKE_CLOSURE, ndefs);
3768 else
3769 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003770 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003771 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003772 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003773 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003774 }
3775}
3776
3777static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003778com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003779{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003780 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003781 REQ(n, testlist);
3782 /* testlist: test (',' test)* [','] */
3783 for (i = 0; i < NCH(n); i += 2)
3784 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003785 i = (NCH(n)+1) / 2;
3786 com_addoparg(c, BUILD_TUPLE, i);
3787 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003788}
3789
3790static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003791com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003792{
Guido van Rossum25831651993-05-19 14:50:45 +00003793 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003794 PyObject *v;
3795 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003796 char *name;
3797
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003798 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003799 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003800 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003801 c->c_errors++;
3802 return;
3803 }
3804 /* Push the class name on the stack */
3805 i = com_addconst(c, v);
3806 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003807 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003808 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003809 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003810 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003811 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003812 com_push(c, 1);
3813 }
Guido van Rossum25831651993-05-19 14:50:45 +00003814 else
3815 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003816 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003817 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003818 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003819 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003820 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003821 c->c_errors++;
3822 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003823 int closure = com_make_closure(c, co);
3824 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003825 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003826 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003827 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003828 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003829 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003830 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003831 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003832 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003833 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003834 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003835 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003836 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003837 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003838 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003839}
3840
3841static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003842com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003843{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003844 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003845 if (c->c_errors)
3846 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003847 switch (TYPE(n)) {
3848
3849 /* Definition nodes */
3850
3851 case funcdef:
3852 com_funcdef(c, n);
3853 break;
3854 case classdef:
3855 com_classdef(c, n);
3856 break;
3857
3858 /* Trivial parse tree nodes */
3859
3860 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003861 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003862 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003863 n = CHILD(n, 0);
3864 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003865
3866 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003867 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003868 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003869 {
3870 int i;
3871 for (i = 0; i < NCH(n)-1; i += 2)
3872 com_node(c, CHILD(n, i));
3873 }
3874 break;
3875
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003876 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003877 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003878 n = CHILD(n, 0);
3879 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003880
3881 /* Statement nodes */
3882
3883 case expr_stmt:
3884 com_expr_stmt(c, n);
3885 break;
3886 case print_stmt:
3887 com_print_stmt(c, n);
3888 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003889 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003890 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003891 break;
3892 case pass_stmt:
3893 break;
3894 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003895 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003896 com_error(c, PyExc_SyntaxError,
3897 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003898 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003899 com_addbyte(c, BREAK_LOOP);
3900 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003901 case continue_stmt:
3902 com_continue_stmt(c, n);
3903 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003904 case return_stmt:
3905 com_return_stmt(c, n);
3906 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003907 case yield_stmt:
3908 com_yield_stmt(c, n);
3909 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003910 case raise_stmt:
3911 com_raise_stmt(c, n);
3912 break;
3913 case import_stmt:
3914 com_import_stmt(c, n);
3915 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003916 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003917 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003918 case exec_stmt:
3919 com_exec_stmt(c, n);
3920 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003921 case assert_stmt:
3922 com_assert_stmt(c, n);
3923 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003924 case if_stmt:
3925 com_if_stmt(c, n);
3926 break;
3927 case while_stmt:
3928 com_while_stmt(c, n);
3929 break;
3930 case for_stmt:
3931 com_for_stmt(c, n);
3932 break;
3933 case try_stmt:
3934 com_try_stmt(c, n);
3935 break;
3936 case suite:
3937 com_suite(c, n);
3938 break;
3939
3940 /* Expression nodes */
3941
3942 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003943 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00003944 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003945 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003946 break;
3947 case test:
3948 com_test(c, n);
3949 break;
3950 case and_test:
3951 com_and_test(c, n);
3952 break;
3953 case not_test:
3954 com_not_test(c, n);
3955 break;
3956 case comparison:
3957 com_comparison(c, n);
3958 break;
3959 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003960 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003961 break;
3962 case expr:
3963 com_expr(c, n);
3964 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003965 case xor_expr:
3966 com_xor_expr(c, n);
3967 break;
3968 case and_expr:
3969 com_and_expr(c, n);
3970 break;
3971 case shift_expr:
3972 com_shift_expr(c, n);
3973 break;
3974 case arith_expr:
3975 com_arith_expr(c, n);
3976 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003977 case term:
3978 com_term(c, n);
3979 break;
3980 case factor:
3981 com_factor(c, n);
3982 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003983 case power:
3984 com_power(c, n);
3985 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003986 case atom:
3987 com_atom(c, n);
3988 break;
3989
3990 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003991 com_error(c, PyExc_SystemError,
3992 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003993 }
3994}
3995
Tim Petersdbd9ba62000-07-09 03:09:57 +00003996static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003997
3998static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003999com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004000{
4001 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4002 if (TYPE(CHILD(n, 0)) == LPAR)
4003 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004004 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004005 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004006 com_pop(c, 1);
4007 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004008}
4009
4010static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004011com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004012{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004013 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004014 if (NCH(n) == 1) {
4015 com_fpdef(c, CHILD(n, 0));
4016 }
4017 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004018 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004019 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004020 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004021 for (i = 0; i < NCH(n); i += 2)
4022 com_fpdef(c, CHILD(n, i));
4023 }
4024}
4025
4026static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004027com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004028{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004029 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004030 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004031 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004032 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004033 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004034 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004035 nch = NCH(n);
4036 /* Enter all arguments in table of locals */
4037 for (i = 0, narg = 0; i < nch; i++) {
4038 node *ch = CHILD(n, i);
4039 node *fp;
4040 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004041 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004042 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4043 fp = CHILD(ch, 0);
4044 if (TYPE(fp) != NAME) {
4045 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4046 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004047 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004048 narg++;
4049 /* all name updates handled by symtable */
4050 if (++i >= nch)
4051 break;
4052 ch = CHILD(n, i);
4053 if (TYPE(ch) == EQUAL)
4054 i += 2;
4055 else
4056 REQ(ch, COMMA);
4057 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004058 if (complex) {
4059 /* Generate code for complex arguments only after
4060 having counted the simple arguments */
4061 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004062 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004063 node *ch = CHILD(n, i);
4064 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004065 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004066 break;
4067 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4068 fp = CHILD(ch, 0);
4069 if (TYPE(fp) != NAME) {
4070 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004071 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004072 com_fpdef(c, ch);
4073 }
4074 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004075 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004076 break;
4077 ch = CHILD(n, i);
4078 if (TYPE(ch) == EQUAL)
4079 i += 2;
4080 else
4081 REQ(ch, COMMA);
4082 }
4083 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004084}
4085
4086static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004087com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004088{
4089 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004090 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004091 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004092 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004093 if (doc != NULL) {
4094 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004095 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004096 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004097 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004098 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004099 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004100 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004101 for (i = 0; i < NCH(n); i++) {
4102 node *ch = CHILD(n, i);
4103 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4104 com_node(c, ch);
4105 }
4106}
4107
4108/* Top-level compile-node interface */
4109
4110static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004111compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004112{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004113 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004114 node *ch;
4115 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00004116 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004117 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004118 if (doc != NULL) {
4119 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004120 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004121 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004122 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004123 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004124 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
4125 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004126 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004127 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004128 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004129 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004130 c->c_infunction = 0;
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004131 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4132 com_push(c, 1);
4133 com_addbyte(c, RETURN_VALUE);
4134 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004135}
4136
4137static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004138compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004139{
Guido van Rossum590baa41993-11-30 13:40:46 +00004140 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004141 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004142 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004143
4144 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004145 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004146 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004147 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004148 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004149 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004150 else
4151 ch = CHILD(n, 2);
4152 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004153 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004154 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004155}
4156
4157static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004158compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004159{
4160 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004161 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004162 REQ(n, classdef);
4163 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4164 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004165 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004166 /* Initialize local __module__ from global __name__ */
4167 com_addop_name(c, LOAD_GLOBAL, "__name__");
4168 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004169 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004170 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004171 if (doc != NULL) {
4172 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004173 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004174 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004175 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004176 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004177 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004178 }
4179 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004180 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004181 com_node(c, ch);
4182 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004183 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004184 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004185 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004186}
4187
4188static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004189compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004190{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004191 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004192
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004193 switch (TYPE(n)) {
4194
Guido van Rossum4c417781991-01-21 16:09:22 +00004195 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004196 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004197 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004198 n = CHILD(n, 0);
4199 if (TYPE(n) != NEWLINE)
4200 com_node(c, n);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004201 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4202 com_push(c, 1);
4203 com_addbyte(c, RETURN_VALUE);
4204 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004205 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004206 break;
4207
Guido van Rossum4c417781991-01-21 16:09:22 +00004208 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004209 com_file_input(c, n);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004210 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4211 com_push(c, 1);
4212 com_addbyte(c, RETURN_VALUE);
4213 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004214 break;
4215
Guido van Rossum590baa41993-11-30 13:40:46 +00004216 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004217 com_node(c, CHILD(n, 0));
4218 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004219 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004220 break;
4221
Guido van Rossum590baa41993-11-30 13:40:46 +00004222 case lambdef: /* anonymous function definition */
4223 compile_lambdef(c, n);
4224 break;
4225
Guido van Rossum4c417781991-01-21 16:09:22 +00004226 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004227 compile_funcdef(c, n);
4228 break;
4229
Guido van Rossum4c417781991-01-21 16:09:22 +00004230 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004231 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004232 break;
4233
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004234 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004235 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004236 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004237 }
4238}
4239
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004240static PyObject *
4241dict_keys_inorder(PyObject *dict, int offset)
4242{
4243 PyObject *tuple, *k, *v;
4244 int i, pos = 0, size = PyDict_Size(dict);
4245
4246 tuple = PyTuple_New(size);
4247 if (tuple == NULL)
4248 return NULL;
4249 while (PyDict_Next(dict, &pos, &k, &v)) {
4250 i = PyInt_AS_LONG(v);
4251 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004252 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004253 PyTuple_SET_ITEM(tuple, i - offset, k);
4254 }
4255 return tuple;
4256}
4257
Guido van Rossum79f25d91997-04-29 20:08:16 +00004258PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004259PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004260{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004261 return PyNode_CompileFlags(n, filename, NULL);
4262}
4263
4264PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004265PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004266{
4267 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004268}
4269
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004270struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004271PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004272{
4273 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004274 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004275
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004276 ff = PyNode_Future(n, filename);
4277 if (ff == NULL)
4278 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004279
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004280 st = symtable_init();
Tim Peters8c5e4152001-11-04 19:26:58 +00004281 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004282 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004283 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004284 }
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004285 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004286 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004287 if (st->st_errors > 0)
4288 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004289 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004290 if (st->st_errors > 0)
4291 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004292
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004293 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004294 fail:
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004295 PyObject_FREE((void *)ff);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004296 st->st_future = NULL;
4297 PySymtable_Free(st);
4298 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004299}
4300
Guido van Rossum79f25d91997-04-29 20:08:16 +00004301static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004302icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004303{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004304 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004305}
4306
Guido van Rossum79f25d91997-04-29 20:08:16 +00004307static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004308jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004309 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004310{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004311 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004312 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004313 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004314 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004315 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4316 sc.c_encoding = "utf-8";
4317 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004318 sc.c_encoding = STR(n);
4319 n = CHILD(n, 0);
4320 } else {
4321 sc.c_encoding = NULL;
4322 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004323 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004324 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004325 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004326 /* c_symtable still points to parent's symbols */
4327 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004328 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004329 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004330 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004331 if (base->c_encoding != NULL) {
4332 assert(sc.c_encoding == NULL);
4333 sc.c_encoding = base->c_encoding;
4334 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004335 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004336 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004337 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004338 if (sc.c_future == NULL) {
4339 com_free(&sc);
4340 return NULL;
4341 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004342 if (flags) {
4343 int merged = sc.c_future->ff_features |
4344 flags->cf_flags;
4345 sc.c_future->ff_features = merged;
4346 flags->cf_flags = merged;
4347 }
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004348 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004349 com_free(&sc);
4350 return NULL;
4351 }
4352 }
4353 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004354 if (symtable_load_symbols(&sc) < 0) {
4355 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004356 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004357 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004358 compile_node(&sc, n);
4359 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004360 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004361 PyObject *consts, *names, *varnames, *filename, *name,
4362 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004363 consts = PyList_AsTuple(sc.c_consts);
4364 names = PyList_AsTuple(sc.c_names);
4365 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004366 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4367 freevars = dict_keys_inorder(sc.c_freevars,
4368 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004369 filename = PyString_InternFromString(sc.c_filename);
4370 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004371 if (!PyErr_Occurred())
4372 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004373 sc.c_nlocals,
4374 sc.c_maxstacklevel,
4375 sc.c_flags,
4376 sc.c_code,
4377 consts,
4378 names,
4379 varnames,
4380 freevars,
4381 cellvars,
4382 filename,
4383 name,
4384 sc.c_firstlineno,
4385 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004386 Py_XDECREF(consts);
4387 Py_XDECREF(names);
4388 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004389 Py_XDECREF(freevars);
4390 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004391 Py_XDECREF(filename);
4392 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004393 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004394 else if (!PyErr_Occurred()) {
4395 /* This could happen if someone called PyErr_Clear() after an
4396 error was reported above. That's not supposed to happen,
4397 but I just plugged one case and I'm not sure there can't be
4398 others. In that case, raise SystemError so that at least
4399 it gets reported instead dumping core. */
4400 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4401 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004402 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004403 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004404 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004405 sc.c_symtable = NULL;
4406 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004407 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004408 return co;
4409}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004410
4411int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004412PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004413{
4414 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004415 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004416 int line = co->co_firstlineno;
4417 int addr = 0;
4418 while (--size >= 0) {
4419 addr += *p++;
4420 if (addr > addrq)
4421 break;
4422 line += *p++;
4423 }
4424 return line;
4425}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004426
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004427/* The test for LOCAL must come before the test for FREE in order to
4428 handle classes where name is both local and free. The local var is
4429 a method and the free var is a free var referenced within a method.
4430*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004431
4432static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004433get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004434{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004435 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004436 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004437
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004438 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4439 return CELL;
4440 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4441 return LOCAL;
4442 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4443 return FREE;
4444 v = PyDict_GetItemString(c->c_globals, name);
4445 if (v) {
4446 if (v == Py_None)
4447 return GLOBAL_EXPLICIT;
4448 else {
4449 return GLOBAL_IMPLICIT;
4450 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004451 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004452 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004453 "unknown scope for %.100s in %.100s(%s) "
4454 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4455 name, c->c_name,
4456 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4457 c->c_filename,
4458 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4459 PyObject_REPR(c->c_locals),
4460 PyObject_REPR(c->c_globals)
4461 );
4462
4463 Py_FatalError(buf);
4464 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004465}
4466
Guido van Rossum207fda62001-03-02 03:30:41 +00004467/* Helper functions to issue warnings */
4468
4469static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004470issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004471{
4472 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4473 lineno, NULL, NULL) < 0) {
4474 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4475 PyErr_SetString(PyExc_SyntaxError, msg);
4476 PyErr_SyntaxLocation(filename, lineno);
4477 }
4478 return -1;
4479 }
4480 return 0;
4481}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004482
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004483static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004484symtable_warn(struct symtable *st, char *msg)
4485{
Guido van Rossum207fda62001-03-02 03:30:41 +00004486 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004487 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004488 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004489 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004490 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004491}
4492
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004493/* Helper function for setting lineno and filename */
4494
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004495static int
4496symtable_build(struct compiling *c, node *n)
4497{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004498 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004499 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004500 c->c_symtable->st_future = c->c_future;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004501 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004502 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4503 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004504 return -1;
4505 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004506 if (c->c_symtable->st_errors > 0)
4507 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004508 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004509 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004510 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004511 return 0;
4512}
4513
4514static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004515symtable_init_compiling_symbols(struct compiling *c)
4516{
4517 PyObject *varnames;
4518
4519 varnames = c->c_symtable->st_cur->ste_varnames;
4520 if (varnames == NULL) {
4521 varnames = PyList_New(0);
4522 if (varnames == NULL)
4523 return -1;
4524 c->c_symtable->st_cur->ste_varnames = varnames;
4525 Py_INCREF(varnames);
4526 } else
4527 Py_INCREF(varnames);
4528 c->c_varnames = varnames;
4529
4530 c->c_globals = PyDict_New();
4531 if (c->c_globals == NULL)
4532 return -1;
4533 c->c_freevars = PyDict_New();
4534 if (c->c_freevars == NULL)
4535 return -1;
4536 c->c_cellvars = PyDict_New();
4537 if (c->c_cellvars == NULL)
4538 return -1;
4539 return 0;
4540}
4541
4542struct symbol_info {
4543 int si_nlocals;
4544 int si_ncells;
4545 int si_nfrees;
4546 int si_nimplicit;
4547};
4548
4549static void
4550symtable_init_info(struct symbol_info *si)
4551{
4552 si->si_nlocals = 0;
4553 si->si_ncells = 0;
4554 si->si_nfrees = 0;
4555 si->si_nimplicit = 0;
4556}
4557
4558static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004559symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004560 struct symbol_info *si)
4561{
4562 PyObject *dict, *v;
4563
4564 /* Seperate logic for DEF_FREE. If it occurs in a function,
4565 it indicates a local that we must allocate storage for (a
4566 cell var). If it occurs in a class, then the class has a
4567 method and a free variable with the same name.
4568 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004569 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004570 /* If it isn't declared locally, it can't be a cell. */
4571 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4572 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004573 v = PyInt_FromLong(si->si_ncells++);
4574 dict = c->c_cellvars;
4575 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004576 /* If it is free anyway, then there is no need to do
4577 anything here.
4578 */
4579 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004580 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004581 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004582 v = PyInt_FromLong(si->si_nfrees++);
4583 dict = c->c_freevars;
4584 }
4585 if (v == NULL)
4586 return -1;
4587 if (PyDict_SetItem(dict, name, v) < 0) {
4588 Py_DECREF(v);
4589 return -1;
4590 }
4591 Py_DECREF(v);
4592 return 0;
4593}
4594
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004595/* If a variable is a cell and an argument, make sure that appears in
4596 co_cellvars before any variable to its right in varnames.
4597*/
4598
4599
4600static int
4601symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4602 PyObject *varnames, int flags)
4603{
Tim Petersb39903b2003-03-24 17:22:24 +00004604 PyObject *v = NULL;
4605 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004606 int i, pos;
4607
4608 if (flags & CO_VARARGS)
4609 argcount++;
4610 if (flags & CO_VARKEYWORDS)
4611 argcount++;
4612 for (i = argcount; --i >= 0; ) {
4613 v = PyList_GET_ITEM(varnames, i);
4614 if (PyDict_GetItem(*cellvars, v)) {
4615 if (list == NULL) {
4616 list = PyList_New(1);
4617 if (list == NULL)
4618 return -1;
4619 PyList_SET_ITEM(list, 0, v);
4620 Py_INCREF(v);
4621 } else
4622 PyList_Insert(list, 0, v);
4623 }
4624 }
4625 if (list == NULL || PyList_GET_SIZE(list) == 0)
4626 return 0;
4627 /* There are cellvars that are also arguments. Create a dict
4628 to replace cellvars and put the args at the front.
4629 */
4630 d = PyDict_New();
4631 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4632 v = PyInt_FromLong(i);
4633 if (v == NULL)
4634 goto fail;
4635 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4636 goto fail;
4637 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4638 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00004639 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004640 }
4641 pos = 0;
4642 i = PyList_GET_SIZE(list);
4643 Py_DECREF(list);
4644 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4645 w = PyInt_FromLong(i++); /* don't care about the old key */
4646 if (PyDict_SetItem(d, v, w) < 0) {
4647 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00004648 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004649 goto fail;
4650 }
4651 Py_DECREF(w);
4652 }
4653 Py_DECREF(*cellvars);
4654 *cellvars = d;
4655 return 1;
4656 fail:
4657 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00004658 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004659 return -1;
4660}
4661
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004662static int
4663symtable_freevar_offsets(PyObject *freevars, int offset)
4664{
4665 PyObject *name, *v;
4666 int pos;
4667
4668 /* The cell vars are the first elements of the closure,
4669 followed by the free vars. Update the offsets in
4670 c_freevars to account for number of cellvars. */
4671 pos = 0;
4672 while (PyDict_Next(freevars, &pos, &name, &v)) {
4673 int i = PyInt_AS_LONG(v) + offset;
4674 PyObject *o = PyInt_FromLong(i);
4675 if (o == NULL)
4676 return -1;
4677 if (PyDict_SetItem(freevars, name, o) < 0) {
4678 Py_DECREF(o);
4679 return -1;
4680 }
4681 Py_DECREF(o);
4682 }
4683 return 0;
4684}
4685
4686static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004687symtable_check_unoptimized(struct compiling *c,
4688 PySymtableEntryObject *ste,
4689 struct symbol_info *si)
4690{
4691 char buf[300];
4692
4693 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4694 || (ste->ste_nested && si->si_nimplicit)))
4695 return 0;
4696
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004697#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4698
4699#define ILLEGAL_IS "is a nested function"
4700
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004701#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004702"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004703
4704#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004705"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004706
4707#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00004708"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004709"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004710
4711 /* XXX perhaps the linenos for these opt-breaking statements
4712 should be stored so the exception can point to them. */
4713
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004714 if (ste->ste_child_free) {
4715 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004716 PyOS_snprintf(buf, sizeof(buf),
4717 ILLEGAL_IMPORT_STAR,
4718 PyString_AS_STRING(ste->ste_name),
4719 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004720 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004721 PyOS_snprintf(buf, sizeof(buf),
4722 ILLEGAL_BARE_EXEC,
4723 PyString_AS_STRING(ste->ste_name),
4724 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004725 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004726 PyOS_snprintf(buf, sizeof(buf),
4727 ILLEGAL_EXEC_AND_IMPORT_STAR,
4728 PyString_AS_STRING(ste->ste_name),
4729 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004730 }
4731 } else {
4732 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004733 PyOS_snprintf(buf, sizeof(buf),
4734 ILLEGAL_IMPORT_STAR,
4735 PyString_AS_STRING(ste->ste_name),
4736 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004737 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004738 PyOS_snprintf(buf, sizeof(buf),
4739 ILLEGAL_BARE_EXEC,
4740 PyString_AS_STRING(ste->ste_name),
4741 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004742 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004743 PyOS_snprintf(buf, sizeof(buf),
4744 ILLEGAL_EXEC_AND_IMPORT_STAR,
4745 PyString_AS_STRING(ste->ste_name),
4746 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004747 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004748 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004749
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004750 PyErr_SetString(PyExc_SyntaxError, buf);
4751 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4752 ste->ste_opt_lineno);
4753 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004754}
4755
4756static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004757symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4758 struct symbol_info *si)
4759{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004760 if (c->c_future)
4761 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004762 if (ste->ste_generator)
4763 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004764 if (ste->ste_type != TYPE_MODULE)
4765 c->c_flags |= CO_NEWLOCALS;
4766 if (ste->ste_type == TYPE_FUNCTION) {
4767 c->c_nlocals = si->si_nlocals;
4768 if (ste->ste_optimized == 0)
4769 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004770 else if (ste->ste_optimized != OPT_EXEC)
4771 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004772 }
4773 return 0;
4774}
4775
4776static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004777symtable_load_symbols(struct compiling *c)
4778{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004779 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004780 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004781 PyObject *name, *varnames, *v;
4782 int i, flags, pos;
4783 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004784
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004785 v = NULL;
4786
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004787 if (symtable_init_compiling_symbols(c) < 0)
4788 goto fail;
4789 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004790 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004791 si.si_nlocals = PyList_GET_SIZE(varnames);
4792 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004793
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004794 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004795 v = PyInt_FromLong(i);
4796 if (PyDict_SetItem(c->c_locals,
4797 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004798 goto fail;
4799 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004800 }
4801
4802 /* XXX The cases below define the rules for whether a name is
4803 local or global. The logic could probably be clearer. */
4804 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004805 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4806 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004807
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004808 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004809 /* undo the original DEF_FREE */
4810 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004811
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004812 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004813 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004814 2. Free variables in methods that are also class
4815 variables or declared global.
4816 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004817 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004818 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004819
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004820 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004821 c->c_argcount--;
4822 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004823 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004824 c->c_argcount--;
4825 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004826 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004827 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004828 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004829 if (flags & DEF_PARAM) {
4830 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004831 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004832 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004833 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004834 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004835 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004836 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004837 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4838 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004839 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004840 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00004841 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004842 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004843 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004844 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004845 if (v == NULL)
4846 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004847 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004848 goto fail;
4849 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004850 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004851 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004852 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004853 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004854 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004855 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004856 if (v == NULL)
4857 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004858 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004859 goto fail;
4860 Py_DECREF(v);
4861 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004862 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004863 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00004864 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004865 goto fail;
4866 if (st->st_nscopes != 1) {
4867 v = PyInt_FromLong(flags);
4868 if (PyDict_SetItem(st->st_global,
4869 name, v))
4870 goto fail;
4871 Py_DECREF(v);
4872 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004873 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004874 }
4875 }
4876
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004877 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4878
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004879 if (si.si_ncells > 1) { /* one cell is always in order */
4880 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4881 c->c_varnames, c->c_flags) < 0)
4882 return -1;
4883 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004884 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4885 return -1;
4886 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004887 fail:
4888 /* is this always the right thing to do? */
4889 Py_XDECREF(v);
4890 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004891}
4892
4893static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004894symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004895{
4896 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004897
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004898 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004899 if (st == NULL)
4900 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004901 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00004902
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004903 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004904 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004905 goto fail;
4906 if ((st->st_symbols = PyDict_New()) == NULL)
4907 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004908 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004909 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004910 st->st_errors = 0;
4911 st->st_tmpname = 0;
4912 st->st_private = NULL;
4913 return st;
4914 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004915 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004916 return NULL;
4917}
4918
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004919void
4920PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004921{
4922 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004923 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004924 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004925 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004926}
4927
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004928/* When the compiler exits a scope, it must should update the scope's
4929 free variable information with the list of free variables in its
4930 children.
4931
4932 Variables that are free in children and defined in the current
4933 scope are cellvars.
4934
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004935 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004936 false), free variables in children that are not defined here are
4937 implicit globals.
4938
4939*/
4940
4941static int
4942symtable_update_free_vars(struct symtable *st)
4943{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004944 int i, j, def;
4945 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004946 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004947
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004948 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004949 def = DEF_FREE_CLASS;
4950 else
4951 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004952 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004953 int pos = 0;
4954
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004955 if (list)
4956 PyList_SetSlice(list, 0,
4957 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004958 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004959 PyList_GET_ITEM(ste->ste_children, i);
4960 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004961 int flags = PyInt_AS_LONG(o);
4962 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004963 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004964 if (list == NULL) {
4965 list = PyList_New(0);
4966 if (list == NULL)
4967 return -1;
4968 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004969 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004970 if (PyList_Append(list, name) < 0) {
4971 Py_DECREF(list);
4972 return -1;
4973 }
4974 }
4975 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004976 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004977 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004978 v = PyDict_GetItem(ste->ste_symbols, name);
4979 /* If a name N is declared global in scope A and
4980 referenced in scope B contained (perhaps
4981 indirectly) in A and there are no scopes
4982 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004983 is global in B. Unless A is a class scope,
4984 because class scopes are not considered for
4985 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004986 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004987 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004988 int flags = PyInt_AS_LONG(v);
4989 if (flags & DEF_GLOBAL) {
4990 symtable_undo_free(st, child->ste_id,
4991 name);
4992 continue;
4993 }
4994 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004995 if (ste->ste_nested) {
4996 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004997 name, def) < 0) {
4998 Py_DECREF(list);
4999 return -1;
5000 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005001 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005002 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005003 name) < 0) {
5004 Py_DECREF(list);
5005 return -1;
5006 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005007 }
5008 }
5009 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005010
5011 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005012 return 0;
5013}
5014
5015/* If the current scope is a non-nested class or if name is not
5016 defined in the current, non-nested scope, then it is an implicit
5017 global in all nested scopes.
5018*/
5019
5020static int
5021symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5022{
5023 PyObject *o;
5024 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005025 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005026
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005027 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005028 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005029 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005030 if (o == NULL)
5031 return symtable_undo_free(st, child, name);
5032 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005033
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005034 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005035 return symtable_undo_free(st, child, name);
5036 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005037 return symtable_add_def_o(st, ste->ste_symbols,
5038 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005039}
5040
5041static int
5042symtable_undo_free(struct symtable *st, PyObject *id,
5043 PyObject *name)
5044{
5045 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005046 PyObject *info;
5047 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005048
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005049 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5050 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005051 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005052
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005053 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005054 if (info == NULL)
5055 return 0;
5056 v = PyInt_AS_LONG(info);
5057 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005058 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005059 DEF_FREE_GLOBAL) < 0)
5060 return -1;
5061 } else
5062 /* If the name is defined here or declared global,
5063 then the recursion stops. */
5064 return 0;
5065
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005066 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5067 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005068 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005069 PyList_GET_ITEM(ste->ste_children, i);
5070 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005071 if (x < 0)
5072 return x;
5073 }
5074 return 0;
5075}
5076
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005077/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5078 This reference is released when the scope is exited, via the DECREF
5079 in symtable_exit_scope().
5080*/
5081
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005082static int
5083symtable_exit_scope(struct symtable *st)
5084{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005085 int end;
5086
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005087 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005088 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005089 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005090 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005091 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5092 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005093 if (PySequence_DelItem(st->st_stack, end) < 0)
5094 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005095 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005096}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005097
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005098static void
5099symtable_enter_scope(struct symtable *st, char *name, int type,
5100 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005101{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005102 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005103
5104 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005105 prev = st->st_cur;
5106 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
5107 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005108 st->st_errors++;
5109 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005110 }
5111 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005112 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005113 PySymtableEntry_New(st, name, type, lineno);
5114 if (strcmp(name, TOP) == 0)
5115 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005116 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005117 if (PyList_Append(prev->ste_children,
5118 (PyObject *)st->st_cur) < 0)
5119 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005120 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005121}
5122
5123static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005124symtable_lookup(struct symtable *st, char *name)
5125{
5126 char buffer[MANGLE_LEN];
5127 PyObject *v;
5128 int flags;
5129
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005130 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005131 name = buffer;
5132 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5133 if (v == NULL) {
5134 if (PyErr_Occurred())
5135 return -1;
5136 else
5137 return 0;
5138 }
5139
5140 flags = PyInt_AS_LONG(v);
5141 return flags;
5142}
5143
5144static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005145symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005146{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005147 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005148 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005149 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005150
Guido van Rossumb7164622002-08-16 02:48:11 +00005151 /* Warn about None, except inside a tuple (where the assignment
5152 code already issues a warning). */
5153 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5154 *name == 'N' && strcmp(name, "None") == 0)
5155 {
5156 if (symtable_warn(st, "argument named None"))
5157 return -1;
5158 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005159 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005160 name = buffer;
5161 if ((s = PyString_InternFromString(name)) == NULL)
5162 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005163 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5164 Py_DECREF(s);
5165 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005166}
5167
5168/* Must only be called with mangled names */
5169
5170static int
5171symtable_add_def_o(struct symtable *st, PyObject *dict,
5172 PyObject *name, int flag)
5173{
5174 PyObject *o;
5175 int val;
5176
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005177 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005178 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005179 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005180 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005181 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005182 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005183 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005184 return -1;
5185 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005186 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005187 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005188 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005189 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005190 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005191 Py_DECREF(o);
5192 return -1;
5193 }
5194 Py_DECREF(o);
5195
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005196 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005197 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005198 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005199 } else if (flag & DEF_GLOBAL) {
5200 /* XXX need to update DEF_GLOBAL for other flags too;
5201 perhaps only DEF_FREE_GLOBAL */
5202 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005203 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005204 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005205 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005206 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005207 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005208 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005209 Py_DECREF(o);
5210 return -1;
5211 }
5212 Py_DECREF(o);
5213 }
5214 return 0;
5215}
5216
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005217#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005218
Tim Peters08a898f2001-06-28 01:52:22 +00005219/* Look for a yield stmt under n. Return 1 if found, else 0.
5220 This hack is used to look inside "if 0:" blocks (which are normally
5221 ignored) in case those are the only places a yield occurs (so that this
5222 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005223static int
5224look_for_yield(node *n)
5225{
5226 int i;
5227
5228 for (i = 0; i < NCH(n); ++i) {
5229 node *kid = CHILD(n, i);
5230
5231 switch (TYPE(kid)) {
5232
5233 case classdef:
5234 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005235 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005236 /* Stuff in nested functions and classes can't make
5237 the parent a generator. */
5238 return 0;
5239
5240 case yield_stmt:
5241 return 1;
5242
5243 default:
5244 if (look_for_yield(kid))
5245 return 1;
5246 }
5247 }
5248 return 0;
5249}
5250
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005251static void
5252symtable_node(struct symtable *st, node *n)
5253{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005254 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005255
5256 loop:
5257 switch (TYPE(n)) {
5258 case funcdef: {
5259 char *func_name = STR(CHILD(n, 1));
5260 symtable_add_def(st, func_name, DEF_LOCAL);
5261 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005262 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005263 symtable_funcdef(st, n);
5264 symtable_exit_scope(st);
5265 break;
5266 }
5267 case lambdef:
5268 if (NCH(n) == 4)
5269 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005270 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005271 symtable_funcdef(st, n);
5272 symtable_exit_scope(st);
5273 break;
5274 case classdef: {
5275 char *tmp, *class_name = STR(CHILD(n, 1));
5276 symtable_add_def(st, class_name, DEF_LOCAL);
5277 if (TYPE(CHILD(n, 2)) == LPAR) {
5278 node *bases = CHILD(n, 3);
5279 int i;
5280 for (i = 0; i < NCH(bases); i += 2) {
5281 symtable_node(st, CHILD(bases, i));
5282 }
5283 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005284 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005285 tmp = st->st_private;
5286 st->st_private = class_name;
5287 symtable_node(st, CHILD(n, NCH(n) - 1));
5288 st->st_private = tmp;
5289 symtable_exit_scope(st);
5290 break;
5291 }
5292 case if_stmt:
5293 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005294 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5295 if (st->st_cur->ste_generator == 0)
5296 st->st_cur->ste_generator =
5297 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005298 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005299 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005300 symtable_node(st, CHILD(n, i + 1));
5301 symtable_node(st, CHILD(n, i + 3));
5302 }
5303 if (i + 2 < NCH(n))
5304 symtable_node(st, CHILD(n, i + 2));
5305 break;
5306 case global_stmt:
5307 symtable_global(st, n);
5308 break;
5309 case import_stmt:
5310 symtable_import(st, n);
5311 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005312 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005313 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005314 symtable_node(st, CHILD(n, 1));
5315 if (NCH(n) > 2)
5316 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005317 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005318 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005319 st->st_cur->ste_opt_lineno = n->n_lineno;
5320 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005321 if (NCH(n) > 4)
5322 symtable_node(st, CHILD(n, 5));
5323 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005324
5325 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005326 case assert_stmt:
5327 if (Py_OptimizeFlag)
5328 return;
5329 if (NCH(n) == 2) {
5330 n = CHILD(n, 1);
5331 goto loop;
5332 } else {
5333 symtable_node(st, CHILD(n, 1));
5334 n = CHILD(n, 3);
5335 goto loop;
5336 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005337 case except_clause:
5338 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005339 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005340 if (NCH(n) > 1) {
5341 n = CHILD(n, 1);
5342 goto loop;
5343 }
5344 break;
5345 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005346 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005347 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005348 case yield_stmt:
5349 st->st_cur->ste_generator = 1;
5350 n = CHILD(n, 1);
5351 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005352 case expr_stmt:
5353 if (NCH(n) == 1)
5354 n = CHILD(n, 0);
5355 else {
5356 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005357 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005358 symtable_node(st, CHILD(n, 2));
5359 break;
5360 } else {
5361 int i;
5362 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005363 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005364 n = CHILD(n, NCH(n) - 1);
5365 }
5366 }
5367 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005368 case list_iter:
5369 n = CHILD(n, 0);
5370 if (TYPE(n) == list_for) {
5371 st->st_tmpname++;
5372 symtable_list_comprehension(st, n);
5373 st->st_tmpname--;
5374 } else {
5375 REQ(n, list_if);
5376 symtable_node(st, CHILD(n, 1));
5377 if (NCH(n) == 3) {
5378 n = CHILD(n, 2);
5379 goto loop;
5380 }
5381 }
5382 break;
5383 case for_stmt:
5384 symtable_assign(st, CHILD(n, 1), 0);
5385 for (i = 3; i < NCH(n); ++i)
5386 if (TYPE(CHILD(n, i)) >= single_input)
5387 symtable_node(st, CHILD(n, i));
5388 break;
5389 /* The remaining cases fall through to default except in
5390 special circumstances. This requires the individual cases
5391 to be coded with great care, even though they look like
5392 rather innocuous. Each case must double-check TYPE(n).
5393 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005394 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005395 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005396 n = CHILD(n, 2);
5397 goto loop;
5398 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005399 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005400 case listmaker:
5401 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00005402 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005403 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00005404 symtable_node(st, CHILD(n, 0));
5405 st->st_tmpname--;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005406 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005407 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005408 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005409 case atom:
5410 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5411 symtable_add_use(st, STR(CHILD(n, 0)));
5412 break;
5413 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005414 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005415 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005416 /* Walk over every non-token child with a special case
5417 for one child.
5418 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005419 if (NCH(n) == 1) {
5420 n = CHILD(n, 0);
5421 goto loop;
5422 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005423 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005424 if (TYPE(CHILD(n, i)) >= single_input)
5425 symtable_node(st, CHILD(n, i));
5426 }
5427}
5428
5429static void
5430symtable_funcdef(struct symtable *st, node *n)
5431{
5432 node *body;
5433
5434 if (TYPE(n) == lambdef) {
5435 if (NCH(n) == 4)
5436 symtable_params(st, CHILD(n, 1));
5437 } else
5438 symtable_params(st, CHILD(n, 2));
5439 body = CHILD(n, NCH(n) - 1);
5440 symtable_node(st, body);
5441}
5442
5443/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00005444 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005445 which are references in the defining scope. symtable_params()
5446 parses the parameter names, which are defined in the function's
5447 body.
5448
5449 varargslist:
5450 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5451 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5452*/
5453
5454static void
5455symtable_default_args(struct symtable *st, node *n)
5456{
5457 node *c;
5458 int i;
5459
5460 if (TYPE(n) == parameters) {
5461 n = CHILD(n, 1);
5462 if (TYPE(n) == RPAR)
5463 return;
5464 }
5465 REQ(n, varargslist);
5466 for (i = 0; i < NCH(n); i += 2) {
5467 c = CHILD(n, i);
5468 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5469 break;
5470 }
5471 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5472 symtable_node(st, CHILD(n, i));
5473 }
5474}
5475
5476static void
5477symtable_params(struct symtable *st, node *n)
5478{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005479 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00005480 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005481
5482 if (TYPE(n) == parameters) {
5483 n = CHILD(n, 1);
5484 if (TYPE(n) == RPAR)
5485 return;
5486 }
5487 REQ(n, varargslist);
5488 for (i = 0; i < NCH(n); i += 2) {
5489 c = CHILD(n, i);
5490 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5491 ext = 1;
5492 break;
5493 }
5494 if (TYPE(c) == test) {
5495 continue;
5496 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00005497 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005498 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00005499 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005500 char nbuf[30];
5501 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005502 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005503 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005504 }
5505 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005506 if (ext) {
5507 c = CHILD(n, i);
5508 if (TYPE(c) == STAR) {
5509 i++;
5510 symtable_add_def(st, STR(CHILD(n, i)),
5511 DEF_PARAM | DEF_STAR);
5512 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005513 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005514 c = NULL;
5515 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005516 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005517 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005518 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005519 i++;
5520 symtable_add_def(st, STR(CHILD(n, i)),
5521 DEF_PARAM | DEF_DOUBLESTAR);
5522 }
5523 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005524 if (complex >= 0) {
5525 int j;
5526 for (j = 0; j <= complex; j++) {
5527 c = CHILD(n, j);
5528 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005529 c = CHILD(n, ++j);
5530 else if (TYPE(c) == EQUAL)
5531 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005532 if (TYPE(CHILD(c, 0)) == LPAR)
5533 symtable_params_fplist(st, CHILD(c, 1));
5534 }
5535 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005536}
5537
5538static void
5539symtable_params_fplist(struct symtable *st, node *n)
5540{
5541 int i;
5542 node *c;
5543
5544 REQ(n, fplist);
5545 for (i = 0; i < NCH(n); i += 2) {
5546 c = CHILD(n, i);
5547 REQ(c, fpdef);
5548 if (NCH(c) == 1)
5549 symtable_add_def(st, STR(CHILD(c, 0)),
5550 DEF_PARAM | DEF_INTUPLE);
5551 else
5552 symtable_params_fplist(st, CHILD(c, 1));
5553 }
5554
5555}
5556
5557static void
5558symtable_global(struct symtable *st, node *n)
5559{
5560 int i;
5561
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005562 /* XXX It might be helpful to warn about module-level global
5563 statements, but it's hard to tell the difference between
5564 module-level and a string passed to exec.
5565 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005566
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005567 for (i = 1; i < NCH(n); i += 2) {
5568 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005569 int flags;
5570
5571 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005572 if (flags < 0)
5573 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005574 if (flags && flags != DEF_GLOBAL) {
5575 char buf[500];
5576 if (flags & DEF_PARAM) {
5577 PyErr_Format(PyExc_SyntaxError,
5578 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005579 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005580 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005581 st->st_cur->ste_lineno);
5582 st->st_errors++;
5583 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005584 }
5585 else {
5586 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005587 PyOS_snprintf(buf, sizeof(buf),
5588 GLOBAL_AFTER_ASSIGN,
5589 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005590 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005591 PyOS_snprintf(buf, sizeof(buf),
5592 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005593 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005594 }
5595 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005596 symtable_add_def(st, name, DEF_GLOBAL);
5597 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005598}
5599
5600static void
5601symtable_list_comprehension(struct symtable *st, node *n)
5602{
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005603 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005604
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005605 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005606 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005607 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005608 symtable_node(st, CHILD(n, 3));
5609 if (NCH(n) == 5)
5610 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005611}
5612
5613static void
5614symtable_import(struct symtable *st, node *n)
5615{
5616 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005617 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005618 | 'from' dotted_name 'import'
5619 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005620 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005621 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005622 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005623 node *dotname = CHILD(n, 1);
5624 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5625 /* check for bogus imports */
5626 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5627 PyErr_SetString(PyExc_SyntaxError,
5628 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005629 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005630 n->n_lineno);
5631 st->st_errors++;
5632 return;
5633 }
5634 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005635 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005636 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005637 if (symtable_warn(st,
5638 "import * only allowed at module level") < 0)
5639 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005640 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005641 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005642 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005643 } else {
5644 for (i = 3; i < NCH(n); i += 2) {
5645 node *c = CHILD(n, i);
5646 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005647 symtable_assign(st, CHILD(c, 2),
5648 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005649 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005650 symtable_assign(st, CHILD(c, 0),
5651 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005652 }
5653 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005654 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005655 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005656 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005657 }
5658 }
5659}
5660
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005661/* The third argument to symatble_assign() is a flag to be passed to
5662 symtable_add_def() if it is eventually called. The flag is useful
5663 to specify the particular type of assignment that should be
5664 recorded, e.g. an assignment caused by import.
5665 */
5666
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005667static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005668symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005669{
5670 node *tmp;
5671 int i;
5672
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005673 loop:
5674 switch (TYPE(n)) {
5675 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005676 /* invalid assignment, e.g. lambda x:x=2. The next
5677 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005678 return;
5679 case power:
5680 if (NCH(n) > 2) {
5681 for (i = 2; i < NCH(n); ++i)
5682 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5683 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005684 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005685 if (NCH(n) > 1) {
5686 symtable_node(st, CHILD(n, 0));
5687 symtable_node(st, CHILD(n, 1));
5688 } else {
5689 n = CHILD(n, 0);
5690 goto loop;
5691 }
5692 return;
5693 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005694 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5695 /* XXX This is an error, but the next pass
5696 will catch it. */
5697 return;
5698 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005699 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005700 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005701 }
5702 return;
5703 case exprlist:
5704 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00005705 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005706 if (NCH(n) == 1) {
5707 n = CHILD(n, 0);
5708 goto loop;
5709 }
5710 else {
5711 int i;
5712 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005713 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005714 return;
5715 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005716 case atom:
5717 tmp = CHILD(n, 0);
5718 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5719 n = CHILD(n, 1);
5720 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005721 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00005722 if (strcmp(STR(tmp), "__debug__") == 0) {
5723 PyErr_SetString(PyExc_SyntaxError,
5724 ASSIGN_DEBUG);
5725 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton86424e32001-12-04 02:41:46 +00005726 n->n_lineno);
Jeremy Hylton778e2652001-11-09 19:50:08 +00005727 st->st_errors++;
5728 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005729 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005730 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005731 return;
5732 case dotted_as_name:
5733 if (NCH(n) == 3)
5734 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005735 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005736 else
5737 symtable_add_def(st,
5738 STR(CHILD(CHILD(n,
5739 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005740 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005741 return;
5742 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005743 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005744 return;
5745 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005746 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005747 return;
5748 default:
5749 if (NCH(n) == 0)
5750 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005751 if (NCH(n) == 1) {
5752 n = CHILD(n, 0);
5753 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005754 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005755 /* Should only occur for errors like x + 1 = 1,
5756 which will be caught in the next pass. */
5757 for (i = 0; i < NCH(n); ++i)
5758 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005759 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005760 }
5761}