blob: 8b1652d212ee379abf9496f36a4b63621c2e7446 [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
Guido van Rossum79f25d91997-04-29 20:08:16 +0000326PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000327PyCode_New(int argcount, int nlocals, int stacksize, int flags,
328 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000329 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
330 PyObject *filename, PyObject *name, int firstlineno,
331 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000332{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000333 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000334 int i;
335 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000336 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000337 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000338 consts == NULL || !PyTuple_Check(consts) ||
339 names == NULL || !PyTuple_Check(names) ||
340 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000341 freevars == NULL || !PyTuple_Check(freevars) ||
342 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000343 name == NULL || !PyString_Check(name) ||
344 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000345 lnotab == NULL || !PyString_Check(lnotab) ||
346 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000347 PyErr_BadInternalCall();
348 return NULL;
349 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000350 intern_strings(names);
351 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000352 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000353 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000354 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000355 for (i = PyTuple_Size(consts); --i >= 0; ) {
356 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000357 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000358 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000359 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000360 continue;
361 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000362 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000363 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000364 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000365 co->co_argcount = argcount;
366 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000367 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000368 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000369 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000370 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000371 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000372 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000373 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000374 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000375 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000376 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000377 Py_INCREF(freevars);
378 co->co_freevars = freevars;
379 Py_INCREF(cellvars);
380 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000381 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000382 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000383 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000384 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000385 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000386 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000387 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000388 }
389 return co;
390}
391
392
393/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000394
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000395/* The compiler uses two passes to generate bytecodes. The first pass
396 builds the symbol table. The second pass generates the bytecode.
397
398 The first pass uses a single symtable struct. The second pass uses
399 a compiling struct for each code block. The compiling structs
400 share a reference to the symtable.
401
402 The two passes communicate via symtable_load_symbols() and via
403 is_local() and is_global(). The former initializes several slots
404 in the compiling struct: c_varnames, c_locals, c_nlocals,
405 c_argcount, c_globals, and c_flags.
406*/
407
Tim Peters2a7f3842001-06-09 09:26:21 +0000408/* All about c_lnotab.
409
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000410c_lnotab is an array of unsigned bytes disguised as a Python string. Since
411version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
412mapped to source code line #s via c_lnotab instead.
413
Tim Peters2a7f3842001-06-09 09:26:21 +0000414The array is conceptually a list of
415 (bytecode offset increment, line number increment)
416pairs. The details are important and delicate, best illustrated by example:
417
418 byte code offset source code line number
419 0 1
420 6 2
421 50 7
422 350 307
423 361 308
424
425The first trick is that these numbers aren't stored, only the increments
426from one row to the next (this doesn't really work, but it's a start):
427
428 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
429
430The second trick is that an unsigned byte can't hold negative values, or
431values larger than 255, so (a) there's a deep assumption that byte code
432offsets and their corresponding line #s both increase monotonically, and (b)
433if at least one column jumps by more than 255 from one row to the next, more
434than one pair is written to the table. In case #b, there's no way to know
435from looking at the table later how many were written. That's the delicate
436part. A user of c_lnotab desiring to find the source line number
437corresponding to a bytecode address A should do something like this
438
439 lineno = addr = 0
440 for addr_incr, line_incr in c_lnotab:
441 addr += addr_incr
442 if addr > A:
443 return lineno
444 lineno += line_incr
445
446In order for this to work, when the addr field increments by more than 255,
447the line # increment in each pair generated must be 0 until the remaining addr
448increment is < 256. So, in the example above, com_set_lineno should not (as
449was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
450255, 0, 45, 255, 0, 45.
451*/
452
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000453struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000454 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000455 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000456 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000457 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000458 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +0000459 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000460 PyObject *c_locals; /* dictionary (value=localID) */
461 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000462 PyObject *c_freevars; /* dictionary (value=None) */
463 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000464 int c_nlocals; /* index of next local */
465 int c_argcount; /* number of top-level arguments */
466 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000467 int c_nexti; /* index into c_code */
468 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000469 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000470 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000471 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000472 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000473 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000474 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +0000475 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000476 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000477 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000478 int c_stacklevel; /* Current stack level */
479 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000480 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000481 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000482 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000483 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000484 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000485 int c_nested; /* Is block nested funcdef or lamdef? */
486 int c_closure; /* Is nested w/freevars? */
487 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000488 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000489 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000490};
491
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000492static int
493is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000494{
495 if ((v & (USE | DEF_FREE))
496 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
497 return 1;
498 if (v & DEF_FREE_CLASS)
499 return 1;
500 return 0;
501}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000502
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000503static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000504com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000505{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000506 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
507
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000508 if (c == NULL) {
509 /* Error occurred via symtable call to
510 is_constant_false */
511 PyErr_SetString(exc, msg);
512 return;
513 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000514 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000515 if (c->c_lineno < 1 || c->c_interactive) {
516 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000517 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000518 return;
519 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000520 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000521 if (v == NULL)
522 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000523
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000524 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000525 if (line == NULL) {
526 Py_INCREF(Py_None);
527 line = Py_None;
528 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000529 if (exc == PyExc_SyntaxError) {
530 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
531 Py_None, line);
532 if (t == NULL)
533 goto exit;
534 w = Py_BuildValue("(OO)", v, t);
535 if (w == NULL)
536 goto exit;
537 PyErr_SetObject(exc, w);
538 } else {
539 /* Make sure additional exceptions are printed with
540 file and line, also. */
541 PyErr_SetObject(exc, v);
542 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
543 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000544 exit:
545 Py_XDECREF(t);
546 Py_XDECREF(v);
547 Py_XDECREF(w);
548 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000549}
550
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000551/* Interface to the block stack */
552
553static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000554block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000555{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000556 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000557 com_error(c, PyExc_SystemError,
558 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000559 }
560 else {
561 c->c_block[c->c_nblocks++] = type;
562 }
563}
564
565static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000566block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000567{
568 if (c->c_nblocks > 0)
569 c->c_nblocks--;
570 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000571 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000572 }
573}
574
Guido van Rossum681d79a1995-07-18 14:51:37 +0000575/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000576
Martin v. Löwis95292d62002-12-11 14:04:59 +0000577static int issue_warning(const char *, const char *, int);
Guido van Rossum9c8a0862002-12-23 16:35:23 +0000578static int symtable_warn(struct symtable *, char *);
Martin v. Löwis95292d62002-12-11 14:04:59 +0000579static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000580static void com_free(struct compiling *);
581static void com_push(struct compiling *, int);
582static void com_pop(struct compiling *, int);
583static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000584static void com_node(struct compiling *, node *);
585static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000586static void com_addbyte(struct compiling *, int);
587static void com_addint(struct compiling *, int);
588static void com_addoparg(struct compiling *, int, int);
589static void com_addfwref(struct compiling *, int, int *);
590static void com_backpatch(struct compiling *, int);
591static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
592static int com_addconst(struct compiling *, PyObject *);
593static int com_addname(struct compiling *, PyObject *);
594static void com_addopname(struct compiling *, int, node *);
595static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000596static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000597static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000598static void com_assign(struct compiling *, node *, int, node *);
599static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000600static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +0000601static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000602 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000603static PyObject *parsestrplus(struct compiling*, node *);
604static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000605static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000606
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000607static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000608
609/* symtable operations */
610static int symtable_build(struct compiling *, node *);
611static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000612static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000613static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000614static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000615static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000616static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000617
618static void symtable_node(struct symtable *, node *);
619static void symtable_funcdef(struct symtable *, node *);
620static void symtable_default_args(struct symtable *, node *);
621static void symtable_params(struct symtable *, node *);
622static void symtable_params_fplist(struct symtable *, node *n);
623static void symtable_global(struct symtable *, node *);
624static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000625static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000626static void symtable_list_comprehension(struct symtable *, node *);
627
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000628static int symtable_update_free_vars(struct symtable *);
629static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
630static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
631
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000632/* helper */
633static void
634do_pad(int pad)
635{
636 int i;
637 for (i = 0; i < pad; ++i)
638 fprintf(stderr, " ");
639}
640
641static void
642dump(node *n, int pad, int depth)
643{
644 int i;
645 if (depth == 0)
646 return;
647 do_pad(pad);
648 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
649 if (depth > 0)
650 depth--;
651 for (i = 0; i < NCH(n); ++i)
652 dump(CHILD(n, i), pad + 1, depth);
653}
654
655#define DUMP(N) dump(N, 0, -1)
656
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000657static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000658com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000659{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000660 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000661 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
662 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000663 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000664 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000665 goto fail;
666 if ((c->c_const_dict = PyDict_New()) == NULL)
667 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000668 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000669 goto fail;
670 if ((c->c_name_dict = PyDict_New()) == NULL)
671 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000672 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000673 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000674 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
675 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000676 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000677 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000678 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000679 c->c_freevars = NULL;
680 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000681 c->c_nlocals = 0;
682 c->c_argcount = 0;
683 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000684 c->c_nexti = 0;
685 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000686 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000687 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000688 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000689 c->c_begin = 0;
690 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000691 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000692 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000693 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000694 c->c_stacklevel = 0;
695 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000696 c->c_firstlineno = 0;
697 c->c_last_addr = 0;
698 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000699 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000700 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000701 c->c_nested = 0;
702 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000703 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000704 return 1;
705
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000706 fail:
707 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000708 return 0;
709}
710
711static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000712com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000713{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000714 Py_XDECREF(c->c_code);
715 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000716 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000717 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000718 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000719 Py_XDECREF(c->c_globals);
720 Py_XDECREF(c->c_locals);
721 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000722 Py_XDECREF(c->c_freevars);
723 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000724 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000725 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +0000726 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000727}
728
729static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000730com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000731{
732 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000733 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +0000734 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000735 /*
736 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
737 c->c_filename, c->c_name, c->c_lineno,
738 c->c_nexti, c->c_stacklevel, n);
739 */
740 }
Guido van Rossum8b993a91997-01-17 21:04:03 +0000741}
742
743static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000744com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000745{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000746 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000747 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000748 else
749 c->c_stacklevel -= n;
750}
751
752static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000753com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000754{
755 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000756 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000757 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000758 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000759}
760
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000761static int
762com_check_size(PyObject **s, int offset)
763{
764 int len = PyString_GET_SIZE(*s);
765 if (offset >= len)
766 return _PyString_Resize(s, len * 2);
767 return 0;
768}
769
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000770static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000771com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000772{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000773 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000774 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +0000775 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000776 if (com_check_size(&c->c_code, c->c_nexti)) {
777 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000778 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000779 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000780 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000781}
782
783static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000784com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000785{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000786 com_addbyte(c, x & 0xff);
787 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000788}
789
790static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000791com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000792{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000793 char *p;
794 if (c->c_lnotab == NULL)
795 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000796 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
797 c->c_errors++;
798 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000799 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000800 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000801 *p++ = addr;
802 *p++ = line;
803 c->c_lnotab_next += 2;
804}
805
806static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000807com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000808{
809 c->c_lineno = lineno;
810 if (c->c_firstlineno == 0) {
811 c->c_firstlineno = c->c_last_line = lineno;
812 }
813 else {
814 int incr_addr = c->c_nexti - c->c_last_addr;
815 int incr_line = lineno - c->c_last_line;
Tim Peters2a7f3842001-06-09 09:26:21 +0000816 while (incr_addr > 255) {
817 com_add_lnotab(c, 255, 0);
818 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000819 }
Tim Peters2a7f3842001-06-09 09:26:21 +0000820 while (incr_line > 255) {
821 com_add_lnotab(c, incr_addr, 255);
822 incr_line -=255;
823 incr_addr = 0;
824 }
825 if (incr_addr > 0 || incr_line > 0)
826 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000827 c->c_last_addr = c->c_nexti;
828 c->c_last_line = lineno;
829 }
830}
831
832static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000833com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000834{
Fred Drakeef8ace32000-08-24 00:32:09 +0000835 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +0000836 if (extended_arg){
837 com_addbyte(c, EXTENDED_ARG);
838 com_addint(c, extended_arg);
839 arg &= 0xffff;
840 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000841 com_addbyte(c, op);
842 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000843}
844
845static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000846com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000847{
848 /* Compile a forward reference for backpatching */
849 int here;
850 int anchor;
851 com_addbyte(c, op);
852 here = c->c_nexti;
853 anchor = *p_anchor;
854 *p_anchor = here;
855 com_addint(c, anchor == 0 ? 0 : here - anchor);
856}
857
858static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000859com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000860{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000861 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000862 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000863 int dist;
864 int prev;
865 for (;;) {
866 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000867 prev = code[anchor] + (code[anchor+1] << 8);
868 dist = target - (anchor+2);
869 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000870 dist >>= 8;
871 code[anchor+1] = dist;
872 dist >>= 8;
873 if (dist) {
874 com_error(c, PyExc_SystemError,
875 "com_backpatch: offset too large");
876 break;
877 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000878 if (!prev)
879 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000880 anchor -= prev;
881 }
882}
883
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000884/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000885
886static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000887com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000888{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000889 PyObject *w, *t, *np=NULL;
890 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000891
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000892 t = Py_BuildValue("(OO)", v, v->ob_type);
893 if (t == NULL)
894 goto fail;
895 w = PyDict_GetItem(dict, t);
896 if (w != NULL) {
897 n = PyInt_AsLong(w);
898 } else {
899 n = PyList_Size(list);
900 np = PyInt_FromLong(n);
901 if (np == NULL)
902 goto fail;
903 if (PyList_Append(list, v) != 0)
904 goto fail;
905 if (PyDict_SetItem(dict, t, np) != 0)
906 goto fail;
907 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000908 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000909 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000910 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000911 fail:
912 Py_XDECREF(np);
913 Py_XDECREF(t);
914 c->c_errors++;
915 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000916}
917
918static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000919com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000920{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000921 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000922}
923
924static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000925com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000926{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000927 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000928}
929
Raymond Hettinger0ae0c072002-06-20 22:23:15 +0000930int
931_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000932{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000933 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000934 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000935 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000936 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
937 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000938 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000939 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000940 return 0; /* Don't mangle __extremely_long_names */
941 if (name[nlen-1] == '_' && name[nlen-2] == '_')
942 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000943 /* Strip leading underscores from class name */
944 while (*p == '_')
945 p++;
946 if (*p == '\0')
947 return 0; /* Don't mangle if class is just underscores */
948 plen = strlen(p);
949 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000950 plen = maxlen-nlen-2; /* Truncate class name if too long */
951 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000952 buffer[0] = '_';
953 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000954 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000955 return 1;
956}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000957
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000958static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000959com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000960{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000961 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000962 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000963 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000964
Raymond Hettinger0ae0c072002-06-20 22:23:15 +0000965 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000966 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000967 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000968 c->c_errors++;
969 i = 255;
970 }
971 else {
972 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000973 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000974 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000975 com_addoparg(c, op, i);
976}
977
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000978#define NAME_LOCAL 0
979#define NAME_GLOBAL 1
980#define NAME_DEFAULT 2
981#define NAME_CLOSURE 3
982
983static int
984com_lookup_arg(PyObject *dict, PyObject *name)
985{
986 PyObject *v = PyDict_GetItem(dict, name);
987 if (v == NULL)
988 return -1;
989 else
990 return PyInt_AS_LONG(v);
991}
992
Guido van Rossum3ac99d42002-08-16 02:13:49 +0000993static int
994none_assignment_check(struct compiling *c, char *name, int assigning)
995{
996 if (name[0] == 'N' && strcmp(name, "None") == 0) {
997 char *msg;
998 if (assigning)
999 msg = "assigment to None";
1000 else
1001 msg = "deleting None";
1002 if (issue_warning(msg, c->c_filename, c->c_lineno) < 0) {
1003 c->c_errors++;
1004 return -1;
1005 }
1006 }
1007 return 0;
1008}
1009
Guido van Rossum9c8a0862002-12-23 16:35:23 +00001010static int num_literals = 3;
1011static char *literal_names[] = {"None", "True", "False"};
1012static PyObject *literals;
1013
1014static int
1015init_literals(void)
1016{
1017 int i;
1018
1019 literals = PyDict_New();
1020 if (literals == NULL)
1021 return -1;
1022 for (i = 0; i < num_literals; i++)
1023 if (PyDict_SetItemString(literals, literal_names[i],
1024 Py_None) < 0)
1025 return -1;
1026 return 0;
1027}
1028
1029static int
1030check_literal(PyObject *name, struct compiling *c, struct symtable *st)
1031{
1032 /* check for literal names that will become keywords in the future */
1033 if (literals == NULL && init_literals() < 0)
1034 return -1;
1035 if (!PyString_Check(name))
1036 return -1;
1037 if (PyDict_GetItem(literals, name)) {
1038 char buf[1024];
1039 PyOS_snprintf(buf, sizeof(buf), "'%s' may become a keyword",
1040 PyString_AS_STRING(name));
1041 if (c && (issue_warning(buf, c->c_filename, c->c_lineno) < 0))
1042 return -1;
1043 if (st && (symtable_warn(st, buf) < 0))
1044 return -1;
1045 }
1046 return 0;
1047}
1048
1049static int
1050check_literal_str(const char *name, struct compiling *c, struct symtable *st)
1051{
1052 int i;
1053
1054 for (i = 0; i < num_literals; i++)
1055 if (strcmp(literal_names[i], name) == 0) {
1056 char buf[1024];
1057 PyOS_snprintf(buf, sizeof(buf),
1058 "'%s' may become a keyword", name);
1059 if (c &&
1060 issue_warning(buf, c->c_filename, c->c_lineno) < 0)
1061 return -1;
1062 if (st && symtable_warn(st, buf) < 0)
1063 return -1;
1064 }
1065 return 0;
1066}
1067
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001068static void
1069com_addop_varname(struct compiling *c, int kind, char *name)
1070{
1071 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001072 int i, reftype;
1073 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001074 int op = STOP_CODE;
1075 char buffer[MANGLE_LEN];
1076
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001077 if (kind != VAR_LOAD &&
1078 none_assignment_check(c, name, kind == VAR_STORE))
1079 {
1080 c->c_errors++;
1081 i = 255;
1082 goto done;
1083 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001084 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001085 name = buffer;
1086 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1087 c->c_errors++;
1088 i = 255;
1089 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001090 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001091
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001092 reftype = get_ref_type(c, name);
1093 switch (reftype) {
1094 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001095 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001096 scope = NAME_LOCAL;
1097 break;
1098 case GLOBAL_EXPLICIT:
1099 scope = NAME_GLOBAL;
1100 break;
1101 case GLOBAL_IMPLICIT:
1102 if (c->c_flags & CO_OPTIMIZED)
1103 scope = NAME_GLOBAL;
1104 break;
1105 case FREE:
1106 case CELL:
1107 scope = NAME_CLOSURE;
1108 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001109 }
1110
1111 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001112 if (scope == NAME_LOCAL)
1113 i = com_lookup_arg(c->c_locals, v);
1114 else if (reftype == FREE)
1115 i = com_lookup_arg(c->c_freevars, v);
1116 else if (reftype == CELL)
1117 i = com_lookup_arg(c->c_cellvars, v);
1118 if (i == -1) {
1119 c->c_errors++; /* XXX no exception set */
1120 i = 255;
1121 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001122 }
1123 Py_DECREF(v);
1124
Guido van Rossum9c8a0862002-12-23 16:35:23 +00001125 if (kind == VAR_STORE || kind == VAR_DELETE) {
1126 if (check_literal(v, c, NULL) < 0) {
1127 c->c_errors++;
1128 i = 255;
1129 goto done;
1130 }
1131 }
1132
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001133 switch (kind) {
1134 case VAR_LOAD:
1135 switch (scope) {
1136 case NAME_LOCAL:
1137 op = LOAD_FAST;
1138 break;
1139 case NAME_GLOBAL:
1140 op = LOAD_GLOBAL;
1141 break;
1142 case NAME_DEFAULT:
1143 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001144 break;
1145 case NAME_CLOSURE:
1146 op = LOAD_DEREF;
1147 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001148 }
1149 break;
1150 case VAR_STORE:
1151 switch (scope) {
1152 case NAME_LOCAL:
1153 op = STORE_FAST;
1154 break;
1155 case NAME_GLOBAL:
1156 op = STORE_GLOBAL;
1157 break;
1158 case NAME_DEFAULT:
1159 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001160 break;
1161 case NAME_CLOSURE:
1162 op = STORE_DEREF;
1163 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001164 }
1165 break;
1166 case VAR_DELETE:
1167 switch (scope) {
1168 case NAME_LOCAL:
1169 op = DELETE_FAST;
1170 break;
1171 case NAME_GLOBAL:
1172 op = DELETE_GLOBAL;
1173 break;
1174 case NAME_DEFAULT:
1175 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001176 break;
1177 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001178 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001179 PyOS_snprintf(buf, sizeof(buf),
1180 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001181 com_error(c, PyExc_SyntaxError, buf);
1182 i = 255;
1183 break;
1184 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001185 }
1186 break;
1187 }
1188done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001189 com_addoparg(c, op, i);
1190}
1191
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001192static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001193com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001194{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001195 char *name;
1196 char buffer[1000];
1197 /* XXX it is possible to write this code without the 1000
1198 chars on the total length of dotted names, I just can't be
1199 bothered right now */
Guido van Rossum9c8a0862002-12-23 16:35:23 +00001200
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001201 if (TYPE(n) == STAR)
1202 name = "*";
1203 else if (TYPE(n) == dotted_name) {
1204 char *p = buffer;
1205 int i;
1206 name = buffer;
1207 for (i = 0; i < NCH(n); i += 2) {
1208 char *s = STR(CHILD(n, i));
Guido van Rossum9c8a0862002-12-23 16:35:23 +00001209 if (check_literal_str(s, c, NULL) < 0) {
1210 name = NULL;
1211 break;
1212 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001213 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001214 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001215 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001216 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001217 break;
1218 }
1219 if (p != buffer)
1220 *p++ = '.';
1221 strcpy(p, s);
1222 p = strchr(p, '\0');
1223 }
1224 }
1225 else {
1226 REQ(n, NAME);
1227 name = STR(n);
Guido van Rossum9c8a0862002-12-23 16:35:23 +00001228 if (check_literal_str(name, c, NULL) < 0)
1229 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001230 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001231 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001232}
1233
Guido van Rossum79f25d91997-04-29 20:08:16 +00001234static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001235parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001236{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001237 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001238 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001239 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001240#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001241 int imflag;
1242#endif
1243
Guido van Rossum282914b1991-04-04 10:42:56 +00001244 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001245 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001246#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001247 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001248#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001249 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001250 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001251 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001252 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001253 if (x < 0 && errno == 0) {
Guido van Rossum715eca92002-08-12 21:54:46 +00001254 if (PyErr_WarnExplicit(
Barry Warsaw9f007392002-08-14 15:51:29 +00001255 PyExc_FutureWarning,
Guido van Rossum715eca92002-08-12 21:54:46 +00001256 "hex/oct constants > sys.maxint "
1257 "will return positive values "
1258 "in Python 2.4 and up",
Martin v. Löwis95292d62002-12-11 14:04:59 +00001259 /* XXX: Give WarnExplicit
1260 a const char* argument. */
1261 (char*)c->c_filename,
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001262 c->c_lineno,
Guido van Rossum715eca92002-08-12 21:54:46 +00001263 NULL,
1264 NULL) < 0)
Guido van Rossum078151d2002-08-11 04:24:12 +00001265 return NULL;
Guido van Rossum3cb8e542002-08-11 14:06:15 +00001266 errno = 0; /* Might be changed by PyErr_Warn() */
Guido van Rossum078151d2002-08-11 04:24:12 +00001267 }
1268 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001269 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001270 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001271 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001272 if (errno != 0)
1273 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001274 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001275 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001276 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001277#ifndef WITHOUT_COMPLEX
1278 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001279 Py_complex z;
1280 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001281 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001282 z.imag = atof(s);
1283 PyFPE_END_PROTECT(z)
1284 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001285 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001286 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001287#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001288 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001289 PyFPE_START_PROTECT("atof", return 0)
1290 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001291 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001292 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001293 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001294}
1295
Guido van Rossum79f25d91997-04-29 20:08:16 +00001296static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001297decode_utf8(char **sPtr, char *end, char* encoding)
1298{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001299#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001300 Py_FatalError("decode_utf8 should not be called in this build.");
1301 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001302#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001303 PyObject *u, *v;
1304 char *s, *t;
1305 t = s = *sPtr;
1306 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1307 while (s < end && (*s & 0x80)) s++;
1308 *sPtr = s;
1309 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1310 if (u == NULL)
1311 return NULL;
1312 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1313 Py_DECREF(u);
1314 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001315#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001316}
1317
1318static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001319parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001320{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001321 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001322 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001323 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001324 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001325 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001326 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001327 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001328
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001329 if (isalpha(quote) || quote == '_') {
1330 if (quote == 'u' || quote == 'U') {
1331 quote = *++s;
1332 unicode = 1;
1333 }
1334 if (quote == 'r' || quote == 'R') {
1335 quote = *++s;
1336 rawmode = 1;
1337 }
1338 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001339 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001340 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001341 return NULL;
1342 }
1343 s++;
1344 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001345 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001346 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001347 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001348 return NULL;
1349 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001350 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001351 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001352 return NULL;
1353 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001354 if (len >= 4 && s[0] == quote && s[1] == quote) {
1355 s += 2;
1356 len -= 2;
1357 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001358 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001359 return NULL;
1360 }
1361 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001362#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001363 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001364 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001365 char *buf;
1366 char *p;
1367 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001368 if (encoding == NULL) {
1369 buf = s;
1370 u = NULL;
1371 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1372 buf = s;
1373 u = NULL;
1374 } else {
1375 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1376 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1377 if (u == NULL)
1378 return NULL;
1379 p = buf = PyString_AsString(u);
1380 end = s + len;
1381 while (s < end) {
1382 if (*s == '\\') {
1383 *p++ = *s++;
1384 if (*s & 0x80) {
1385 strcpy(p, "u005c");
1386 p += 5;
1387 }
1388 }
1389 if (*s & 0x80) { /* XXX inefficient */
1390 char *r;
1391 int rn, i;
1392 w = decode_utf8(&s, end, "utf-16-be");
1393 if (w == NULL) {
1394 Py_DECREF(u);
1395 return NULL;
1396 }
1397 r = PyString_AsString(w);
1398 rn = PyString_Size(w);
1399 assert(rn % 2 == 0);
1400 for (i = 0; i < rn; i += 2) {
1401 sprintf(p, "\\u%02x%02x",
1402 r[i + 0] & 0xFF,
1403 r[i + 1] & 0xFF);
1404 p += 6;
1405 }
1406 Py_DECREF(w);
1407 } else {
1408 *p++ = *s++;
1409 }
1410 }
1411 len = p - buf;
1412 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001413 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001414 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001415 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001416 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1417 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001418 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001419 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001420 return v;
1421
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001422 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001423#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001424 need_encoding = (encoding != NULL &&
1425 strcmp(encoding, "utf-8") != 0 &&
1426 strcmp(encoding, "iso-8859-1") != 0);
1427 if (rawmode || strchr(s, '\\') == NULL) {
1428 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001429#ifndef Py_USING_UNICODE
1430 /* This should not happen - we never see any other
1431 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001432 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001433#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001434 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1435 if (u == NULL)
1436 return NULL;
1437 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1438 Py_DECREF(u);
1439 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001440#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001441 } else {
1442 return PyString_FromStringAndSize(s, len);
1443 }
1444 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001445
1446 v = PyString_DecodeEscape(s, len, NULL, unicode,
1447 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001448 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001449 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001450 return v;
1451}
1452
Guido van Rossum79f25d91997-04-29 20:08:16 +00001453static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001454parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001455{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001456 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001457 int i;
1458 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001459 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001460 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001461 for (i = 1; i < NCH(n); i++) {
1462 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001463 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001464 if (s == NULL)
1465 goto onError;
1466 if (PyString_Check(v) && PyString_Check(s)) {
1467 PyString_ConcatAndDel(&v, s);
1468 if (v == NULL)
1469 goto onError;
1470 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001471#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001472 else {
1473 PyObject *temp;
1474 temp = PyUnicode_Concat(v, s);
1475 Py_DECREF(s);
1476 if (temp == NULL)
1477 goto onError;
1478 Py_DECREF(v);
1479 v = temp;
1480 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001481#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001482 }
1483 }
1484 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001485
1486 onError:
1487 Py_XDECREF(v);
1488 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001489}
1490
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001491static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001492com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001493{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001494 int anchor = 0;
1495 int save_begin = c->c_begin;
1496
1497 /* list_iter: for v in expr [list_iter] */
1498 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001499 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001500 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001501 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001502 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001503 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001504 c->c_loops++;
1505 com_list_iter(c, n, e, t);
1506 c->c_loops--;
1507 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1508 c->c_begin = save_begin;
1509 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001510 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001511}
1512
1513static void
1514com_list_if(struct compiling *c, node *n, node *e, char *t)
1515{
1516 int anchor = 0;
1517 int a = 0;
1518 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001519 com_node(c, CHILD(n, 1));
1520 com_addfwref(c, JUMP_IF_FALSE, &a);
1521 com_addbyte(c, POP_TOP);
1522 com_pop(c, 1);
1523 com_list_iter(c, n, e, t);
1524 com_addfwref(c, JUMP_FORWARD, &anchor);
1525 com_backpatch(c, a);
1526 /* We jump here with an extra entry which we now pop */
1527 com_addbyte(c, POP_TOP);
1528 com_backpatch(c, anchor);
1529}
1530
1531static void
1532com_list_iter(struct compiling *c,
1533 node *p, /* parent of list_iter node */
1534 node *e, /* element expression node */
1535 char *t /* name of result list temp local */)
1536{
1537 /* list_iter is the last child in a listmaker, list_for, or list_if */
1538 node *n = CHILD(p, NCH(p)-1);
1539 if (TYPE(n) == list_iter) {
1540 n = CHILD(n, 0);
1541 switch (TYPE(n)) {
1542 case list_for:
1543 com_list_for(c, n, e, t);
1544 break;
1545 case list_if:
1546 com_list_if(c, n, e, t);
1547 break;
1548 default:
1549 com_error(c, PyExc_SystemError,
1550 "invalid list_iter node type");
1551 }
1552 }
1553 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001554 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001555 com_push(c, 1);
1556 com_node(c, e);
1557 com_addoparg(c, CALL_FUNCTION, 1);
1558 com_addbyte(c, POP_TOP);
1559 com_pop(c, 2);
1560 }
1561}
1562
1563static void
1564com_list_comprehension(struct compiling *c, node *n)
1565{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001566 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001567 char tmpname[30];
1568 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001569 com_addoparg(c, BUILD_LIST, 0);
1570 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1571 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001572 com_addop_name(c, LOAD_ATTR, "append");
1573 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001574 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001575 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001576 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001577 --c->c_tmpname;
1578}
1579
1580static void
1581com_listmaker(struct compiling *c, node *n)
1582{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001583 /* listmaker: test ( list_for | (',' test)* [','] ) */
1584 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001585 com_list_comprehension(c, n);
1586 else {
1587 int len = 0;
1588 int i;
1589 for (i = 0; i < NCH(n); i += 2, len++)
1590 com_node(c, CHILD(n, i));
1591 com_addoparg(c, BUILD_LIST, len);
1592 com_pop(c, len-1);
1593 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001594}
1595
1596static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001597com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001598{
1599 int i;
1600 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1601 for (i = 0; i+2 < NCH(n); i += 4) {
1602 /* We must arrange things just right for STORE_SUBSCR.
1603 It wants the stack to look like (value) (dict) (key) */
1604 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001605 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001606 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00001607 com_node(c, CHILD(n, i+2)); /* value */
1608 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001609 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001610 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001611 }
1612}
1613
1614static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001615com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001616{
1617 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001618 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001619 int i;
1620 REQ(n, atom);
1621 ch = CHILD(n, 0);
1622 switch (TYPE(ch)) {
1623 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001624 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001625 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001626 com_push(c, 1);
1627 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001628 else
1629 com_node(c, CHILD(n, 1));
1630 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001631 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001632 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001633 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001634 com_push(c, 1);
1635 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001636 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001637 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001638 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001639 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001640 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001641 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001642 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001643 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001644 break;
1645 case BACKQUOTE:
1646 com_node(c, CHILD(n, 1));
1647 com_addbyte(c, UNARY_CONVERT);
1648 break;
1649 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001650 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001651 i = 255;
1652 }
1653 else {
1654 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001655 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001656 }
1657 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001658 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001659 break;
1660 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001661 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001662 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001663 c->c_errors++;
1664 i = 255;
1665 }
1666 else {
1667 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001668 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001669 }
1670 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001671 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001672 break;
1673 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001674 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001675 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001676 break;
1677 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001678 com_error(c, PyExc_SystemError,
1679 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001680 }
1681}
1682
1683static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001684com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001685{
1686 if (NCH(n) == 1) {
1687 com_addbyte(c, op);
1688 }
1689 else if (NCH(n) == 2) {
1690 if (TYPE(CHILD(n, 0)) != COLON) {
1691 com_node(c, CHILD(n, 0));
1692 com_addbyte(c, op+1);
1693 }
1694 else {
1695 com_node(c, CHILD(n, 1));
1696 com_addbyte(c, op+2);
1697 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001698 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001699 }
1700 else {
1701 com_node(c, CHILD(n, 0));
1702 com_node(c, CHILD(n, 2));
1703 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001704 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001705 }
1706}
1707
Guido van Rossum635abd21997-01-06 22:56:52 +00001708static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001709com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1710{
1711 if (NCH(n) == 1) {
1712 com_addbyte(c, DUP_TOP);
1713 com_push(c, 1);
1714 com_addbyte(c, SLICE);
1715 com_node(c, augn);
1716 com_addbyte(c, opcode);
1717 com_pop(c, 1);
1718 com_addbyte(c, ROT_TWO);
1719 com_addbyte(c, STORE_SLICE);
1720 com_pop(c, 2);
1721 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1722 com_node(c, CHILD(n, 0));
1723 com_addoparg(c, DUP_TOPX, 2);
1724 com_push(c, 2);
1725 com_addbyte(c, SLICE+1);
1726 com_pop(c, 1);
1727 com_node(c, augn);
1728 com_addbyte(c, opcode);
1729 com_pop(c, 1);
1730 com_addbyte(c, ROT_THREE);
1731 com_addbyte(c, STORE_SLICE+1);
1732 com_pop(c, 3);
1733 } else if (NCH(n) == 2) {
1734 com_node(c, CHILD(n, 1));
1735 com_addoparg(c, DUP_TOPX, 2);
1736 com_push(c, 2);
1737 com_addbyte(c, SLICE+2);
1738 com_pop(c, 1);
1739 com_node(c, augn);
1740 com_addbyte(c, opcode);
1741 com_pop(c, 1);
1742 com_addbyte(c, ROT_THREE);
1743 com_addbyte(c, STORE_SLICE+2);
1744 com_pop(c, 3);
1745 } else {
1746 com_node(c, CHILD(n, 0));
1747 com_node(c, CHILD(n, 2));
1748 com_addoparg(c, DUP_TOPX, 3);
1749 com_push(c, 3);
1750 com_addbyte(c, SLICE+3);
1751 com_pop(c, 2);
1752 com_node(c, augn);
1753 com_addbyte(c, opcode);
1754 com_pop(c, 1);
1755 com_addbyte(c, ROT_FOUR);
1756 com_addbyte(c, STORE_SLICE+3);
1757 com_pop(c, 4);
1758 }
1759}
1760
1761static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001762com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001763{
1764 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001765 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001766 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001767 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001768 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001769 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001770 }
1771 else {
1772 com_node(c, CHILD(n, 0));
1773 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001774 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001775 }
1776 m = n;
1777 do {
1778 m = CHILD(m, 0);
1779 } while (NCH(m) == 1);
1780 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001781 /* f(lambda x: x[0] = 3) ends up getting parsed with
1782 * LHS test = lambda x: x[0], and RHS test = 3.
1783 * SF bug 132313 points out that complaining about a keyword
1784 * then is very confusing.
1785 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001786 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001787 TYPE(m) == lambdef ?
1788 "lambda cannot contain assignment" :
1789 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001790 }
1791 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001792 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00001793 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00001794 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001795 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001796 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001797 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001798 else if (*pkeywords == NULL) {
1799 c->c_errors++;
1800 Py_DECREF(v);
1801 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001802 if (PyDict_GetItem(*pkeywords, v) != NULL)
1803 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001804 "duplicate keyword argument");
1805 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001806 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001807 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001808 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001809 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001810 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001811 }
1812 }
1813 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001814}
1815
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001816static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001817com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001818{
1819 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001820 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001821 }
1822 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001823 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001824 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001825 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001826 int star_flag = 0;
1827 int starstar_flag = 0;
1828 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001829 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001830 na = 0;
1831 nk = 0;
1832 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001833 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001834 if (TYPE(ch) == STAR ||
1835 TYPE(ch) == DOUBLESTAR)
1836 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001837 if (ch->n_lineno != lineno) {
1838 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001839 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00001840 }
1841 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001842 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001843 na++;
1844 else
1845 nk++;
1846 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001847 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001848 while (i < NCH(n)) {
1849 node *tok = CHILD(n, i);
1850 node *ch = CHILD(n, i+1);
1851 i += 3;
1852 switch (TYPE(tok)) {
1853 case STAR: star_flag = 1; break;
1854 case DOUBLESTAR: starstar_flag = 1; break;
1855 }
1856 com_node(c, ch);
1857 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001858 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001859 com_error(c, PyExc_SyntaxError,
1860 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001861 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001862 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001863 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001864 star_flag + (starstar_flag << 1);
1865 else
1866 opcode = CALL_FUNCTION;
1867 com_addoparg(c, opcode, na | (nk << 8));
1868 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001869 }
1870}
1871
1872static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001873com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001874{
1875 com_addopname(c, LOAD_ATTR, n);
1876}
1877
1878static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001879com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001880{
1881 int i=0;
1882 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001883 node *ch;
1884
1885 /* first argument */
1886 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001887 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001888 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001889 i++;
1890 }
1891 else {
1892 com_node(c, CHILD(n,i));
1893 i++;
1894 REQ(CHILD(n,i),COLON);
1895 i++;
1896 }
1897 /* second argument */
1898 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1899 com_node(c, CHILD(n,i));
1900 i++;
1901 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001902 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001903 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001904 com_push(c, 1);
1905 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001906 /* remaining arguments */
1907 for (; i < NCH(n); i++) {
1908 ns++;
1909 ch=CHILD(n,i);
1910 REQ(ch, sliceop);
1911 if (NCH(ch) == 1) {
1912 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001913 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001914 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001915 }
1916 else
1917 com_node(c, CHILD(ch,1));
1918 }
1919 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001920 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001921}
1922
1923static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001924com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001925{
1926 node *ch;
1927 REQ(n, subscript);
1928 ch = CHILD(n,0);
1929 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001930 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001931 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001932 com_push(c, 1);
1933 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001934 else {
1935 /* check for slice */
1936 if ((TYPE(ch) == COLON || NCH(n) > 1))
1937 com_sliceobj(c, n);
1938 else {
1939 REQ(ch, test);
1940 com_node(c, ch);
1941 }
1942 }
1943}
1944
1945static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001946com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001947{
1948 int i, op;
1949 REQ(n, subscriptlist);
1950 /* Check to make backward compatible slice behavior for '[i:j]' */
1951 if (NCH(n) == 1) {
1952 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001953 /* 'Basic' slice, should have exactly one colon. */
1954 if ((TYPE(CHILD(sub, 0)) == COLON
1955 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1956 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1957 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001958 switch (assigning) {
1959 case OP_DELETE:
1960 op = DELETE_SLICE;
1961 break;
1962 case OP_ASSIGN:
1963 op = STORE_SLICE;
1964 break;
1965 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001966 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001967 break;
1968 default:
1969 com_augassign_slice(c, sub, assigning, augn);
1970 return;
1971 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001972 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001973 if (op == STORE_SLICE)
1974 com_pop(c, 2);
1975 else if (op == DELETE_SLICE)
1976 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001977 return;
1978 }
1979 }
1980 /* Else normal subscriptlist. Compile each subscript. */
1981 for (i = 0; i < NCH(n); i += 2)
1982 com_subscript(c, CHILD(n, i));
1983 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001984 if (NCH(n) > 1) {
1985 i = (NCH(n)+1) / 2;
1986 com_addoparg(c, BUILD_TUPLE, i);
1987 com_pop(c, i-1);
1988 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001989 switch (assigning) {
1990 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001991 op = DELETE_SUBSCR;
1992 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001993 break;
1994 default:
1995 case OP_ASSIGN:
1996 op = STORE_SUBSCR;
1997 i = 3;
1998 break;
1999 case OP_APPLY:
2000 op = BINARY_SUBSCR;
2001 i = 1;
2002 break;
2003 }
2004 if (assigning > OP_APPLY) {
2005 com_addoparg(c, DUP_TOPX, 2);
2006 com_push(c, 2);
2007 com_addbyte(c, BINARY_SUBSCR);
2008 com_pop(c, 1);
2009 com_node(c, augn);
2010 com_addbyte(c, assigning);
2011 com_pop(c, 1);
2012 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002013 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002014 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002015 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002016}
2017
2018static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002019com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002020{
2021 REQ(n, trailer);
2022 switch (TYPE(CHILD(n, 0))) {
2023 case LPAR:
2024 com_call_function(c, CHILD(n, 1));
2025 break;
2026 case DOT:
2027 com_select_member(c, CHILD(n, 1));
2028 break;
2029 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002030 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002031 break;
2032 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002033 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002034 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002035 }
2036}
2037
2038static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002039com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002040{
2041 int i;
2042 REQ(n, power);
2043 com_atom(c, CHILD(n, 0));
2044 for (i = 1; i < NCH(n); i++) {
2045 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2046 com_factor(c, CHILD(n, i+1));
2047 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002048 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002049 break;
2050 }
2051 else
2052 com_apply_trailer(c, CHILD(n, i));
2053 }
2054}
2055
2056static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002057com_invert_constant(struct compiling *c, node *n)
2058{
2059 /* Compute the inverse of int and longs and use them directly,
2060 but be prepared to generate code for all other
2061 possibilities (invalid numbers, floats, complex).
2062 */
2063 PyObject *num, *inv = NULL;
2064 int i;
2065
2066 REQ(n, NUMBER);
2067 num = parsenumber(c, STR(n));
2068 if (num == NULL)
2069 i = 255;
2070 else {
2071 inv = PyNumber_Invert(num);
2072 if (inv == NULL) {
2073 PyErr_Clear();
2074 i = com_addconst(c, num);
2075 } else {
2076 i = com_addconst(c, inv);
2077 Py_DECREF(inv);
2078 }
2079 Py_DECREF(num);
2080 }
2081 com_addoparg(c, LOAD_CONST, i);
2082 com_push(c, 1);
2083 if (num != NULL && inv == NULL)
2084 com_addbyte(c, UNARY_INVERT);
2085}
2086
Tim Peters51e26512001-09-07 08:45:55 +00002087static int
2088is_float_zero(const char *p)
2089{
2090 int found_radix_point = 0;
2091 int ch;
2092 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2093 switch (ch) {
2094 case '0':
2095 /* no reason to believe it's not 0 -- continue */
2096 break;
2097
2098 case 'e': case 'E': case 'j': case 'J':
2099 /* If this was a hex constant, we already would have
2100 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2101 must be an exponent marker, and we haven't yet
2102 seen a non-zero digit, and it doesn't matter what
2103 the exponent is then. For 'j' or 'J' similarly,
2104 except that this is an imaginary 0 then. */
2105 return 1;
2106
2107 case '.':
2108 found_radix_point = 1;
2109 break;
2110
2111 default:
2112 return 0;
2113 }
2114 }
2115 return found_radix_point;
2116}
2117
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002118static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002119com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002120{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002121 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002122 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002123 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002124 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002125 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002126 approriate value as a constant. If the value is negative,
2127 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002128 negative in the 0th position -- unless we're doing unary minus
2129 of a floating zero! In that case the sign is significant, but
2130 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002131 */
2132 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002133 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002134 && TYPE((pfactor = CHILD(n, 1))) == factor
2135 && NCH(pfactor) == 1
2136 && TYPE((ppower = CHILD(pfactor, 0))) == power
2137 && NCH(ppower) == 1
2138 && TYPE((patom = CHILD(ppower, 0))) == atom
2139 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
2140 && !(childtype == MINUS && is_float_zero(STR(pnum)))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002141 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002142 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002143 return;
2144 }
2145 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002146 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002147 if (s == NULL) {
2148 com_error(c, PyExc_MemoryError, "");
2149 com_addbyte(c, 255);
2150 return;
2151 }
2152 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002153 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002154 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002155 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002156 }
Tim Peters51e26512001-09-07 08:45:55 +00002157 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002158 }
2159 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002160 com_factor(c, CHILD(n, 1));
2161 com_addbyte(c, UNARY_POSITIVE);
2162 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002163 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002164 com_factor(c, CHILD(n, 1));
2165 com_addbyte(c, UNARY_NEGATIVE);
2166 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002167 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002168 com_factor(c, CHILD(n, 1));
2169 com_addbyte(c, UNARY_INVERT);
2170 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002171 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002172 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002173 }
2174}
2175
2176static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002177com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002178{
2179 int i;
2180 int op;
2181 REQ(n, term);
2182 com_factor(c, CHILD(n, 0));
2183 for (i = 2; i < NCH(n); i += 2) {
2184 com_factor(c, CHILD(n, i));
2185 switch (TYPE(CHILD(n, i-1))) {
2186 case STAR:
2187 op = BINARY_MULTIPLY;
2188 break;
2189 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002190 if (c->c_flags & CO_FUTURE_DIVISION)
2191 op = BINARY_TRUE_DIVIDE;
2192 else
2193 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002194 break;
2195 case PERCENT:
2196 op = BINARY_MODULO;
2197 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002198 case DOUBLESLASH:
2199 op = BINARY_FLOOR_DIVIDE;
2200 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002201 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002202 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002203 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002204 op = 255;
2205 }
2206 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002207 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002208 }
2209}
2210
2211static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002212com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002213{
2214 int i;
2215 int op;
2216 REQ(n, arith_expr);
2217 com_term(c, CHILD(n, 0));
2218 for (i = 2; i < NCH(n); i += 2) {
2219 com_term(c, CHILD(n, i));
2220 switch (TYPE(CHILD(n, i-1))) {
2221 case PLUS:
2222 op = BINARY_ADD;
2223 break;
2224 case MINUS:
2225 op = BINARY_SUBTRACT;
2226 break;
2227 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002228 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002229 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002230 op = 255;
2231 }
2232 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002233 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002234 }
2235}
2236
2237static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002238com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002239{
2240 int i;
2241 int op;
2242 REQ(n, shift_expr);
2243 com_arith_expr(c, CHILD(n, 0));
2244 for (i = 2; i < NCH(n); i += 2) {
2245 com_arith_expr(c, CHILD(n, i));
2246 switch (TYPE(CHILD(n, i-1))) {
2247 case LEFTSHIFT:
2248 op = BINARY_LSHIFT;
2249 break;
2250 case RIGHTSHIFT:
2251 op = BINARY_RSHIFT;
2252 break;
2253 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002254 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002255 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002256 op = 255;
2257 }
2258 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002259 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002260 }
2261}
2262
2263static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002264com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002265{
2266 int i;
2267 int op;
2268 REQ(n, and_expr);
2269 com_shift_expr(c, CHILD(n, 0));
2270 for (i = 2; i < NCH(n); i += 2) {
2271 com_shift_expr(c, CHILD(n, i));
2272 if (TYPE(CHILD(n, i-1)) == AMPER) {
2273 op = BINARY_AND;
2274 }
2275 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002276 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002277 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002278 op = 255;
2279 }
2280 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002281 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002282 }
2283}
2284
2285static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002286com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002287{
2288 int i;
2289 int op;
2290 REQ(n, xor_expr);
2291 com_and_expr(c, CHILD(n, 0));
2292 for (i = 2; i < NCH(n); i += 2) {
2293 com_and_expr(c, CHILD(n, i));
2294 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2295 op = BINARY_XOR;
2296 }
2297 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002298 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002299 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002300 op = 255;
2301 }
2302 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002303 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002304 }
2305}
2306
2307static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002308com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002309{
2310 int i;
2311 int op;
2312 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002313 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002314 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002315 com_xor_expr(c, CHILD(n, i));
2316 if (TYPE(CHILD(n, i-1)) == VBAR) {
2317 op = BINARY_OR;
2318 }
2319 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002320 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002321 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002322 op = 255;
2323 }
2324 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002325 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002326 }
2327}
2328
2329static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002330cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002331{
2332 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00002333 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002334 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2335 if (NCH(n) == 1) {
2336 n = CHILD(n, 0);
2337 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002338 case LESS: return PyCmp_LT;
2339 case GREATER: return PyCmp_GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002340 case EQEQUAL: /* == */
Martin v. Löwis7198a522002-01-01 19:59:11 +00002341 case EQUAL: return PyCmp_EQ;
2342 case LESSEQUAL: return PyCmp_LE;
2343 case GREATEREQUAL: return PyCmp_GE;
2344 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2345 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2346 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002347 }
2348 }
2349 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002350 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002351 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002352 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002353 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002354 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002355 }
2356 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002357 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002358}
2359
2360static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002361com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002362{
2363 int i;
2364 enum cmp_op op;
2365 int anchor;
2366 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2367 com_expr(c, CHILD(n, 0));
2368 if (NCH(n) == 1)
2369 return;
2370
2371 /****************************************************************
2372 The following code is generated for all but the last
2373 comparison in a chain:
2374
2375 label: on stack: opcode: jump to:
2376
2377 a <code to load b>
2378 a, b DUP_TOP
2379 a, b, b ROT_THREE
2380 b, a, b COMPARE_OP
2381 b, 0-or-1 JUMP_IF_FALSE L1
2382 b, 1 POP_TOP
2383 b
2384
2385 We are now ready to repeat this sequence for the next
2386 comparison in the chain.
2387
2388 For the last we generate:
2389
2390 b <code to load c>
2391 b, c COMPARE_OP
2392 0-or-1
2393
2394 If there were any jumps to L1 (i.e., there was more than one
2395 comparison), we generate:
2396
2397 0-or-1 JUMP_FORWARD L2
2398 L1: b, 0 ROT_TWO
2399 0, b POP_TOP
2400 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002401 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002402 ****************************************************************/
2403
2404 anchor = 0;
2405
2406 for (i = 2; i < NCH(n); i += 2) {
2407 com_expr(c, CHILD(n, i));
2408 if (i+2 < NCH(n)) {
2409 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002410 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002411 com_addbyte(c, ROT_THREE);
2412 }
2413 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002414 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002415 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002416 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002417 }
2418 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002419 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002420 if (i+2 < NCH(n)) {
2421 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2422 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002423 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002424 }
2425 }
2426
2427 if (anchor) {
2428 int anchor2 = 0;
2429 com_addfwref(c, JUMP_FORWARD, &anchor2);
2430 com_backpatch(c, anchor);
2431 com_addbyte(c, ROT_TWO);
2432 com_addbyte(c, POP_TOP);
2433 com_backpatch(c, anchor2);
2434 }
2435}
2436
2437static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002438com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002439{
2440 REQ(n, not_test); /* 'not' not_test | comparison */
2441 if (NCH(n) == 1) {
2442 com_comparison(c, CHILD(n, 0));
2443 }
2444 else {
2445 com_not_test(c, CHILD(n, 1));
2446 com_addbyte(c, UNARY_NOT);
2447 }
2448}
2449
2450static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002451com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002452{
2453 int i;
2454 int anchor;
2455 REQ(n, and_test); /* not_test ('and' not_test)* */
2456 anchor = 0;
2457 i = 0;
2458 for (;;) {
2459 com_not_test(c, CHILD(n, i));
2460 if ((i += 2) >= NCH(n))
2461 break;
2462 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2463 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002464 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002465 }
2466 if (anchor)
2467 com_backpatch(c, anchor);
2468}
2469
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002470static int
2471com_make_closure(struct compiling *c, PyCodeObject *co)
2472{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002473 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002474 if (free == 0)
2475 return 0;
2476 for (i = 0; i < free; ++i) {
2477 /* Bypass com_addop_varname because it will generate
2478 LOAD_DEREF but LOAD_CLOSURE is needed.
2479 */
2480 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2481 int arg, reftype;
2482
2483 /* Special case: If a class contains a method with a
2484 free variable that has the same name as a method,
2485 the name will be considered free *and* local in the
2486 class. It should be handled by the closure, as
2487 well as by the normal name loookup logic.
2488 */
2489 reftype = get_ref_type(c, PyString_AS_STRING(name));
2490 if (reftype == CELL)
2491 arg = com_lookup_arg(c->c_cellvars, name);
2492 else /* (reftype == FREE) */
2493 arg = com_lookup_arg(c->c_freevars, name);
2494 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002495 fprintf(stderr, "lookup %s in %s %d %d\n"
2496 "freevars of %s: %s\n",
2497 PyObject_REPR(name),
2498 c->c_name,
2499 reftype, arg,
2500 PyString_AS_STRING(co->co_name),
2501 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002502 Py_FatalError("com_make_closure()");
2503 }
2504 com_addoparg(c, LOAD_CLOSURE, arg);
2505
2506 }
2507 com_push(c, free);
2508 return 1;
2509}
2510
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002511static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002512com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002513{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002514 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002515 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002516 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002517 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002518 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002519 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2520 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002521 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002522 if (co == NULL) {
2523 c->c_errors++;
2524 return;
2525 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002526 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002527 i = com_addconst(c, (PyObject *)co);
2528 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002529 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002530 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002531 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002532 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002533 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002534 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002535 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002536 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002537 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002538 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002539 else {
2540 int anchor = 0;
2541 int i = 0;
2542 for (;;) {
2543 com_and_test(c, CHILD(n, i));
2544 if ((i += 2) >= NCH(n))
2545 break;
2546 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2547 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002548 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002549 }
2550 if (anchor)
2551 com_backpatch(c, anchor);
2552 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002553}
2554
2555static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002556com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002557{
2558 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002559 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002560 com_node(c, CHILD(n, 0));
2561 }
2562 else {
2563 int i;
2564 int len;
2565 len = (NCH(n) + 1) / 2;
2566 for (i = 0; i < NCH(n); i += 2)
2567 com_node(c, CHILD(n, i));
2568 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002569 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002570 }
2571}
2572
2573
2574/* Begin of assignment compilation */
2575
Thomas Wouters434d0822000-08-24 20:11:32 +00002576
2577static void
2578com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2579{
2580 com_addbyte(c, DUP_TOP);
2581 com_push(c, 1);
2582 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002583 com_node(c, augn);
2584 com_addbyte(c, opcode);
2585 com_pop(c, 1);
2586 com_addbyte(c, ROT_TWO);
2587 com_addopname(c, STORE_ATTR, n);
2588 com_pop(c, 2);
2589}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002590
2591static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002592com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002593{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00002594 if (none_assignment_check(c, STR(n), assigning))
2595 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002596 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002597 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002598}
2599
2600static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002601com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002602{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002603 REQ(n, trailer);
2604 switch (TYPE(CHILD(n, 0))) {
2605 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002606 if (assigning == OP_DELETE)
2607 com_error(c, PyExc_SyntaxError,
2608 "can't delete function call");
2609 else
2610 com_error(c, PyExc_SyntaxError,
2611 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002612 break;
2613 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002614 if (assigning > OP_APPLY)
2615 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2616 else
2617 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002618 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002619 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002620 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002621 break;
2622 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002623 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002624 }
2625}
2626
2627static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002628com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002629{
2630 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002631 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002632 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002633 if (assigning) {
2634 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002635 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002636 com_push(c, i-1);
2637 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002638 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002639 com_assign(c, CHILD(n, i), assigning, NULL);
2640}
2641
2642static void
2643com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2644{
2645 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002646 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002647 com_push(c, 1);
2648 com_node(c, augn);
2649 com_addbyte(c, opcode);
2650 com_pop(c, 1);
2651 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002652}
2653
2654static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002655com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002656{
2657 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002658 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002659 if (assigning)
2660 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002661}
2662
2663static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002664com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002665{
2666 /* Loop to avoid trivial recursion */
2667 for (;;) {
2668 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002669
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002670 case exprlist:
2671 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002672 case testlist1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002673 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002674 if (assigning > OP_APPLY) {
2675 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002676 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002677 return;
2678 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002679 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002680 return;
2681 }
2682 n = CHILD(n, 0);
2683 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002684
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002685 case test:
2686 case and_test:
2687 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002688 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002689 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002690 case xor_expr:
2691 case and_expr:
2692 case shift_expr:
2693 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002694 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002695 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002696 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002697 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002698 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002699 return;
2700 }
2701 n = CHILD(n, 0);
2702 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002703
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002704 case power: /* atom trailer* ('**' power)*
2705 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002706 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002707 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002708 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002709 return;
2710 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002711 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002712 int i;
2713 com_node(c, CHILD(n, 0));
2714 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002715 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002716 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002717 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002718 return;
2719 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002720 com_apply_trailer(c, CHILD(n, i));
2721 } /* NB i is still alive */
2722 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002723 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002724 return;
2725 }
2726 n = CHILD(n, 0);
2727 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002728
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002729 case atom:
2730 switch (TYPE(CHILD(n, 0))) {
2731 case LPAR:
2732 n = CHILD(n, 1);
2733 if (TYPE(n) == RPAR) {
2734 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002735 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002736 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002737 return;
2738 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002739 if (assigning > OP_APPLY) {
2740 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002741 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002742 return;
2743 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002744 break;
2745 case LSQB:
2746 n = CHILD(n, 1);
2747 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002748 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002749 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002750 return;
2751 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002752 if (assigning > OP_APPLY) {
2753 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002754 "augmented assign to list not possible");
2755 return;
2756 }
2757 if (NCH(n) > 1
2758 && TYPE(CHILD(n, 1)) == list_for) {
2759 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002760 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002761 return;
2762 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002763 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002764 return;
2765 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002766 if (assigning > OP_APPLY)
2767 com_augassign_name(c, CHILD(n, 0),
2768 assigning, augn);
2769 else
2770 com_assign_name(c, CHILD(n, 0),
2771 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002772 return;
2773 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002774 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002775 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002776 return;
2777 }
2778 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002779
2780 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002781 com_error(c, PyExc_SyntaxError,
2782 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002783 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002784
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002785 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002786 com_error(c, PyExc_SystemError,
2787 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002788 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002789
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002790 }
2791 }
2792}
Guido van Rossum7c531111997-03-11 18:42:21 +00002793
Thomas Wouters434d0822000-08-24 20:11:32 +00002794static void
2795com_augassign(struct compiling *c, node *n)
2796{
2797 int opcode;
2798
2799 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2800 case '+': opcode = INPLACE_ADD; break;
2801 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002802 case '/':
2803 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
2804 opcode = INPLACE_FLOOR_DIVIDE;
2805 else if (c->c_flags & CO_FUTURE_DIVISION)
2806 opcode = INPLACE_TRUE_DIVIDE;
2807 else
2808 opcode = INPLACE_DIVIDE;
2809 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00002810 case '%': opcode = INPLACE_MODULO; break;
2811 case '<': opcode = INPLACE_LSHIFT; break;
2812 case '>': opcode = INPLACE_RSHIFT; break;
2813 case '&': opcode = INPLACE_AND; break;
2814 case '^': opcode = INPLACE_XOR; break;
2815 case '|': opcode = INPLACE_OR; break;
2816 case '*':
2817 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2818 opcode = INPLACE_POWER;
2819 else
2820 opcode = INPLACE_MULTIPLY;
2821 break;
2822 default:
2823 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2824 return;
2825 }
2826 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2827}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002828
2829static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002830com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002831{
Thomas Wouters434d0822000-08-24 20:11:32 +00002832 REQ(n, expr_stmt);
2833 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002834 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002835 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002836 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002837 if (NCH(n) == 1) {
2838 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002839 if (c->c_interactive)
2840 com_addbyte(c, PRINT_EXPR);
2841 else
2842 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002843 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002844 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002845 else if (TYPE(CHILD(n,1)) == augassign)
2846 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002847 else {
2848 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002849 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002850 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002851 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002852 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002853 com_push(c, 1);
2854 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002855 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002856 }
2857 }
2858}
2859
2860static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002861com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002862{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002863 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002864 int i;
2865 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002866 if (Py_OptimizeFlag)
2867 return;
2868 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00002869
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002870 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00002871 raise AssertionError [, <message>]
2872
2873 where <message> is the second test, if present.
2874 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002875 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002876 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002877 com_addbyte(c, POP_TOP);
2878 com_pop(c, 1);
2879 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002880 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002881 com_push(c, 1);
2882 i = NCH(n)/2; /* Either 2 or 4 */
2883 if (i > 1)
2884 com_node(c, CHILD(n, 3));
2885 com_addoparg(c, RAISE_VARARGS, i);
2886 com_pop(c, i);
2887 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002888 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002889 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002890 com_addbyte(c, POP_TOP);
2891}
2892
2893static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002894com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002895{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002896 int i = 1;
2897 node* stream = NULL;
2898
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002899 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002900
2901 /* are we using the extended print form? */
2902 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2903 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002904 com_node(c, stream);
2905 /* stack: [...] => [... stream] */
2906 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002907 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2908 i = 4;
2909 else
2910 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002911 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002912 for (; i < NCH(n); i += 2) {
2913 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002914 com_addbyte(c, DUP_TOP);
2915 /* stack: [stream] => [stream stream] */
2916 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002917 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002918 /* stack: [stream stream] => [stream stream obj] */
2919 com_addbyte(c, ROT_TWO);
2920 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002921 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002922 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002923 com_pop(c, 2);
2924 }
2925 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002926 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002927 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002928 com_addbyte(c, PRINT_ITEM);
2929 com_pop(c, 1);
2930 }
2931 }
2932 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002933 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002934 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002935 /* must pop the extra stream object off the stack */
2936 com_addbyte(c, POP_TOP);
2937 /* stack: [... stream] => [...] */
2938 com_pop(c, 1);
2939 }
2940 }
2941 else {
2942 if (stream != NULL) {
2943 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002944 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002945 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002946 com_pop(c, 1);
2947 }
2948 else
2949 com_addbyte(c, PRINT_NEWLINE);
2950 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002951}
2952
2953static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002954com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002955{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002956 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002957 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002958 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002959 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002960 if (c->c_flags & CO_GENERATOR) {
2961 if (NCH(n) > 1) {
2962 com_error(c, PyExc_SyntaxError,
2963 "'return' with argument inside generator");
2964 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002965 }
2966 if (NCH(n) < 2) {
2967 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002968 com_push(c, 1);
2969 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002970 else
2971 com_node(c, CHILD(n, 1));
2972 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00002973 com_pop(c, 1);
2974}
2975
2976static void
2977com_yield_stmt(struct compiling *c, node *n)
2978{
Tim Peters95c80f82001-06-23 02:07:08 +00002979 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00002980 REQ(n, yield_stmt); /* 'yield' testlist */
2981 if (!c->c_infunction) {
2982 com_error(c, PyExc_SyntaxError, "'yield' outside function");
2983 }
Tim Peters95c80f82001-06-23 02:07:08 +00002984
2985 for (i = 0; i < c->c_nblocks; ++i) {
2986 if (c->c_block[i] == SETUP_FINALLY) {
2987 com_error(c, PyExc_SyntaxError,
2988 "'yield' not allowed in a 'try' block "
2989 "with a 'finally' clause");
2990 return;
2991 }
2992 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002993 com_node(c, CHILD(n, 1));
2994 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002995 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002996}
2997
2998static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002999com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003000{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003001 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003002 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3003 if (NCH(n) > 1) {
3004 com_node(c, CHILD(n, 1));
3005 if (NCH(n) > 3) {
3006 com_node(c, CHILD(n, 3));
3007 if (NCH(n) > 5)
3008 com_node(c, CHILD(n, 5));
3009 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003010 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003011 i = NCH(n)/2;
3012 com_addoparg(c, RAISE_VARARGS, i);
3013 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003014}
3015
3016static void
Thomas Wouters52152252000-08-17 22:55:00 +00003017com_from_import(struct compiling *c, node *n)
3018{
3019 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3020 com_push(c, 1);
3021 if (NCH(n) > 1) {
3022 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3023 com_error(c, PyExc_SyntaxError, "invalid syntax");
3024 return;
3025 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003026 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003027 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003028 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003029 com_pop(c, 1);
3030}
3031
3032static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003033com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003034{
3035 int i;
3036 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003037 /* 'import' dotted_name (',' dotted_name)* |
3038 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003039 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00003040 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003041 /* 'from' dotted_name 'import' ... */
3042 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003043
3044 if (TYPE(CHILD(n, 3)) == STAR) {
3045 tup = Py_BuildValue("(s)", "*");
3046 } else {
3047 tup = PyTuple_New((NCH(n) - 2)/2);
3048 for (i = 3; i < NCH(n); i += 2) {
Guido van Rossum9c8a0862002-12-23 16:35:23 +00003049 char *s = STR(CHILD(CHILD(n, i), 0));
3050 if (check_literal_str(s, c, NULL) < 0) {
3051 c->c_errors++;
3052 return;
3053 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003054 PyTuple_SET_ITEM(tup, (i-3)/2,
Guido van Rossum9c8a0862002-12-23 16:35:23 +00003055 PyString_FromString(s));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003056 }
3057 }
3058 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003059 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003060 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003061 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00003062 if (TYPE(CHILD(n, 3)) == STAR)
3063 com_addbyte(c, IMPORT_STAR);
3064 else {
3065 for (i = 3; i < NCH(n); i += 2)
3066 com_from_import(c, CHILD(n, i));
3067 com_addbyte(c, POP_TOP);
3068 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003069 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003070 }
3071 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003072 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003073 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003074 node *subn = CHILD(n, i);
3075 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003076 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003077 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003078 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003079 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003080 int j;
3081 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003082 com_error(c, PyExc_SyntaxError,
3083 "invalid syntax");
3084 return;
3085 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003086 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3087 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003088 CHILD(CHILD(subn, 0),
3089 j));
3090 com_addop_varname(c, VAR_STORE,
3091 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003092 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003093 com_addop_varname(c, VAR_STORE,
3094 STR(CHILD(CHILD(subn, 0),
3095 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003096 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003097 }
3098 }
3099}
3100
3101static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003102com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003103{
3104 REQ(n, exec_stmt);
3105 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3106 com_node(c, CHILD(n, 1));
3107 if (NCH(n) >= 4)
3108 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003109 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003110 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003111 com_push(c, 1);
3112 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003113 if (NCH(n) >= 6)
3114 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003115 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003116 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003117 com_push(c, 1);
3118 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003119 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003120 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003121}
3122
Guido van Rossum7c531111997-03-11 18:42:21 +00003123static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003124is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003125{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003126 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003127 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003128 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003129
3130 /* Label to avoid tail recursion */
3131 next:
3132 switch (TYPE(n)) {
3133
3134 case suite:
3135 if (NCH(n) == 1) {
3136 n = CHILD(n, 0);
3137 goto next;
3138 }
3139 /* Fall through */
3140 case file_input:
3141 for (i = 0; i < NCH(n); i++) {
3142 node *ch = CHILD(n, i);
3143 if (TYPE(ch) == stmt) {
3144 n = ch;
3145 goto next;
3146 }
3147 }
3148 break;
3149
3150 case stmt:
3151 case simple_stmt:
3152 case small_stmt:
3153 n = CHILD(n, 0);
3154 goto next;
3155
3156 case expr_stmt:
3157 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003158 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003159 case test:
3160 case and_test:
3161 case not_test:
3162 case comparison:
3163 case expr:
3164 case xor_expr:
3165 case and_expr:
3166 case shift_expr:
3167 case arith_expr:
3168 case term:
3169 case factor:
3170 case power:
3171 case atom:
3172 if (NCH(n) == 1) {
3173 n = CHILD(n, 0);
3174 goto next;
3175 }
3176 break;
3177
3178 case NAME:
3179 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3180 return 1;
3181 break;
3182
3183 case NUMBER:
3184 v = parsenumber(c, STR(n));
3185 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003186 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003187 break;
3188 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003189 i = PyObject_IsTrue(v);
3190 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003191 return i == 0;
3192
3193 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003194 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003195 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003196 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003197 break;
3198 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003199 i = PyObject_IsTrue(v);
3200 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003201 return i == 0;
3202
3203 }
3204 return 0;
3205}
3206
Tim Peters08a898f2001-06-28 01:52:22 +00003207
3208/* Look under n for a return stmt with an expression.
3209 * This hack is used to find illegal returns under "if 0:" blocks in
3210 * functions already known to be generators (as determined by the symtable
3211 * pass).
3212 * Return the offending return node if found, else NULL.
3213 */
3214static node *
3215look_for_offending_return(node *n)
3216{
3217 int i;
3218
3219 for (i = 0; i < NCH(n); ++i) {
3220 node *kid = CHILD(n, i);
3221
3222 switch (TYPE(kid)) {
3223 case classdef:
3224 case funcdef:
3225 case lambdef:
3226 /* Stuff in nested functions & classes doesn't
3227 affect the code block we started in. */
3228 return NULL;
3229
3230 case return_stmt:
3231 if (NCH(kid) > 1)
3232 return kid;
3233 break;
3234
3235 default: {
3236 node *bad = look_for_offending_return(kid);
3237 if (bad != NULL)
3238 return bad;
3239 }
3240 }
3241 }
3242
3243 return NULL;
3244}
3245
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003246static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003247com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003248{
3249 int i;
3250 int anchor = 0;
3251 REQ(n, if_stmt);
3252 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3253 for (i = 0; i+3 < NCH(n); i+=4) {
3254 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003255 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003256 if (is_constant_false(c, ch)) {
3257 /* We're going to skip this block. However, if this
3258 is a generator, we have to check the dead code
3259 anyway to make sure there aren't any return stmts
3260 with expressions, in the same scope. */
3261 if (c->c_flags & CO_GENERATOR) {
3262 node *p = look_for_offending_return(n);
3263 if (p != NULL) {
3264 int savelineno = c->c_lineno;
3265 c->c_lineno = p->n_lineno;
3266 com_error(c, PyExc_SyntaxError,
3267 "'return' with argument "
3268 "inside generator");
3269 c->c_lineno = savelineno;
3270 }
3271 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003272 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003273 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003274 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003275 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003276 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003277 com_addfwref(c, JUMP_IF_FALSE, &a);
3278 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003279 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003280 com_node(c, CHILD(n, i+3));
3281 com_addfwref(c, JUMP_FORWARD, &anchor);
3282 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003283 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003284 com_addbyte(c, POP_TOP);
3285 }
3286 if (i+2 < NCH(n))
3287 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003288 if (anchor)
3289 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003290}
3291
3292static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003293com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003294{
3295 int break_anchor = 0;
3296 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003297 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003298 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3299 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003300 block_push(c, SETUP_LOOP);
3301 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003302 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003303 com_node(c, CHILD(n, 1));
3304 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3305 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003306 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003307 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003308 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003309 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003310 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3311 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003312 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003313 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003314 com_addbyte(c, POP_TOP);
3315 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003316 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003317 if (NCH(n) > 4)
3318 com_node(c, CHILD(n, 6));
3319 com_backpatch(c, break_anchor);
3320}
3321
3322static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003323com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003324{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003325 int break_anchor = 0;
3326 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003327 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003328 REQ(n, for_stmt);
3329 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3330 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003331 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003332 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003333 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003334 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003335 com_set_lineno(c, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003336 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003337 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003338 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003339 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003340 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003341 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003342 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3343 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003344 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003345 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003346 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003347 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003348 if (NCH(n) > 8)
3349 com_node(c, CHILD(n, 8));
3350 com_backpatch(c, break_anchor);
3351}
3352
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003353/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003354
3355 SETUP_FINALLY L
3356 <code for S>
3357 POP_BLOCK
3358 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003359 L: <code for Sf>
3360 END_FINALLY
3361
3362 The special instructions use the block stack. Each block
3363 stack entry contains the instruction that created it (here
3364 SETUP_FINALLY), the level of the value stack at the time the
3365 block stack entry was created, and a label (here L).
3366
3367 SETUP_FINALLY:
3368 Pushes the current value stack level and the label
3369 onto the block stack.
3370 POP_BLOCK:
3371 Pops en entry from the block stack, and pops the value
3372 stack until its level is the same as indicated on the
3373 block stack. (The label is ignored.)
3374 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003375 Pops a variable number of entries from the *value* stack
3376 and re-raises the exception they specify. The number of
3377 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003378
3379 The block stack is unwound when an exception is raised:
3380 when a SETUP_FINALLY entry is found, the exception is pushed
3381 onto the value stack (and the exception condition is cleared),
3382 and the interpreter jumps to the label gotten from the block
3383 stack.
3384
3385 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003386 (The contents of the value stack is shown in [], with the top
3387 at the right; 'tb' is trace-back info, 'val' the exception's
3388 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003389
3390 Value stack Label Instruction Argument
3391 [] SETUP_EXCEPT L1
3392 [] <code for S>
3393 [] POP_BLOCK
3394 [] JUMP_FORWARD L0
3395
Guido van Rossum3f5da241990-12-20 15:06:42 +00003396 [tb, val, exc] L1: DUP )
3397 [tb, val, exc, exc] <evaluate E1> )
3398 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3399 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3400 [tb, val, exc, 1] POP )
3401 [tb, val, exc] POP
3402 [tb, val] <assign to V1> (or POP if no V1)
3403 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003404 [] <code for S1>
3405 JUMP_FORWARD L0
3406
Guido van Rossum3f5da241990-12-20 15:06:42 +00003407 [tb, val, exc, 0] L2: POP
3408 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003409 .............................etc.......................
3410
Guido van Rossum3f5da241990-12-20 15:06:42 +00003411 [tb, val, exc, 0] Ln+1: POP
3412 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003413
3414 [] L0: <next statement>
3415
3416 Of course, parts are not generated if Vi or Ei is not present.
3417*/
3418
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003419static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003420com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003421{
3422 int except_anchor = 0;
3423 int end_anchor = 0;
3424 int else_anchor = 0;
3425 int i;
3426 node *ch;
3427
3428 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3429 block_push(c, SETUP_EXCEPT);
3430 com_node(c, CHILD(n, 2));
3431 com_addbyte(c, POP_BLOCK);
3432 block_pop(c, SETUP_EXCEPT);
3433 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3434 com_backpatch(c, except_anchor);
3435 for (i = 3;
3436 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3437 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003438 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003439 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003440 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003441 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003442 break;
3443 }
3444 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003445 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003446 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003447 if (NCH(ch) > 1) {
3448 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003449 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003450 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003451 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003452 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003453 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3454 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003455 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003456 }
3457 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003458 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003459 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003460 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003461 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003462 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003463 com_pop(c, 1);
3464 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003465 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003466 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003467 com_node(c, CHILD(n, i+2));
3468 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3469 if (except_anchor) {
3470 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003471 /* We come in with [tb, val, exc, 0] on the
3472 stack; one pop and it's the same as
3473 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003474 com_addbyte(c, POP_TOP);
3475 }
3476 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003477 /* We actually come in here with [tb, val, exc] but the
3478 END_FINALLY will zap those and jump around.
3479 The c_stacklevel does not reflect them so we need not pop
3480 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003481 com_addbyte(c, END_FINALLY);
3482 com_backpatch(c, else_anchor);
3483 if (i < NCH(n))
3484 com_node(c, CHILD(n, i+2));
3485 com_backpatch(c, end_anchor);
3486}
3487
3488static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003489com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003490{
3491 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003492 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003493
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003494 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3495 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003496 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003497 com_addbyte(c, POP_BLOCK);
3498 block_pop(c, SETUP_FINALLY);
3499 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003500 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003501 /* While the generated code pushes only one item,
3502 the try-finally handling can enter here with
3503 up to three items. OK, here are the details:
3504 3 for an exception, 2 for RETURN, 1 for BREAK. */
3505 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003506 com_backpatch(c, finally_anchor);
3507 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003508 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003509 com_node(c, ch);
3510 com_addbyte(c, END_FINALLY);
3511 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003512 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003513}
3514
3515static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003516com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003517{
3518 REQ(n, try_stmt);
3519 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3520 | 'try' ':' suite 'finally' ':' suite */
3521 if (TYPE(CHILD(n, 3)) != except_clause)
3522 com_try_finally(c, n);
3523 else
3524 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003525}
3526
Guido van Rossum8b993a91997-01-17 21:04:03 +00003527static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003528get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003529{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003530 int i;
3531
Guido van Rossum8b993a91997-01-17 21:04:03 +00003532 /* Label to avoid tail recursion */
3533 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003534 switch (TYPE(n)) {
3535
3536 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003537 if (NCH(n) == 1) {
3538 n = CHILD(n, 0);
3539 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003540 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003541 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003542 case file_input:
3543 for (i = 0; i < NCH(n); i++) {
3544 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003545 if (TYPE(ch) == stmt) {
3546 n = ch;
3547 goto next;
3548 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003549 }
3550 break;
3551
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003552 case stmt:
3553 case simple_stmt:
3554 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003555 n = CHILD(n, 0);
3556 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003557
3558 case expr_stmt:
3559 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003560 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003561 case test:
3562 case and_test:
3563 case not_test:
3564 case comparison:
3565 case expr:
3566 case xor_expr:
3567 case and_expr:
3568 case shift_expr:
3569 case arith_expr:
3570 case term:
3571 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003572 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003573 if (NCH(n) == 1) {
3574 n = CHILD(n, 0);
3575 goto next;
3576 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003577 break;
3578
3579 case atom:
3580 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003581 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003582 break;
3583
3584 }
3585 return NULL;
3586}
3587
Guido van Rossum79f25d91997-04-29 20:08:16 +00003588static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003589get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003590{
Guido van Rossum541563e1999-01-28 15:08:09 +00003591 /* Don't generate doc-strings if run with -OO */
3592 if (Py_OptimizeFlag > 1)
3593 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003594 n = get_rawdocstring(n);
3595 if (n == NULL)
3596 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003597 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003598}
3599
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003600static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003601com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003602{
3603 REQ(n, suite);
3604 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3605 if (NCH(n) == 1) {
3606 com_node(c, CHILD(n, 0));
3607 }
3608 else {
3609 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003610 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003611 node *ch = CHILD(n, i);
3612 if (TYPE(ch) == stmt)
3613 com_node(c, ch);
3614 }
3615 }
3616}
3617
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003618/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003619static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003620com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003621{
3622 int i = c->c_nblocks;
3623 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3624 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3625 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003626 else if (i <= 0) {
3627 /* at the outer level */
3628 com_error(c, PyExc_SyntaxError,
3629 "'continue' not properly in loop");
3630 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003631 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003632 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003633 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003634 if (c->c_block[j] == SETUP_LOOP)
3635 break;
3636 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003637 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003638 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003639 for (; i > j; --i) {
3640 if (c->c_block[i] == SETUP_EXCEPT ||
3641 c->c_block[i] == SETUP_FINALLY) {
3642 com_addoparg(c, CONTINUE_LOOP,
3643 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003644 return;
3645 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003646 if (c->c_block[i] == END_FINALLY) {
3647 com_error(c, PyExc_SyntaxError,
3648 "'continue' not supported inside 'finally' clause");
3649 return;
3650 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003651 }
3652 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003653 com_error(c, PyExc_SyntaxError,
3654 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003655 }
3656 /* XXX Could allow it inside a 'finally' clause
3657 XXX if we could pop the exception still on the stack */
3658}
3659
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003660static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003661com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003662{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003663 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003664 if (TYPE(n) == lambdef) {
3665 /* lambdef: 'lambda' [varargslist] ':' test */
3666 n = CHILD(n, 1);
3667 }
3668 else {
3669 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3670 n = CHILD(n, 2);
3671 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3672 n = CHILD(n, 1);
3673 }
3674 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003675 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003676 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003677 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003678 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3679 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003680 nargs = 0;
3681 ndefs = 0;
3682 for (i = 0; i < nch; i++) {
3683 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003684 if (TYPE(CHILD(n, i)) == STAR ||
3685 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003686 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003687 nargs++;
3688 i++;
3689 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003690 t = RPAR; /* Anything except EQUAL or COMMA */
3691 else
3692 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003693 if (t == EQUAL) {
3694 i++;
3695 ndefs++;
3696 com_node(c, CHILD(n, i));
3697 i++;
3698 if (i >= nch)
3699 break;
3700 t = TYPE(CHILD(n, i));
3701 }
3702 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003703 /* Treat "(a=1, b)" as an error */
3704 if (ndefs)
3705 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003706 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003707 }
3708 if (t != COMMA)
3709 break;
3710 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003711 return ndefs;
3712}
3713
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003714static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003715com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003716{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003717 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003718 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003719 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003720 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003721 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3722 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003723 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003724 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003725 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003726 c->c_errors++;
3727 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003728 int closure = com_make_closure(c, (PyCodeObject *)co);
3729 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003730 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003731 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003732 if (closure)
3733 com_addoparg(c, MAKE_CLOSURE, ndefs);
3734 else
3735 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003736 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003737 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003738 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003739 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003740 }
3741}
3742
3743static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003744com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003745{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003746 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003747 REQ(n, testlist);
3748 /* testlist: test (',' test)* [','] */
3749 for (i = 0; i < NCH(n); i += 2)
3750 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003751 i = (NCH(n)+1) / 2;
3752 com_addoparg(c, BUILD_TUPLE, i);
3753 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003754}
3755
3756static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003757com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003758{
Guido van Rossum25831651993-05-19 14:50:45 +00003759 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003760 PyObject *v;
3761 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003762 char *name;
3763
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003764 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003765 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003766 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003767 c->c_errors++;
3768 return;
3769 }
3770 /* Push the class name on the stack */
3771 i = com_addconst(c, v);
3772 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003773 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003774 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003775 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003776 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003777 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003778 com_push(c, 1);
3779 }
Guido van Rossum25831651993-05-19 14:50:45 +00003780 else
3781 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003782 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003783 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003784 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003785 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003786 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003787 c->c_errors++;
3788 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003789 int closure = com_make_closure(c, co);
3790 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003791 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003792 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003793 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003794 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003795 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003796 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003797 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003798 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003799 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003800 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003801 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003802 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003803 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003804 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003805}
3806
3807static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003808com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003809{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003810 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003811 if (c->c_errors)
3812 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003813 switch (TYPE(n)) {
3814
3815 /* Definition nodes */
3816
3817 case funcdef:
3818 com_funcdef(c, n);
3819 break;
3820 case classdef:
3821 com_classdef(c, n);
3822 break;
3823
3824 /* Trivial parse tree nodes */
3825
3826 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003827 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003828 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003829 n = CHILD(n, 0);
3830 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003831
3832 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003833 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003834 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003835 {
3836 int i;
3837 for (i = 0; i < NCH(n)-1; i += 2)
3838 com_node(c, CHILD(n, i));
3839 }
3840 break;
3841
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003842 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003843 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003844 n = CHILD(n, 0);
3845 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003846
3847 /* Statement nodes */
3848
3849 case expr_stmt:
3850 com_expr_stmt(c, n);
3851 break;
3852 case print_stmt:
3853 com_print_stmt(c, n);
3854 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003855 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003856 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003857 break;
3858 case pass_stmt:
3859 break;
3860 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003861 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003862 com_error(c, PyExc_SyntaxError,
3863 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003864 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003865 com_addbyte(c, BREAK_LOOP);
3866 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003867 case continue_stmt:
3868 com_continue_stmt(c, n);
3869 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003870 case return_stmt:
3871 com_return_stmt(c, n);
3872 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003873 case yield_stmt:
3874 com_yield_stmt(c, n);
3875 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003876 case raise_stmt:
3877 com_raise_stmt(c, n);
3878 break;
3879 case import_stmt:
3880 com_import_stmt(c, n);
3881 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003882 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003883 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003884 case exec_stmt:
3885 com_exec_stmt(c, n);
3886 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003887 case assert_stmt:
3888 com_assert_stmt(c, n);
3889 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003890 case if_stmt:
3891 com_if_stmt(c, n);
3892 break;
3893 case while_stmt:
3894 com_while_stmt(c, n);
3895 break;
3896 case for_stmt:
3897 com_for_stmt(c, n);
3898 break;
3899 case try_stmt:
3900 com_try_stmt(c, n);
3901 break;
3902 case suite:
3903 com_suite(c, n);
3904 break;
3905
3906 /* Expression nodes */
3907
3908 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003909 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00003910 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003911 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003912 break;
3913 case test:
3914 com_test(c, n);
3915 break;
3916 case and_test:
3917 com_and_test(c, n);
3918 break;
3919 case not_test:
3920 com_not_test(c, n);
3921 break;
3922 case comparison:
3923 com_comparison(c, n);
3924 break;
3925 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003926 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003927 break;
3928 case expr:
3929 com_expr(c, n);
3930 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003931 case xor_expr:
3932 com_xor_expr(c, n);
3933 break;
3934 case and_expr:
3935 com_and_expr(c, n);
3936 break;
3937 case shift_expr:
3938 com_shift_expr(c, n);
3939 break;
3940 case arith_expr:
3941 com_arith_expr(c, n);
3942 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003943 case term:
3944 com_term(c, n);
3945 break;
3946 case factor:
3947 com_factor(c, n);
3948 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003949 case power:
3950 com_power(c, n);
3951 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003952 case atom:
3953 com_atom(c, n);
3954 break;
3955
3956 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003957 com_error(c, PyExc_SystemError,
3958 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003959 }
3960}
3961
Tim Petersdbd9ba62000-07-09 03:09:57 +00003962static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003963
3964static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003965com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003966{
3967 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3968 if (TYPE(CHILD(n, 0)) == LPAR)
3969 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003970 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003971 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003972 com_pop(c, 1);
3973 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003974}
3975
3976static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003977com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003978{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003979 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003980 if (NCH(n) == 1) {
3981 com_fpdef(c, CHILD(n, 0));
3982 }
3983 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003984 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003985 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003986 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003987 for (i = 0; i < NCH(n); i += 2)
3988 com_fpdef(c, CHILD(n, i));
3989 }
3990}
3991
3992static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003993com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003994{
Guido van Rossum9c8a0862002-12-23 16:35:23 +00003995 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003996 int complex = 0;
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003997 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003998 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003999 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004000 /* Check if the argument list includes nested tuples */
4001 for (i = 0; i < NCH(n); i++)
4002 if (TYPE(CHILD(n, i)) == LPAR) {
Guido van Rossum530956d1996-07-21 02:27:43 +00004003 complex = 1;
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004004 break;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004005 }
4006 /* If it does, generate code to unpack them. */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004007 if (complex) {
4008 /* Generate code for complex arguments only after
4009 having counted the simple arguments */
4010 int ilocal = 0;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004011 for (i = 0; i < NCH(n); i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004012 node *ch = CHILD(n, i);
4013 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004014 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004015 break;
4016 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4017 fp = CHILD(ch, 0);
4018 if (TYPE(fp) != NAME) {
4019 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004020 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004021 com_fpdef(c, ch);
4022 }
4023 ilocal++;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004024 if (++i >= NCH(n))
Guido van Rossum681d79a1995-07-18 14:51:37 +00004025 break;
4026 ch = CHILD(n, i);
4027 if (TYPE(ch) == EQUAL)
4028 i += 2;
4029 else
4030 REQ(ch, COMMA);
4031 }
4032 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004033}
4034
4035static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004036com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004037{
4038 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004039 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004040 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004041 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004042 if (doc != NULL) {
4043 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004044 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004045 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004046 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004047 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004048 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004049 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004050 for (i = 0; i < NCH(n); i++) {
4051 node *ch = CHILD(n, i);
4052 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4053 com_node(c, ch);
4054 }
4055}
4056
4057/* Top-level compile-node interface */
4058
4059static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004060compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004061{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004062 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004063 node *ch;
4064 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00004065 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004066 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004067 if (doc != NULL) {
4068 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004069 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004070 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004071 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004072 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004073 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
4074 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004075 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004076 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004077 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004078 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004079 c->c_infunction = 0;
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004080 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4081 com_push(c, 1);
4082 com_addbyte(c, RETURN_VALUE);
4083 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004084}
4085
4086static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004087compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004088{
Guido van Rossum590baa41993-11-30 13:40:46 +00004089 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004090 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004091 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004092
4093 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004094 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004095 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004096 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004097 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004098 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004099 else
4100 ch = CHILD(n, 2);
4101 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004102 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004103 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004104}
4105
4106static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004107compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004108{
4109 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004110 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004111 REQ(n, classdef);
4112 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4113 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004114 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004115 /* Initialize local __module__ from global __name__ */
4116 com_addop_name(c, LOAD_GLOBAL, "__name__");
4117 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004118 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004119 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004120 if (doc != NULL) {
4121 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004122 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004123 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004124 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004125 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004126 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004127 }
4128 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004129 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004130 com_node(c, ch);
4131 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004132 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004133 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004134 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004135}
4136
4137static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004138compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004139{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004140 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004141
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004142 switch (TYPE(n)) {
4143
Guido van Rossum4c417781991-01-21 16:09:22 +00004144 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004145 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004146 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004147 n = CHILD(n, 0);
4148 if (TYPE(n) != NEWLINE)
4149 com_node(c, n);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004150 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4151 com_push(c, 1);
4152 com_addbyte(c, RETURN_VALUE);
4153 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004154 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004155 break;
4156
Guido van Rossum4c417781991-01-21 16:09:22 +00004157 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004158 com_file_input(c, n);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004159 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4160 com_push(c, 1);
4161 com_addbyte(c, RETURN_VALUE);
4162 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004163 break;
4164
Guido van Rossum590baa41993-11-30 13:40:46 +00004165 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004166 com_node(c, CHILD(n, 0));
4167 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004168 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004169 break;
4170
Guido van Rossum590baa41993-11-30 13:40:46 +00004171 case lambdef: /* anonymous function definition */
4172 compile_lambdef(c, n);
4173 break;
4174
Guido van Rossum4c417781991-01-21 16:09:22 +00004175 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004176 compile_funcdef(c, n);
4177 break;
4178
Guido van Rossum4c417781991-01-21 16:09:22 +00004179 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004180 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004181 break;
4182
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004183 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004184 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004185 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004186 }
4187}
4188
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004189static PyObject *
4190dict_keys_inorder(PyObject *dict, int offset)
4191{
4192 PyObject *tuple, *k, *v;
4193 int i, pos = 0, size = PyDict_Size(dict);
4194
4195 tuple = PyTuple_New(size);
4196 if (tuple == NULL)
4197 return NULL;
4198 while (PyDict_Next(dict, &pos, &k, &v)) {
4199 i = PyInt_AS_LONG(v);
4200 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004201 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004202 PyTuple_SET_ITEM(tuple, i - offset, k);
4203 }
4204 return tuple;
4205}
4206
Guido van Rossum79f25d91997-04-29 20:08:16 +00004207PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004208PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004209{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004210 return PyNode_CompileFlags(n, filename, NULL);
4211}
4212
4213PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004214PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004215{
4216 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004217}
4218
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004219struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004220PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004221{
4222 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004223 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004224
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004225 ff = PyNode_Future(n, filename);
4226 if (ff == NULL)
4227 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004228
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004229 st = symtable_init();
Tim Peters8c5e4152001-11-04 19:26:58 +00004230 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004231 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004232 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004233 }
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004234 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004235 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004236 if (st->st_errors > 0)
4237 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004238 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004239 if (st->st_errors > 0)
4240 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004241
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004242 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004243 fail:
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004244 PyObject_FREE((void *)ff);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004245 st->st_future = NULL;
4246 PySymtable_Free(st);
4247 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004248}
4249
Guido van Rossum79f25d91997-04-29 20:08:16 +00004250static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004251icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004252{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004253 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004254}
4255
Guido van Rossum79f25d91997-04-29 20:08:16 +00004256static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004257jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004258 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004259{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004260 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004261 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004262 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004263 return NULL;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004264 if (TYPE(n) == encoding_decl) {
4265 sc.c_encoding = STR(n);
4266 n = CHILD(n, 0);
4267 } else {
4268 sc.c_encoding = NULL;
4269 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004270 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004271 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004272 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004273 /* c_symtable still points to parent's symbols */
4274 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004275 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004276 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004277 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004278 if (base->c_encoding != NULL) {
4279 assert(sc.c_encoding == NULL);
4280 sc.c_encoding = base->c_encoding;
4281 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004282 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004283 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004284 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004285 if (sc.c_future == NULL) {
4286 com_free(&sc);
4287 return NULL;
4288 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004289 if (flags) {
4290 int merged = sc.c_future->ff_features |
4291 flags->cf_flags;
4292 sc.c_future->ff_features = merged;
4293 flags->cf_flags = merged;
4294 }
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004295 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004296 com_free(&sc);
4297 return NULL;
4298 }
4299 }
4300 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004301 if (symtable_load_symbols(&sc) < 0) {
4302 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004303 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004304 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004305 compile_node(&sc, n);
4306 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004307 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004308 PyObject *consts, *names, *varnames, *filename, *name,
4309 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004310 consts = PyList_AsTuple(sc.c_consts);
4311 names = PyList_AsTuple(sc.c_names);
4312 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004313 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4314 freevars = dict_keys_inorder(sc.c_freevars,
4315 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004316 filename = PyString_InternFromString(sc.c_filename);
4317 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004318 if (!PyErr_Occurred())
4319 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004320 sc.c_nlocals,
4321 sc.c_maxstacklevel,
4322 sc.c_flags,
4323 sc.c_code,
4324 consts,
4325 names,
4326 varnames,
4327 freevars,
4328 cellvars,
4329 filename,
4330 name,
4331 sc.c_firstlineno,
4332 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004333 Py_XDECREF(consts);
4334 Py_XDECREF(names);
4335 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004336 Py_XDECREF(freevars);
4337 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004338 Py_XDECREF(filename);
4339 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004340 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004341 else if (!PyErr_Occurred()) {
4342 /* This could happen if someone called PyErr_Clear() after an
4343 error was reported above. That's not supposed to happen,
4344 but I just plugged one case and I'm not sure there can't be
4345 others. In that case, raise SystemError so that at least
4346 it gets reported instead dumping core. */
4347 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4348 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004349 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004350 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004351 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004352 sc.c_symtable = NULL;
4353 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004354 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004355 return co;
4356}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004357
4358int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004359PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004360{
4361 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004362 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004363 int line = co->co_firstlineno;
4364 int addr = 0;
4365 while (--size >= 0) {
4366 addr += *p++;
4367 if (addr > addrq)
4368 break;
4369 line += *p++;
4370 }
4371 return line;
4372}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004373
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004374/* The test for LOCAL must come before the test for FREE in order to
4375 handle classes where name is both local and free. The local var is
4376 a method and the free var is a free var referenced within a method.
4377*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004378
4379static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004380get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004381{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004382 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004383 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004384
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004385 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4386 return CELL;
4387 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4388 return LOCAL;
4389 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4390 return FREE;
4391 v = PyDict_GetItemString(c->c_globals, name);
4392 if (v) {
4393 if (v == Py_None)
4394 return GLOBAL_EXPLICIT;
4395 else {
4396 return GLOBAL_IMPLICIT;
4397 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004398 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004399 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004400 "unknown scope for %.100s in %.100s(%s) "
4401 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4402 name, c->c_name,
4403 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4404 c->c_filename,
4405 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4406 PyObject_REPR(c->c_locals),
4407 PyObject_REPR(c->c_globals)
4408 );
4409
4410 Py_FatalError(buf);
4411 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004412}
4413
Guido van Rossum207fda62001-03-02 03:30:41 +00004414/* Helper functions to issue warnings */
4415
4416static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004417issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004418{
4419 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4420 lineno, NULL, NULL) < 0) {
4421 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4422 PyErr_SetString(PyExc_SyntaxError, msg);
4423 PyErr_SyntaxLocation(filename, lineno);
4424 }
4425 return -1;
4426 }
4427 return 0;
4428}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004429
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004430static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004431symtable_warn(struct symtable *st, char *msg)
4432{
Guido van Rossum207fda62001-03-02 03:30:41 +00004433 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004434 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004435 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004436 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004437 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004438}
4439
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004440/* Helper function for setting lineno and filename */
4441
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004442static int
4443symtable_build(struct compiling *c, node *n)
4444{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004445 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004446 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004447 c->c_symtable->st_future = c->c_future;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004448 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004449 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4450 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004451 return -1;
4452 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004453 if (c->c_symtable->st_errors > 0)
4454 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004455 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004456 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004457 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004458 return 0;
4459}
4460
4461static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004462symtable_init_compiling_symbols(struct compiling *c)
4463{
4464 PyObject *varnames;
4465
4466 varnames = c->c_symtable->st_cur->ste_varnames;
4467 if (varnames == NULL) {
4468 varnames = PyList_New(0);
4469 if (varnames == NULL)
4470 return -1;
4471 c->c_symtable->st_cur->ste_varnames = varnames;
4472 Py_INCREF(varnames);
4473 } else
4474 Py_INCREF(varnames);
4475 c->c_varnames = varnames;
4476
4477 c->c_globals = PyDict_New();
4478 if (c->c_globals == NULL)
4479 return -1;
4480 c->c_freevars = PyDict_New();
4481 if (c->c_freevars == NULL)
4482 return -1;
4483 c->c_cellvars = PyDict_New();
4484 if (c->c_cellvars == NULL)
4485 return -1;
4486 return 0;
4487}
4488
4489struct symbol_info {
4490 int si_nlocals;
4491 int si_ncells;
4492 int si_nfrees;
4493 int si_nimplicit;
4494};
4495
4496static void
4497symtable_init_info(struct symbol_info *si)
4498{
4499 si->si_nlocals = 0;
4500 si->si_ncells = 0;
4501 si->si_nfrees = 0;
4502 si->si_nimplicit = 0;
4503}
4504
4505static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004506symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004507 struct symbol_info *si)
4508{
4509 PyObject *dict, *v;
4510
4511 /* Seperate logic for DEF_FREE. If it occurs in a function,
4512 it indicates a local that we must allocate storage for (a
4513 cell var). If it occurs in a class, then the class has a
4514 method and a free variable with the same name.
4515 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004516 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004517 /* If it isn't declared locally, it can't be a cell. */
4518 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4519 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004520 v = PyInt_FromLong(si->si_ncells++);
4521 dict = c->c_cellvars;
4522 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004523 /* If it is free anyway, then there is no need to do
4524 anything here.
4525 */
4526 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004527 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004528 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004529 v = PyInt_FromLong(si->si_nfrees++);
4530 dict = c->c_freevars;
4531 }
4532 if (v == NULL)
4533 return -1;
4534 if (PyDict_SetItem(dict, name, v) < 0) {
4535 Py_DECREF(v);
4536 return -1;
4537 }
4538 Py_DECREF(v);
4539 return 0;
4540}
4541
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004542/* If a variable is a cell and an argument, make sure that appears in
4543 co_cellvars before any variable to its right in varnames.
4544*/
4545
4546
4547static int
4548symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4549 PyObject *varnames, int flags)
4550{
4551 PyObject *v, *w, *d, *list = NULL;
4552 int i, pos;
4553
4554 if (flags & CO_VARARGS)
4555 argcount++;
4556 if (flags & CO_VARKEYWORDS)
4557 argcount++;
4558 for (i = argcount; --i >= 0; ) {
4559 v = PyList_GET_ITEM(varnames, i);
4560 if (PyDict_GetItem(*cellvars, v)) {
4561 if (list == NULL) {
4562 list = PyList_New(1);
4563 if (list == NULL)
4564 return -1;
4565 PyList_SET_ITEM(list, 0, v);
4566 Py_INCREF(v);
4567 } else
4568 PyList_Insert(list, 0, v);
4569 }
4570 }
4571 if (list == NULL || PyList_GET_SIZE(list) == 0)
4572 return 0;
4573 /* There are cellvars that are also arguments. Create a dict
4574 to replace cellvars and put the args at the front.
4575 */
4576 d = PyDict_New();
4577 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4578 v = PyInt_FromLong(i);
4579 if (v == NULL)
4580 goto fail;
4581 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4582 goto fail;
4583 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4584 goto fail;
4585 }
4586 pos = 0;
4587 i = PyList_GET_SIZE(list);
4588 Py_DECREF(list);
4589 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4590 w = PyInt_FromLong(i++); /* don't care about the old key */
4591 if (PyDict_SetItem(d, v, w) < 0) {
4592 Py_DECREF(w);
4593 goto fail;
4594 }
4595 Py_DECREF(w);
4596 }
4597 Py_DECREF(*cellvars);
4598 *cellvars = d;
4599 return 1;
4600 fail:
4601 Py_DECREF(d);
4602 return -1;
4603}
4604
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004605static int
4606symtable_freevar_offsets(PyObject *freevars, int offset)
4607{
4608 PyObject *name, *v;
4609 int pos;
4610
4611 /* The cell vars are the first elements of the closure,
4612 followed by the free vars. Update the offsets in
4613 c_freevars to account for number of cellvars. */
4614 pos = 0;
4615 while (PyDict_Next(freevars, &pos, &name, &v)) {
4616 int i = PyInt_AS_LONG(v) + offset;
4617 PyObject *o = PyInt_FromLong(i);
4618 if (o == NULL)
4619 return -1;
4620 if (PyDict_SetItem(freevars, name, o) < 0) {
4621 Py_DECREF(o);
4622 return -1;
4623 }
4624 Py_DECREF(o);
4625 }
4626 return 0;
4627}
4628
4629static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004630symtable_check_unoptimized(struct compiling *c,
4631 PySymtableEntryObject *ste,
4632 struct symbol_info *si)
4633{
4634 char buf[300];
4635
4636 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4637 || (ste->ste_nested && si->si_nimplicit)))
4638 return 0;
4639
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004640#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4641
4642#define ILLEGAL_IS "is a nested function"
4643
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004644#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004645"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004646
4647#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004648"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004649
4650#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00004651"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004652"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004653
4654 /* XXX perhaps the linenos for these opt-breaking statements
4655 should be stored so the exception can point to them. */
4656
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004657 if (ste->ste_child_free) {
4658 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004659 PyOS_snprintf(buf, sizeof(buf),
4660 ILLEGAL_IMPORT_STAR,
4661 PyString_AS_STRING(ste->ste_name),
4662 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004663 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004664 PyOS_snprintf(buf, sizeof(buf),
4665 ILLEGAL_BARE_EXEC,
4666 PyString_AS_STRING(ste->ste_name),
4667 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004668 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004669 PyOS_snprintf(buf, sizeof(buf),
4670 ILLEGAL_EXEC_AND_IMPORT_STAR,
4671 PyString_AS_STRING(ste->ste_name),
4672 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004673 }
4674 } else {
4675 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004676 PyOS_snprintf(buf, sizeof(buf),
4677 ILLEGAL_IMPORT_STAR,
4678 PyString_AS_STRING(ste->ste_name),
4679 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004680 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004681 PyOS_snprintf(buf, sizeof(buf),
4682 ILLEGAL_BARE_EXEC,
4683 PyString_AS_STRING(ste->ste_name),
4684 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004685 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004686 PyOS_snprintf(buf, sizeof(buf),
4687 ILLEGAL_EXEC_AND_IMPORT_STAR,
4688 PyString_AS_STRING(ste->ste_name),
4689 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004690 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004691 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004692
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004693 PyErr_SetString(PyExc_SyntaxError, buf);
4694 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4695 ste->ste_opt_lineno);
4696 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004697}
4698
4699static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004700symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4701 struct symbol_info *si)
4702{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004703 if (c->c_future)
4704 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004705 if (ste->ste_generator)
4706 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004707 if (ste->ste_type != TYPE_MODULE)
4708 c->c_flags |= CO_NEWLOCALS;
4709 if (ste->ste_type == TYPE_FUNCTION) {
4710 c->c_nlocals = si->si_nlocals;
4711 if (ste->ste_optimized == 0)
4712 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004713 else if (ste->ste_optimized != OPT_EXEC)
4714 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004715 }
4716 return 0;
4717}
4718
4719static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004720symtable_load_symbols(struct compiling *c)
4721{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004722 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004723 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004724 PyObject *name, *varnames, *v;
4725 int i, flags, pos;
4726 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004727
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004728 v = NULL;
4729
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004730 if (symtable_init_compiling_symbols(c) < 0)
4731 goto fail;
4732 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004733 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004734 si.si_nlocals = PyList_GET_SIZE(varnames);
4735 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004736
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004737 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004738 v = PyInt_FromLong(i);
4739 if (PyDict_SetItem(c->c_locals,
4740 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004741 goto fail;
4742 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004743 }
4744
4745 /* XXX The cases below define the rules for whether a name is
4746 local or global. The logic could probably be clearer. */
4747 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004748 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4749 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004750
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004751 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004752 /* undo the original DEF_FREE */
4753 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004754
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004755 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004756 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004757 2. Free variables in methods that are also class
4758 variables or declared global.
4759 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004760 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004761 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004762
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004763 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004764 c->c_argcount--;
4765 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004766 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004767 c->c_argcount--;
4768 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004769 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004770 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004771 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004772 if (flags & DEF_PARAM) {
4773 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004774 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004775 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004776 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004777 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004778 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004779 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004780 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4781 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004782 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004783 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00004784 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004785 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004786 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004787 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004788 if (v == NULL)
4789 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004790 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004791 goto fail;
4792 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004793 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004794 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004795 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004796 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004797 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004798 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004799 if (v == NULL)
4800 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004801 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004802 goto fail;
4803 Py_DECREF(v);
4804 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004805 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004806 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00004807 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004808 goto fail;
4809 if (st->st_nscopes != 1) {
4810 v = PyInt_FromLong(flags);
4811 if (PyDict_SetItem(st->st_global,
4812 name, v))
4813 goto fail;
4814 Py_DECREF(v);
4815 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004816 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004817 }
4818 }
4819
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004820 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4821
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004822 if (si.si_ncells > 1) { /* one cell is always in order */
4823 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4824 c->c_varnames, c->c_flags) < 0)
4825 return -1;
4826 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004827 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4828 return -1;
4829 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004830 fail:
4831 /* is this always the right thing to do? */
4832 Py_XDECREF(v);
4833 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004834}
4835
4836static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004837symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004838{
4839 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004840
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004841 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004842 if (st == NULL)
4843 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004844 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00004845
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004846 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004847 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004848 goto fail;
4849 if ((st->st_symbols = PyDict_New()) == NULL)
4850 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004851 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004852 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004853 st->st_errors = 0;
4854 st->st_tmpname = 0;
4855 st->st_private = NULL;
4856 return st;
4857 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004858 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004859 return NULL;
4860}
4861
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004862void
4863PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004864{
4865 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004866 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004867 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004868 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004869}
4870
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004871/* When the compiler exits a scope, it must should update the scope's
4872 free variable information with the list of free variables in its
4873 children.
4874
4875 Variables that are free in children and defined in the current
4876 scope are cellvars.
4877
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004878 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004879 false), free variables in children that are not defined here are
4880 implicit globals.
4881
4882*/
4883
4884static int
4885symtable_update_free_vars(struct symtable *st)
4886{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004887 int i, j, def;
4888 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004889 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004890
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004891 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004892 def = DEF_FREE_CLASS;
4893 else
4894 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004895 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004896 int pos = 0;
4897
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004898 if (list)
4899 PyList_SetSlice(list, 0,
4900 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004901 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004902 PyList_GET_ITEM(ste->ste_children, i);
4903 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004904 int flags = PyInt_AS_LONG(o);
4905 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004906 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004907 if (list == NULL) {
4908 list = PyList_New(0);
4909 if (list == NULL)
4910 return -1;
4911 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004912 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004913 if (PyList_Append(list, name) < 0) {
4914 Py_DECREF(list);
4915 return -1;
4916 }
4917 }
4918 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004919 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004920 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004921 v = PyDict_GetItem(ste->ste_symbols, name);
4922 /* If a name N is declared global in scope A and
4923 referenced in scope B contained (perhaps
4924 indirectly) in A and there are no scopes
4925 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004926 is global in B. Unless A is a class scope,
4927 because class scopes are not considered for
4928 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004929 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004930 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004931 int flags = PyInt_AS_LONG(v);
4932 if (flags & DEF_GLOBAL) {
4933 symtable_undo_free(st, child->ste_id,
4934 name);
4935 continue;
4936 }
4937 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004938 if (ste->ste_nested) {
4939 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004940 name, def) < 0) {
4941 Py_DECREF(list);
4942 return -1;
4943 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004944 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004945 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004946 name) < 0) {
4947 Py_DECREF(list);
4948 return -1;
4949 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004950 }
4951 }
4952 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004953
4954 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004955 return 0;
4956}
4957
4958/* If the current scope is a non-nested class or if name is not
4959 defined in the current, non-nested scope, then it is an implicit
4960 global in all nested scopes.
4961*/
4962
4963static int
4964symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4965{
4966 PyObject *o;
4967 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004968 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004969
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004970 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004971 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004972 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004973 if (o == NULL)
4974 return symtable_undo_free(st, child, name);
4975 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004976
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004977 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004978 return symtable_undo_free(st, child, name);
4979 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004980 return symtable_add_def_o(st, ste->ste_symbols,
4981 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004982}
4983
4984static int
4985symtable_undo_free(struct symtable *st, PyObject *id,
4986 PyObject *name)
4987{
4988 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004989 PyObject *info;
4990 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004991
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004992 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4993 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004994 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00004995
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004996 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004997 if (info == NULL)
4998 return 0;
4999 v = PyInt_AS_LONG(info);
5000 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005001 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005002 DEF_FREE_GLOBAL) < 0)
5003 return -1;
5004 } else
5005 /* If the name is defined here or declared global,
5006 then the recursion stops. */
5007 return 0;
5008
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005009 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5010 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005011 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005012 PyList_GET_ITEM(ste->ste_children, i);
5013 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005014 if (x < 0)
5015 return x;
5016 }
5017 return 0;
5018}
5019
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005020/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5021 This reference is released when the scope is exited, via the DECREF
5022 in symtable_exit_scope().
5023*/
5024
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005025static int
5026symtable_exit_scope(struct symtable *st)
5027{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005028 int end;
5029
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005030 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005031 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005032 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005033 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005034 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5035 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005036 if (PySequence_DelItem(st->st_stack, end) < 0)
5037 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005038 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005039}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005040
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005041static void
5042symtable_enter_scope(struct symtable *st, char *name, int type,
5043 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005044{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005045 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005046
5047 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005048 prev = st->st_cur;
5049 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
5050 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005051 st->st_errors++;
5052 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005053 }
5054 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005055 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005056 PySymtableEntry_New(st, name, type, lineno);
5057 if (strcmp(name, TOP) == 0)
5058 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005059 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005060 if (PyList_Append(prev->ste_children,
5061 (PyObject *)st->st_cur) < 0)
5062 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005063 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005064}
5065
5066static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005067symtable_lookup(struct symtable *st, char *name)
5068{
5069 char buffer[MANGLE_LEN];
5070 PyObject *v;
5071 int flags;
5072
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005073 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005074 name = buffer;
5075 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5076 if (v == NULL) {
5077 if (PyErr_Occurred())
5078 return -1;
5079 else
5080 return 0;
5081 }
5082
5083 flags = PyInt_AS_LONG(v);
5084 return flags;
5085}
5086
5087static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005088symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005089{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005090 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005091 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005092 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005093
Guido van Rossumb7164622002-08-16 02:48:11 +00005094 /* Warn about None, except inside a tuple (where the assignment
5095 code already issues a warning). */
5096 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5097 *name == 'N' && strcmp(name, "None") == 0)
5098 {
5099 if (symtable_warn(st, "argument named None"))
5100 return -1;
5101 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005102 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005103 name = buffer;
5104 if ((s = PyString_InternFromString(name)) == NULL)
5105 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005106 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5107 Py_DECREF(s);
5108 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005109}
5110
5111/* Must only be called with mangled names */
5112
5113static int
5114symtable_add_def_o(struct symtable *st, PyObject *dict,
5115 PyObject *name, int flag)
5116{
5117 PyObject *o;
5118 int val;
5119
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005120 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005121 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005122 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005123 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005124 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005125 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005126 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005127 return -1;
5128 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005129 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005130 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005131 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005132 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005133 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005134 Py_DECREF(o);
5135 return -1;
5136 }
5137 Py_DECREF(o);
5138
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005139 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005140 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005141 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005142 } else if (flag & DEF_GLOBAL) {
5143 /* XXX need to update DEF_GLOBAL for other flags too;
5144 perhaps only DEF_FREE_GLOBAL */
5145 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005146 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005147 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005148 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005149 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005150 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005151 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005152 Py_DECREF(o);
5153 return -1;
5154 }
5155 Py_DECREF(o);
5156 }
5157 return 0;
5158}
5159
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005160#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005161
Tim Peters08a898f2001-06-28 01:52:22 +00005162/* Look for a yield stmt under n. Return 1 if found, else 0.
5163 This hack is used to look inside "if 0:" blocks (which are normally
5164 ignored) in case those are the only places a yield occurs (so that this
5165 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005166static int
5167look_for_yield(node *n)
5168{
5169 int i;
5170
5171 for (i = 0; i < NCH(n); ++i) {
5172 node *kid = CHILD(n, i);
5173
5174 switch (TYPE(kid)) {
5175
5176 case classdef:
5177 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005178 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005179 /* Stuff in nested functions and classes can't make
5180 the parent a generator. */
5181 return 0;
5182
5183 case yield_stmt:
5184 return 1;
5185
5186 default:
5187 if (look_for_yield(kid))
5188 return 1;
5189 }
5190 }
5191 return 0;
5192}
5193
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005194static void
5195symtable_node(struct symtable *st, node *n)
5196{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005197 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005198
5199 loop:
5200 switch (TYPE(n)) {
5201 case funcdef: {
5202 char *func_name = STR(CHILD(n, 1));
5203 symtable_add_def(st, func_name, DEF_LOCAL);
5204 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005205 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005206 symtable_funcdef(st, n);
5207 symtable_exit_scope(st);
5208 break;
5209 }
5210 case lambdef:
5211 if (NCH(n) == 4)
5212 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005213 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005214 symtable_funcdef(st, n);
5215 symtable_exit_scope(st);
5216 break;
5217 case classdef: {
5218 char *tmp, *class_name = STR(CHILD(n, 1));
5219 symtable_add_def(st, class_name, DEF_LOCAL);
5220 if (TYPE(CHILD(n, 2)) == LPAR) {
5221 node *bases = CHILD(n, 3);
5222 int i;
5223 for (i = 0; i < NCH(bases); i += 2) {
5224 symtable_node(st, CHILD(bases, i));
5225 }
5226 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005227 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005228 tmp = st->st_private;
5229 st->st_private = class_name;
5230 symtable_node(st, CHILD(n, NCH(n) - 1));
5231 st->st_private = tmp;
5232 symtable_exit_scope(st);
5233 break;
5234 }
5235 case if_stmt:
5236 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005237 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5238 if (st->st_cur->ste_generator == 0)
5239 st->st_cur->ste_generator =
5240 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005241 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005242 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005243 symtable_node(st, CHILD(n, i + 1));
5244 symtable_node(st, CHILD(n, i + 3));
5245 }
5246 if (i + 2 < NCH(n))
5247 symtable_node(st, CHILD(n, i + 2));
5248 break;
5249 case global_stmt:
5250 symtable_global(st, n);
5251 break;
5252 case import_stmt:
5253 symtable_import(st, n);
5254 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005255 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005256 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005257 symtable_node(st, CHILD(n, 1));
5258 if (NCH(n) > 2)
5259 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005260 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005261 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005262 st->st_cur->ste_opt_lineno = n->n_lineno;
5263 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005264 if (NCH(n) > 4)
5265 symtable_node(st, CHILD(n, 5));
5266 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005267
5268 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005269 case assert_stmt:
5270 if (Py_OptimizeFlag)
5271 return;
5272 if (NCH(n) == 2) {
5273 n = CHILD(n, 1);
5274 goto loop;
5275 } else {
5276 symtable_node(st, CHILD(n, 1));
5277 n = CHILD(n, 3);
5278 goto loop;
5279 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005280 case except_clause:
5281 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005282 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005283 if (NCH(n) > 1) {
5284 n = CHILD(n, 1);
5285 goto loop;
5286 }
5287 break;
5288 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005289 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005290 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005291 case yield_stmt:
5292 st->st_cur->ste_generator = 1;
5293 n = CHILD(n, 1);
5294 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005295 case expr_stmt:
5296 if (NCH(n) == 1)
5297 n = CHILD(n, 0);
5298 else {
5299 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005300 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005301 symtable_node(st, CHILD(n, 2));
5302 break;
5303 } else {
5304 int i;
5305 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005306 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005307 n = CHILD(n, NCH(n) - 1);
5308 }
5309 }
5310 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005311 case list_iter:
5312 n = CHILD(n, 0);
5313 if (TYPE(n) == list_for) {
5314 st->st_tmpname++;
5315 symtable_list_comprehension(st, n);
5316 st->st_tmpname--;
5317 } else {
5318 REQ(n, list_if);
5319 symtable_node(st, CHILD(n, 1));
5320 if (NCH(n) == 3) {
5321 n = CHILD(n, 2);
5322 goto loop;
5323 }
5324 }
5325 break;
5326 case for_stmt:
5327 symtable_assign(st, CHILD(n, 1), 0);
5328 for (i = 3; i < NCH(n); ++i)
5329 if (TYPE(CHILD(n, i)) >= single_input)
5330 symtable_node(st, CHILD(n, i));
5331 break;
5332 /* The remaining cases fall through to default except in
5333 special circumstances. This requires the individual cases
5334 to be coded with great care, even though they look like
5335 rather innocuous. Each case must double-check TYPE(n).
5336 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005337 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005338 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005339 n = CHILD(n, 2);
5340 goto loop;
5341 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005342 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005343 case listmaker:
5344 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00005345 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005346 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00005347 symtable_node(st, CHILD(n, 0));
5348 st->st_tmpname--;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005349 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005350 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005351 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005352 case atom:
5353 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5354 symtable_add_use(st, STR(CHILD(n, 0)));
5355 break;
5356 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005357 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005358 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005359 /* Walk over every non-token child with a special case
5360 for one child.
5361 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005362 if (NCH(n) == 1) {
5363 n = CHILD(n, 0);
5364 goto loop;
5365 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005366 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005367 if (TYPE(CHILD(n, i)) >= single_input)
5368 symtable_node(st, CHILD(n, i));
5369 }
5370}
5371
5372static void
5373symtable_funcdef(struct symtable *st, node *n)
5374{
5375 node *body;
5376
5377 if (TYPE(n) == lambdef) {
5378 if (NCH(n) == 4)
5379 symtable_params(st, CHILD(n, 1));
5380 } else
5381 symtable_params(st, CHILD(n, 2));
5382 body = CHILD(n, NCH(n) - 1);
5383 symtable_node(st, body);
5384}
5385
5386/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00005387 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005388 which are references in the defining scope. symtable_params()
5389 parses the parameter names, which are defined in the function's
5390 body.
5391
5392 varargslist:
5393 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5394 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5395*/
5396
5397static void
5398symtable_default_args(struct symtable *st, node *n)
5399{
5400 node *c;
5401 int i;
5402
5403 if (TYPE(n) == parameters) {
5404 n = CHILD(n, 1);
5405 if (TYPE(n) == RPAR)
5406 return;
5407 }
5408 REQ(n, varargslist);
5409 for (i = 0; i < NCH(n); i += 2) {
5410 c = CHILD(n, i);
5411 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5412 break;
5413 }
5414 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5415 symtable_node(st, CHILD(n, i));
5416 }
5417}
5418
5419static void
5420symtable_params(struct symtable *st, node *n)
5421{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005422 int i, complex = -1, ext = 0;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00005423 node *c = NULL, *ch = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005424
5425 if (TYPE(n) == parameters) {
5426 n = CHILD(n, 1);
5427 if (TYPE(n) == RPAR)
5428 return;
5429 }
5430 REQ(n, varargslist);
5431 for (i = 0; i < NCH(n); i += 2) {
5432 c = CHILD(n, i);
5433 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5434 ext = 1;
5435 break;
5436 }
5437 if (TYPE(c) == test) {
5438 continue;
5439 }
Guido van Rossum9c8a0862002-12-23 16:35:23 +00005440 ch = CHILD(c, 0);
5441 if (TYPE(ch) == NAME) {
5442 if (check_literal_str(STR(ch), NULL, st) < 0) {
5443 st->st_errors++;
5444 return;
5445 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005446 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum9c8a0862002-12-23 16:35:23 +00005447 } else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005448 char nbuf[30];
5449 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005450 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005451 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005452 }
5453 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005454 if (ext) {
5455 c = CHILD(n, i);
5456 if (TYPE(c) == STAR) {
5457 i++;
5458 symtable_add_def(st, STR(CHILD(n, i)),
5459 DEF_PARAM | DEF_STAR);
5460 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005461 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005462 c = NULL;
5463 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005464 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005465 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005466 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005467 i++;
5468 symtable_add_def(st, STR(CHILD(n, i)),
5469 DEF_PARAM | DEF_DOUBLESTAR);
5470 }
5471 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005472 if (complex >= 0) {
5473 int j;
5474 for (j = 0; j <= complex; j++) {
5475 c = CHILD(n, j);
5476 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005477 c = CHILD(n, ++j);
5478 else if (TYPE(c) == EQUAL)
5479 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005480 if (TYPE(CHILD(c, 0)) == LPAR)
5481 symtable_params_fplist(st, CHILD(c, 1));
5482 }
5483 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005484}
5485
5486static void
5487symtable_params_fplist(struct symtable *st, node *n)
5488{
5489 int i;
5490 node *c;
5491
5492 REQ(n, fplist);
5493 for (i = 0; i < NCH(n); i += 2) {
5494 c = CHILD(n, i);
5495 REQ(c, fpdef);
5496 if (NCH(c) == 1)
5497 symtable_add_def(st, STR(CHILD(c, 0)),
5498 DEF_PARAM | DEF_INTUPLE);
5499 else
5500 symtable_params_fplist(st, CHILD(c, 1));
5501 }
5502
5503}
5504
5505static void
5506symtable_global(struct symtable *st, node *n)
5507{
5508 int i;
5509
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005510 /* XXX It might be helpful to warn about module-level global
5511 statements, but it's hard to tell the difference between
5512 module-level and a string passed to exec.
5513 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005514
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005515 for (i = 1; i < NCH(n); i += 2) {
5516 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005517 int flags;
5518
5519 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005520 if (flags < 0)
5521 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005522 if (flags && flags != DEF_GLOBAL) {
5523 char buf[500];
5524 if (flags & DEF_PARAM) {
5525 PyErr_Format(PyExc_SyntaxError,
5526 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005527 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005528 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005529 st->st_cur->ste_lineno);
5530 st->st_errors++;
5531 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005532 }
5533 else {
5534 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005535 PyOS_snprintf(buf, sizeof(buf),
5536 GLOBAL_AFTER_ASSIGN,
5537 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005538 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005539 PyOS_snprintf(buf, sizeof(buf),
5540 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005541 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005542 }
5543 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005544 symtable_add_def(st, name, DEF_GLOBAL);
5545 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005546}
5547
5548static void
5549symtable_list_comprehension(struct symtable *st, node *n)
5550{
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005551 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005552
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005553 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005554 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005555 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005556 symtable_node(st, CHILD(n, 3));
5557 if (NCH(n) == 5)
5558 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005559}
5560
5561static void
5562symtable_import(struct symtable *st, node *n)
5563{
5564 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005565 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005566 | 'from' dotted_name 'import'
5567 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005568 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005569 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005570 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005571 node *dotname = CHILD(n, 1);
5572 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5573 /* check for bogus imports */
5574 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5575 PyErr_SetString(PyExc_SyntaxError,
5576 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005577 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005578 n->n_lineno);
5579 st->st_errors++;
5580 return;
5581 }
5582 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005583 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005584 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005585 if (symtable_warn(st,
5586 "import * only allowed at module level") < 0)
5587 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005588 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005589 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005590 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005591 } else {
5592 for (i = 3; i < NCH(n); i += 2) {
5593 node *c = CHILD(n, i);
5594 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005595 symtable_assign(st, CHILD(c, 2),
5596 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005597 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005598 symtable_assign(st, CHILD(c, 0),
5599 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005600 }
5601 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005602 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005603 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005604 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005605 }
5606 }
5607}
5608
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005609/* The third argument to symatble_assign() is a flag to be passed to
5610 symtable_add_def() if it is eventually called. The flag is useful
5611 to specify the particular type of assignment that should be
5612 recorded, e.g. an assignment caused by import.
5613 */
5614
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005615static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005616symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005617{
5618 node *tmp;
5619 int i;
5620
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005621 loop:
5622 switch (TYPE(n)) {
5623 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005624 /* invalid assignment, e.g. lambda x:x=2. The next
5625 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005626 return;
5627 case power:
5628 if (NCH(n) > 2) {
5629 for (i = 2; i < NCH(n); ++i)
5630 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5631 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005632 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005633 if (NCH(n) > 1) {
5634 symtable_node(st, CHILD(n, 0));
5635 symtable_node(st, CHILD(n, 1));
5636 } else {
5637 n = CHILD(n, 0);
5638 goto loop;
5639 }
5640 return;
5641 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005642 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5643 /* XXX This is an error, but the next pass
5644 will catch it. */
5645 return;
5646 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005647 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005648 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005649 }
5650 return;
5651 case exprlist:
5652 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00005653 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005654 if (NCH(n) == 1) {
5655 n = CHILD(n, 0);
5656 goto loop;
5657 }
5658 else {
5659 int i;
5660 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005661 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005662 return;
5663 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005664 case atom:
5665 tmp = CHILD(n, 0);
5666 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5667 n = CHILD(n, 1);
5668 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005669 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00005670 if (strcmp(STR(tmp), "__debug__") == 0) {
5671 PyErr_SetString(PyExc_SyntaxError,
5672 ASSIGN_DEBUG);
5673 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton86424e32001-12-04 02:41:46 +00005674 n->n_lineno);
Jeremy Hylton778e2652001-11-09 19:50:08 +00005675 st->st_errors++;
5676 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005677 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005678 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005679 return;
5680 case dotted_as_name:
5681 if (NCH(n) == 3)
5682 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005683 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005684 else
5685 symtable_add_def(st,
5686 STR(CHILD(CHILD(n,
5687 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005688 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005689 return;
5690 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005691 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005692 return;
5693 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005694 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005695 return;
5696 default:
5697 if (NCH(n) == 0)
5698 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005699 if (NCH(n) == 1) {
5700 n = CHILD(n, 0);
5701 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005702 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005703 /* Should only occur for errors like x + 1 = 1,
5704 which will be caught in the next pass. */
5705 for (i = 0; i < NCH(n); ++i)
5706 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005707 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005708 }
5709}