blob: 4afd0eb7256b94a344af58f8070bd1f4da74c614 [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
Raymond Hettinger060641d2003-04-22 06:49:11 +0000331#define CODESIZE(op) (HAS_ARG(op) ? 3 : 1)
332#define ISBASICBLOCK(blocks, start, bytes) (blocks[start]==blocks[start+bytes-1])
333
334static unsigned int *
335markblocks(unsigned char *code, int len)
336{
337 unsigned int *blocks = PyMem_Malloc(len*sizeof(int));
338 int i,j, opcode, oldblock, newblock, blockcnt = 0;
339
340 if (blocks == NULL)
341 return NULL;
342 memset(blocks, 0, len*sizeof(int));
343 for (i=0 ; i<len ; i+=CODESIZE(opcode)) {
344 opcode = code[i];
345 switch (opcode) {
346 case FOR_ITER:
347 case JUMP_FORWARD:
348 case JUMP_IF_FALSE:
349 case JUMP_IF_TRUE:
350 case JUMP_ABSOLUTE:
351 case CONTINUE_LOOP:
352 case SETUP_LOOP:
353 case SETUP_EXCEPT:
354 case SETUP_FINALLY:
355 j = GETJUMPTGT(code, i);
356 oldblock = blocks[j];
357 newblock = ++blockcnt;
358 for (; j<len ; j++) {
359 if (blocks[j] != (unsigned)oldblock)
360 break;
361 blocks[j] = newblock;
362 }
363 break;
364 }
365 }
366 return blocks;
367}
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000368
369static PyObject *
370optimize_code(PyObject *code, PyObject* consts)
371{
372 int i, j, codelen;
373 int tgt, tgttgt, opcode;
374 unsigned char *codestr;
Raymond Hettinger060641d2003-04-22 06:49:11 +0000375 unsigned int *blocks;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000376
377 /* Make a modifiable copy of the code string */
378 if (!PyString_Check(code))
379 goto exitUnchanged;
380 codelen = PyString_Size(code);
381 codestr = PyMem_Malloc(codelen);
Raymond Hettinger060641d2003-04-22 06:49:11 +0000382 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000383 goto exitUnchanged;
384 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
Raymond Hettinger060641d2003-04-22 06:49:11 +0000385 blocks = markblocks(codestr, codelen);
386 if (blocks == NULL) {
387 PyMem_Free(codestr);
388 goto exitUnchanged;
389 }
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000390 assert(PyTuple_Check(consts));
391
Raymond Hettinger060641d2003-04-22 06:49:11 +0000392 for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000393 opcode = codestr[i];
394 switch (opcode) {
395
396 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP.
397 Note, only the first opcode is changed, the others still
398 perform normally if they happen to be jump targets. */
399 case LOAD_CONST:
400 j = GETARG(codestr, i);
401 if (codestr[i+3] != JUMP_IF_FALSE ||
402 codestr[i+6] != POP_TOP ||
403 !PyObject_IsTrue(PyTuple_GET_ITEM(consts, j)))
404 continue;
405 codestr[i] = JUMP_FORWARD;
406 SETARG(codestr, i, 4);
407 break;
408
Raymond Hettinger060641d2003-04-22 06:49:11 +0000409 /* Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2 JMP+2 NOP NOP.
410 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2 JMP+1 NOP.
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000411 Note, these opcodes occur together only in assignment
412 statements. Accordingly, the unpack opcode is never
413 a jump target. */
414 case BUILD_TUPLE:
415 case BUILD_LIST:
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000416 if (codestr[i+3] != UNPACK_SEQUENCE)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000417 continue;
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000418 if (GETARG(codestr, i) == 2 && \
419 GETARG(codestr, i+3) == 2) {
420 codestr[i] = ROT_TWO;
421 codestr[i+1] = JUMP_FORWARD;
422 SETARG(codestr, i+1, 2);
Raymond Hettinger060641d2003-04-22 06:49:11 +0000423 codestr[i+4] = NOP;
424 codestr[i+5] = NOP;
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000425 continue;
426 }
427 if (GETARG(codestr, i) == 3 && \
428 GETARG(codestr, i+3) == 3) {
429 codestr[i] = ROT_THREE;
430 codestr[i+1] = ROT_TWO;
431 codestr[i+2] = JUMP_FORWARD;
Raymond Hettinger060641d2003-04-22 06:49:11 +0000432 SETARG(codestr, i+2, 1);
433 codestr[i+5] = NOP;
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000434 }
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000435 break;
436
Raymond Hettinger060641d2003-04-22 06:49:11 +0000437 /* Simplify inverted tests.
438 Must verify that sequence is a basic block because the jump
439 can itself be a jump target. Also, must verify that *both*
440 jump alternatives go to a POP_TOP. Otherwise, the code will
441 expect the stack value to have been inverted. */
442 case UNARY_NOT:
443 if (codestr[i+1] != JUMP_IF_FALSE || \
444 codestr[i+4] != POP_TOP || \
445 !ISBASICBLOCK(blocks,i,5))
446 continue;
447 tgt = GETJUMPTGT(codestr, (i+1));
448 if (codestr[tgt] != POP_TOP)
449 continue;
450 codestr[i] = NOP;
451 codestr[i+1] = JUMP_IF_TRUE;
452 break;
453
454 /* not a is b --> a is not b
455 not a in b --> a not in b
456 not a is not b --> a is b
457 not a not in b --> a in b */
458 case COMPARE_OP:
459 j = GETARG(codestr, i);
460 if (codestr[i+3] != UNARY_NOT || j < 6 || \
461 j > 9 || !ISBASICBLOCK(blocks,i,4))
462 continue;
463 SETARG(codestr, i, (j^1));
464 codestr[i+3] = NOP;
465 break;
466
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000467 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000468 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000469 case JUMP_FORWARD:
470 case JUMP_IF_FALSE:
471 case JUMP_IF_TRUE:
472 case JUMP_ABSOLUTE:
473 case CONTINUE_LOOP:
474 case SETUP_LOOP:
475 case SETUP_EXCEPT:
476 case SETUP_FINALLY:
477 tgt = GETJUMPTGT(codestr, i);
Raymond Hettinger060641d2003-04-22 06:49:11 +0000478 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000479 continue;
480 tgttgt = GETJUMPTGT(codestr, tgt);
481 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
482 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000483 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000484 tgttgt -= i + 3; /* Calc relative jump addr */
485 if (tgttgt < 0) /* No backward relative jumps */
486 continue;
487 codestr[i] = opcode;
488 SETARG(codestr, i, tgttgt);
489 break;
490
491 case EXTENDED_ARG:
492 PyMem_Free(codestr);
493 goto exitUnchanged;
494 }
495 }
496 code = PyString_FromStringAndSize(codestr, codelen);
497 PyMem_Free(codestr);
Raymond Hettinger060641d2003-04-22 06:49:11 +0000498 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000499 return code;
500
501exitUnchanged:
502 Py_INCREF(code);
503 return code;
504}
505
Guido van Rossum79f25d91997-04-29 20:08:16 +0000506PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000507PyCode_New(int argcount, int nlocals, int stacksize, int flags,
508 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000509 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
510 PyObject *filename, PyObject *name, int firstlineno,
511 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000512{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000513 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000514 int i;
515 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000516 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000517 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000518 consts == NULL || !PyTuple_Check(consts) ||
519 names == NULL || !PyTuple_Check(names) ||
520 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000521 freevars == NULL || !PyTuple_Check(freevars) ||
522 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000523 name == NULL || !PyString_Check(name) ||
524 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000525 lnotab == NULL || !PyString_Check(lnotab) ||
526 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000527 PyErr_BadInternalCall();
528 return NULL;
529 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000530 intern_strings(names);
531 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000532 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000533 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000534 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000535 for (i = PyTuple_Size(consts); --i >= 0; ) {
536 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000537 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000538 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000539 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000540 continue;
541 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000542 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000543 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000544 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000545 co->co_argcount = argcount;
546 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000547 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000548 co->co_flags = flags;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000549 co->co_code = optimize_code(code, consts);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000550 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000551 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000552 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000553 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000554 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000555 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000556 Py_INCREF(freevars);
557 co->co_freevars = freevars;
558 Py_INCREF(cellvars);
559 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000560 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000561 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000562 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000563 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000564 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000565 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000566 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000567 if (PyTuple_GET_SIZE(freevars) == 0 &&
568 PyTuple_GET_SIZE(cellvars) == 0)
569 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000570 }
571 return co;
572}
573
574
575/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000576
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000577/* The compiler uses two passes to generate bytecodes. The first pass
578 builds the symbol table. The second pass generates the bytecode.
579
580 The first pass uses a single symtable struct. The second pass uses
581 a compiling struct for each code block. The compiling structs
582 share a reference to the symtable.
583
584 The two passes communicate via symtable_load_symbols() and via
585 is_local() and is_global(). The former initializes several slots
586 in the compiling struct: c_varnames, c_locals, c_nlocals,
587 c_argcount, c_globals, and c_flags.
588*/
589
Tim Peters2a7f3842001-06-09 09:26:21 +0000590/* All about c_lnotab.
591
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000592c_lnotab is an array of unsigned bytes disguised as a Python string. Since
593version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
594mapped to source code line #s via c_lnotab instead.
595
Tim Peters2a7f3842001-06-09 09:26:21 +0000596The array is conceptually a list of
597 (bytecode offset increment, line number increment)
598pairs. The details are important and delicate, best illustrated by example:
599
600 byte code offset source code line number
601 0 1
602 6 2
603 50 7
604 350 307
605 361 308
606
607The first trick is that these numbers aren't stored, only the increments
608from one row to the next (this doesn't really work, but it's a start):
609
610 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
611
612The second trick is that an unsigned byte can't hold negative values, or
613values larger than 255, so (a) there's a deep assumption that byte code
614offsets and their corresponding line #s both increase monotonically, and (b)
615if at least one column jumps by more than 255 from one row to the next, more
616than one pair is written to the table. In case #b, there's no way to know
617from looking at the table later how many were written. That's the delicate
618part. A user of c_lnotab desiring to find the source line number
619corresponding to a bytecode address A should do something like this
620
621 lineno = addr = 0
622 for addr_incr, line_incr in c_lnotab:
623 addr += addr_incr
624 if addr > A:
625 return lineno
626 lineno += line_incr
627
628In order for this to work, when the addr field increments by more than 255,
629the line # increment in each pair generated must be 0 until the remaining addr
630increment is < 256. So, in the example above, com_set_lineno should not (as
631was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
632255, 0, 45, 255, 0, 45.
633*/
634
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000635struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000636 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000637 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000638 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000639 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000640 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +0000641 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000642 PyObject *c_locals; /* dictionary (value=localID) */
643 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000644 PyObject *c_freevars; /* dictionary (value=None) */
645 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000646 int c_nlocals; /* index of next local */
647 int c_argcount; /* number of top-level arguments */
648 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000649 int c_nexti; /* index into c_code */
650 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000651 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000652 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000653 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000654 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000655 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000656 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +0000657 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000658 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000659 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000660 int c_stacklevel; /* Current stack level */
661 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000662 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000663 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000664 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000665 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000666 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000667 int c_nested; /* Is block nested funcdef or lamdef? */
668 int c_closure; /* Is nested w/freevars? */
669 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000670 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000671 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000672};
673
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000674static int
675is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000676{
677 if ((v & (USE | DEF_FREE))
678 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
679 return 1;
680 if (v & DEF_FREE_CLASS)
681 return 1;
682 return 0;
683}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000684
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000685static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000686com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000687{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000688 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
689
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000690 if (c == NULL) {
691 /* Error occurred via symtable call to
692 is_constant_false */
693 PyErr_SetString(exc, msg);
694 return;
695 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000696 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000697 if (c->c_lineno < 1 || c->c_interactive) {
698 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000699 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000700 return;
701 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000702 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000703 if (v == NULL)
704 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000705
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000706 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000707 if (line == NULL) {
708 Py_INCREF(Py_None);
709 line = Py_None;
710 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000711 if (exc == PyExc_SyntaxError) {
712 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
713 Py_None, line);
714 if (t == NULL)
715 goto exit;
716 w = Py_BuildValue("(OO)", v, t);
717 if (w == NULL)
718 goto exit;
719 PyErr_SetObject(exc, w);
720 } else {
721 /* Make sure additional exceptions are printed with
722 file and line, also. */
723 PyErr_SetObject(exc, v);
724 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
725 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000726 exit:
727 Py_XDECREF(t);
728 Py_XDECREF(v);
729 Py_XDECREF(w);
730 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000731}
732
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000733/* Interface to the block stack */
734
735static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000736block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000737{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000738 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000739 com_error(c, PyExc_SystemError,
740 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000741 }
742 else {
743 c->c_block[c->c_nblocks++] = type;
744 }
745}
746
747static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000748block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000749{
750 if (c->c_nblocks > 0)
751 c->c_nblocks--;
752 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000753 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000754 }
755}
756
Guido van Rossum681d79a1995-07-18 14:51:37 +0000757/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000758
Martin v. Löwis95292d62002-12-11 14:04:59 +0000759static int issue_warning(const char *, const char *, int);
760static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000761static void com_free(struct compiling *);
762static void com_push(struct compiling *, int);
763static void com_pop(struct compiling *, int);
764static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000765static void com_node(struct compiling *, node *);
766static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000767static void com_addbyte(struct compiling *, int);
768static void com_addint(struct compiling *, int);
769static void com_addoparg(struct compiling *, int, int);
770static void com_addfwref(struct compiling *, int, int *);
771static void com_backpatch(struct compiling *, int);
772static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
773static int com_addconst(struct compiling *, PyObject *);
774static int com_addname(struct compiling *, PyObject *);
775static void com_addopname(struct compiling *, int, node *);
776static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000777static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000778static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000779static void com_assign(struct compiling *, node *, int, node *);
780static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000781static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +0000782static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000783 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000784static PyObject *parsestrplus(struct compiling*, node *);
785static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000786static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000787
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000788static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000789
790/* symtable operations */
791static int symtable_build(struct compiling *, node *);
792static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000793static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000794static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000795static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000796static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000797static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000798
799static void symtable_node(struct symtable *, node *);
800static void symtable_funcdef(struct symtable *, node *);
801static void symtable_default_args(struct symtable *, node *);
802static void symtable_params(struct symtable *, node *);
803static void symtable_params_fplist(struct symtable *, node *n);
804static void symtable_global(struct symtable *, node *);
805static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000806static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000807static void symtable_list_comprehension(struct symtable *, node *);
808
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000809static int symtable_update_free_vars(struct symtable *);
810static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
811static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
812
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000813/* helper */
814static void
815do_pad(int pad)
816{
817 int i;
818 for (i = 0; i < pad; ++i)
819 fprintf(stderr, " ");
820}
821
822static void
823dump(node *n, int pad, int depth)
824{
825 int i;
826 if (depth == 0)
827 return;
828 do_pad(pad);
829 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
830 if (depth > 0)
831 depth--;
832 for (i = 0; i < NCH(n); ++i)
833 dump(CHILD(n, i), pad + 1, depth);
834}
835
836#define DUMP(N) dump(N, 0, -1)
837
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000838static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000839com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000840{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000841 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000842 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
843 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000844 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000845 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000846 goto fail;
847 if ((c->c_const_dict = PyDict_New()) == NULL)
848 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000849 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000850 goto fail;
851 if ((c->c_name_dict = PyDict_New()) == NULL)
852 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000853 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000854 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000855 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
856 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000857 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000858 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000859 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000860 c->c_freevars = NULL;
861 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000862 c->c_nlocals = 0;
863 c->c_argcount = 0;
864 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000865 c->c_nexti = 0;
866 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000867 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000868 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000869 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000870 c->c_begin = 0;
871 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000872 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000873 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000874 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000875 c->c_stacklevel = 0;
876 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000877 c->c_firstlineno = 0;
878 c->c_last_addr = 0;
879 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000880 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000881 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000882 c->c_nested = 0;
883 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000884 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000885 return 1;
886
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000887 fail:
888 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000889 return 0;
890}
891
892static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000893com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000894{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000895 Py_XDECREF(c->c_code);
896 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000897 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000898 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000899 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000900 Py_XDECREF(c->c_globals);
901 Py_XDECREF(c->c_locals);
902 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000903 Py_XDECREF(c->c_freevars);
904 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000905 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000906 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +0000907 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000908}
909
910static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000911com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000912{
913 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000914 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +0000915 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000916 /*
917 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
918 c->c_filename, c->c_name, c->c_lineno,
919 c->c_nexti, c->c_stacklevel, n);
920 */
921 }
Guido van Rossum8b993a91997-01-17 21:04:03 +0000922}
923
924static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000925com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000926{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000927 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000928 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000929 else
930 c->c_stacklevel -= n;
931}
932
933static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000934com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000935{
936 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000937 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000938 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000939 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000940}
941
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000942static int
943com_check_size(PyObject **s, int offset)
944{
945 int len = PyString_GET_SIZE(*s);
946 if (offset >= len)
947 return _PyString_Resize(s, len * 2);
948 return 0;
949}
950
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000951static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000952com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000953{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000954 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000955 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +0000956 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000957 if (com_check_size(&c->c_code, c->c_nexti)) {
958 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000959 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000960 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000961 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000962}
963
964static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000965com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000966{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000967 com_addbyte(c, x & 0xff);
968 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000969}
970
971static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000972com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000973{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000974 char *p;
975 if (c->c_lnotab == NULL)
976 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000977 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
978 c->c_errors++;
979 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000980 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000981 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000982 *p++ = addr;
983 *p++ = line;
984 c->c_lnotab_next += 2;
985}
986
987static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000988com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000989{
990 c->c_lineno = lineno;
991 if (c->c_firstlineno == 0) {
992 c->c_firstlineno = c->c_last_line = lineno;
993 }
994 else {
995 int incr_addr = c->c_nexti - c->c_last_addr;
996 int incr_line = lineno - c->c_last_line;
Tim Peters2a7f3842001-06-09 09:26:21 +0000997 while (incr_addr > 255) {
998 com_add_lnotab(c, 255, 0);
999 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001000 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001001 while (incr_line > 255) {
1002 com_add_lnotab(c, incr_addr, 255);
1003 incr_line -=255;
1004 incr_addr = 0;
1005 }
1006 if (incr_addr > 0 || incr_line > 0)
1007 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001008 c->c_last_addr = c->c_nexti;
1009 c->c_last_line = lineno;
1010 }
1011}
1012
1013static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001014com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001015{
Fred Drakeef8ace32000-08-24 00:32:09 +00001016 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +00001017 if (extended_arg){
1018 com_addbyte(c, EXTENDED_ARG);
1019 com_addint(c, extended_arg);
1020 arg &= 0xffff;
1021 }
Guido van Rossum8e793d91997-03-03 19:13:14 +00001022 com_addbyte(c, op);
1023 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001024}
1025
1026static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001027com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001028{
1029 /* Compile a forward reference for backpatching */
1030 int here;
1031 int anchor;
1032 com_addbyte(c, op);
1033 here = c->c_nexti;
1034 anchor = *p_anchor;
1035 *p_anchor = here;
1036 com_addint(c, anchor == 0 ? 0 : here - anchor);
1037}
1038
1039static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001040com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001041{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001042 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001043 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001044 int dist;
1045 int prev;
1046 for (;;) {
1047 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001048 prev = code[anchor] + (code[anchor+1] << 8);
1049 dist = target - (anchor+2);
1050 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001051 dist >>= 8;
1052 code[anchor+1] = dist;
1053 dist >>= 8;
1054 if (dist) {
1055 com_error(c, PyExc_SystemError,
1056 "com_backpatch: offset too large");
1057 break;
1058 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001059 if (!prev)
1060 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001061 anchor -= prev;
1062 }
1063}
1064
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001065/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001066
1067static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001068com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001069{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001070 PyObject *w, *t, *np=NULL;
1071 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001072
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001073 t = Py_BuildValue("(OO)", v, v->ob_type);
1074 if (t == NULL)
1075 goto fail;
1076 w = PyDict_GetItem(dict, t);
1077 if (w != NULL) {
1078 n = PyInt_AsLong(w);
1079 } else {
1080 n = PyList_Size(list);
1081 np = PyInt_FromLong(n);
1082 if (np == NULL)
1083 goto fail;
1084 if (PyList_Append(list, v) != 0)
1085 goto fail;
1086 if (PyDict_SetItem(dict, t, np) != 0)
1087 goto fail;
1088 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001089 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001090 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001091 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001092 fail:
1093 Py_XDECREF(np);
1094 Py_XDECREF(t);
1095 c->c_errors++;
1096 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001097}
1098
1099static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001100com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001101{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001102 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001103}
1104
1105static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001106com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001107{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001108 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001109}
1110
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001111int
1112_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001113{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001114 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001115 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001116 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001117 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1118 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001119 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001120 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001121 return 0; /* Don't mangle __extremely_long_names */
1122 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1123 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001124 /* Strip leading underscores from class name */
1125 while (*p == '_')
1126 p++;
1127 if (*p == '\0')
1128 return 0; /* Don't mangle if class is just underscores */
1129 plen = strlen(p);
1130 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001131 plen = maxlen-nlen-2; /* Truncate class name if too long */
1132 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001133 buffer[0] = '_';
1134 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001135 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001136 return 1;
1137}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001138
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001139static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001140com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001141{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001142 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001143 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001144 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001145
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001146 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001147 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001148 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001149 c->c_errors++;
1150 i = 255;
1151 }
1152 else {
1153 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001154 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001155 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001156 com_addoparg(c, op, i);
1157}
1158
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001159#define NAME_LOCAL 0
1160#define NAME_GLOBAL 1
1161#define NAME_DEFAULT 2
1162#define NAME_CLOSURE 3
1163
1164static int
1165com_lookup_arg(PyObject *dict, PyObject *name)
1166{
1167 PyObject *v = PyDict_GetItem(dict, name);
1168 if (v == NULL)
1169 return -1;
1170 else
1171 return PyInt_AS_LONG(v);
1172}
1173
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001174static int
1175none_assignment_check(struct compiling *c, char *name, int assigning)
1176{
1177 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1178 char *msg;
1179 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001180 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001181 else
1182 msg = "deleting None";
1183 if (issue_warning(msg, c->c_filename, c->c_lineno) < 0) {
1184 c->c_errors++;
1185 return -1;
1186 }
1187 }
1188 return 0;
1189}
1190
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001191static void
1192com_addop_varname(struct compiling *c, int kind, char *name)
1193{
1194 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001195 int i, reftype;
1196 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001197 int op = STOP_CODE;
1198 char buffer[MANGLE_LEN];
1199
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001200 if (kind != VAR_LOAD &&
1201 none_assignment_check(c, name, kind == VAR_STORE))
1202 {
1203 c->c_errors++;
1204 i = 255;
1205 goto done;
1206 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001207 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001208 name = buffer;
1209 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1210 c->c_errors++;
1211 i = 255;
1212 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001213 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001214
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001215 reftype = get_ref_type(c, name);
1216 switch (reftype) {
1217 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001218 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001219 scope = NAME_LOCAL;
1220 break;
1221 case GLOBAL_EXPLICIT:
1222 scope = NAME_GLOBAL;
1223 break;
1224 case GLOBAL_IMPLICIT:
1225 if (c->c_flags & CO_OPTIMIZED)
1226 scope = NAME_GLOBAL;
1227 break;
1228 case FREE:
1229 case CELL:
1230 scope = NAME_CLOSURE;
1231 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001232 }
1233
1234 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001235 if (scope == NAME_LOCAL)
1236 i = com_lookup_arg(c->c_locals, v);
1237 else if (reftype == FREE)
1238 i = com_lookup_arg(c->c_freevars, v);
1239 else if (reftype == CELL)
1240 i = com_lookup_arg(c->c_cellvars, v);
1241 if (i == -1) {
1242 c->c_errors++; /* XXX no exception set */
1243 i = 255;
1244 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001245 }
1246 Py_DECREF(v);
1247
1248 switch (kind) {
1249 case VAR_LOAD:
1250 switch (scope) {
1251 case NAME_LOCAL:
1252 op = LOAD_FAST;
1253 break;
1254 case NAME_GLOBAL:
1255 op = LOAD_GLOBAL;
1256 break;
1257 case NAME_DEFAULT:
1258 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001259 break;
1260 case NAME_CLOSURE:
1261 op = LOAD_DEREF;
1262 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001263 }
1264 break;
1265 case VAR_STORE:
1266 switch (scope) {
1267 case NAME_LOCAL:
1268 op = STORE_FAST;
1269 break;
1270 case NAME_GLOBAL:
1271 op = STORE_GLOBAL;
1272 break;
1273 case NAME_DEFAULT:
1274 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001275 break;
1276 case NAME_CLOSURE:
1277 op = STORE_DEREF;
1278 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001279 }
1280 break;
1281 case VAR_DELETE:
1282 switch (scope) {
1283 case NAME_LOCAL:
1284 op = DELETE_FAST;
1285 break;
1286 case NAME_GLOBAL:
1287 op = DELETE_GLOBAL;
1288 break;
1289 case NAME_DEFAULT:
1290 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001291 break;
1292 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001293 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001294 PyOS_snprintf(buf, sizeof(buf),
1295 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001296 com_error(c, PyExc_SyntaxError, buf);
1297 i = 255;
1298 break;
1299 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001300 }
1301 break;
1302 }
1303done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001304 com_addoparg(c, op, i);
1305}
1306
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001307static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001308com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001309{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001310 char *name;
1311 char buffer[1000];
1312 /* XXX it is possible to write this code without the 1000
1313 chars on the total length of dotted names, I just can't be
1314 bothered right now */
1315 if (TYPE(n) == STAR)
1316 name = "*";
1317 else if (TYPE(n) == dotted_name) {
1318 char *p = buffer;
1319 int i;
1320 name = buffer;
1321 for (i = 0; i < NCH(n); i += 2) {
1322 char *s = STR(CHILD(n, i));
1323 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001324 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001325 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001326 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001327 break;
1328 }
1329 if (p != buffer)
1330 *p++ = '.';
1331 strcpy(p, s);
1332 p = strchr(p, '\0');
1333 }
1334 }
1335 else {
1336 REQ(n, NAME);
1337 name = STR(n);
1338 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001339 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001340}
1341
Guido van Rossum79f25d91997-04-29 20:08:16 +00001342static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001343parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001344{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001345 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001346 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001347 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001348#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001349 int imflag;
1350#endif
1351
Guido van Rossum282914b1991-04-04 10:42:56 +00001352 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001353 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001354#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001355 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001356#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001357 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001358 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001359 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001360 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001361 if (x < 0 && errno == 0) {
Guido van Rossum715eca92002-08-12 21:54:46 +00001362 if (PyErr_WarnExplicit(
Barry Warsaw9f007392002-08-14 15:51:29 +00001363 PyExc_FutureWarning,
Guido van Rossum715eca92002-08-12 21:54:46 +00001364 "hex/oct constants > sys.maxint "
1365 "will return positive values "
1366 "in Python 2.4 and up",
Martin v. Löwis95292d62002-12-11 14:04:59 +00001367 /* XXX: Give WarnExplicit
1368 a const char* argument. */
1369 (char*)c->c_filename,
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001370 c->c_lineno,
Guido van Rossum715eca92002-08-12 21:54:46 +00001371 NULL,
1372 NULL) < 0)
Guido van Rossum078151d2002-08-11 04:24:12 +00001373 return NULL;
Guido van Rossum3cb8e542002-08-11 14:06:15 +00001374 errno = 0; /* Might be changed by PyErr_Warn() */
Guido van Rossum078151d2002-08-11 04:24:12 +00001375 }
1376 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001377 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001378 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001379 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001380 if (errno != 0)
1381 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001382 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001383 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001384 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001385#ifndef WITHOUT_COMPLEX
1386 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001387 Py_complex z;
1388 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001389 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001390 z.imag = atof(s);
1391 PyFPE_END_PROTECT(z)
1392 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001393 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001394 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001395#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001396 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001397 PyFPE_START_PROTECT("atof", return 0)
1398 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001399 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001400 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001401 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001402}
1403
Guido van Rossum79f25d91997-04-29 20:08:16 +00001404static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001405decode_utf8(char **sPtr, char *end, char* encoding)
1406{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001407#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001408 Py_FatalError("decode_utf8 should not be called in this build.");
1409 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001410#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001411 PyObject *u, *v;
1412 char *s, *t;
1413 t = s = *sPtr;
1414 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1415 while (s < end && (*s & 0x80)) s++;
1416 *sPtr = s;
1417 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1418 if (u == NULL)
1419 return NULL;
1420 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1421 Py_DECREF(u);
1422 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001423#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001424}
1425
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001426/* compiler.transformer.Transformer.decode_literal depends on what
1427 might seem like minor details of this function -- changes here
1428 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001429static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001430parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001431{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001432 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001433 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001434 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001435 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001436 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001437 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001438 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001439
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001440 if (isalpha(quote) || quote == '_') {
1441 if (quote == 'u' || quote == 'U') {
1442 quote = *++s;
1443 unicode = 1;
1444 }
1445 if (quote == 'r' || quote == 'R') {
1446 quote = *++s;
1447 rawmode = 1;
1448 }
1449 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001450 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001451 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001452 return NULL;
1453 }
1454 s++;
1455 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001456 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001457 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001458 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001459 return NULL;
1460 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001461 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001462 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001463 return NULL;
1464 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001465 if (len >= 4 && s[0] == quote && s[1] == quote) {
1466 s += 2;
1467 len -= 2;
1468 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001469 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001470 return NULL;
1471 }
1472 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001473#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001474 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001475 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001476 char *buf;
1477 char *p;
1478 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001479 if (encoding == NULL) {
1480 buf = s;
1481 u = NULL;
1482 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1483 buf = s;
1484 u = NULL;
1485 } else {
1486 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1487 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1488 if (u == NULL)
1489 return NULL;
1490 p = buf = PyString_AsString(u);
1491 end = s + len;
1492 while (s < end) {
1493 if (*s == '\\') {
1494 *p++ = *s++;
1495 if (*s & 0x80) {
1496 strcpy(p, "u005c");
1497 p += 5;
1498 }
1499 }
1500 if (*s & 0x80) { /* XXX inefficient */
1501 char *r;
1502 int rn, i;
1503 w = decode_utf8(&s, end, "utf-16-be");
1504 if (w == NULL) {
1505 Py_DECREF(u);
1506 return NULL;
1507 }
1508 r = PyString_AsString(w);
1509 rn = PyString_Size(w);
1510 assert(rn % 2 == 0);
1511 for (i = 0; i < rn; i += 2) {
1512 sprintf(p, "\\u%02x%02x",
1513 r[i + 0] & 0xFF,
1514 r[i + 1] & 0xFF);
1515 p += 6;
1516 }
1517 Py_DECREF(w);
1518 } else {
1519 *p++ = *s++;
1520 }
1521 }
1522 len = p - buf;
1523 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001524 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001525 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001526 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001527 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1528 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001529 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001530 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001531 return v;
1532
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001533 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001534#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001535 need_encoding = (encoding != NULL &&
1536 strcmp(encoding, "utf-8") != 0 &&
1537 strcmp(encoding, "iso-8859-1") != 0);
1538 if (rawmode || strchr(s, '\\') == NULL) {
1539 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001540#ifndef Py_USING_UNICODE
1541 /* This should not happen - we never see any other
1542 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001543 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001544#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001545 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1546 if (u == NULL)
1547 return NULL;
1548 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1549 Py_DECREF(u);
1550 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001551#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001552 } else {
1553 return PyString_FromStringAndSize(s, len);
1554 }
1555 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001556
1557 v = PyString_DecodeEscape(s, len, NULL, unicode,
1558 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001559 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001560 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001561 return v;
1562}
1563
Guido van Rossum79f25d91997-04-29 20:08:16 +00001564static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001565parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001566{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001567 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001568 int i;
1569 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001570 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001571 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001572 for (i = 1; i < NCH(n); i++) {
1573 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001574 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001575 if (s == NULL)
1576 goto onError;
1577 if (PyString_Check(v) && PyString_Check(s)) {
1578 PyString_ConcatAndDel(&v, s);
1579 if (v == NULL)
1580 goto onError;
1581 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001582#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001583 else {
1584 PyObject *temp;
1585 temp = PyUnicode_Concat(v, s);
1586 Py_DECREF(s);
1587 if (temp == NULL)
1588 goto onError;
1589 Py_DECREF(v);
1590 v = temp;
1591 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001592#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001593 }
1594 }
1595 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001596
1597 onError:
1598 Py_XDECREF(v);
1599 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001600}
1601
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001602static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001603com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001604{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001605 int anchor = 0;
1606 int save_begin = c->c_begin;
1607
1608 /* list_iter: for v in expr [list_iter] */
1609 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001610 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001611 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001612 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001613 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001614 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001615 c->c_loops++;
1616 com_list_iter(c, n, e, t);
1617 c->c_loops--;
1618 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1619 c->c_begin = save_begin;
1620 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001621 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001622}
1623
1624static void
1625com_list_if(struct compiling *c, node *n, node *e, char *t)
1626{
1627 int anchor = 0;
1628 int a = 0;
1629 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001630 com_node(c, CHILD(n, 1));
1631 com_addfwref(c, JUMP_IF_FALSE, &a);
1632 com_addbyte(c, POP_TOP);
1633 com_pop(c, 1);
1634 com_list_iter(c, n, e, t);
1635 com_addfwref(c, JUMP_FORWARD, &anchor);
1636 com_backpatch(c, a);
1637 /* We jump here with an extra entry which we now pop */
1638 com_addbyte(c, POP_TOP);
1639 com_backpatch(c, anchor);
1640}
1641
1642static void
1643com_list_iter(struct compiling *c,
1644 node *p, /* parent of list_iter node */
1645 node *e, /* element expression node */
1646 char *t /* name of result list temp local */)
1647{
1648 /* list_iter is the last child in a listmaker, list_for, or list_if */
1649 node *n = CHILD(p, NCH(p)-1);
1650 if (TYPE(n) == list_iter) {
1651 n = CHILD(n, 0);
1652 switch (TYPE(n)) {
1653 case list_for:
1654 com_list_for(c, n, e, t);
1655 break;
1656 case list_if:
1657 com_list_if(c, n, e, t);
1658 break;
1659 default:
1660 com_error(c, PyExc_SystemError,
1661 "invalid list_iter node type");
1662 }
1663 }
1664 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001665 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001666 com_push(c, 1);
1667 com_node(c, e);
1668 com_addoparg(c, CALL_FUNCTION, 1);
1669 com_addbyte(c, POP_TOP);
1670 com_pop(c, 2);
1671 }
1672}
1673
1674static void
1675com_list_comprehension(struct compiling *c, node *n)
1676{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001677 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001678 char tmpname[30];
1679 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001680 com_addoparg(c, BUILD_LIST, 0);
1681 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1682 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001683 com_addop_name(c, LOAD_ATTR, "append");
1684 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001685 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001686 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001687 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001688 --c->c_tmpname;
1689}
1690
1691static void
1692com_listmaker(struct compiling *c, node *n)
1693{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001694 /* listmaker: test ( list_for | (',' test)* [','] ) */
1695 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001696 com_list_comprehension(c, n);
1697 else {
1698 int len = 0;
1699 int i;
1700 for (i = 0; i < NCH(n); i += 2, len++)
1701 com_node(c, CHILD(n, i));
1702 com_addoparg(c, BUILD_LIST, len);
1703 com_pop(c, len-1);
1704 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001705}
1706
1707static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001708com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001709{
1710 int i;
1711 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1712 for (i = 0; i+2 < NCH(n); i += 4) {
1713 /* We must arrange things just right for STORE_SUBSCR.
1714 It wants the stack to look like (value) (dict) (key) */
1715 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001716 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001717 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00001718 com_node(c, CHILD(n, i+2)); /* value */
1719 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001720 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001721 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001722 }
1723}
1724
1725static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001726com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001727{
1728 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001729 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001730 int i;
1731 REQ(n, atom);
1732 ch = CHILD(n, 0);
1733 switch (TYPE(ch)) {
1734 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001735 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001736 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001737 com_push(c, 1);
1738 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001739 else
1740 com_node(c, CHILD(n, 1));
1741 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001742 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001743 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001744 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001745 com_push(c, 1);
1746 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001747 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001748 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001749 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001750 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001751 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001752 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001753 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001754 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001755 break;
1756 case BACKQUOTE:
1757 com_node(c, CHILD(n, 1));
1758 com_addbyte(c, UNARY_CONVERT);
1759 break;
1760 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001761 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001762 i = 255;
1763 }
1764 else {
1765 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001766 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001767 }
1768 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001769 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001770 break;
1771 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001772 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001773 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001774 c->c_errors++;
1775 i = 255;
1776 }
1777 else {
1778 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001779 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001780 }
1781 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001782 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001783 break;
1784 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001785 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001786 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001787 break;
1788 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001789 com_error(c, PyExc_SystemError,
1790 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001791 }
1792}
1793
1794static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001795com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001796{
1797 if (NCH(n) == 1) {
1798 com_addbyte(c, op);
1799 }
1800 else if (NCH(n) == 2) {
1801 if (TYPE(CHILD(n, 0)) != COLON) {
1802 com_node(c, CHILD(n, 0));
1803 com_addbyte(c, op+1);
1804 }
1805 else {
1806 com_node(c, CHILD(n, 1));
1807 com_addbyte(c, op+2);
1808 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001809 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001810 }
1811 else {
1812 com_node(c, CHILD(n, 0));
1813 com_node(c, CHILD(n, 2));
1814 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001815 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001816 }
1817}
1818
Guido van Rossum635abd21997-01-06 22:56:52 +00001819static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001820com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1821{
1822 if (NCH(n) == 1) {
1823 com_addbyte(c, DUP_TOP);
1824 com_push(c, 1);
1825 com_addbyte(c, SLICE);
1826 com_node(c, augn);
1827 com_addbyte(c, opcode);
1828 com_pop(c, 1);
1829 com_addbyte(c, ROT_TWO);
1830 com_addbyte(c, STORE_SLICE);
1831 com_pop(c, 2);
1832 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1833 com_node(c, CHILD(n, 0));
1834 com_addoparg(c, DUP_TOPX, 2);
1835 com_push(c, 2);
1836 com_addbyte(c, SLICE+1);
1837 com_pop(c, 1);
1838 com_node(c, augn);
1839 com_addbyte(c, opcode);
1840 com_pop(c, 1);
1841 com_addbyte(c, ROT_THREE);
1842 com_addbyte(c, STORE_SLICE+1);
1843 com_pop(c, 3);
1844 } else if (NCH(n) == 2) {
1845 com_node(c, CHILD(n, 1));
1846 com_addoparg(c, DUP_TOPX, 2);
1847 com_push(c, 2);
1848 com_addbyte(c, SLICE+2);
1849 com_pop(c, 1);
1850 com_node(c, augn);
1851 com_addbyte(c, opcode);
1852 com_pop(c, 1);
1853 com_addbyte(c, ROT_THREE);
1854 com_addbyte(c, STORE_SLICE+2);
1855 com_pop(c, 3);
1856 } else {
1857 com_node(c, CHILD(n, 0));
1858 com_node(c, CHILD(n, 2));
1859 com_addoparg(c, DUP_TOPX, 3);
1860 com_push(c, 3);
1861 com_addbyte(c, SLICE+3);
1862 com_pop(c, 2);
1863 com_node(c, augn);
1864 com_addbyte(c, opcode);
1865 com_pop(c, 1);
1866 com_addbyte(c, ROT_FOUR);
1867 com_addbyte(c, STORE_SLICE+3);
1868 com_pop(c, 4);
1869 }
1870}
1871
1872static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001873com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001874{
1875 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001876 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001877 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001878 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001879 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001880 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001881 }
1882 else {
1883 com_node(c, CHILD(n, 0));
1884 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001885 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001886 }
1887 m = n;
1888 do {
1889 m = CHILD(m, 0);
1890 } while (NCH(m) == 1);
1891 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001892 /* f(lambda x: x[0] = 3) ends up getting parsed with
1893 * LHS test = lambda x: x[0], and RHS test = 3.
1894 * SF bug 132313 points out that complaining about a keyword
1895 * then is very confusing.
1896 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001897 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001898 TYPE(m) == lambdef ?
1899 "lambda cannot contain assignment" :
1900 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001901 }
1902 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001903 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00001904 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00001905 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001906 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001907 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001908 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001909 else if (*pkeywords == NULL) {
1910 c->c_errors++;
1911 Py_DECREF(v);
1912 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001913 if (PyDict_GetItem(*pkeywords, v) != NULL)
1914 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001915 "duplicate keyword argument");
1916 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001917 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001918 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001919 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001920 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001921 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001922 }
1923 }
1924 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001925}
1926
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001927static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001928com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001929{
1930 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001931 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001932 }
1933 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001934 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001935 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001936 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001937 int star_flag = 0;
1938 int starstar_flag = 0;
1939 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001940 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001941 na = 0;
1942 nk = 0;
1943 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001944 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001945 if (TYPE(ch) == STAR ||
1946 TYPE(ch) == DOUBLESTAR)
1947 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001948 if (ch->n_lineno != lineno) {
1949 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001950 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00001951 }
1952 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001953 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001954 na++;
1955 else
1956 nk++;
1957 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001958 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001959 while (i < NCH(n)) {
1960 node *tok = CHILD(n, i);
1961 node *ch = CHILD(n, i+1);
1962 i += 3;
1963 switch (TYPE(tok)) {
1964 case STAR: star_flag = 1; break;
1965 case DOUBLESTAR: starstar_flag = 1; break;
1966 }
1967 com_node(c, ch);
1968 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001969 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001970 com_error(c, PyExc_SyntaxError,
1971 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001972 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001973 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001974 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001975 star_flag + (starstar_flag << 1);
1976 else
1977 opcode = CALL_FUNCTION;
1978 com_addoparg(c, opcode, na | (nk << 8));
1979 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001980 }
1981}
1982
1983static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001984com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001985{
1986 com_addopname(c, LOAD_ATTR, n);
1987}
1988
1989static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001990com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001991{
1992 int i=0;
1993 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001994 node *ch;
1995
1996 /* first argument */
1997 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001998 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001999 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002000 i++;
2001 }
2002 else {
2003 com_node(c, CHILD(n,i));
2004 i++;
2005 REQ(CHILD(n,i),COLON);
2006 i++;
2007 }
2008 /* second argument */
2009 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
2010 com_node(c, CHILD(n,i));
2011 i++;
2012 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002013 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002014 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002015 com_push(c, 1);
2016 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002017 /* remaining arguments */
2018 for (; i < NCH(n); i++) {
2019 ns++;
2020 ch=CHILD(n,i);
2021 REQ(ch, sliceop);
2022 if (NCH(ch) == 1) {
2023 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002024 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002025 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002026 }
2027 else
2028 com_node(c, CHILD(ch,1));
2029 }
2030 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002031 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002032}
2033
2034static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002035com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002036{
2037 node *ch;
2038 REQ(n, subscript);
2039 ch = CHILD(n,0);
2040 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002041 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002042 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002043 com_push(c, 1);
2044 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002045 else {
2046 /* check for slice */
2047 if ((TYPE(ch) == COLON || NCH(n) > 1))
2048 com_sliceobj(c, n);
2049 else {
2050 REQ(ch, test);
2051 com_node(c, ch);
2052 }
2053 }
2054}
2055
2056static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002057com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002058{
2059 int i, op;
2060 REQ(n, subscriptlist);
2061 /* Check to make backward compatible slice behavior for '[i:j]' */
2062 if (NCH(n) == 1) {
2063 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002064 /* 'Basic' slice, should have exactly one colon. */
2065 if ((TYPE(CHILD(sub, 0)) == COLON
2066 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2067 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2068 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002069 switch (assigning) {
2070 case OP_DELETE:
2071 op = DELETE_SLICE;
2072 break;
2073 case OP_ASSIGN:
2074 op = STORE_SLICE;
2075 break;
2076 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002077 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002078 break;
2079 default:
2080 com_augassign_slice(c, sub, assigning, augn);
2081 return;
2082 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002083 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002084 if (op == STORE_SLICE)
2085 com_pop(c, 2);
2086 else if (op == DELETE_SLICE)
2087 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002088 return;
2089 }
2090 }
2091 /* Else normal subscriptlist. Compile each subscript. */
2092 for (i = 0; i < NCH(n); i += 2)
2093 com_subscript(c, CHILD(n, i));
2094 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002095 if (NCH(n) > 1) {
2096 i = (NCH(n)+1) / 2;
2097 com_addoparg(c, BUILD_TUPLE, i);
2098 com_pop(c, i-1);
2099 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002100 switch (assigning) {
2101 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002102 op = DELETE_SUBSCR;
2103 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002104 break;
2105 default:
2106 case OP_ASSIGN:
2107 op = STORE_SUBSCR;
2108 i = 3;
2109 break;
2110 case OP_APPLY:
2111 op = BINARY_SUBSCR;
2112 i = 1;
2113 break;
2114 }
2115 if (assigning > OP_APPLY) {
2116 com_addoparg(c, DUP_TOPX, 2);
2117 com_push(c, 2);
2118 com_addbyte(c, BINARY_SUBSCR);
2119 com_pop(c, 1);
2120 com_node(c, augn);
2121 com_addbyte(c, assigning);
2122 com_pop(c, 1);
2123 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002124 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002125 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002126 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002127}
2128
2129static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002130com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002131{
2132 REQ(n, trailer);
2133 switch (TYPE(CHILD(n, 0))) {
2134 case LPAR:
2135 com_call_function(c, CHILD(n, 1));
2136 break;
2137 case DOT:
2138 com_select_member(c, CHILD(n, 1));
2139 break;
2140 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002141 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002142 break;
2143 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002144 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002145 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002146 }
2147}
2148
2149static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002150com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002151{
2152 int i;
2153 REQ(n, power);
2154 com_atom(c, CHILD(n, 0));
2155 for (i = 1; i < NCH(n); i++) {
2156 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2157 com_factor(c, CHILD(n, i+1));
2158 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002159 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002160 break;
2161 }
2162 else
2163 com_apply_trailer(c, CHILD(n, i));
2164 }
2165}
2166
2167static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002168com_invert_constant(struct compiling *c, node *n)
2169{
2170 /* Compute the inverse of int and longs and use them directly,
2171 but be prepared to generate code for all other
2172 possibilities (invalid numbers, floats, complex).
2173 */
2174 PyObject *num, *inv = NULL;
2175 int i;
2176
2177 REQ(n, NUMBER);
2178 num = parsenumber(c, STR(n));
2179 if (num == NULL)
2180 i = 255;
2181 else {
2182 inv = PyNumber_Invert(num);
2183 if (inv == NULL) {
2184 PyErr_Clear();
2185 i = com_addconst(c, num);
2186 } else {
2187 i = com_addconst(c, inv);
2188 Py_DECREF(inv);
2189 }
2190 Py_DECREF(num);
2191 }
2192 com_addoparg(c, LOAD_CONST, i);
2193 com_push(c, 1);
2194 if (num != NULL && inv == NULL)
2195 com_addbyte(c, UNARY_INVERT);
2196}
2197
Tim Peters51e26512001-09-07 08:45:55 +00002198static int
2199is_float_zero(const char *p)
2200{
2201 int found_radix_point = 0;
2202 int ch;
2203 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2204 switch (ch) {
2205 case '0':
2206 /* no reason to believe it's not 0 -- continue */
2207 break;
2208
2209 case 'e': case 'E': case 'j': case 'J':
2210 /* If this was a hex constant, we already would have
2211 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2212 must be an exponent marker, and we haven't yet
2213 seen a non-zero digit, and it doesn't matter what
2214 the exponent is then. For 'j' or 'J' similarly,
2215 except that this is an imaginary 0 then. */
2216 return 1;
2217
2218 case '.':
2219 found_radix_point = 1;
2220 break;
2221
2222 default:
2223 return 0;
2224 }
2225 }
2226 return found_radix_point;
2227}
2228
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002229static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002230com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002231{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002232 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002233 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002234 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002235 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002236 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002237 approriate value as a constant. If the value is negative,
2238 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002239 negative in the 0th position -- unless we're doing unary minus
2240 of a floating zero! In that case the sign is significant, but
2241 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002242 */
2243 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002244 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002245 && TYPE((pfactor = CHILD(n, 1))) == factor
2246 && NCH(pfactor) == 1
2247 && TYPE((ppower = CHILD(pfactor, 0))) == power
2248 && NCH(ppower) == 1
2249 && TYPE((patom = CHILD(ppower, 0))) == atom
2250 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002251 && !(childtype == MINUS &&
2252 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002253 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002254 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002255 return;
2256 }
2257 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002258 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002259 if (s == NULL) {
2260 com_error(c, PyExc_MemoryError, "");
2261 com_addbyte(c, 255);
2262 return;
2263 }
2264 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002265 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002266 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002267 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002268 }
Tim Peters51e26512001-09-07 08:45:55 +00002269 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002270 }
2271 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002272 com_factor(c, CHILD(n, 1));
2273 com_addbyte(c, UNARY_POSITIVE);
2274 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002275 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002276 com_factor(c, CHILD(n, 1));
2277 com_addbyte(c, UNARY_NEGATIVE);
2278 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002279 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002280 com_factor(c, CHILD(n, 1));
2281 com_addbyte(c, UNARY_INVERT);
2282 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002283 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002284 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002285 }
2286}
2287
2288static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002289com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002290{
2291 int i;
2292 int op;
2293 REQ(n, term);
2294 com_factor(c, CHILD(n, 0));
2295 for (i = 2; i < NCH(n); i += 2) {
2296 com_factor(c, CHILD(n, i));
2297 switch (TYPE(CHILD(n, i-1))) {
2298 case STAR:
2299 op = BINARY_MULTIPLY;
2300 break;
2301 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002302 if (c->c_flags & CO_FUTURE_DIVISION)
2303 op = BINARY_TRUE_DIVIDE;
2304 else
2305 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002306 break;
2307 case PERCENT:
2308 op = BINARY_MODULO;
2309 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002310 case DOUBLESLASH:
2311 op = BINARY_FLOOR_DIVIDE;
2312 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002313 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002314 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002315 "com_term: operator not *, /, // or %");
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_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002325{
2326 int i;
2327 int op;
2328 REQ(n, arith_expr);
2329 com_term(c, CHILD(n, 0));
2330 for (i = 2; i < NCH(n); i += 2) {
2331 com_term(c, CHILD(n, i));
2332 switch (TYPE(CHILD(n, i-1))) {
2333 case PLUS:
2334 op = BINARY_ADD;
2335 break;
2336 case MINUS:
2337 op = BINARY_SUBTRACT;
2338 break;
2339 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002340 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002341 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002342 op = 255;
2343 }
2344 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002345 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002346 }
2347}
2348
2349static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002350com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002351{
2352 int i;
2353 int op;
2354 REQ(n, shift_expr);
2355 com_arith_expr(c, CHILD(n, 0));
2356 for (i = 2; i < NCH(n); i += 2) {
2357 com_arith_expr(c, CHILD(n, i));
2358 switch (TYPE(CHILD(n, i-1))) {
2359 case LEFTSHIFT:
2360 op = BINARY_LSHIFT;
2361 break;
2362 case RIGHTSHIFT:
2363 op = BINARY_RSHIFT;
2364 break;
2365 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002366 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002367 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002368 op = 255;
2369 }
2370 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002371 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002372 }
2373}
2374
2375static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002376com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002377{
2378 int i;
2379 int op;
2380 REQ(n, and_expr);
2381 com_shift_expr(c, CHILD(n, 0));
2382 for (i = 2; i < NCH(n); i += 2) {
2383 com_shift_expr(c, CHILD(n, i));
2384 if (TYPE(CHILD(n, i-1)) == AMPER) {
2385 op = BINARY_AND;
2386 }
2387 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002388 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002389 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002390 op = 255;
2391 }
2392 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002393 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002394 }
2395}
2396
2397static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002398com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002399{
2400 int i;
2401 int op;
2402 REQ(n, xor_expr);
2403 com_and_expr(c, CHILD(n, 0));
2404 for (i = 2; i < NCH(n); i += 2) {
2405 com_and_expr(c, CHILD(n, i));
2406 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2407 op = BINARY_XOR;
2408 }
2409 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002410 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002411 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002412 op = 255;
2413 }
2414 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002415 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002416 }
2417}
2418
2419static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002420com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002421{
2422 int i;
2423 int op;
2424 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002425 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002426 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002427 com_xor_expr(c, CHILD(n, i));
2428 if (TYPE(CHILD(n, i-1)) == VBAR) {
2429 op = BINARY_OR;
2430 }
2431 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002432 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002433 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002434 op = 255;
2435 }
2436 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002437 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002438 }
2439}
2440
2441static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002442cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002443{
2444 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00002445 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002446 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2447 if (NCH(n) == 1) {
2448 n = CHILD(n, 0);
2449 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002450 case LESS: return PyCmp_LT;
2451 case GREATER: return PyCmp_GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002452 case EQEQUAL: /* == */
Martin v. Löwis7198a522002-01-01 19:59:11 +00002453 case EQUAL: return PyCmp_EQ;
2454 case LESSEQUAL: return PyCmp_LE;
2455 case GREATEREQUAL: return PyCmp_GE;
2456 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2457 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2458 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002459 }
2460 }
2461 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002462 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002463 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002464 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002465 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002466 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002467 }
2468 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002469 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002470}
2471
2472static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002473com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002474{
2475 int i;
2476 enum cmp_op op;
2477 int anchor;
2478 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2479 com_expr(c, CHILD(n, 0));
2480 if (NCH(n) == 1)
2481 return;
2482
2483 /****************************************************************
2484 The following code is generated for all but the last
2485 comparison in a chain:
2486
2487 label: on stack: opcode: jump to:
2488
2489 a <code to load b>
2490 a, b DUP_TOP
2491 a, b, b ROT_THREE
2492 b, a, b COMPARE_OP
2493 b, 0-or-1 JUMP_IF_FALSE L1
2494 b, 1 POP_TOP
2495 b
2496
2497 We are now ready to repeat this sequence for the next
2498 comparison in the chain.
2499
2500 For the last we generate:
2501
2502 b <code to load c>
2503 b, c COMPARE_OP
2504 0-or-1
2505
2506 If there were any jumps to L1 (i.e., there was more than one
2507 comparison), we generate:
2508
2509 0-or-1 JUMP_FORWARD L2
2510 L1: b, 0 ROT_TWO
2511 0, b POP_TOP
2512 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002513 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002514 ****************************************************************/
2515
2516 anchor = 0;
2517
2518 for (i = 2; i < NCH(n); i += 2) {
2519 com_expr(c, CHILD(n, i));
2520 if (i+2 < NCH(n)) {
2521 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002522 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002523 com_addbyte(c, ROT_THREE);
2524 }
2525 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002526 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002527 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002528 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002529 }
2530 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002531 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002532 if (i+2 < NCH(n)) {
2533 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2534 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002535 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002536 }
2537 }
2538
2539 if (anchor) {
2540 int anchor2 = 0;
2541 com_addfwref(c, JUMP_FORWARD, &anchor2);
2542 com_backpatch(c, anchor);
2543 com_addbyte(c, ROT_TWO);
2544 com_addbyte(c, POP_TOP);
2545 com_backpatch(c, anchor2);
2546 }
2547}
2548
2549static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002550com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002551{
2552 REQ(n, not_test); /* 'not' not_test | comparison */
2553 if (NCH(n) == 1) {
2554 com_comparison(c, CHILD(n, 0));
2555 }
2556 else {
2557 com_not_test(c, CHILD(n, 1));
2558 com_addbyte(c, UNARY_NOT);
2559 }
2560}
2561
2562static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002563com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002564{
2565 int i;
2566 int anchor;
2567 REQ(n, and_test); /* not_test ('and' not_test)* */
2568 anchor = 0;
2569 i = 0;
2570 for (;;) {
2571 com_not_test(c, CHILD(n, i));
2572 if ((i += 2) >= NCH(n))
2573 break;
2574 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2575 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002576 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002577 }
2578 if (anchor)
2579 com_backpatch(c, anchor);
2580}
2581
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002582static int
2583com_make_closure(struct compiling *c, PyCodeObject *co)
2584{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002585 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002586 if (free == 0)
2587 return 0;
2588 for (i = 0; i < free; ++i) {
2589 /* Bypass com_addop_varname because it will generate
2590 LOAD_DEREF but LOAD_CLOSURE is needed.
2591 */
2592 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2593 int arg, reftype;
2594
2595 /* Special case: If a class contains a method with a
2596 free variable that has the same name as a method,
2597 the name will be considered free *and* local in the
2598 class. It should be handled by the closure, as
2599 well as by the normal name loookup logic.
2600 */
2601 reftype = get_ref_type(c, PyString_AS_STRING(name));
2602 if (reftype == CELL)
2603 arg = com_lookup_arg(c->c_cellvars, name);
2604 else /* (reftype == FREE) */
2605 arg = com_lookup_arg(c->c_freevars, name);
2606 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002607 fprintf(stderr, "lookup %s in %s %d %d\n"
2608 "freevars of %s: %s\n",
2609 PyObject_REPR(name),
2610 c->c_name,
2611 reftype, arg,
2612 PyString_AS_STRING(co->co_name),
2613 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002614 Py_FatalError("com_make_closure()");
2615 }
2616 com_addoparg(c, LOAD_CLOSURE, arg);
2617
2618 }
2619 com_push(c, free);
2620 return 1;
2621}
2622
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002623static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002624com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002625{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002626 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002627 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002628 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002629 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002630 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002631 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2632 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002633 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002634 if (co == NULL) {
2635 c->c_errors++;
2636 return;
2637 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002638 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002639 i = com_addconst(c, (PyObject *)co);
2640 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002641 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002642 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002643 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002644 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002645 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002646 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002647 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002648 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002649 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002650 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002651 else {
2652 int anchor = 0;
2653 int i = 0;
2654 for (;;) {
2655 com_and_test(c, CHILD(n, i));
2656 if ((i += 2) >= NCH(n))
2657 break;
2658 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2659 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002660 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002661 }
2662 if (anchor)
2663 com_backpatch(c, anchor);
2664 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002665}
2666
2667static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002668com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002669{
2670 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002671 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002672 com_node(c, CHILD(n, 0));
2673 }
2674 else {
2675 int i;
2676 int len;
2677 len = (NCH(n) + 1) / 2;
2678 for (i = 0; i < NCH(n); i += 2)
2679 com_node(c, CHILD(n, i));
2680 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002681 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002682 }
2683}
2684
2685
2686/* Begin of assignment compilation */
2687
Thomas Wouters434d0822000-08-24 20:11:32 +00002688
2689static void
2690com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2691{
2692 com_addbyte(c, DUP_TOP);
2693 com_push(c, 1);
2694 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002695 com_node(c, augn);
2696 com_addbyte(c, opcode);
2697 com_pop(c, 1);
2698 com_addbyte(c, ROT_TWO);
2699 com_addopname(c, STORE_ATTR, n);
2700 com_pop(c, 2);
2701}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002702
2703static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002704com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002705{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00002706 if (none_assignment_check(c, STR(n), assigning))
2707 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002708 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002709 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002710}
2711
2712static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002713com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002714{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002715 REQ(n, trailer);
2716 switch (TYPE(CHILD(n, 0))) {
2717 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002718 if (assigning == OP_DELETE)
2719 com_error(c, PyExc_SyntaxError,
2720 "can't delete function call");
2721 else
2722 com_error(c, PyExc_SyntaxError,
2723 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002724 break;
2725 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002726 if (assigning > OP_APPLY)
2727 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2728 else
2729 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002730 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002731 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002732 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002733 break;
2734 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002735 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002736 }
2737}
2738
2739static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002740com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002741{
2742 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002743 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002744 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002745 if (assigning) {
2746 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002747 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002748 com_push(c, i-1);
2749 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002750 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002751 com_assign(c, CHILD(n, i), assigning, NULL);
2752}
2753
2754static void
2755com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2756{
2757 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002758 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002759 com_push(c, 1);
2760 com_node(c, augn);
2761 com_addbyte(c, opcode);
2762 com_pop(c, 1);
2763 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002764}
2765
2766static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002767com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002768{
2769 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002770 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002771 if (assigning)
2772 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002773}
2774
2775static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002776com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002777{
2778 /* Loop to avoid trivial recursion */
2779 for (;;) {
2780 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002781
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002782 case exprlist:
2783 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002784 case testlist1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002785 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002786 if (assigning > OP_APPLY) {
2787 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002788 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002789 return;
2790 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002791 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002792 return;
2793 }
2794 n = CHILD(n, 0);
2795 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002796
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002797 case test:
2798 case and_test:
2799 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002800 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002801 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002802 case xor_expr:
2803 case and_expr:
2804 case shift_expr:
2805 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002806 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002807 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002808 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002809 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002810 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002811 return;
2812 }
2813 n = CHILD(n, 0);
2814 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002815
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002816 case power: /* atom trailer* ('**' power)*
2817 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002818 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002819 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002820 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002821 return;
2822 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002823 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002824 int i;
2825 com_node(c, CHILD(n, 0));
2826 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002827 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002828 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002829 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002830 return;
2831 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002832 com_apply_trailer(c, CHILD(n, i));
2833 } /* NB i is still alive */
2834 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002835 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002836 return;
2837 }
2838 n = CHILD(n, 0);
2839 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002840
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002841 case atom:
2842 switch (TYPE(CHILD(n, 0))) {
2843 case LPAR:
2844 n = CHILD(n, 1);
2845 if (TYPE(n) == RPAR) {
2846 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002847 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002848 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002849 return;
2850 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002851 if (assigning > OP_APPLY) {
2852 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002853 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002854 return;
2855 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002856 break;
2857 case LSQB:
2858 n = CHILD(n, 1);
2859 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002860 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002861 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002862 return;
2863 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002864 if (assigning > OP_APPLY) {
2865 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002866 "augmented assign to list not possible");
2867 return;
2868 }
2869 if (NCH(n) > 1
2870 && TYPE(CHILD(n, 1)) == list_for) {
2871 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002872 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002873 return;
2874 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002875 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002876 return;
2877 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002878 if (assigning > OP_APPLY)
2879 com_augassign_name(c, CHILD(n, 0),
2880 assigning, augn);
2881 else
2882 com_assign_name(c, CHILD(n, 0),
2883 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002884 return;
2885 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002886 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002887 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002888 return;
2889 }
2890 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002891
2892 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002893 com_error(c, PyExc_SyntaxError,
2894 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002895 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002896
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002897 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002898 com_error(c, PyExc_SystemError,
2899 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002900 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002901
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002902 }
2903 }
2904}
Guido van Rossum7c531111997-03-11 18:42:21 +00002905
Thomas Wouters434d0822000-08-24 20:11:32 +00002906static void
2907com_augassign(struct compiling *c, node *n)
2908{
2909 int opcode;
2910
2911 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2912 case '+': opcode = INPLACE_ADD; break;
2913 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002914 case '/':
2915 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
2916 opcode = INPLACE_FLOOR_DIVIDE;
2917 else if (c->c_flags & CO_FUTURE_DIVISION)
2918 opcode = INPLACE_TRUE_DIVIDE;
2919 else
2920 opcode = INPLACE_DIVIDE;
2921 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00002922 case '%': opcode = INPLACE_MODULO; break;
2923 case '<': opcode = INPLACE_LSHIFT; break;
2924 case '>': opcode = INPLACE_RSHIFT; break;
2925 case '&': opcode = INPLACE_AND; break;
2926 case '^': opcode = INPLACE_XOR; break;
2927 case '|': opcode = INPLACE_OR; break;
2928 case '*':
2929 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2930 opcode = INPLACE_POWER;
2931 else
2932 opcode = INPLACE_MULTIPLY;
2933 break;
2934 default:
2935 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2936 return;
2937 }
2938 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2939}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002940
2941static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002942com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002943{
Thomas Wouters434d0822000-08-24 20:11:32 +00002944 REQ(n, expr_stmt);
2945 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002946 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002947 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002948 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002949 if (NCH(n) == 1) {
2950 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002951 if (c->c_interactive)
2952 com_addbyte(c, PRINT_EXPR);
2953 else
2954 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002955 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002956 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002957 else if (TYPE(CHILD(n,1)) == augassign)
2958 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002959 else {
2960 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002961 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002962 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002963 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002964 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002965 com_push(c, 1);
2966 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002967 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002968 }
2969 }
2970}
2971
2972static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002973com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002974{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002975 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002976 int i;
2977 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002978 if (Py_OptimizeFlag)
2979 return;
2980 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00002981
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002982 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00002983 raise AssertionError [, <message>]
2984
2985 where <message> is the second test, if present.
2986 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002987 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002988 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002989 com_addbyte(c, POP_TOP);
2990 com_pop(c, 1);
2991 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002992 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002993 com_push(c, 1);
2994 i = NCH(n)/2; /* Either 2 or 4 */
2995 if (i > 1)
2996 com_node(c, CHILD(n, 3));
2997 com_addoparg(c, RAISE_VARARGS, i);
2998 com_pop(c, i);
2999 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003000 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003001 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003002 com_addbyte(c, POP_TOP);
3003}
3004
3005static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003006com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003007{
Barry Warsaw29c574e2000-08-21 15:38:56 +00003008 int i = 1;
3009 node* stream = NULL;
3010
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003011 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003012
3013 /* are we using the extended print form? */
3014 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
3015 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00003016 com_node(c, stream);
3017 /* stack: [...] => [... stream] */
3018 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003019 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3020 i = 4;
3021 else
3022 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003023 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003024 for (; i < NCH(n); i += 2) {
3025 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003026 com_addbyte(c, DUP_TOP);
3027 /* stack: [stream] => [stream stream] */
3028 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003029 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003030 /* stack: [stream stream] => [stream stream obj] */
3031 com_addbyte(c, ROT_TWO);
3032 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003033 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003034 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003035 com_pop(c, 2);
3036 }
3037 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003038 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003039 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003040 com_addbyte(c, PRINT_ITEM);
3041 com_pop(c, 1);
3042 }
3043 }
3044 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003045 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003046 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003047 /* must pop the extra stream object off the stack */
3048 com_addbyte(c, POP_TOP);
3049 /* stack: [... stream] => [...] */
3050 com_pop(c, 1);
3051 }
3052 }
3053 else {
3054 if (stream != NULL) {
3055 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003056 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003057 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003058 com_pop(c, 1);
3059 }
3060 else
3061 com_addbyte(c, PRINT_NEWLINE);
3062 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003063}
3064
3065static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003066com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003067{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003068 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003069 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003070 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003071 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003072 if (c->c_flags & CO_GENERATOR) {
3073 if (NCH(n) > 1) {
3074 com_error(c, PyExc_SyntaxError,
3075 "'return' with argument inside generator");
3076 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003077 }
3078 if (NCH(n) < 2) {
3079 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003080 com_push(c, 1);
3081 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003082 else
3083 com_node(c, CHILD(n, 1));
3084 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003085 com_pop(c, 1);
3086}
3087
3088static void
3089com_yield_stmt(struct compiling *c, node *n)
3090{
Tim Peters95c80f82001-06-23 02:07:08 +00003091 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003092 REQ(n, yield_stmt); /* 'yield' testlist */
3093 if (!c->c_infunction) {
3094 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3095 }
Tim Peters95c80f82001-06-23 02:07:08 +00003096
3097 for (i = 0; i < c->c_nblocks; ++i) {
3098 if (c->c_block[i] == SETUP_FINALLY) {
3099 com_error(c, PyExc_SyntaxError,
3100 "'yield' not allowed in a 'try' block "
3101 "with a 'finally' clause");
3102 return;
3103 }
3104 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003105 com_node(c, CHILD(n, 1));
3106 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003107 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003108}
3109
3110static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003111com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003112{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003113 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003114 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3115 if (NCH(n) > 1) {
3116 com_node(c, CHILD(n, 1));
3117 if (NCH(n) > 3) {
3118 com_node(c, CHILD(n, 3));
3119 if (NCH(n) > 5)
3120 com_node(c, CHILD(n, 5));
3121 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003122 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003123 i = NCH(n)/2;
3124 com_addoparg(c, RAISE_VARARGS, i);
3125 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003126}
3127
3128static void
Thomas Wouters52152252000-08-17 22:55:00 +00003129com_from_import(struct compiling *c, node *n)
3130{
3131 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3132 com_push(c, 1);
3133 if (NCH(n) > 1) {
3134 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3135 com_error(c, PyExc_SyntaxError, "invalid syntax");
3136 return;
3137 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003138 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003139 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003140 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003141 com_pop(c, 1);
3142}
3143
3144static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003145com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003146{
3147 int i;
3148 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003149 /* 'import' dotted_name (',' dotted_name)* |
3150 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003151 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00003152 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003153 /* 'from' dotted_name 'import' ... */
3154 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003155
3156 if (TYPE(CHILD(n, 3)) == STAR) {
3157 tup = Py_BuildValue("(s)", "*");
3158 } else {
3159 tup = PyTuple_New((NCH(n) - 2)/2);
3160 for (i = 3; i < NCH(n); i += 2) {
3161 PyTuple_SET_ITEM(tup, (i-3)/2,
Guido van Rossum633d90c2002-12-23 16:51:42 +00003162 PyString_FromString(STR(
3163 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003164 }
3165 }
3166 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003167 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003168 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003169 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00003170 if (TYPE(CHILD(n, 3)) == STAR)
3171 com_addbyte(c, IMPORT_STAR);
3172 else {
3173 for (i = 3; i < NCH(n); i += 2)
3174 com_from_import(c, CHILD(n, i));
3175 com_addbyte(c, POP_TOP);
3176 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003177 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003178 }
3179 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003180 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003181 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003182 node *subn = CHILD(n, i);
3183 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003184 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003185 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003186 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003187 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003188 int j;
3189 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003190 com_error(c, PyExc_SyntaxError,
3191 "invalid syntax");
3192 return;
3193 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003194 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3195 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003196 CHILD(CHILD(subn, 0),
3197 j));
3198 com_addop_varname(c, VAR_STORE,
3199 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003200 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003201 com_addop_varname(c, VAR_STORE,
3202 STR(CHILD(CHILD(subn, 0),
3203 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003204 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003205 }
3206 }
3207}
3208
3209static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003210com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003211{
3212 REQ(n, exec_stmt);
3213 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3214 com_node(c, CHILD(n, 1));
3215 if (NCH(n) >= 4)
3216 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003217 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003218 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003219 com_push(c, 1);
3220 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003221 if (NCH(n) >= 6)
3222 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003223 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003224 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003225 com_push(c, 1);
3226 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003227 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003228 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003229}
3230
Guido van Rossum7c531111997-03-11 18:42:21 +00003231static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003232is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003233{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003234 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003235 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003236 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003237
3238 /* Label to avoid tail recursion */
3239 next:
3240 switch (TYPE(n)) {
3241
3242 case suite:
3243 if (NCH(n) == 1) {
3244 n = CHILD(n, 0);
3245 goto next;
3246 }
3247 /* Fall through */
3248 case file_input:
3249 for (i = 0; i < NCH(n); i++) {
3250 node *ch = CHILD(n, i);
3251 if (TYPE(ch) == stmt) {
3252 n = ch;
3253 goto next;
3254 }
3255 }
3256 break;
3257
3258 case stmt:
3259 case simple_stmt:
3260 case small_stmt:
3261 n = CHILD(n, 0);
3262 goto next;
3263
3264 case expr_stmt:
3265 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003266 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003267 case test:
3268 case and_test:
3269 case not_test:
3270 case comparison:
3271 case expr:
3272 case xor_expr:
3273 case and_expr:
3274 case shift_expr:
3275 case arith_expr:
3276 case term:
3277 case factor:
3278 case power:
3279 case atom:
3280 if (NCH(n) == 1) {
3281 n = CHILD(n, 0);
3282 goto next;
3283 }
3284 break;
3285
3286 case NAME:
3287 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3288 return 1;
3289 break;
3290
3291 case NUMBER:
3292 v = parsenumber(c, STR(n));
3293 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003294 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003295 break;
3296 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003297 i = PyObject_IsTrue(v);
3298 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003299 return i == 0;
3300
3301 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003302 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003303 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003304 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003305 break;
3306 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003307 i = PyObject_IsTrue(v);
3308 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003309 return i == 0;
3310
3311 }
3312 return 0;
3313}
3314
Tim Peters08a898f2001-06-28 01:52:22 +00003315
3316/* Look under n for a return stmt with an expression.
3317 * This hack is used to find illegal returns under "if 0:" blocks in
3318 * functions already known to be generators (as determined by the symtable
3319 * pass).
3320 * Return the offending return node if found, else NULL.
3321 */
3322static node *
3323look_for_offending_return(node *n)
3324{
3325 int i;
3326
3327 for (i = 0; i < NCH(n); ++i) {
3328 node *kid = CHILD(n, i);
3329
3330 switch (TYPE(kid)) {
3331 case classdef:
3332 case funcdef:
3333 case lambdef:
3334 /* Stuff in nested functions & classes doesn't
3335 affect the code block we started in. */
3336 return NULL;
3337
3338 case return_stmt:
3339 if (NCH(kid) > 1)
3340 return kid;
3341 break;
3342
3343 default: {
3344 node *bad = look_for_offending_return(kid);
3345 if (bad != NULL)
3346 return bad;
3347 }
3348 }
3349 }
3350
3351 return NULL;
3352}
3353
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003354static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003355com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003356{
3357 int i;
3358 int anchor = 0;
3359 REQ(n, if_stmt);
3360 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3361 for (i = 0; i+3 < NCH(n); i+=4) {
3362 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003363 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003364 if (is_constant_false(c, ch)) {
3365 /* We're going to skip this block. However, if this
3366 is a generator, we have to check the dead code
3367 anyway to make sure there aren't any return stmts
3368 with expressions, in the same scope. */
3369 if (c->c_flags & CO_GENERATOR) {
3370 node *p = look_for_offending_return(n);
3371 if (p != NULL) {
3372 int savelineno = c->c_lineno;
3373 c->c_lineno = p->n_lineno;
3374 com_error(c, PyExc_SyntaxError,
3375 "'return' with argument "
3376 "inside generator");
3377 c->c_lineno = savelineno;
3378 }
3379 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003380 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003381 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003382 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003383 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003384 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003385 com_addfwref(c, JUMP_IF_FALSE, &a);
3386 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003387 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003388 com_node(c, CHILD(n, i+3));
3389 com_addfwref(c, JUMP_FORWARD, &anchor);
3390 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003391 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003392 com_addbyte(c, POP_TOP);
3393 }
3394 if (i+2 < NCH(n))
3395 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003396 if (anchor)
3397 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003398}
3399
3400static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003401com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003402{
3403 int break_anchor = 0;
3404 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003405 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003406 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3407 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003408 block_push(c, SETUP_LOOP);
3409 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003410 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003411 com_node(c, CHILD(n, 1));
3412 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3413 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003414 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003415 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003416 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003417 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003418 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3419 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003420 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003421 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003422 com_addbyte(c, POP_TOP);
3423 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003424 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003425 if (NCH(n) > 4)
3426 com_node(c, CHILD(n, 6));
3427 com_backpatch(c, break_anchor);
3428}
3429
3430static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003431com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003432{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003433 int break_anchor = 0;
3434 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003435 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003436 REQ(n, for_stmt);
3437 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3438 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003439 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003440 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003441 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003442 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003443 com_set_lineno(c, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003444 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003445 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003446 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003447 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003448 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003449 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003450 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3451 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003452 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003453 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003454 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003455 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003456 if (NCH(n) > 8)
3457 com_node(c, CHILD(n, 8));
3458 com_backpatch(c, break_anchor);
3459}
3460
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003461/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003462
3463 SETUP_FINALLY L
3464 <code for S>
3465 POP_BLOCK
3466 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003467 L: <code for Sf>
3468 END_FINALLY
3469
3470 The special instructions use the block stack. Each block
3471 stack entry contains the instruction that created it (here
3472 SETUP_FINALLY), the level of the value stack at the time the
3473 block stack entry was created, and a label (here L).
3474
3475 SETUP_FINALLY:
3476 Pushes the current value stack level and the label
3477 onto the block stack.
3478 POP_BLOCK:
3479 Pops en entry from the block stack, and pops the value
3480 stack until its level is the same as indicated on the
3481 block stack. (The label is ignored.)
3482 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003483 Pops a variable number of entries from the *value* stack
3484 and re-raises the exception they specify. The number of
3485 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003486
3487 The block stack is unwound when an exception is raised:
3488 when a SETUP_FINALLY entry is found, the exception is pushed
3489 onto the value stack (and the exception condition is cleared),
3490 and the interpreter jumps to the label gotten from the block
3491 stack.
3492
3493 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003494 (The contents of the value stack is shown in [], with the top
3495 at the right; 'tb' is trace-back info, 'val' the exception's
3496 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003497
3498 Value stack Label Instruction Argument
3499 [] SETUP_EXCEPT L1
3500 [] <code for S>
3501 [] POP_BLOCK
3502 [] JUMP_FORWARD L0
3503
Guido van Rossum3f5da241990-12-20 15:06:42 +00003504 [tb, val, exc] L1: DUP )
3505 [tb, val, exc, exc] <evaluate E1> )
3506 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3507 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3508 [tb, val, exc, 1] POP )
3509 [tb, val, exc] POP
3510 [tb, val] <assign to V1> (or POP if no V1)
3511 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003512 [] <code for S1>
3513 JUMP_FORWARD L0
3514
Guido van Rossum3f5da241990-12-20 15:06:42 +00003515 [tb, val, exc, 0] L2: POP
3516 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003517 .............................etc.......................
3518
Guido van Rossum3f5da241990-12-20 15:06:42 +00003519 [tb, val, exc, 0] Ln+1: POP
3520 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003521
3522 [] L0: <next statement>
3523
3524 Of course, parts are not generated if Vi or Ei is not present.
3525*/
3526
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003527static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003528com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003529{
3530 int except_anchor = 0;
3531 int end_anchor = 0;
3532 int else_anchor = 0;
3533 int i;
3534 node *ch;
3535
3536 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3537 block_push(c, SETUP_EXCEPT);
3538 com_node(c, CHILD(n, 2));
3539 com_addbyte(c, POP_BLOCK);
3540 block_pop(c, SETUP_EXCEPT);
3541 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3542 com_backpatch(c, except_anchor);
3543 for (i = 3;
3544 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3545 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003546 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003547 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003548 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003549 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003550 break;
3551 }
3552 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003553 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003554 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003555 if (NCH(ch) > 1) {
3556 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003557 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003558 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003559 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003560 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003561 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3562 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003563 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003564 }
3565 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003566 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003567 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003568 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003569 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003570 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003571 com_pop(c, 1);
3572 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003573 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003574 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003575 com_node(c, CHILD(n, i+2));
3576 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3577 if (except_anchor) {
3578 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003579 /* We come in with [tb, val, exc, 0] on the
3580 stack; one pop and it's the same as
3581 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003582 com_addbyte(c, POP_TOP);
3583 }
3584 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003585 /* We actually come in here with [tb, val, exc] but the
3586 END_FINALLY will zap those and jump around.
3587 The c_stacklevel does not reflect them so we need not pop
3588 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003589 com_addbyte(c, END_FINALLY);
3590 com_backpatch(c, else_anchor);
3591 if (i < NCH(n))
3592 com_node(c, CHILD(n, i+2));
3593 com_backpatch(c, end_anchor);
3594}
3595
3596static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003597com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003598{
3599 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003600 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003601
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003602 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3603 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003604 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003605 com_addbyte(c, POP_BLOCK);
3606 block_pop(c, SETUP_FINALLY);
3607 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003608 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003609 /* While the generated code pushes only one item,
3610 the try-finally handling can enter here with
3611 up to three items. OK, here are the details:
3612 3 for an exception, 2 for RETURN, 1 for BREAK. */
3613 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003614 com_backpatch(c, finally_anchor);
3615 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003616 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003617 com_node(c, ch);
3618 com_addbyte(c, END_FINALLY);
3619 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003620 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003621}
3622
3623static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003624com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003625{
3626 REQ(n, try_stmt);
3627 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3628 | 'try' ':' suite 'finally' ':' suite */
3629 if (TYPE(CHILD(n, 3)) != except_clause)
3630 com_try_finally(c, n);
3631 else
3632 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003633}
3634
Guido van Rossum8b993a91997-01-17 21:04:03 +00003635static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003636get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003637{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003638 int i;
3639
Guido van Rossum8b993a91997-01-17 21:04:03 +00003640 /* Label to avoid tail recursion */
3641 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003642 switch (TYPE(n)) {
3643
3644 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003645 if (NCH(n) == 1) {
3646 n = CHILD(n, 0);
3647 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003648 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003649 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003650 case file_input:
3651 for (i = 0; i < NCH(n); i++) {
3652 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003653 if (TYPE(ch) == stmt) {
3654 n = ch;
3655 goto next;
3656 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003657 }
3658 break;
3659
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003660 case stmt:
3661 case simple_stmt:
3662 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003663 n = CHILD(n, 0);
3664 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003665
3666 case expr_stmt:
3667 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003668 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003669 case test:
3670 case and_test:
3671 case not_test:
3672 case comparison:
3673 case expr:
3674 case xor_expr:
3675 case and_expr:
3676 case shift_expr:
3677 case arith_expr:
3678 case term:
3679 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003680 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003681 if (NCH(n) == 1) {
3682 n = CHILD(n, 0);
3683 goto next;
3684 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003685 break;
3686
3687 case atom:
3688 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003689 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003690 break;
3691
3692 }
3693 return NULL;
3694}
3695
Guido van Rossum79f25d91997-04-29 20:08:16 +00003696static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003697get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003698{
Guido van Rossum541563e1999-01-28 15:08:09 +00003699 /* Don't generate doc-strings if run with -OO */
3700 if (Py_OptimizeFlag > 1)
3701 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003702 n = get_rawdocstring(n);
3703 if (n == NULL)
3704 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003705 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003706}
3707
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003708static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003709com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003710{
3711 REQ(n, suite);
3712 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3713 if (NCH(n) == 1) {
3714 com_node(c, CHILD(n, 0));
3715 }
3716 else {
3717 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003718 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003719 node *ch = CHILD(n, i);
3720 if (TYPE(ch) == stmt)
3721 com_node(c, ch);
3722 }
3723 }
3724}
3725
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003726/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003727static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003728com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003729{
3730 int i = c->c_nblocks;
3731 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3732 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3733 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003734 else if (i <= 0) {
3735 /* at the outer level */
3736 com_error(c, PyExc_SyntaxError,
3737 "'continue' not properly in loop");
3738 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003739 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003740 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003741 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003742 if (c->c_block[j] == SETUP_LOOP)
3743 break;
3744 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003745 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003746 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003747 for (; i > j; --i) {
3748 if (c->c_block[i] == SETUP_EXCEPT ||
3749 c->c_block[i] == SETUP_FINALLY) {
3750 com_addoparg(c, CONTINUE_LOOP,
3751 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003752 return;
3753 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003754 if (c->c_block[i] == END_FINALLY) {
3755 com_error(c, PyExc_SyntaxError,
3756 "'continue' not supported inside 'finally' clause");
3757 return;
3758 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003759 }
3760 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003761 com_error(c, PyExc_SyntaxError,
3762 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003763 }
3764 /* XXX Could allow it inside a 'finally' clause
3765 XXX if we could pop the exception still on the stack */
3766}
3767
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003768static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003769com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003770{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003771 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003772 if (TYPE(n) == lambdef) {
3773 /* lambdef: 'lambda' [varargslist] ':' test */
3774 n = CHILD(n, 1);
3775 }
3776 else {
3777 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3778 n = CHILD(n, 2);
3779 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3780 n = CHILD(n, 1);
3781 }
3782 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003783 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003784 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003785 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003786 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3787 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003788 nargs = 0;
3789 ndefs = 0;
3790 for (i = 0; i < nch; i++) {
3791 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003792 if (TYPE(CHILD(n, i)) == STAR ||
3793 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003794 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003795 nargs++;
3796 i++;
3797 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003798 t = RPAR; /* Anything except EQUAL or COMMA */
3799 else
3800 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003801 if (t == EQUAL) {
3802 i++;
3803 ndefs++;
3804 com_node(c, CHILD(n, i));
3805 i++;
3806 if (i >= nch)
3807 break;
3808 t = TYPE(CHILD(n, i));
3809 }
3810 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003811 /* Treat "(a=1, b)" as an error */
3812 if (ndefs)
3813 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003814 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003815 }
3816 if (t != COMMA)
3817 break;
3818 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003819 return ndefs;
3820}
3821
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003822static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003823com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003824{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003825 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003826 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003827 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003828 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003829 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3830 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003831 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003832 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003833 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003834 c->c_errors++;
3835 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003836 int closure = com_make_closure(c, (PyCodeObject *)co);
3837 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003838 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003839 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003840 if (closure)
3841 com_addoparg(c, MAKE_CLOSURE, ndefs);
3842 else
3843 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003844 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003845 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003846 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003847 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003848 }
3849}
3850
3851static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003852com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003853{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003854 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003855 REQ(n, testlist);
3856 /* testlist: test (',' test)* [','] */
3857 for (i = 0; i < NCH(n); i += 2)
3858 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003859 i = (NCH(n)+1) / 2;
3860 com_addoparg(c, BUILD_TUPLE, i);
3861 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003862}
3863
3864static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003865com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003866{
Guido van Rossum25831651993-05-19 14:50:45 +00003867 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003868 PyObject *v;
3869 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003870 char *name;
3871
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003872 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003873 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003874 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003875 c->c_errors++;
3876 return;
3877 }
3878 /* Push the class name on the stack */
3879 i = com_addconst(c, v);
3880 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003881 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003882 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003883 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003884 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003885 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003886 com_push(c, 1);
3887 }
Guido van Rossum25831651993-05-19 14:50:45 +00003888 else
3889 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003890 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003891 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003892 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003893 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003894 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003895 c->c_errors++;
3896 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003897 int closure = com_make_closure(c, co);
3898 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003899 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003900 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003901 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003902 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003903 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003904 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003905 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003906 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003907 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003908 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003909 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003910 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003911 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003912 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003913}
3914
3915static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003916com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003917{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003918 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003919 if (c->c_errors)
3920 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003921 switch (TYPE(n)) {
3922
3923 /* Definition nodes */
3924
3925 case funcdef:
3926 com_funcdef(c, n);
3927 break;
3928 case classdef:
3929 com_classdef(c, n);
3930 break;
3931
3932 /* Trivial parse tree nodes */
3933
3934 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003935 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003936 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003937 n = CHILD(n, 0);
3938 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003939
3940 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003941 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003942 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003943 {
3944 int i;
3945 for (i = 0; i < NCH(n)-1; i += 2)
3946 com_node(c, CHILD(n, i));
3947 }
3948 break;
3949
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003950 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003951 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003952 n = CHILD(n, 0);
3953 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003954
3955 /* Statement nodes */
3956
3957 case expr_stmt:
3958 com_expr_stmt(c, n);
3959 break;
3960 case print_stmt:
3961 com_print_stmt(c, n);
3962 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003963 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003964 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003965 break;
3966 case pass_stmt:
3967 break;
3968 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003969 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003970 com_error(c, PyExc_SyntaxError,
3971 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003972 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003973 com_addbyte(c, BREAK_LOOP);
3974 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003975 case continue_stmt:
3976 com_continue_stmt(c, n);
3977 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003978 case return_stmt:
3979 com_return_stmt(c, n);
3980 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003981 case yield_stmt:
3982 com_yield_stmt(c, n);
3983 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003984 case raise_stmt:
3985 com_raise_stmt(c, n);
3986 break;
3987 case import_stmt:
3988 com_import_stmt(c, n);
3989 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003990 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003991 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003992 case exec_stmt:
3993 com_exec_stmt(c, n);
3994 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003995 case assert_stmt:
3996 com_assert_stmt(c, n);
3997 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003998 case if_stmt:
3999 com_if_stmt(c, n);
4000 break;
4001 case while_stmt:
4002 com_while_stmt(c, n);
4003 break;
4004 case for_stmt:
4005 com_for_stmt(c, n);
4006 break;
4007 case try_stmt:
4008 com_try_stmt(c, n);
4009 break;
4010 case suite:
4011 com_suite(c, n);
4012 break;
4013
4014 /* Expression nodes */
4015
4016 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004017 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004018 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004019 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004020 break;
4021 case test:
4022 com_test(c, n);
4023 break;
4024 case and_test:
4025 com_and_test(c, n);
4026 break;
4027 case not_test:
4028 com_not_test(c, n);
4029 break;
4030 case comparison:
4031 com_comparison(c, n);
4032 break;
4033 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004034 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004035 break;
4036 case expr:
4037 com_expr(c, n);
4038 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004039 case xor_expr:
4040 com_xor_expr(c, n);
4041 break;
4042 case and_expr:
4043 com_and_expr(c, n);
4044 break;
4045 case shift_expr:
4046 com_shift_expr(c, n);
4047 break;
4048 case arith_expr:
4049 com_arith_expr(c, n);
4050 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004051 case term:
4052 com_term(c, n);
4053 break;
4054 case factor:
4055 com_factor(c, n);
4056 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004057 case power:
4058 com_power(c, n);
4059 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004060 case atom:
4061 com_atom(c, n);
4062 break;
4063
4064 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004065 com_error(c, PyExc_SystemError,
4066 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004067 }
4068}
4069
Tim Petersdbd9ba62000-07-09 03:09:57 +00004070static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004071
4072static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004073com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004074{
4075 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4076 if (TYPE(CHILD(n, 0)) == LPAR)
4077 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004078 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004079 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004080 com_pop(c, 1);
4081 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004082}
4083
4084static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004085com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004086{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004087 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004088 if (NCH(n) == 1) {
4089 com_fpdef(c, CHILD(n, 0));
4090 }
4091 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004092 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004093 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004094 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004095 for (i = 0; i < NCH(n); i += 2)
4096 com_fpdef(c, CHILD(n, i));
4097 }
4098}
4099
4100static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004101com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004102{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004103 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004104 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004105 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004106 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004107 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004108 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004109 nch = NCH(n);
4110 /* Enter all arguments in table of locals */
4111 for (i = 0, narg = 0; i < nch; i++) {
4112 node *ch = CHILD(n, i);
4113 node *fp;
4114 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004115 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004116 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4117 fp = CHILD(ch, 0);
4118 if (TYPE(fp) != NAME) {
4119 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4120 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004121 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004122 narg++;
4123 /* all name updates handled by symtable */
4124 if (++i >= nch)
4125 break;
4126 ch = CHILD(n, i);
4127 if (TYPE(ch) == EQUAL)
4128 i += 2;
4129 else
4130 REQ(ch, COMMA);
4131 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004132 if (complex) {
4133 /* Generate code for complex arguments only after
4134 having counted the simple arguments */
4135 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004136 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004137 node *ch = CHILD(n, i);
4138 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004139 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004140 break;
4141 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4142 fp = CHILD(ch, 0);
4143 if (TYPE(fp) != NAME) {
4144 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004145 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004146 com_fpdef(c, ch);
4147 }
4148 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004149 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004150 break;
4151 ch = CHILD(n, i);
4152 if (TYPE(ch) == EQUAL)
4153 i += 2;
4154 else
4155 REQ(ch, COMMA);
4156 }
4157 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004158}
4159
4160static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004161com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004162{
4163 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004164 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004165 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004166 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004167 if (doc != NULL) {
4168 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004169 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004170 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004171 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004172 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004173 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004174 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004175 for (i = 0; i < NCH(n); i++) {
4176 node *ch = CHILD(n, i);
4177 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4178 com_node(c, ch);
4179 }
4180}
4181
4182/* Top-level compile-node interface */
4183
4184static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004185compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004186{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004187 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004188 node *ch;
4189 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00004190 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004191 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004192 if (doc != NULL) {
4193 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004194 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004195 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004196 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004197 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004198 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
4199 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004200 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004201 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004202 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004203 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004204 c->c_infunction = 0;
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004205 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4206 com_push(c, 1);
4207 com_addbyte(c, RETURN_VALUE);
4208 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004209}
4210
4211static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004212compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004213{
Guido van Rossum590baa41993-11-30 13:40:46 +00004214 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004215 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004216 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004217
4218 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004219 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004220 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004221 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004222 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004223 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004224 else
4225 ch = CHILD(n, 2);
4226 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004227 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004228 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004229}
4230
4231static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004232compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004233{
4234 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004235 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004236 REQ(n, classdef);
4237 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4238 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004239 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004240 /* Initialize local __module__ from global __name__ */
4241 com_addop_name(c, LOAD_GLOBAL, "__name__");
4242 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004243 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004244 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004245 if (doc != NULL) {
4246 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004247 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004248 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004249 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004250 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004251 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004252 }
4253 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004254 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004255 com_node(c, ch);
4256 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004257 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004258 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004259 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004260}
4261
4262static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004263compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004264{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004265 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004266
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004267 switch (TYPE(n)) {
4268
Guido van Rossum4c417781991-01-21 16:09:22 +00004269 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004270 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004271 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004272 n = CHILD(n, 0);
4273 if (TYPE(n) != NEWLINE)
4274 com_node(c, n);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004275 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4276 com_push(c, 1);
4277 com_addbyte(c, RETURN_VALUE);
4278 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004279 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004280 break;
4281
Guido van Rossum4c417781991-01-21 16:09:22 +00004282 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004283 com_file_input(c, n);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004284 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4285 com_push(c, 1);
4286 com_addbyte(c, RETURN_VALUE);
4287 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004288 break;
4289
Guido van Rossum590baa41993-11-30 13:40:46 +00004290 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004291 com_node(c, CHILD(n, 0));
4292 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004293 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004294 break;
4295
Guido van Rossum590baa41993-11-30 13:40:46 +00004296 case lambdef: /* anonymous function definition */
4297 compile_lambdef(c, n);
4298 break;
4299
Guido van Rossum4c417781991-01-21 16:09:22 +00004300 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004301 compile_funcdef(c, n);
4302 break;
4303
Guido van Rossum4c417781991-01-21 16:09:22 +00004304 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004305 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004306 break;
4307
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004308 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004309 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004310 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004311 }
4312}
4313
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004314static PyObject *
4315dict_keys_inorder(PyObject *dict, int offset)
4316{
4317 PyObject *tuple, *k, *v;
4318 int i, pos = 0, size = PyDict_Size(dict);
4319
4320 tuple = PyTuple_New(size);
4321 if (tuple == NULL)
4322 return NULL;
4323 while (PyDict_Next(dict, &pos, &k, &v)) {
4324 i = PyInt_AS_LONG(v);
4325 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004326 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004327 PyTuple_SET_ITEM(tuple, i - offset, k);
4328 }
4329 return tuple;
4330}
4331
Guido van Rossum79f25d91997-04-29 20:08:16 +00004332PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004333PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004334{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004335 return PyNode_CompileFlags(n, filename, NULL);
4336}
4337
4338PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004339PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004340{
4341 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004342}
4343
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004344struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004345PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004346{
4347 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004348 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004349
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004350 ff = PyNode_Future(n, filename);
4351 if (ff == NULL)
4352 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004353
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004354 st = symtable_init();
Tim Peters8c5e4152001-11-04 19:26:58 +00004355 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004356 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004357 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004358 }
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004359 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004360 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004361 if (st->st_errors > 0)
4362 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004363 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004364 if (st->st_errors > 0)
4365 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004366
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004367 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004368 fail:
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004369 PyObject_FREE((void *)ff);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004370 st->st_future = NULL;
4371 PySymtable_Free(st);
4372 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004373}
4374
Guido van Rossum79f25d91997-04-29 20:08:16 +00004375static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004376icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004377{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004378 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004379}
4380
Guido van Rossum79f25d91997-04-29 20:08:16 +00004381static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004382jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004383 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004384{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004385 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004386 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004387 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004388 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004389 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4390 sc.c_encoding = "utf-8";
4391 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004392 sc.c_encoding = STR(n);
4393 n = CHILD(n, 0);
4394 } else {
4395 sc.c_encoding = NULL;
4396 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004397 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004398 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004399 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004400 /* c_symtable still points to parent's symbols */
4401 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004402 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004403 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004404 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004405 if (base->c_encoding != NULL) {
4406 assert(sc.c_encoding == NULL);
4407 sc.c_encoding = base->c_encoding;
4408 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004409 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004410 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004411 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004412 if (sc.c_future == NULL) {
4413 com_free(&sc);
4414 return NULL;
4415 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004416 if (flags) {
4417 int merged = sc.c_future->ff_features |
4418 flags->cf_flags;
4419 sc.c_future->ff_features = merged;
4420 flags->cf_flags = merged;
4421 }
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004422 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004423 com_free(&sc);
4424 return NULL;
4425 }
4426 }
4427 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004428 if (symtable_load_symbols(&sc) < 0) {
4429 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004430 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004431 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004432 compile_node(&sc, n);
4433 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004434 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004435 PyObject *consts, *names, *varnames, *filename, *name,
4436 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004437 consts = PyList_AsTuple(sc.c_consts);
4438 names = PyList_AsTuple(sc.c_names);
4439 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004440 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4441 freevars = dict_keys_inorder(sc.c_freevars,
4442 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004443 filename = PyString_InternFromString(sc.c_filename);
4444 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004445 if (!PyErr_Occurred())
4446 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004447 sc.c_nlocals,
4448 sc.c_maxstacklevel,
4449 sc.c_flags,
4450 sc.c_code,
4451 consts,
4452 names,
4453 varnames,
4454 freevars,
4455 cellvars,
4456 filename,
4457 name,
4458 sc.c_firstlineno,
4459 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004460 Py_XDECREF(consts);
4461 Py_XDECREF(names);
4462 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004463 Py_XDECREF(freevars);
4464 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004465 Py_XDECREF(filename);
4466 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004467 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004468 else if (!PyErr_Occurred()) {
4469 /* This could happen if someone called PyErr_Clear() after an
4470 error was reported above. That's not supposed to happen,
4471 but I just plugged one case and I'm not sure there can't be
4472 others. In that case, raise SystemError so that at least
4473 it gets reported instead dumping core. */
4474 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4475 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004476 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004477 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004478 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004479 sc.c_symtable = NULL;
4480 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004481 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004482 return co;
4483}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004484
4485int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004486PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004487{
4488 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004489 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004490 int line = co->co_firstlineno;
4491 int addr = 0;
4492 while (--size >= 0) {
4493 addr += *p++;
4494 if (addr > addrq)
4495 break;
4496 line += *p++;
4497 }
4498 return line;
4499}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004500
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004501/* The test for LOCAL must come before the test for FREE in order to
4502 handle classes where name is both local and free. The local var is
4503 a method and the free var is a free var referenced within a method.
4504*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004505
4506static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004507get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004508{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004509 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004510 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004511
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004512 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4513 return CELL;
4514 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4515 return LOCAL;
4516 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4517 return FREE;
4518 v = PyDict_GetItemString(c->c_globals, name);
4519 if (v) {
4520 if (v == Py_None)
4521 return GLOBAL_EXPLICIT;
4522 else {
4523 return GLOBAL_IMPLICIT;
4524 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004525 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004526 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004527 "unknown scope for %.100s in %.100s(%s) "
4528 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4529 name, c->c_name,
4530 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4531 c->c_filename,
4532 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4533 PyObject_REPR(c->c_locals),
4534 PyObject_REPR(c->c_globals)
4535 );
4536
4537 Py_FatalError(buf);
4538 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004539}
4540
Guido van Rossum207fda62001-03-02 03:30:41 +00004541/* Helper functions to issue warnings */
4542
4543static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004544issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004545{
4546 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4547 lineno, NULL, NULL) < 0) {
4548 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4549 PyErr_SetString(PyExc_SyntaxError, msg);
4550 PyErr_SyntaxLocation(filename, lineno);
4551 }
4552 return -1;
4553 }
4554 return 0;
4555}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004556
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004557static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004558symtable_warn(struct symtable *st, char *msg)
4559{
Guido van Rossum207fda62001-03-02 03:30:41 +00004560 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004561 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004562 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004563 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004564 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004565}
4566
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004567/* Helper function for setting lineno and filename */
4568
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004569static int
4570symtable_build(struct compiling *c, node *n)
4571{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004572 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004573 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004574 c->c_symtable->st_future = c->c_future;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004575 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004576 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4577 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004578 return -1;
4579 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004580 if (c->c_symtable->st_errors > 0)
4581 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004582 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004583 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004584 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004585 return 0;
4586}
4587
4588static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004589symtable_init_compiling_symbols(struct compiling *c)
4590{
4591 PyObject *varnames;
4592
4593 varnames = c->c_symtable->st_cur->ste_varnames;
4594 if (varnames == NULL) {
4595 varnames = PyList_New(0);
4596 if (varnames == NULL)
4597 return -1;
4598 c->c_symtable->st_cur->ste_varnames = varnames;
4599 Py_INCREF(varnames);
4600 } else
4601 Py_INCREF(varnames);
4602 c->c_varnames = varnames;
4603
4604 c->c_globals = PyDict_New();
4605 if (c->c_globals == NULL)
4606 return -1;
4607 c->c_freevars = PyDict_New();
4608 if (c->c_freevars == NULL)
4609 return -1;
4610 c->c_cellvars = PyDict_New();
4611 if (c->c_cellvars == NULL)
4612 return -1;
4613 return 0;
4614}
4615
4616struct symbol_info {
4617 int si_nlocals;
4618 int si_ncells;
4619 int si_nfrees;
4620 int si_nimplicit;
4621};
4622
4623static void
4624symtable_init_info(struct symbol_info *si)
4625{
4626 si->si_nlocals = 0;
4627 si->si_ncells = 0;
4628 si->si_nfrees = 0;
4629 si->si_nimplicit = 0;
4630}
4631
4632static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004633symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004634 struct symbol_info *si)
4635{
4636 PyObject *dict, *v;
4637
4638 /* Seperate logic for DEF_FREE. If it occurs in a function,
4639 it indicates a local that we must allocate storage for (a
4640 cell var). If it occurs in a class, then the class has a
4641 method and a free variable with the same name.
4642 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004643 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004644 /* If it isn't declared locally, it can't be a cell. */
4645 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4646 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004647 v = PyInt_FromLong(si->si_ncells++);
4648 dict = c->c_cellvars;
4649 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004650 /* If it is free anyway, then there is no need to do
4651 anything here.
4652 */
4653 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004654 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004655 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004656 v = PyInt_FromLong(si->si_nfrees++);
4657 dict = c->c_freevars;
4658 }
4659 if (v == NULL)
4660 return -1;
4661 if (PyDict_SetItem(dict, name, v) < 0) {
4662 Py_DECREF(v);
4663 return -1;
4664 }
4665 Py_DECREF(v);
4666 return 0;
4667}
4668
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004669/* If a variable is a cell and an argument, make sure that appears in
4670 co_cellvars before any variable to its right in varnames.
4671*/
4672
4673
4674static int
4675symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4676 PyObject *varnames, int flags)
4677{
Tim Petersb39903b2003-03-24 17:22:24 +00004678 PyObject *v = NULL;
4679 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004680 int i, pos;
4681
4682 if (flags & CO_VARARGS)
4683 argcount++;
4684 if (flags & CO_VARKEYWORDS)
4685 argcount++;
4686 for (i = argcount; --i >= 0; ) {
4687 v = PyList_GET_ITEM(varnames, i);
4688 if (PyDict_GetItem(*cellvars, v)) {
4689 if (list == NULL) {
4690 list = PyList_New(1);
4691 if (list == NULL)
4692 return -1;
4693 PyList_SET_ITEM(list, 0, v);
4694 Py_INCREF(v);
4695 } else
4696 PyList_Insert(list, 0, v);
4697 }
4698 }
4699 if (list == NULL || PyList_GET_SIZE(list) == 0)
4700 return 0;
4701 /* There are cellvars that are also arguments. Create a dict
4702 to replace cellvars and put the args at the front.
4703 */
4704 d = PyDict_New();
4705 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4706 v = PyInt_FromLong(i);
4707 if (v == NULL)
4708 goto fail;
4709 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4710 goto fail;
4711 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4712 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00004713 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004714 }
4715 pos = 0;
4716 i = PyList_GET_SIZE(list);
4717 Py_DECREF(list);
4718 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4719 w = PyInt_FromLong(i++); /* don't care about the old key */
4720 if (PyDict_SetItem(d, v, w) < 0) {
4721 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00004722 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004723 goto fail;
4724 }
4725 Py_DECREF(w);
4726 }
4727 Py_DECREF(*cellvars);
4728 *cellvars = d;
4729 return 1;
4730 fail:
4731 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00004732 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004733 return -1;
4734}
4735
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004736static int
4737symtable_freevar_offsets(PyObject *freevars, int offset)
4738{
4739 PyObject *name, *v;
4740 int pos;
4741
4742 /* The cell vars are the first elements of the closure,
4743 followed by the free vars. Update the offsets in
4744 c_freevars to account for number of cellvars. */
4745 pos = 0;
4746 while (PyDict_Next(freevars, &pos, &name, &v)) {
4747 int i = PyInt_AS_LONG(v) + offset;
4748 PyObject *o = PyInt_FromLong(i);
4749 if (o == NULL)
4750 return -1;
4751 if (PyDict_SetItem(freevars, name, o) < 0) {
4752 Py_DECREF(o);
4753 return -1;
4754 }
4755 Py_DECREF(o);
4756 }
4757 return 0;
4758}
4759
4760static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004761symtable_check_unoptimized(struct compiling *c,
4762 PySymtableEntryObject *ste,
4763 struct symbol_info *si)
4764{
4765 char buf[300];
4766
4767 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4768 || (ste->ste_nested && si->si_nimplicit)))
4769 return 0;
4770
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004771#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4772
4773#define ILLEGAL_IS "is a nested function"
4774
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004775#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004776"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004777
4778#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004779"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004780
4781#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00004782"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004783"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004784
4785 /* XXX perhaps the linenos for these opt-breaking statements
4786 should be stored so the exception can point to them. */
4787
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004788 if (ste->ste_child_free) {
4789 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004790 PyOS_snprintf(buf, sizeof(buf),
4791 ILLEGAL_IMPORT_STAR,
4792 PyString_AS_STRING(ste->ste_name),
4793 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004794 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004795 PyOS_snprintf(buf, sizeof(buf),
4796 ILLEGAL_BARE_EXEC,
4797 PyString_AS_STRING(ste->ste_name),
4798 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004799 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004800 PyOS_snprintf(buf, sizeof(buf),
4801 ILLEGAL_EXEC_AND_IMPORT_STAR,
4802 PyString_AS_STRING(ste->ste_name),
4803 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004804 }
4805 } else {
4806 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004807 PyOS_snprintf(buf, sizeof(buf),
4808 ILLEGAL_IMPORT_STAR,
4809 PyString_AS_STRING(ste->ste_name),
4810 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004811 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004812 PyOS_snprintf(buf, sizeof(buf),
4813 ILLEGAL_BARE_EXEC,
4814 PyString_AS_STRING(ste->ste_name),
4815 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004816 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004817 PyOS_snprintf(buf, sizeof(buf),
4818 ILLEGAL_EXEC_AND_IMPORT_STAR,
4819 PyString_AS_STRING(ste->ste_name),
4820 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004821 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004822 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004823
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004824 PyErr_SetString(PyExc_SyntaxError, buf);
4825 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4826 ste->ste_opt_lineno);
4827 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004828}
4829
4830static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004831symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4832 struct symbol_info *si)
4833{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004834 if (c->c_future)
4835 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004836 if (ste->ste_generator)
4837 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004838 if (ste->ste_type != TYPE_MODULE)
4839 c->c_flags |= CO_NEWLOCALS;
4840 if (ste->ste_type == TYPE_FUNCTION) {
4841 c->c_nlocals = si->si_nlocals;
4842 if (ste->ste_optimized == 0)
4843 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004844 else if (ste->ste_optimized != OPT_EXEC)
4845 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004846 }
4847 return 0;
4848}
4849
4850static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004851symtable_load_symbols(struct compiling *c)
4852{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004853 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004854 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004855 PyObject *name, *varnames, *v;
4856 int i, flags, pos;
4857 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004858
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004859 v = NULL;
4860
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004861 if (symtable_init_compiling_symbols(c) < 0)
4862 goto fail;
4863 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004864 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004865 si.si_nlocals = PyList_GET_SIZE(varnames);
4866 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004867
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004868 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004869 v = PyInt_FromLong(i);
4870 if (PyDict_SetItem(c->c_locals,
4871 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004872 goto fail;
4873 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004874 }
4875
4876 /* XXX The cases below define the rules for whether a name is
4877 local or global. The logic could probably be clearer. */
4878 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004879 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4880 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004881
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004882 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004883 /* undo the original DEF_FREE */
4884 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004885
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004886 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004887 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004888 2. Free variables in methods that are also class
4889 variables or declared global.
4890 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004891 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004892 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004893
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004894 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004895 c->c_argcount--;
4896 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004897 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004898 c->c_argcount--;
4899 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004900 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004901 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004902 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004903 if (flags & DEF_PARAM) {
4904 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004905 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004906 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004907 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004908 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004909 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004910 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004911 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4912 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004913 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004914 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00004915 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004916 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004917 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004918 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004919 if (v == NULL)
4920 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004921 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004922 goto fail;
4923 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004924 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004925 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004926 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004927 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004928 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004929 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004930 if (v == NULL)
4931 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004932 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004933 goto fail;
4934 Py_DECREF(v);
4935 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004936 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004937 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00004938 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004939 goto fail;
4940 if (st->st_nscopes != 1) {
4941 v = PyInt_FromLong(flags);
4942 if (PyDict_SetItem(st->st_global,
4943 name, v))
4944 goto fail;
4945 Py_DECREF(v);
4946 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004947 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004948 }
4949 }
4950
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004951 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4952
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004953 if (si.si_ncells > 1) { /* one cell is always in order */
4954 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4955 c->c_varnames, c->c_flags) < 0)
4956 return -1;
4957 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004958 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4959 return -1;
4960 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004961 fail:
4962 /* is this always the right thing to do? */
4963 Py_XDECREF(v);
4964 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004965}
4966
4967static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004968symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004969{
4970 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004971
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004972 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004973 if (st == NULL)
4974 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004975 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00004976
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004977 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004978 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004979 goto fail;
4980 if ((st->st_symbols = PyDict_New()) == NULL)
4981 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004982 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004983 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004984 st->st_errors = 0;
4985 st->st_tmpname = 0;
4986 st->st_private = NULL;
4987 return st;
4988 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004989 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004990 return NULL;
4991}
4992
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004993void
4994PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004995{
4996 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004997 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004998 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004999 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005000}
5001
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005002/* When the compiler exits a scope, it must should update the scope's
5003 free variable information with the list of free variables in its
5004 children.
5005
5006 Variables that are free in children and defined in the current
5007 scope are cellvars.
5008
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005009 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005010 false), free variables in children that are not defined here are
5011 implicit globals.
5012
5013*/
5014
5015static int
5016symtable_update_free_vars(struct symtable *st)
5017{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005018 int i, j, def;
5019 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005020 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005021
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005022 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005023 def = DEF_FREE_CLASS;
5024 else
5025 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005026 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005027 int pos = 0;
5028
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005029 if (list)
5030 PyList_SetSlice(list, 0,
5031 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00005032 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005033 PyList_GET_ITEM(ste->ste_children, i);
5034 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005035 int flags = PyInt_AS_LONG(o);
5036 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005037 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005038 if (list == NULL) {
5039 list = PyList_New(0);
5040 if (list == NULL)
5041 return -1;
5042 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005043 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005044 if (PyList_Append(list, name) < 0) {
5045 Py_DECREF(list);
5046 return -1;
5047 }
5048 }
5049 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005050 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005051 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005052 v = PyDict_GetItem(ste->ste_symbols, name);
5053 /* If a name N is declared global in scope A and
5054 referenced in scope B contained (perhaps
5055 indirectly) in A and there are no scopes
5056 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005057 is global in B. Unless A is a class scope,
5058 because class scopes are not considered for
5059 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005060 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005061 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005062 int flags = PyInt_AS_LONG(v);
5063 if (flags & DEF_GLOBAL) {
5064 symtable_undo_free(st, child->ste_id,
5065 name);
5066 continue;
5067 }
5068 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005069 if (ste->ste_nested) {
5070 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005071 name, def) < 0) {
5072 Py_DECREF(list);
5073 return -1;
5074 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005075 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005076 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005077 name) < 0) {
5078 Py_DECREF(list);
5079 return -1;
5080 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005081 }
5082 }
5083 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005084
5085 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005086 return 0;
5087}
5088
5089/* If the current scope is a non-nested class or if name is not
5090 defined in the current, non-nested scope, then it is an implicit
5091 global in all nested scopes.
5092*/
5093
5094static int
5095symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5096{
5097 PyObject *o;
5098 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005099 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005100
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005101 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005102 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005103 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005104 if (o == NULL)
5105 return symtable_undo_free(st, child, name);
5106 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005107
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005108 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005109 return symtable_undo_free(st, child, name);
5110 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005111 return symtable_add_def_o(st, ste->ste_symbols,
5112 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005113}
5114
5115static int
5116symtable_undo_free(struct symtable *st, PyObject *id,
5117 PyObject *name)
5118{
5119 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005120 PyObject *info;
5121 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005122
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005123 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5124 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005125 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005126
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005127 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005128 if (info == NULL)
5129 return 0;
5130 v = PyInt_AS_LONG(info);
5131 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005132 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005133 DEF_FREE_GLOBAL) < 0)
5134 return -1;
5135 } else
5136 /* If the name is defined here or declared global,
5137 then the recursion stops. */
5138 return 0;
5139
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005140 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5141 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005142 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005143 PyList_GET_ITEM(ste->ste_children, i);
5144 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005145 if (x < 0)
5146 return x;
5147 }
5148 return 0;
5149}
5150
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005151/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5152 This reference is released when the scope is exited, via the DECREF
5153 in symtable_exit_scope().
5154*/
5155
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005156static int
5157symtable_exit_scope(struct symtable *st)
5158{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005159 int end;
5160
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005161 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005162 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005163 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005164 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005165 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5166 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005167 if (PySequence_DelItem(st->st_stack, end) < 0)
5168 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005169 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005170}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005171
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005172static void
5173symtable_enter_scope(struct symtable *st, char *name, int type,
5174 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005175{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005176 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005177
5178 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005179 prev = st->st_cur;
5180 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
5181 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005182 st->st_errors++;
5183 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005184 }
5185 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005186 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005187 PySymtableEntry_New(st, name, type, lineno);
5188 if (strcmp(name, TOP) == 0)
5189 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005190 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005191 if (PyList_Append(prev->ste_children,
5192 (PyObject *)st->st_cur) < 0)
5193 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005194 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005195}
5196
5197static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005198symtable_lookup(struct symtable *st, char *name)
5199{
5200 char buffer[MANGLE_LEN];
5201 PyObject *v;
5202 int flags;
5203
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005204 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005205 name = buffer;
5206 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5207 if (v == NULL) {
5208 if (PyErr_Occurred())
5209 return -1;
5210 else
5211 return 0;
5212 }
5213
5214 flags = PyInt_AS_LONG(v);
5215 return flags;
5216}
5217
5218static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005219symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005220{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005221 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005222 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005223 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005224
Guido van Rossumb7164622002-08-16 02:48:11 +00005225 /* Warn about None, except inside a tuple (where the assignment
5226 code already issues a warning). */
5227 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5228 *name == 'N' && strcmp(name, "None") == 0)
5229 {
5230 if (symtable_warn(st, "argument named None"))
5231 return -1;
5232 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005233 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005234 name = buffer;
5235 if ((s = PyString_InternFromString(name)) == NULL)
5236 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005237 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5238 Py_DECREF(s);
5239 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005240}
5241
5242/* Must only be called with mangled names */
5243
5244static int
5245symtable_add_def_o(struct symtable *st, PyObject *dict,
5246 PyObject *name, int flag)
5247{
5248 PyObject *o;
5249 int val;
5250
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005251 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005252 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005253 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005254 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005255 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005256 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005257 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005258 return -1;
5259 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005260 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005261 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005262 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005263 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005264 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005265 Py_DECREF(o);
5266 return -1;
5267 }
5268 Py_DECREF(o);
5269
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005270 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005271 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005272 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005273 } else if (flag & DEF_GLOBAL) {
5274 /* XXX need to update DEF_GLOBAL for other flags too;
5275 perhaps only DEF_FREE_GLOBAL */
5276 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005277 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005278 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005279 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005280 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005281 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005282 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005283 Py_DECREF(o);
5284 return -1;
5285 }
5286 Py_DECREF(o);
5287 }
5288 return 0;
5289}
5290
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005291#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005292
Tim Peters08a898f2001-06-28 01:52:22 +00005293/* Look for a yield stmt under n. Return 1 if found, else 0.
5294 This hack is used to look inside "if 0:" blocks (which are normally
5295 ignored) in case those are the only places a yield occurs (so that this
5296 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005297static int
5298look_for_yield(node *n)
5299{
5300 int i;
5301
5302 for (i = 0; i < NCH(n); ++i) {
5303 node *kid = CHILD(n, i);
5304
5305 switch (TYPE(kid)) {
5306
5307 case classdef:
5308 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005309 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005310 /* Stuff in nested functions and classes can't make
5311 the parent a generator. */
5312 return 0;
5313
5314 case yield_stmt:
5315 return 1;
5316
5317 default:
5318 if (look_for_yield(kid))
5319 return 1;
5320 }
5321 }
5322 return 0;
5323}
5324
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005325static void
5326symtable_node(struct symtable *st, node *n)
5327{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005328 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005329
5330 loop:
5331 switch (TYPE(n)) {
5332 case funcdef: {
5333 char *func_name = STR(CHILD(n, 1));
5334 symtable_add_def(st, func_name, DEF_LOCAL);
5335 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005336 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005337 symtable_funcdef(st, n);
5338 symtable_exit_scope(st);
5339 break;
5340 }
5341 case lambdef:
5342 if (NCH(n) == 4)
5343 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005344 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005345 symtable_funcdef(st, n);
5346 symtable_exit_scope(st);
5347 break;
5348 case classdef: {
5349 char *tmp, *class_name = STR(CHILD(n, 1));
5350 symtable_add_def(st, class_name, DEF_LOCAL);
5351 if (TYPE(CHILD(n, 2)) == LPAR) {
5352 node *bases = CHILD(n, 3);
5353 int i;
5354 for (i = 0; i < NCH(bases); i += 2) {
5355 symtable_node(st, CHILD(bases, i));
5356 }
5357 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005358 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005359 tmp = st->st_private;
5360 st->st_private = class_name;
5361 symtable_node(st, CHILD(n, NCH(n) - 1));
5362 st->st_private = tmp;
5363 symtable_exit_scope(st);
5364 break;
5365 }
5366 case if_stmt:
5367 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005368 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5369 if (st->st_cur->ste_generator == 0)
5370 st->st_cur->ste_generator =
5371 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005372 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005373 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005374 symtable_node(st, CHILD(n, i + 1));
5375 symtable_node(st, CHILD(n, i + 3));
5376 }
5377 if (i + 2 < NCH(n))
5378 symtable_node(st, CHILD(n, i + 2));
5379 break;
5380 case global_stmt:
5381 symtable_global(st, n);
5382 break;
5383 case import_stmt:
5384 symtable_import(st, n);
5385 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005386 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005387 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005388 symtable_node(st, CHILD(n, 1));
5389 if (NCH(n) > 2)
5390 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005391 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005392 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005393 st->st_cur->ste_opt_lineno = n->n_lineno;
5394 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005395 if (NCH(n) > 4)
5396 symtable_node(st, CHILD(n, 5));
5397 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005398
5399 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005400 case assert_stmt:
5401 if (Py_OptimizeFlag)
5402 return;
5403 if (NCH(n) == 2) {
5404 n = CHILD(n, 1);
5405 goto loop;
5406 } else {
5407 symtable_node(st, CHILD(n, 1));
5408 n = CHILD(n, 3);
5409 goto loop;
5410 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005411 case except_clause:
5412 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005413 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005414 if (NCH(n) > 1) {
5415 n = CHILD(n, 1);
5416 goto loop;
5417 }
5418 break;
5419 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005420 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005421 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005422 case yield_stmt:
5423 st->st_cur->ste_generator = 1;
5424 n = CHILD(n, 1);
5425 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005426 case expr_stmt:
5427 if (NCH(n) == 1)
5428 n = CHILD(n, 0);
5429 else {
5430 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005431 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005432 symtable_node(st, CHILD(n, 2));
5433 break;
5434 } else {
5435 int i;
5436 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005437 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005438 n = CHILD(n, NCH(n) - 1);
5439 }
5440 }
5441 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005442 case list_iter:
5443 n = CHILD(n, 0);
5444 if (TYPE(n) == list_for) {
5445 st->st_tmpname++;
5446 symtable_list_comprehension(st, n);
5447 st->st_tmpname--;
5448 } else {
5449 REQ(n, list_if);
5450 symtable_node(st, CHILD(n, 1));
5451 if (NCH(n) == 3) {
5452 n = CHILD(n, 2);
5453 goto loop;
5454 }
5455 }
5456 break;
5457 case for_stmt:
5458 symtable_assign(st, CHILD(n, 1), 0);
5459 for (i = 3; i < NCH(n); ++i)
5460 if (TYPE(CHILD(n, i)) >= single_input)
5461 symtable_node(st, CHILD(n, i));
5462 break;
5463 /* The remaining cases fall through to default except in
5464 special circumstances. This requires the individual cases
5465 to be coded with great care, even though they look like
5466 rather innocuous. Each case must double-check TYPE(n).
5467 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005468 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005469 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005470 n = CHILD(n, 2);
5471 goto loop;
5472 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005473 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005474 case listmaker:
5475 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00005476 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005477 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00005478 symtable_node(st, CHILD(n, 0));
5479 st->st_tmpname--;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005480 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005481 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005482 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005483 case atom:
5484 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5485 symtable_add_use(st, STR(CHILD(n, 0)));
5486 break;
5487 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005488 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005489 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005490 /* Walk over every non-token child with a special case
5491 for one child.
5492 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005493 if (NCH(n) == 1) {
5494 n = CHILD(n, 0);
5495 goto loop;
5496 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005497 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005498 if (TYPE(CHILD(n, i)) >= single_input)
5499 symtable_node(st, CHILD(n, i));
5500 }
5501}
5502
5503static void
5504symtable_funcdef(struct symtable *st, node *n)
5505{
5506 node *body;
5507
5508 if (TYPE(n) == lambdef) {
5509 if (NCH(n) == 4)
5510 symtable_params(st, CHILD(n, 1));
5511 } else
5512 symtable_params(st, CHILD(n, 2));
5513 body = CHILD(n, NCH(n) - 1);
5514 symtable_node(st, body);
5515}
5516
5517/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00005518 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005519 which are references in the defining scope. symtable_params()
5520 parses the parameter names, which are defined in the function's
5521 body.
5522
5523 varargslist:
5524 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5525 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5526*/
5527
5528static void
5529symtable_default_args(struct symtable *st, node *n)
5530{
5531 node *c;
5532 int i;
5533
5534 if (TYPE(n) == parameters) {
5535 n = CHILD(n, 1);
5536 if (TYPE(n) == RPAR)
5537 return;
5538 }
5539 REQ(n, varargslist);
5540 for (i = 0; i < NCH(n); i += 2) {
5541 c = CHILD(n, i);
5542 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5543 break;
5544 }
5545 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5546 symtable_node(st, CHILD(n, i));
5547 }
5548}
5549
5550static void
5551symtable_params(struct symtable *st, node *n)
5552{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005553 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00005554 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005555
5556 if (TYPE(n) == parameters) {
5557 n = CHILD(n, 1);
5558 if (TYPE(n) == RPAR)
5559 return;
5560 }
5561 REQ(n, varargslist);
5562 for (i = 0; i < NCH(n); i += 2) {
5563 c = CHILD(n, i);
5564 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5565 ext = 1;
5566 break;
5567 }
5568 if (TYPE(c) == test) {
5569 continue;
5570 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00005571 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005572 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00005573 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005574 char nbuf[30];
5575 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005576 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005577 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005578 }
5579 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005580 if (ext) {
5581 c = CHILD(n, i);
5582 if (TYPE(c) == STAR) {
5583 i++;
5584 symtable_add_def(st, STR(CHILD(n, i)),
5585 DEF_PARAM | DEF_STAR);
5586 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005587 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005588 c = NULL;
5589 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005590 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005591 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005592 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005593 i++;
5594 symtable_add_def(st, STR(CHILD(n, i)),
5595 DEF_PARAM | DEF_DOUBLESTAR);
5596 }
5597 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005598 if (complex >= 0) {
5599 int j;
5600 for (j = 0; j <= complex; j++) {
5601 c = CHILD(n, j);
5602 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005603 c = CHILD(n, ++j);
5604 else if (TYPE(c) == EQUAL)
5605 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005606 if (TYPE(CHILD(c, 0)) == LPAR)
5607 symtable_params_fplist(st, CHILD(c, 1));
5608 }
5609 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005610}
5611
5612static void
5613symtable_params_fplist(struct symtable *st, node *n)
5614{
5615 int i;
5616 node *c;
5617
5618 REQ(n, fplist);
5619 for (i = 0; i < NCH(n); i += 2) {
5620 c = CHILD(n, i);
5621 REQ(c, fpdef);
5622 if (NCH(c) == 1)
5623 symtable_add_def(st, STR(CHILD(c, 0)),
5624 DEF_PARAM | DEF_INTUPLE);
5625 else
5626 symtable_params_fplist(st, CHILD(c, 1));
5627 }
5628
5629}
5630
5631static void
5632symtable_global(struct symtable *st, node *n)
5633{
5634 int i;
5635
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005636 /* XXX It might be helpful to warn about module-level global
5637 statements, but it's hard to tell the difference between
5638 module-level and a string passed to exec.
5639 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005640
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005641 for (i = 1; i < NCH(n); i += 2) {
5642 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005643 int flags;
5644
5645 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005646 if (flags < 0)
5647 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005648 if (flags && flags != DEF_GLOBAL) {
5649 char buf[500];
5650 if (flags & DEF_PARAM) {
5651 PyErr_Format(PyExc_SyntaxError,
5652 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005653 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005654 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005655 st->st_cur->ste_lineno);
5656 st->st_errors++;
5657 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005658 }
5659 else {
5660 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005661 PyOS_snprintf(buf, sizeof(buf),
5662 GLOBAL_AFTER_ASSIGN,
5663 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005664 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005665 PyOS_snprintf(buf, sizeof(buf),
5666 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005667 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005668 }
5669 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005670 symtable_add_def(st, name, DEF_GLOBAL);
5671 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005672}
5673
5674static void
5675symtable_list_comprehension(struct symtable *st, node *n)
5676{
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005677 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005678
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005679 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005680 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005681 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005682 symtable_node(st, CHILD(n, 3));
5683 if (NCH(n) == 5)
5684 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005685}
5686
5687static void
5688symtable_import(struct symtable *st, node *n)
5689{
5690 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005691 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005692 | 'from' dotted_name 'import'
5693 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005694 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005695 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005696 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005697 node *dotname = CHILD(n, 1);
5698 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5699 /* check for bogus imports */
5700 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5701 PyErr_SetString(PyExc_SyntaxError,
5702 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005703 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005704 n->n_lineno);
5705 st->st_errors++;
5706 return;
5707 }
5708 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005709 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005710 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005711 if (symtable_warn(st,
5712 "import * only allowed at module level") < 0)
5713 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005714 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005715 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005716 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005717 } else {
5718 for (i = 3; i < NCH(n); i += 2) {
5719 node *c = CHILD(n, i);
5720 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005721 symtable_assign(st, CHILD(c, 2),
5722 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005723 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005724 symtable_assign(st, CHILD(c, 0),
5725 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005726 }
5727 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005728 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005729 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005730 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005731 }
5732 }
5733}
5734
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005735/* The third argument to symatble_assign() is a flag to be passed to
5736 symtable_add_def() if it is eventually called. The flag is useful
5737 to specify the particular type of assignment that should be
5738 recorded, e.g. an assignment caused by import.
5739 */
5740
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005741static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005742symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005743{
5744 node *tmp;
5745 int i;
5746
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005747 loop:
5748 switch (TYPE(n)) {
5749 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005750 /* invalid assignment, e.g. lambda x:x=2. The next
5751 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005752 return;
5753 case power:
5754 if (NCH(n) > 2) {
5755 for (i = 2; i < NCH(n); ++i)
5756 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5757 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005758 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005759 if (NCH(n) > 1) {
5760 symtable_node(st, CHILD(n, 0));
5761 symtable_node(st, CHILD(n, 1));
5762 } else {
5763 n = CHILD(n, 0);
5764 goto loop;
5765 }
5766 return;
5767 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005768 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5769 /* XXX This is an error, but the next pass
5770 will catch it. */
5771 return;
5772 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005773 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005774 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005775 }
5776 return;
5777 case exprlist:
5778 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00005779 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005780 if (NCH(n) == 1) {
5781 n = CHILD(n, 0);
5782 goto loop;
5783 }
5784 else {
5785 int i;
5786 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005787 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005788 return;
5789 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005790 case atom:
5791 tmp = CHILD(n, 0);
5792 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5793 n = CHILD(n, 1);
5794 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005795 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00005796 if (strcmp(STR(tmp), "__debug__") == 0) {
5797 PyErr_SetString(PyExc_SyntaxError,
5798 ASSIGN_DEBUG);
5799 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton86424e32001-12-04 02:41:46 +00005800 n->n_lineno);
Jeremy Hylton778e2652001-11-09 19:50:08 +00005801 st->st_errors++;
5802 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005803 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005804 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005805 return;
5806 case dotted_as_name:
5807 if (NCH(n) == 3)
5808 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005809 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005810 else
5811 symtable_add_def(st,
5812 STR(CHILD(CHILD(n,
5813 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005814 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005815 return;
5816 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005817 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005818 return;
5819 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005820 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005821 return;
5822 default:
5823 if (NCH(n) == 0)
5824 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005825 if (NCH(n) == 1) {
5826 n = CHILD(n, 0);
5827 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005828 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005829 /* Should only occur for errors like x + 1 = 1,
5830 which will be caught in the next pass. */
5831 for (i = 0; i < NCH(n); ++i)
5832 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005833 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005834 }
5835}