blob: 41d31d212c457e787e56e530e99bdeeba3de1895 [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;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000199 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000200 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000201 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000202 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000203 if (cmp) return cmp;
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 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000459 PyObject *c_globals; /* dictionary (value=None) */
460 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 */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000475 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
Guido van Rossum3ac99d42002-08-16 02:13:49 +0000577static int issue_warning(char *, char *, int);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000578static int com_init(struct compiling *, char *);
579static void com_free(struct compiling *);
580static void com_push(struct compiling *, int);
581static void com_pop(struct compiling *, int);
582static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000583static void com_node(struct compiling *, node *);
584static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000585static void com_addbyte(struct compiling *, int);
586static void com_addint(struct compiling *, int);
587static void com_addoparg(struct compiling *, int, int);
588static void com_addfwref(struct compiling *, int, int *);
589static void com_backpatch(struct compiling *, int);
590static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
591static int com_addconst(struct compiling *, PyObject *);
592static int com_addname(struct compiling *, PyObject *);
593static void com_addopname(struct compiling *, int, node *);
594static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000595static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000596static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000597static void com_assign(struct compiling *, node *, int, node *);
598static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000599static PyCodeObject *icompile(node *, struct compiling *);
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000600static PyCodeObject *jcompile(node *, char *, struct compiling *,
601 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000602static PyObject *parsestrplus(struct compiling*, node *);
603static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000604static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000605
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000606static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000607
608/* symtable operations */
609static int symtable_build(struct compiling *, node *);
610static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000611static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000612static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000613static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000614static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000615static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000616
617static void symtable_node(struct symtable *, node *);
618static void symtable_funcdef(struct symtable *, node *);
619static void symtable_default_args(struct symtable *, node *);
620static void symtable_params(struct symtable *, node *);
621static void symtable_params_fplist(struct symtable *, node *n);
622static void symtable_global(struct symtable *, node *);
623static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000624static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000625static void symtable_list_comprehension(struct symtable *, node *);
626
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000627static int symtable_update_free_vars(struct symtable *);
628static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
629static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
630
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000631/* helper */
632static void
633do_pad(int pad)
634{
635 int i;
636 for (i = 0; i < pad; ++i)
637 fprintf(stderr, " ");
638}
639
640static void
641dump(node *n, int pad, int depth)
642{
643 int i;
644 if (depth == 0)
645 return;
646 do_pad(pad);
647 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
648 if (depth > 0)
649 depth--;
650 for (i = 0; i < NCH(n); ++i)
651 dump(CHILD(n, i), pad + 1, depth);
652}
653
654#define DUMP(N) dump(N, 0, -1)
655
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000656static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000657com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000658{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000659 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000660 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
661 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000662 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000663 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000664 goto fail;
665 if ((c->c_const_dict = PyDict_New()) == NULL)
666 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000667 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000668 goto fail;
669 if ((c->c_name_dict = PyDict_New()) == NULL)
670 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000671 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000672 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000673 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
674 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000675 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000676 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000677 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000678 c->c_freevars = NULL;
679 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000680 c->c_nlocals = 0;
681 c->c_argcount = 0;
682 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000683 c->c_nexti = 0;
684 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000685 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000686 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000687 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000688 c->c_begin = 0;
689 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000690 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000691 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000692 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000693 c->c_stacklevel = 0;
694 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000695 c->c_firstlineno = 0;
696 c->c_last_addr = 0;
697 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000698 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000699 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000700 c->c_nested = 0;
701 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000702 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000703 return 1;
704
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000705 fail:
706 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000707 return 0;
708}
709
710static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000711com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000712{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000713 Py_XDECREF(c->c_code);
714 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000715 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000716 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000717 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000718 Py_XDECREF(c->c_globals);
719 Py_XDECREF(c->c_locals);
720 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000721 Py_XDECREF(c->c_freevars);
722 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000723 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000724 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +0000725 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000726}
727
728static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000729com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000730{
731 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000732 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +0000733 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000734 /*
735 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
736 c->c_filename, c->c_name, c->c_lineno,
737 c->c_nexti, c->c_stacklevel, n);
738 */
739 }
Guido van Rossum8b993a91997-01-17 21:04:03 +0000740}
741
742static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000743com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000744{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000745 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000746 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000747 else
748 c->c_stacklevel -= n;
749}
750
751static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000752com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000753{
754 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000755 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000756 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000757 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000758}
759
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000760static int
761com_check_size(PyObject **s, int offset)
762{
763 int len = PyString_GET_SIZE(*s);
764 if (offset >= len)
765 return _PyString_Resize(s, len * 2);
766 return 0;
767}
768
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000769static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000770com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000771{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000772 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000773 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +0000774 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000775 if (com_check_size(&c->c_code, c->c_nexti)) {
776 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000777 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000778 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000779 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000780}
781
782static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000783com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000784{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000785 com_addbyte(c, x & 0xff);
786 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000787}
788
789static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000790com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000791{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000792 char *p;
793 if (c->c_lnotab == NULL)
794 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000795 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
796 c->c_errors++;
797 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000798 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000799 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000800 *p++ = addr;
801 *p++ = line;
802 c->c_lnotab_next += 2;
803}
804
805static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000806com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000807{
808 c->c_lineno = lineno;
809 if (c->c_firstlineno == 0) {
810 c->c_firstlineno = c->c_last_line = lineno;
811 }
812 else {
813 int incr_addr = c->c_nexti - c->c_last_addr;
814 int incr_line = lineno - c->c_last_line;
Tim Peters2a7f3842001-06-09 09:26:21 +0000815 while (incr_addr > 255) {
816 com_add_lnotab(c, 255, 0);
817 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000818 }
Tim Peters2a7f3842001-06-09 09:26:21 +0000819 while (incr_line > 255) {
820 com_add_lnotab(c, incr_addr, 255);
821 incr_line -=255;
822 incr_addr = 0;
823 }
824 if (incr_addr > 0 || incr_line > 0)
825 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000826 c->c_last_addr = c->c_nexti;
827 c->c_last_line = lineno;
828 }
829}
830
831static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000832com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000833{
Fred Drakeef8ace32000-08-24 00:32:09 +0000834 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +0000835 if (extended_arg){
836 com_addbyte(c, EXTENDED_ARG);
837 com_addint(c, extended_arg);
838 arg &= 0xffff;
839 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000840 com_addbyte(c, op);
841 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000842}
843
844static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000845com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000846{
847 /* Compile a forward reference for backpatching */
848 int here;
849 int anchor;
850 com_addbyte(c, op);
851 here = c->c_nexti;
852 anchor = *p_anchor;
853 *p_anchor = here;
854 com_addint(c, anchor == 0 ? 0 : here - anchor);
855}
856
857static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000858com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000859{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000860 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000861 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000862 int dist;
863 int prev;
864 for (;;) {
865 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000866 prev = code[anchor] + (code[anchor+1] << 8);
867 dist = target - (anchor+2);
868 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000869 dist >>= 8;
870 code[anchor+1] = dist;
871 dist >>= 8;
872 if (dist) {
873 com_error(c, PyExc_SystemError,
874 "com_backpatch: offset too large");
875 break;
876 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000877 if (!prev)
878 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000879 anchor -= prev;
880 }
881}
882
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000883/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000884
885static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000886com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000887{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000888 PyObject *w, *t, *np=NULL;
889 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000890
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000891 t = Py_BuildValue("(OO)", v, v->ob_type);
892 if (t == NULL)
893 goto fail;
894 w = PyDict_GetItem(dict, t);
895 if (w != NULL) {
896 n = PyInt_AsLong(w);
897 } else {
898 n = PyList_Size(list);
899 np = PyInt_FromLong(n);
900 if (np == NULL)
901 goto fail;
902 if (PyList_Append(list, v) != 0)
903 goto fail;
904 if (PyDict_SetItem(dict, t, np) != 0)
905 goto fail;
906 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000907 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000908 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000909 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000910 fail:
911 Py_XDECREF(np);
912 Py_XDECREF(t);
913 c->c_errors++;
914 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000915}
916
917static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000918com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000919{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000920 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000921}
922
923static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000924com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000925{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000926 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000927}
928
Raymond Hettinger0ae0c072002-06-20 22:23:15 +0000929int
930_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000931{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000932 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000933 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000934 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000935 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
936 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000937 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000938 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000939 return 0; /* Don't mangle __extremely_long_names */
940 if (name[nlen-1] == '_' && name[nlen-2] == '_')
941 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000942 /* Strip leading underscores from class name */
943 while (*p == '_')
944 p++;
945 if (*p == '\0')
946 return 0; /* Don't mangle if class is just underscores */
947 plen = strlen(p);
948 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000949 plen = maxlen-nlen-2; /* Truncate class name if too long */
950 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000951 buffer[0] = '_';
952 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000953 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000954 return 1;
955}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000956
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000957static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000958com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000959{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000960 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000961 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000962 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000963
Raymond Hettinger0ae0c072002-06-20 22:23:15 +0000964 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000965 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000966 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000967 c->c_errors++;
968 i = 255;
969 }
970 else {
971 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000972 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000973 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000974 com_addoparg(c, op, i);
975}
976
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000977#define NAME_LOCAL 0
978#define NAME_GLOBAL 1
979#define NAME_DEFAULT 2
980#define NAME_CLOSURE 3
981
982static int
983com_lookup_arg(PyObject *dict, PyObject *name)
984{
985 PyObject *v = PyDict_GetItem(dict, name);
986 if (v == NULL)
987 return -1;
988 else
989 return PyInt_AS_LONG(v);
990}
991
Guido van Rossum3ac99d42002-08-16 02:13:49 +0000992static int
993none_assignment_check(struct compiling *c, char *name, int assigning)
994{
995 if (name[0] == 'N' && strcmp(name, "None") == 0) {
996 char *msg;
997 if (assigning)
998 msg = "assigment to None";
999 else
1000 msg = "deleting None";
1001 if (issue_warning(msg, c->c_filename, c->c_lineno) < 0) {
1002 c->c_errors++;
1003 return -1;
1004 }
1005 }
1006 return 0;
1007}
1008
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001009static void
1010com_addop_varname(struct compiling *c, int kind, char *name)
1011{
1012 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001013 int i, reftype;
1014 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001015 int op = STOP_CODE;
1016 char buffer[MANGLE_LEN];
1017
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001018 if (kind != VAR_LOAD &&
1019 none_assignment_check(c, name, kind == VAR_STORE))
1020 {
1021 c->c_errors++;
1022 i = 255;
1023 goto done;
1024 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001025 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001026 name = buffer;
1027 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1028 c->c_errors++;
1029 i = 255;
1030 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001031 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001032
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001033 reftype = get_ref_type(c, name);
1034 switch (reftype) {
1035 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001036 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001037 scope = NAME_LOCAL;
1038 break;
1039 case GLOBAL_EXPLICIT:
1040 scope = NAME_GLOBAL;
1041 break;
1042 case GLOBAL_IMPLICIT:
1043 if (c->c_flags & CO_OPTIMIZED)
1044 scope = NAME_GLOBAL;
1045 break;
1046 case FREE:
1047 case CELL:
1048 scope = NAME_CLOSURE;
1049 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001050 }
1051
1052 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001053 if (scope == NAME_LOCAL)
1054 i = com_lookup_arg(c->c_locals, v);
1055 else if (reftype == FREE)
1056 i = com_lookup_arg(c->c_freevars, v);
1057 else if (reftype == CELL)
1058 i = com_lookup_arg(c->c_cellvars, v);
1059 if (i == -1) {
1060 c->c_errors++; /* XXX no exception set */
1061 i = 255;
1062 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001063 }
1064 Py_DECREF(v);
1065
1066 switch (kind) {
1067 case VAR_LOAD:
1068 switch (scope) {
1069 case NAME_LOCAL:
1070 op = LOAD_FAST;
1071 break;
1072 case NAME_GLOBAL:
1073 op = LOAD_GLOBAL;
1074 break;
1075 case NAME_DEFAULT:
1076 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001077 break;
1078 case NAME_CLOSURE:
1079 op = LOAD_DEREF;
1080 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001081 }
1082 break;
1083 case VAR_STORE:
1084 switch (scope) {
1085 case NAME_LOCAL:
1086 op = STORE_FAST;
1087 break;
1088 case NAME_GLOBAL:
1089 op = STORE_GLOBAL;
1090 break;
1091 case NAME_DEFAULT:
1092 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001093 break;
1094 case NAME_CLOSURE:
1095 op = STORE_DEREF;
1096 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001097 }
1098 break;
1099 case VAR_DELETE:
1100 switch (scope) {
1101 case NAME_LOCAL:
1102 op = DELETE_FAST;
1103 break;
1104 case NAME_GLOBAL:
1105 op = DELETE_GLOBAL;
1106 break;
1107 case NAME_DEFAULT:
1108 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001109 break;
1110 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001111 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001112 PyOS_snprintf(buf, sizeof(buf),
1113 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001114 com_error(c, PyExc_SyntaxError, buf);
1115 i = 255;
1116 break;
1117 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001118 }
1119 break;
1120 }
1121done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001122 com_addoparg(c, op, i);
1123}
1124
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001125static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001126com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001127{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001128 char *name;
1129 char buffer[1000];
1130 /* XXX it is possible to write this code without the 1000
1131 chars on the total length of dotted names, I just can't be
1132 bothered right now */
1133 if (TYPE(n) == STAR)
1134 name = "*";
1135 else if (TYPE(n) == dotted_name) {
1136 char *p = buffer;
1137 int i;
1138 name = buffer;
1139 for (i = 0; i < NCH(n); i += 2) {
1140 char *s = STR(CHILD(n, i));
1141 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001142 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001143 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001144 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001145 break;
1146 }
1147 if (p != buffer)
1148 *p++ = '.';
1149 strcpy(p, s);
1150 p = strchr(p, '\0');
1151 }
1152 }
1153 else {
1154 REQ(n, NAME);
1155 name = STR(n);
1156 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001157 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001158}
1159
Guido van Rossum79f25d91997-04-29 20:08:16 +00001160static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001161parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001162{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001163 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001164 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001165 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001166#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001167 int imflag;
1168#endif
1169
Guido van Rossum282914b1991-04-04 10:42:56 +00001170 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001171 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001172#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001173 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001174#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001175 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001176 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001177 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001178 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001179 if (x < 0 && errno == 0) {
Guido van Rossum715eca92002-08-12 21:54:46 +00001180 if (PyErr_WarnExplicit(
Barry Warsaw9f007392002-08-14 15:51:29 +00001181 PyExc_FutureWarning,
Guido van Rossum715eca92002-08-12 21:54:46 +00001182 "hex/oct constants > sys.maxint "
1183 "will return positive values "
1184 "in Python 2.4 and up",
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001185 c->c_filename,
1186 c->c_lineno,
Guido van Rossum715eca92002-08-12 21:54:46 +00001187 NULL,
1188 NULL) < 0)
Guido van Rossum078151d2002-08-11 04:24:12 +00001189 return NULL;
Guido van Rossum3cb8e542002-08-11 14:06:15 +00001190 errno = 0; /* Might be changed by PyErr_Warn() */
Guido van Rossum078151d2002-08-11 04:24:12 +00001191 }
1192 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001193 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001194 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001195 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001196 if (errno != 0)
1197 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001198 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001199 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001200 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001201#ifndef WITHOUT_COMPLEX
1202 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001203 Py_complex z;
1204 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001205 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001206 z.imag = atof(s);
1207 PyFPE_END_PROTECT(z)
1208 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001209 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001210 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001211#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001212 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001213 PyFPE_START_PROTECT("atof", return 0)
1214 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001215 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001216 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001217 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001218}
1219
Guido van Rossum79f25d91997-04-29 20:08:16 +00001220static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001221decode_utf8(char **sPtr, char *end, char* encoding)
1222{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001223#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001224 Py_FatalError("decode_utf8 should not be called in this build.");
1225 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001226#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001227 PyObject *u, *v;
1228 char *s, *t;
1229 t = s = *sPtr;
1230 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1231 while (s < end && (*s & 0x80)) s++;
1232 *sPtr = s;
1233 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1234 if (u == NULL)
1235 return NULL;
1236 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1237 Py_DECREF(u);
1238 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001239#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001240}
1241
1242static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001243parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001244{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001245 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001246 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001247 char *buf;
1248 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001249 char *end;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001250 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001251 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001252 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001253 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001254 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001255
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001256 if (isalpha(quote) || quote == '_') {
1257 if (quote == 'u' || quote == 'U') {
1258 quote = *++s;
1259 unicode = 1;
1260 }
1261 if (quote == 'r' || quote == 'R') {
1262 quote = *++s;
1263 rawmode = 1;
1264 }
1265 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001266 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001267 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001268 return NULL;
1269 }
1270 s++;
1271 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001272 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001273 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001274 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001275 return NULL;
1276 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001277 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001278 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001279 return NULL;
1280 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001281 if (len >= 4 && s[0] == quote && s[1] == quote) {
1282 s += 2;
1283 len -= 2;
1284 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001285 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001286 return NULL;
1287 }
1288 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001289#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001290 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001291 PyObject *u, *w;
1292 if (encoding == NULL) {
1293 buf = s;
1294 u = NULL;
1295 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1296 buf = s;
1297 u = NULL;
1298 } else {
1299 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1300 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1301 if (u == NULL)
1302 return NULL;
1303 p = buf = PyString_AsString(u);
1304 end = s + len;
1305 while (s < end) {
1306 if (*s == '\\') {
1307 *p++ = *s++;
1308 if (*s & 0x80) {
1309 strcpy(p, "u005c");
1310 p += 5;
1311 }
1312 }
1313 if (*s & 0x80) { /* XXX inefficient */
1314 char *r;
1315 int rn, i;
1316 w = decode_utf8(&s, end, "utf-16-be");
1317 if (w == NULL) {
1318 Py_DECREF(u);
1319 return NULL;
1320 }
1321 r = PyString_AsString(w);
1322 rn = PyString_Size(w);
1323 assert(rn % 2 == 0);
1324 for (i = 0; i < rn; i += 2) {
1325 sprintf(p, "\\u%02x%02x",
1326 r[i + 0] & 0xFF,
1327 r[i + 1] & 0xFF);
1328 p += 6;
1329 }
1330 Py_DECREF(w);
1331 } else {
1332 *p++ = *s++;
1333 }
1334 }
1335 len = p - buf;
1336 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001337 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001338 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001339 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001340 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1341 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001342 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001343 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001344 return v;
1345
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001346 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001347#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001348 need_encoding = (encoding != NULL &&
1349 strcmp(encoding, "utf-8") != 0 &&
1350 strcmp(encoding, "iso-8859-1") != 0);
1351 if (rawmode || strchr(s, '\\') == NULL) {
1352 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001353#ifndef Py_USING_UNICODE
1354 /* This should not happen - we never see any other
1355 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001356 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001357#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001358 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1359 if (u == NULL)
1360 return NULL;
1361 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1362 Py_DECREF(u);
1363 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001364#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001365 } else {
1366 return PyString_FromStringAndSize(s, len);
1367 }
1368 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001369
1370 v = PyString_DecodeEscape(s, len, NULL, unicode,
1371 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001372 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001373 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001374 return v;
1375}
1376
Guido van Rossum79f25d91997-04-29 20:08:16 +00001377static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001378parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001379{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001380 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001381 int i;
1382 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001383 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001384 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001385 for (i = 1; i < NCH(n); i++) {
1386 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001387 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001388 if (s == NULL)
1389 goto onError;
1390 if (PyString_Check(v) && PyString_Check(s)) {
1391 PyString_ConcatAndDel(&v, s);
1392 if (v == NULL)
1393 goto onError;
1394 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001395#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001396 else {
1397 PyObject *temp;
1398 temp = PyUnicode_Concat(v, s);
1399 Py_DECREF(s);
1400 if (temp == NULL)
1401 goto onError;
1402 Py_DECREF(v);
1403 v = temp;
1404 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001405#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001406 }
1407 }
1408 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001409
1410 onError:
1411 Py_XDECREF(v);
1412 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001413}
1414
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001415static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001416com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001417{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001418 int anchor = 0;
1419 int save_begin = c->c_begin;
1420
1421 /* list_iter: for v in expr [list_iter] */
1422 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001423 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001424 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001425 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001426 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001427 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001428 c->c_loops++;
1429 com_list_iter(c, n, e, t);
1430 c->c_loops--;
1431 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1432 c->c_begin = save_begin;
1433 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001434 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001435}
1436
1437static void
1438com_list_if(struct compiling *c, node *n, node *e, char *t)
1439{
1440 int anchor = 0;
1441 int a = 0;
1442 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001443 com_node(c, CHILD(n, 1));
1444 com_addfwref(c, JUMP_IF_FALSE, &a);
1445 com_addbyte(c, POP_TOP);
1446 com_pop(c, 1);
1447 com_list_iter(c, n, e, t);
1448 com_addfwref(c, JUMP_FORWARD, &anchor);
1449 com_backpatch(c, a);
1450 /* We jump here with an extra entry which we now pop */
1451 com_addbyte(c, POP_TOP);
1452 com_backpatch(c, anchor);
1453}
1454
1455static void
1456com_list_iter(struct compiling *c,
1457 node *p, /* parent of list_iter node */
1458 node *e, /* element expression node */
1459 char *t /* name of result list temp local */)
1460{
1461 /* list_iter is the last child in a listmaker, list_for, or list_if */
1462 node *n = CHILD(p, NCH(p)-1);
1463 if (TYPE(n) == list_iter) {
1464 n = CHILD(n, 0);
1465 switch (TYPE(n)) {
1466 case list_for:
1467 com_list_for(c, n, e, t);
1468 break;
1469 case list_if:
1470 com_list_if(c, n, e, t);
1471 break;
1472 default:
1473 com_error(c, PyExc_SystemError,
1474 "invalid list_iter node type");
1475 }
1476 }
1477 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001478 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001479 com_push(c, 1);
1480 com_node(c, e);
1481 com_addoparg(c, CALL_FUNCTION, 1);
1482 com_addbyte(c, POP_TOP);
1483 com_pop(c, 2);
1484 }
1485}
1486
1487static void
1488com_list_comprehension(struct compiling *c, node *n)
1489{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001490 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001491 char tmpname[30];
1492 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001493 com_addoparg(c, BUILD_LIST, 0);
1494 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1495 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001496 com_addop_name(c, LOAD_ATTR, "append");
1497 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001498 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001499 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001500 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001501 --c->c_tmpname;
1502}
1503
1504static void
1505com_listmaker(struct compiling *c, node *n)
1506{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001507 /* listmaker: test ( list_for | (',' test)* [','] ) */
1508 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001509 com_list_comprehension(c, n);
1510 else {
1511 int len = 0;
1512 int i;
1513 for (i = 0; i < NCH(n); i += 2, len++)
1514 com_node(c, CHILD(n, i));
1515 com_addoparg(c, BUILD_LIST, len);
1516 com_pop(c, len-1);
1517 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001518}
1519
1520static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001521com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001522{
1523 int i;
1524 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1525 for (i = 0; i+2 < NCH(n); i += 4) {
1526 /* We must arrange things just right for STORE_SUBSCR.
1527 It wants the stack to look like (value) (dict) (key) */
1528 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001529 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001530 com_node(c, CHILD(n, i+2)); /* value */
1531 com_addbyte(c, ROT_TWO);
1532 com_node(c, CHILD(n, i)); /* key */
1533 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001534 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001535 }
1536}
1537
1538static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001539com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001540{
1541 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001542 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001543 int i;
1544 REQ(n, atom);
1545 ch = CHILD(n, 0);
1546 switch (TYPE(ch)) {
1547 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001548 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001549 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001550 com_push(c, 1);
1551 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001552 else
1553 com_node(c, CHILD(n, 1));
1554 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001555 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001556 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001557 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001558 com_push(c, 1);
1559 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001560 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001561 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001562 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001563 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001564 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001565 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001566 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001567 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001568 break;
1569 case BACKQUOTE:
1570 com_node(c, CHILD(n, 1));
1571 com_addbyte(c, UNARY_CONVERT);
1572 break;
1573 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001574 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001575 i = 255;
1576 }
1577 else {
1578 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001579 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001580 }
1581 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001582 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001583 break;
1584 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001585 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001586 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001587 c->c_errors++;
1588 i = 255;
1589 }
1590 else {
1591 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001592 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001593 }
1594 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001595 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001596 break;
1597 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001598 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001599 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001600 break;
1601 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001602 com_error(c, PyExc_SystemError,
1603 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001604 }
1605}
1606
1607static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001608com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001609{
1610 if (NCH(n) == 1) {
1611 com_addbyte(c, op);
1612 }
1613 else if (NCH(n) == 2) {
1614 if (TYPE(CHILD(n, 0)) != COLON) {
1615 com_node(c, CHILD(n, 0));
1616 com_addbyte(c, op+1);
1617 }
1618 else {
1619 com_node(c, CHILD(n, 1));
1620 com_addbyte(c, op+2);
1621 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001622 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001623 }
1624 else {
1625 com_node(c, CHILD(n, 0));
1626 com_node(c, CHILD(n, 2));
1627 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001628 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001629 }
1630}
1631
Guido van Rossum635abd21997-01-06 22:56:52 +00001632static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001633com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1634{
1635 if (NCH(n) == 1) {
1636 com_addbyte(c, DUP_TOP);
1637 com_push(c, 1);
1638 com_addbyte(c, SLICE);
1639 com_node(c, augn);
1640 com_addbyte(c, opcode);
1641 com_pop(c, 1);
1642 com_addbyte(c, ROT_TWO);
1643 com_addbyte(c, STORE_SLICE);
1644 com_pop(c, 2);
1645 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1646 com_node(c, CHILD(n, 0));
1647 com_addoparg(c, DUP_TOPX, 2);
1648 com_push(c, 2);
1649 com_addbyte(c, SLICE+1);
1650 com_pop(c, 1);
1651 com_node(c, augn);
1652 com_addbyte(c, opcode);
1653 com_pop(c, 1);
1654 com_addbyte(c, ROT_THREE);
1655 com_addbyte(c, STORE_SLICE+1);
1656 com_pop(c, 3);
1657 } else if (NCH(n) == 2) {
1658 com_node(c, CHILD(n, 1));
1659 com_addoparg(c, DUP_TOPX, 2);
1660 com_push(c, 2);
1661 com_addbyte(c, SLICE+2);
1662 com_pop(c, 1);
1663 com_node(c, augn);
1664 com_addbyte(c, opcode);
1665 com_pop(c, 1);
1666 com_addbyte(c, ROT_THREE);
1667 com_addbyte(c, STORE_SLICE+2);
1668 com_pop(c, 3);
1669 } else {
1670 com_node(c, CHILD(n, 0));
1671 com_node(c, CHILD(n, 2));
1672 com_addoparg(c, DUP_TOPX, 3);
1673 com_push(c, 3);
1674 com_addbyte(c, SLICE+3);
1675 com_pop(c, 2);
1676 com_node(c, augn);
1677 com_addbyte(c, opcode);
1678 com_pop(c, 1);
1679 com_addbyte(c, ROT_FOUR);
1680 com_addbyte(c, STORE_SLICE+3);
1681 com_pop(c, 4);
1682 }
1683}
1684
1685static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001686com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001687{
1688 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001689 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001690 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001691 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001692 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001693 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001694 }
1695 else {
1696 com_node(c, CHILD(n, 0));
1697 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001698 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001699 }
1700 m = n;
1701 do {
1702 m = CHILD(m, 0);
1703 } while (NCH(m) == 1);
1704 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001705 /* f(lambda x: x[0] = 3) ends up getting parsed with
1706 * LHS test = lambda x: x[0], and RHS test = 3.
1707 * SF bug 132313 points out that complaining about a keyword
1708 * then is very confusing.
1709 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001710 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001711 TYPE(m) == lambdef ?
1712 "lambda cannot contain assignment" :
1713 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001714 }
1715 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001716 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001717 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001718 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001719 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001720 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001721 else if (*pkeywords == NULL) {
1722 c->c_errors++;
1723 Py_DECREF(v);
1724 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001725 if (PyDict_GetItem(*pkeywords, v) != NULL)
1726 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001727 "duplicate keyword argument");
1728 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001729 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001730 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001731 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001732 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001733 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001734 }
1735 }
1736 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001737}
1738
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001739static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001740com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001741{
1742 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001743 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001744 }
1745 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001746 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001747 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001748 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001749 int star_flag = 0;
1750 int starstar_flag = 0;
1751 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001752 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001753 na = 0;
1754 nk = 0;
1755 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001756 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001757 if (TYPE(ch) == STAR ||
1758 TYPE(ch) == DOUBLESTAR)
1759 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001760 if (ch->n_lineno != lineno) {
1761 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001762 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00001763 }
1764 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001765 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001766 na++;
1767 else
1768 nk++;
1769 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001770 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001771 while (i < NCH(n)) {
1772 node *tok = CHILD(n, i);
1773 node *ch = CHILD(n, i+1);
1774 i += 3;
1775 switch (TYPE(tok)) {
1776 case STAR: star_flag = 1; break;
1777 case DOUBLESTAR: starstar_flag = 1; break;
1778 }
1779 com_node(c, ch);
1780 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001781 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001782 com_error(c, PyExc_SyntaxError,
1783 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001784 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001785 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001786 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001787 star_flag + (starstar_flag << 1);
1788 else
1789 opcode = CALL_FUNCTION;
1790 com_addoparg(c, opcode, na | (nk << 8));
1791 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001792 }
1793}
1794
1795static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001796com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001797{
1798 com_addopname(c, LOAD_ATTR, n);
1799}
1800
1801static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001802com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001803{
1804 int i=0;
1805 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001806 node *ch;
1807
1808 /* first argument */
1809 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001810 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001811 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001812 i++;
1813 }
1814 else {
1815 com_node(c, CHILD(n,i));
1816 i++;
1817 REQ(CHILD(n,i),COLON);
1818 i++;
1819 }
1820 /* second argument */
1821 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1822 com_node(c, CHILD(n,i));
1823 i++;
1824 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001825 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001826 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001827 com_push(c, 1);
1828 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001829 /* remaining arguments */
1830 for (; i < NCH(n); i++) {
1831 ns++;
1832 ch=CHILD(n,i);
1833 REQ(ch, sliceop);
1834 if (NCH(ch) == 1) {
1835 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001836 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001837 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001838 }
1839 else
1840 com_node(c, CHILD(ch,1));
1841 }
1842 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001843 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001844}
1845
1846static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001847com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001848{
1849 node *ch;
1850 REQ(n, subscript);
1851 ch = CHILD(n,0);
1852 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001853 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001854 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001855 com_push(c, 1);
1856 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001857 else {
1858 /* check for slice */
1859 if ((TYPE(ch) == COLON || NCH(n) > 1))
1860 com_sliceobj(c, n);
1861 else {
1862 REQ(ch, test);
1863 com_node(c, ch);
1864 }
1865 }
1866}
1867
1868static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001869com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001870{
1871 int i, op;
1872 REQ(n, subscriptlist);
1873 /* Check to make backward compatible slice behavior for '[i:j]' */
1874 if (NCH(n) == 1) {
1875 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001876 /* 'Basic' slice, should have exactly one colon. */
1877 if ((TYPE(CHILD(sub, 0)) == COLON
1878 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1879 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1880 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001881 switch (assigning) {
1882 case OP_DELETE:
1883 op = DELETE_SLICE;
1884 break;
1885 case OP_ASSIGN:
1886 op = STORE_SLICE;
1887 break;
1888 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001889 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001890 break;
1891 default:
1892 com_augassign_slice(c, sub, assigning, augn);
1893 return;
1894 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001895 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001896 if (op == STORE_SLICE)
1897 com_pop(c, 2);
1898 else if (op == DELETE_SLICE)
1899 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001900 return;
1901 }
1902 }
1903 /* Else normal subscriptlist. Compile each subscript. */
1904 for (i = 0; i < NCH(n); i += 2)
1905 com_subscript(c, CHILD(n, i));
1906 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001907 if (NCH(n) > 1) {
1908 i = (NCH(n)+1) / 2;
1909 com_addoparg(c, BUILD_TUPLE, i);
1910 com_pop(c, i-1);
1911 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001912 switch (assigning) {
1913 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001914 op = DELETE_SUBSCR;
1915 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001916 break;
1917 default:
1918 case OP_ASSIGN:
1919 op = STORE_SUBSCR;
1920 i = 3;
1921 break;
1922 case OP_APPLY:
1923 op = BINARY_SUBSCR;
1924 i = 1;
1925 break;
1926 }
1927 if (assigning > OP_APPLY) {
1928 com_addoparg(c, DUP_TOPX, 2);
1929 com_push(c, 2);
1930 com_addbyte(c, BINARY_SUBSCR);
1931 com_pop(c, 1);
1932 com_node(c, augn);
1933 com_addbyte(c, assigning);
1934 com_pop(c, 1);
1935 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001936 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001937 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001938 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001939}
1940
1941static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001942com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001943{
1944 REQ(n, trailer);
1945 switch (TYPE(CHILD(n, 0))) {
1946 case LPAR:
1947 com_call_function(c, CHILD(n, 1));
1948 break;
1949 case DOT:
1950 com_select_member(c, CHILD(n, 1));
1951 break;
1952 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001953 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001954 break;
1955 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001956 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001957 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001958 }
1959}
1960
1961static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001962com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001963{
1964 int i;
1965 REQ(n, power);
1966 com_atom(c, CHILD(n, 0));
1967 for (i = 1; i < NCH(n); i++) {
1968 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1969 com_factor(c, CHILD(n, i+1));
1970 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001971 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001972 break;
1973 }
1974 else
1975 com_apply_trailer(c, CHILD(n, i));
1976 }
1977}
1978
1979static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001980com_invert_constant(struct compiling *c, node *n)
1981{
1982 /* Compute the inverse of int and longs and use them directly,
1983 but be prepared to generate code for all other
1984 possibilities (invalid numbers, floats, complex).
1985 */
1986 PyObject *num, *inv = NULL;
1987 int i;
1988
1989 REQ(n, NUMBER);
1990 num = parsenumber(c, STR(n));
1991 if (num == NULL)
1992 i = 255;
1993 else {
1994 inv = PyNumber_Invert(num);
1995 if (inv == NULL) {
1996 PyErr_Clear();
1997 i = com_addconst(c, num);
1998 } else {
1999 i = com_addconst(c, inv);
2000 Py_DECREF(inv);
2001 }
2002 Py_DECREF(num);
2003 }
2004 com_addoparg(c, LOAD_CONST, i);
2005 com_push(c, 1);
2006 if (num != NULL && inv == NULL)
2007 com_addbyte(c, UNARY_INVERT);
2008}
2009
Tim Peters51e26512001-09-07 08:45:55 +00002010static int
2011is_float_zero(const char *p)
2012{
2013 int found_radix_point = 0;
2014 int ch;
2015 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2016 switch (ch) {
2017 case '0':
2018 /* no reason to believe it's not 0 -- continue */
2019 break;
2020
2021 case 'e': case 'E': case 'j': case 'J':
2022 /* If this was a hex constant, we already would have
2023 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2024 must be an exponent marker, and we haven't yet
2025 seen a non-zero digit, and it doesn't matter what
2026 the exponent is then. For 'j' or 'J' similarly,
2027 except that this is an imaginary 0 then. */
2028 return 1;
2029
2030 case '.':
2031 found_radix_point = 1;
2032 break;
2033
2034 default:
2035 return 0;
2036 }
2037 }
2038 return found_radix_point;
2039}
2040
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002041static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002042com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002043{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002044 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002045 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002046 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002047 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002048 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002049 approriate value as a constant. If the value is negative,
2050 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002051 negative in the 0th position -- unless we're doing unary minus
2052 of a floating zero! In that case the sign is significant, but
2053 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002054 */
2055 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002056 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002057 && TYPE((pfactor = CHILD(n, 1))) == factor
2058 && NCH(pfactor) == 1
2059 && TYPE((ppower = CHILD(pfactor, 0))) == power
2060 && NCH(ppower) == 1
2061 && TYPE((patom = CHILD(ppower, 0))) == atom
2062 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
2063 && !(childtype == MINUS && is_float_zero(STR(pnum)))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002064 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002065 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002066 return;
2067 }
2068 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002069 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002070 if (s == NULL) {
2071 com_error(c, PyExc_MemoryError, "");
2072 com_addbyte(c, 255);
2073 return;
2074 }
2075 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002076 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002077 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002078 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002079 }
Tim Peters51e26512001-09-07 08:45:55 +00002080 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002081 }
2082 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002083 com_factor(c, CHILD(n, 1));
2084 com_addbyte(c, UNARY_POSITIVE);
2085 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002086 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002087 com_factor(c, CHILD(n, 1));
2088 com_addbyte(c, UNARY_NEGATIVE);
2089 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002090 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002091 com_factor(c, CHILD(n, 1));
2092 com_addbyte(c, UNARY_INVERT);
2093 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002094 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002095 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002096 }
2097}
2098
2099static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002100com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002101{
2102 int i;
2103 int op;
2104 REQ(n, term);
2105 com_factor(c, CHILD(n, 0));
2106 for (i = 2; i < NCH(n); i += 2) {
2107 com_factor(c, CHILD(n, i));
2108 switch (TYPE(CHILD(n, i-1))) {
2109 case STAR:
2110 op = BINARY_MULTIPLY;
2111 break;
2112 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002113 if (c->c_flags & CO_FUTURE_DIVISION)
2114 op = BINARY_TRUE_DIVIDE;
2115 else
2116 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002117 break;
2118 case PERCENT:
2119 op = BINARY_MODULO;
2120 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002121 case DOUBLESLASH:
2122 op = BINARY_FLOOR_DIVIDE;
2123 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002124 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002125 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002126 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002127 op = 255;
2128 }
2129 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002130 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002131 }
2132}
2133
2134static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002135com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002136{
2137 int i;
2138 int op;
2139 REQ(n, arith_expr);
2140 com_term(c, CHILD(n, 0));
2141 for (i = 2; i < NCH(n); i += 2) {
2142 com_term(c, CHILD(n, i));
2143 switch (TYPE(CHILD(n, i-1))) {
2144 case PLUS:
2145 op = BINARY_ADD;
2146 break;
2147 case MINUS:
2148 op = BINARY_SUBTRACT;
2149 break;
2150 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002151 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002152 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002153 op = 255;
2154 }
2155 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002156 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002157 }
2158}
2159
2160static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002161com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002162{
2163 int i;
2164 int op;
2165 REQ(n, shift_expr);
2166 com_arith_expr(c, CHILD(n, 0));
2167 for (i = 2; i < NCH(n); i += 2) {
2168 com_arith_expr(c, CHILD(n, i));
2169 switch (TYPE(CHILD(n, i-1))) {
2170 case LEFTSHIFT:
2171 op = BINARY_LSHIFT;
2172 break;
2173 case RIGHTSHIFT:
2174 op = BINARY_RSHIFT;
2175 break;
2176 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002177 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002178 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002179 op = 255;
2180 }
2181 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002182 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002183 }
2184}
2185
2186static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002187com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002188{
2189 int i;
2190 int op;
2191 REQ(n, and_expr);
2192 com_shift_expr(c, CHILD(n, 0));
2193 for (i = 2; i < NCH(n); i += 2) {
2194 com_shift_expr(c, CHILD(n, i));
2195 if (TYPE(CHILD(n, i-1)) == AMPER) {
2196 op = BINARY_AND;
2197 }
2198 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002199 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002200 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002201 op = 255;
2202 }
2203 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002204 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002205 }
2206}
2207
2208static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002209com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002210{
2211 int i;
2212 int op;
2213 REQ(n, xor_expr);
2214 com_and_expr(c, CHILD(n, 0));
2215 for (i = 2; i < NCH(n); i += 2) {
2216 com_and_expr(c, CHILD(n, i));
2217 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2218 op = BINARY_XOR;
2219 }
2220 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002221 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002222 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002223 op = 255;
2224 }
2225 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002226 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002227 }
2228}
2229
2230static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002231com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002232{
2233 int i;
2234 int op;
2235 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002236 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002237 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002238 com_xor_expr(c, CHILD(n, i));
2239 if (TYPE(CHILD(n, i-1)) == VBAR) {
2240 op = BINARY_OR;
2241 }
2242 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002243 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002244 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002245 op = 255;
2246 }
2247 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002248 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002249 }
2250}
2251
2252static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002253cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002254{
2255 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00002256 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002257 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2258 if (NCH(n) == 1) {
2259 n = CHILD(n, 0);
2260 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002261 case LESS: return PyCmp_LT;
2262 case GREATER: return PyCmp_GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002263 case EQEQUAL: /* == */
Martin v. Löwis7198a522002-01-01 19:59:11 +00002264 case EQUAL: return PyCmp_EQ;
2265 case LESSEQUAL: return PyCmp_LE;
2266 case GREATEREQUAL: return PyCmp_GE;
2267 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2268 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2269 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002270 }
2271 }
2272 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002273 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002274 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002275 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002276 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002277 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002278 }
2279 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002280 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002281}
2282
2283static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002284com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002285{
2286 int i;
2287 enum cmp_op op;
2288 int anchor;
2289 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2290 com_expr(c, CHILD(n, 0));
2291 if (NCH(n) == 1)
2292 return;
2293
2294 /****************************************************************
2295 The following code is generated for all but the last
2296 comparison in a chain:
2297
2298 label: on stack: opcode: jump to:
2299
2300 a <code to load b>
2301 a, b DUP_TOP
2302 a, b, b ROT_THREE
2303 b, a, b COMPARE_OP
2304 b, 0-or-1 JUMP_IF_FALSE L1
2305 b, 1 POP_TOP
2306 b
2307
2308 We are now ready to repeat this sequence for the next
2309 comparison in the chain.
2310
2311 For the last we generate:
2312
2313 b <code to load c>
2314 b, c COMPARE_OP
2315 0-or-1
2316
2317 If there were any jumps to L1 (i.e., there was more than one
2318 comparison), we generate:
2319
2320 0-or-1 JUMP_FORWARD L2
2321 L1: b, 0 ROT_TWO
2322 0, b POP_TOP
2323 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002324 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002325 ****************************************************************/
2326
2327 anchor = 0;
2328
2329 for (i = 2; i < NCH(n); i += 2) {
2330 com_expr(c, CHILD(n, i));
2331 if (i+2 < NCH(n)) {
2332 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002333 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002334 com_addbyte(c, ROT_THREE);
2335 }
2336 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002337 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002338 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002339 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002340 }
2341 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002342 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002343 if (i+2 < NCH(n)) {
2344 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2345 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002346 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002347 }
2348 }
2349
2350 if (anchor) {
2351 int anchor2 = 0;
2352 com_addfwref(c, JUMP_FORWARD, &anchor2);
2353 com_backpatch(c, anchor);
2354 com_addbyte(c, ROT_TWO);
2355 com_addbyte(c, POP_TOP);
2356 com_backpatch(c, anchor2);
2357 }
2358}
2359
2360static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002361com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002362{
2363 REQ(n, not_test); /* 'not' not_test | comparison */
2364 if (NCH(n) == 1) {
2365 com_comparison(c, CHILD(n, 0));
2366 }
2367 else {
2368 com_not_test(c, CHILD(n, 1));
2369 com_addbyte(c, UNARY_NOT);
2370 }
2371}
2372
2373static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002374com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002375{
2376 int i;
2377 int anchor;
2378 REQ(n, and_test); /* not_test ('and' not_test)* */
2379 anchor = 0;
2380 i = 0;
2381 for (;;) {
2382 com_not_test(c, CHILD(n, i));
2383 if ((i += 2) >= NCH(n))
2384 break;
2385 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2386 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002387 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002388 }
2389 if (anchor)
2390 com_backpatch(c, anchor);
2391}
2392
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002393static int
2394com_make_closure(struct compiling *c, PyCodeObject *co)
2395{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002396 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002397 if (free == 0)
2398 return 0;
2399 for (i = 0; i < free; ++i) {
2400 /* Bypass com_addop_varname because it will generate
2401 LOAD_DEREF but LOAD_CLOSURE is needed.
2402 */
2403 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2404 int arg, reftype;
2405
2406 /* Special case: If a class contains a method with a
2407 free variable that has the same name as a method,
2408 the name will be considered free *and* local in the
2409 class. It should be handled by the closure, as
2410 well as by the normal name loookup logic.
2411 */
2412 reftype = get_ref_type(c, PyString_AS_STRING(name));
2413 if (reftype == CELL)
2414 arg = com_lookup_arg(c->c_cellvars, name);
2415 else /* (reftype == FREE) */
2416 arg = com_lookup_arg(c->c_freevars, name);
2417 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002418 fprintf(stderr, "lookup %s in %s %d %d\n"
2419 "freevars of %s: %s\n",
2420 PyObject_REPR(name),
2421 c->c_name,
2422 reftype, arg,
2423 PyString_AS_STRING(co->co_name),
2424 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002425 Py_FatalError("com_make_closure()");
2426 }
2427 com_addoparg(c, LOAD_CLOSURE, arg);
2428
2429 }
2430 com_push(c, free);
2431 return 1;
2432}
2433
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002434static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002435com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002436{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002437 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002438 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002439 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002440 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002441 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002442 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2443 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002444 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002445 if (co == NULL) {
2446 c->c_errors++;
2447 return;
2448 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002449 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002450 i = com_addconst(c, (PyObject *)co);
2451 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002452 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002453 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002454 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002455 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002456 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002457 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002458 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002459 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002460 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002461 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002462 else {
2463 int anchor = 0;
2464 int i = 0;
2465 for (;;) {
2466 com_and_test(c, CHILD(n, i));
2467 if ((i += 2) >= NCH(n))
2468 break;
2469 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2470 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002471 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002472 }
2473 if (anchor)
2474 com_backpatch(c, anchor);
2475 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002476}
2477
2478static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002479com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002480{
2481 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002482 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002483 com_node(c, CHILD(n, 0));
2484 }
2485 else {
2486 int i;
2487 int len;
2488 len = (NCH(n) + 1) / 2;
2489 for (i = 0; i < NCH(n); i += 2)
2490 com_node(c, CHILD(n, i));
2491 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002492 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002493 }
2494}
2495
2496
2497/* Begin of assignment compilation */
2498
Thomas Wouters434d0822000-08-24 20:11:32 +00002499
2500static void
2501com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2502{
2503 com_addbyte(c, DUP_TOP);
2504 com_push(c, 1);
2505 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002506 com_node(c, augn);
2507 com_addbyte(c, opcode);
2508 com_pop(c, 1);
2509 com_addbyte(c, ROT_TWO);
2510 com_addopname(c, STORE_ATTR, n);
2511 com_pop(c, 2);
2512}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002513
2514static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002515com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002516{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00002517 if (none_assignment_check(c, STR(n), assigning))
2518 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002519 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002520 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002521}
2522
2523static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002524com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002525{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002526 REQ(n, trailer);
2527 switch (TYPE(CHILD(n, 0))) {
2528 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002529 if (assigning == OP_DELETE)
2530 com_error(c, PyExc_SyntaxError,
2531 "can't delete function call");
2532 else
2533 com_error(c, PyExc_SyntaxError,
2534 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002535 break;
2536 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002537 if (assigning > OP_APPLY)
2538 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2539 else
2540 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002541 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002542 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002543 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002544 break;
2545 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002546 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002547 }
2548}
2549
2550static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002551com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002552{
2553 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002554 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002555 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002556 if (assigning) {
2557 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002558 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002559 com_push(c, i-1);
2560 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002561 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002562 com_assign(c, CHILD(n, i), assigning, NULL);
2563}
2564
2565static void
2566com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2567{
2568 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002569 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002570 com_push(c, 1);
2571 com_node(c, augn);
2572 com_addbyte(c, opcode);
2573 com_pop(c, 1);
2574 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002575}
2576
2577static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002578com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002579{
2580 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002581 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002582 if (assigning)
2583 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002584}
2585
2586static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002587com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002588{
2589 /* Loop to avoid trivial recursion */
2590 for (;;) {
2591 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002592
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002593 case exprlist:
2594 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002595 case testlist1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002596 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002597 if (assigning > OP_APPLY) {
2598 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002599 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002600 return;
2601 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002602 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002603 return;
2604 }
2605 n = CHILD(n, 0);
2606 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002607
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002608 case test:
2609 case and_test:
2610 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002611 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002612 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002613 case xor_expr:
2614 case and_expr:
2615 case shift_expr:
2616 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002617 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002618 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002619 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002620 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002621 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002622 return;
2623 }
2624 n = CHILD(n, 0);
2625 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002626
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002627 case power: /* atom trailer* ('**' power)*
2628 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002629 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002630 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002631 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002632 return;
2633 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002634 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002635 int i;
2636 com_node(c, CHILD(n, 0));
2637 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002638 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002639 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002640 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002641 return;
2642 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002643 com_apply_trailer(c, CHILD(n, i));
2644 } /* NB i is still alive */
2645 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002646 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002647 return;
2648 }
2649 n = CHILD(n, 0);
2650 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002651
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002652 case atom:
2653 switch (TYPE(CHILD(n, 0))) {
2654 case LPAR:
2655 n = CHILD(n, 1);
2656 if (TYPE(n) == RPAR) {
2657 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002658 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002659 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002660 return;
2661 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002662 if (assigning > OP_APPLY) {
2663 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002664 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002665 return;
2666 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002667 break;
2668 case LSQB:
2669 n = CHILD(n, 1);
2670 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002671 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002672 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002673 return;
2674 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002675 if (assigning > OP_APPLY) {
2676 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002677 "augmented assign to list not possible");
2678 return;
2679 }
2680 if (NCH(n) > 1
2681 && TYPE(CHILD(n, 1)) == list_for) {
2682 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002683 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002684 return;
2685 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002686 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002687 return;
2688 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002689 if (assigning > OP_APPLY)
2690 com_augassign_name(c, CHILD(n, 0),
2691 assigning, augn);
2692 else
2693 com_assign_name(c, CHILD(n, 0),
2694 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002695 return;
2696 default:
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 literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002699 return;
2700 }
2701 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002702
2703 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002704 com_error(c, PyExc_SyntaxError,
2705 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002706 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002707
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002708 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002709 com_error(c, PyExc_SystemError,
2710 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002711 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002712
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002713 }
2714 }
2715}
Guido van Rossum7c531111997-03-11 18:42:21 +00002716
Thomas Wouters434d0822000-08-24 20:11:32 +00002717static void
2718com_augassign(struct compiling *c, node *n)
2719{
2720 int opcode;
2721
2722 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2723 case '+': opcode = INPLACE_ADD; break;
2724 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002725 case '/':
2726 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
2727 opcode = INPLACE_FLOOR_DIVIDE;
2728 else if (c->c_flags & CO_FUTURE_DIVISION)
2729 opcode = INPLACE_TRUE_DIVIDE;
2730 else
2731 opcode = INPLACE_DIVIDE;
2732 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00002733 case '%': opcode = INPLACE_MODULO; break;
2734 case '<': opcode = INPLACE_LSHIFT; break;
2735 case '>': opcode = INPLACE_RSHIFT; break;
2736 case '&': opcode = INPLACE_AND; break;
2737 case '^': opcode = INPLACE_XOR; break;
2738 case '|': opcode = INPLACE_OR; break;
2739 case '*':
2740 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2741 opcode = INPLACE_POWER;
2742 else
2743 opcode = INPLACE_MULTIPLY;
2744 break;
2745 default:
2746 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2747 return;
2748 }
2749 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2750}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002751
2752static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002753com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002754{
Thomas Wouters434d0822000-08-24 20:11:32 +00002755 REQ(n, expr_stmt);
2756 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002757 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002758 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002759 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002760 if (NCH(n) == 1) {
2761 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002762 if (c->c_interactive)
2763 com_addbyte(c, PRINT_EXPR);
2764 else
2765 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002766 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002767 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002768 else if (TYPE(CHILD(n,1)) == augassign)
2769 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002770 else {
2771 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002772 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002773 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002774 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002775 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002776 com_push(c, 1);
2777 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002778 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002779 }
2780 }
2781}
2782
2783static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002784com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002785{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002786 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002787 int i;
2788 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002789 if (Py_OptimizeFlag)
2790 return;
2791 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00002792
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002793 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00002794 raise AssertionError [, <message>]
2795
2796 where <message> is the second test, if present.
2797 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002798 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002799 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002800 com_addbyte(c, POP_TOP);
2801 com_pop(c, 1);
2802 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002803 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002804 com_push(c, 1);
2805 i = NCH(n)/2; /* Either 2 or 4 */
2806 if (i > 1)
2807 com_node(c, CHILD(n, 3));
2808 com_addoparg(c, RAISE_VARARGS, i);
2809 com_pop(c, i);
2810 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002811 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002812 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002813 com_addbyte(c, POP_TOP);
2814}
2815
2816static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002817com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002818{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002819 int i = 1;
2820 node* stream = NULL;
2821
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002822 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002823
2824 /* are we using the extended print form? */
2825 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2826 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002827 com_node(c, stream);
2828 /* stack: [...] => [... stream] */
2829 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002830 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2831 i = 4;
2832 else
2833 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002834 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002835 for (; i < NCH(n); i += 2) {
2836 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002837 com_addbyte(c, DUP_TOP);
2838 /* stack: [stream] => [stream stream] */
2839 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002840 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002841 /* stack: [stream stream] => [stream stream obj] */
2842 com_addbyte(c, ROT_TWO);
2843 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002844 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002845 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002846 com_pop(c, 2);
2847 }
2848 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002849 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002850 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002851 com_addbyte(c, PRINT_ITEM);
2852 com_pop(c, 1);
2853 }
2854 }
2855 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002856 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002857 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002858 /* must pop the extra stream object off the stack */
2859 com_addbyte(c, POP_TOP);
2860 /* stack: [... stream] => [...] */
2861 com_pop(c, 1);
2862 }
2863 }
2864 else {
2865 if (stream != NULL) {
2866 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002867 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002868 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002869 com_pop(c, 1);
2870 }
2871 else
2872 com_addbyte(c, PRINT_NEWLINE);
2873 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002874}
2875
2876static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002877com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002878{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002879 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002880 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002881 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002882 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002883 if (c->c_flags & CO_GENERATOR) {
2884 if (NCH(n) > 1) {
2885 com_error(c, PyExc_SyntaxError,
2886 "'return' with argument inside generator");
2887 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002888 }
2889 if (NCH(n) < 2) {
2890 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002891 com_push(c, 1);
2892 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002893 else
2894 com_node(c, CHILD(n, 1));
2895 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00002896 com_pop(c, 1);
2897}
2898
2899static void
2900com_yield_stmt(struct compiling *c, node *n)
2901{
Tim Peters95c80f82001-06-23 02:07:08 +00002902 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00002903 REQ(n, yield_stmt); /* 'yield' testlist */
2904 if (!c->c_infunction) {
2905 com_error(c, PyExc_SyntaxError, "'yield' outside function");
2906 }
Tim Peters95c80f82001-06-23 02:07:08 +00002907
2908 for (i = 0; i < c->c_nblocks; ++i) {
2909 if (c->c_block[i] == SETUP_FINALLY) {
2910 com_error(c, PyExc_SyntaxError,
2911 "'yield' not allowed in a 'try' block "
2912 "with a 'finally' clause");
2913 return;
2914 }
2915 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002916 com_node(c, CHILD(n, 1));
2917 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002918 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002919}
2920
2921static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002922com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002923{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002924 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002925 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2926 if (NCH(n) > 1) {
2927 com_node(c, CHILD(n, 1));
2928 if (NCH(n) > 3) {
2929 com_node(c, CHILD(n, 3));
2930 if (NCH(n) > 5)
2931 com_node(c, CHILD(n, 5));
2932 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002933 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002934 i = NCH(n)/2;
2935 com_addoparg(c, RAISE_VARARGS, i);
2936 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002937}
2938
2939static void
Thomas Wouters52152252000-08-17 22:55:00 +00002940com_from_import(struct compiling *c, node *n)
2941{
2942 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2943 com_push(c, 1);
2944 if (NCH(n) > 1) {
2945 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2946 com_error(c, PyExc_SyntaxError, "invalid syntax");
2947 return;
2948 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002949 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002950 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002951 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002952 com_pop(c, 1);
2953}
2954
2955static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002956com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002957{
2958 int i;
2959 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002960 /* 'import' dotted_name (',' dotted_name)* |
2961 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002962 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002963 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002964 /* 'from' dotted_name 'import' ... */
2965 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002966
2967 if (TYPE(CHILD(n, 3)) == STAR) {
2968 tup = Py_BuildValue("(s)", "*");
2969 } else {
2970 tup = PyTuple_New((NCH(n) - 2)/2);
2971 for (i = 3; i < NCH(n); i += 2) {
2972 PyTuple_SET_ITEM(tup, (i-3)/2,
2973 PyString_FromString(STR(
Jeremy Hylton4419ac12001-02-28 22:54:51 +00002974 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002975 }
2976 }
2977 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002978 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002979 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002980 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002981 if (TYPE(CHILD(n, 3)) == STAR)
2982 com_addbyte(c, IMPORT_STAR);
2983 else {
2984 for (i = 3; i < NCH(n); i += 2)
2985 com_from_import(c, CHILD(n, i));
2986 com_addbyte(c, POP_TOP);
2987 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002988 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002989 }
2990 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002991 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002992 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002993 node *subn = CHILD(n, i);
2994 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002995 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002996 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002997 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002998 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002999 int j;
3000 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003001 com_error(c, PyExc_SyntaxError,
3002 "invalid syntax");
3003 return;
3004 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003005 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3006 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003007 CHILD(CHILD(subn, 0),
3008 j));
3009 com_addop_varname(c, VAR_STORE,
3010 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003011 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003012 com_addop_varname(c, VAR_STORE,
3013 STR(CHILD(CHILD(subn, 0),
3014 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003015 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003016 }
3017 }
3018}
3019
3020static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003021com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003022{
3023 REQ(n, exec_stmt);
3024 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3025 com_node(c, CHILD(n, 1));
3026 if (NCH(n) >= 4)
3027 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003028 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003029 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003030 com_push(c, 1);
3031 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003032 if (NCH(n) >= 6)
3033 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003034 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003035 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003036 com_push(c, 1);
3037 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003038 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003039 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003040}
3041
Guido van Rossum7c531111997-03-11 18:42:21 +00003042static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003043is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003044{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003045 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003046 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003047 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003048
3049 /* Label to avoid tail recursion */
3050 next:
3051 switch (TYPE(n)) {
3052
3053 case suite:
3054 if (NCH(n) == 1) {
3055 n = CHILD(n, 0);
3056 goto next;
3057 }
3058 /* Fall through */
3059 case file_input:
3060 for (i = 0; i < NCH(n); i++) {
3061 node *ch = CHILD(n, i);
3062 if (TYPE(ch) == stmt) {
3063 n = ch;
3064 goto next;
3065 }
3066 }
3067 break;
3068
3069 case stmt:
3070 case simple_stmt:
3071 case small_stmt:
3072 n = CHILD(n, 0);
3073 goto next;
3074
3075 case expr_stmt:
3076 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003077 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003078 case test:
3079 case and_test:
3080 case not_test:
3081 case comparison:
3082 case expr:
3083 case xor_expr:
3084 case and_expr:
3085 case shift_expr:
3086 case arith_expr:
3087 case term:
3088 case factor:
3089 case power:
3090 case atom:
3091 if (NCH(n) == 1) {
3092 n = CHILD(n, 0);
3093 goto next;
3094 }
3095 break;
3096
3097 case NAME:
3098 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3099 return 1;
3100 break;
3101
3102 case NUMBER:
3103 v = parsenumber(c, STR(n));
3104 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003105 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003106 break;
3107 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003108 i = PyObject_IsTrue(v);
3109 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003110 return i == 0;
3111
3112 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003113 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003114 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003115 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003116 break;
3117 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003118 i = PyObject_IsTrue(v);
3119 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003120 return i == 0;
3121
3122 }
3123 return 0;
3124}
3125
Tim Peters08a898f2001-06-28 01:52:22 +00003126
3127/* Look under n for a return stmt with an expression.
3128 * This hack is used to find illegal returns under "if 0:" blocks in
3129 * functions already known to be generators (as determined by the symtable
3130 * pass).
3131 * Return the offending return node if found, else NULL.
3132 */
3133static node *
3134look_for_offending_return(node *n)
3135{
3136 int i;
3137
3138 for (i = 0; i < NCH(n); ++i) {
3139 node *kid = CHILD(n, i);
3140
3141 switch (TYPE(kid)) {
3142 case classdef:
3143 case funcdef:
3144 case lambdef:
3145 /* Stuff in nested functions & classes doesn't
3146 affect the code block we started in. */
3147 return NULL;
3148
3149 case return_stmt:
3150 if (NCH(kid) > 1)
3151 return kid;
3152 break;
3153
3154 default: {
3155 node *bad = look_for_offending_return(kid);
3156 if (bad != NULL)
3157 return bad;
3158 }
3159 }
3160 }
3161
3162 return NULL;
3163}
3164
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003165static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003166com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003167{
3168 int i;
3169 int anchor = 0;
3170 REQ(n, if_stmt);
3171 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3172 for (i = 0; i+3 < NCH(n); i+=4) {
3173 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003174 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003175 if (is_constant_false(c, ch)) {
3176 /* We're going to skip this block. However, if this
3177 is a generator, we have to check the dead code
3178 anyway to make sure there aren't any return stmts
3179 with expressions, in the same scope. */
3180 if (c->c_flags & CO_GENERATOR) {
3181 node *p = look_for_offending_return(n);
3182 if (p != NULL) {
3183 int savelineno = c->c_lineno;
3184 c->c_lineno = p->n_lineno;
3185 com_error(c, PyExc_SyntaxError,
3186 "'return' with argument "
3187 "inside generator");
3188 c->c_lineno = savelineno;
3189 }
3190 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003191 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003192 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003193 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003194 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003195 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003196 com_addfwref(c, JUMP_IF_FALSE, &a);
3197 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003198 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003199 com_node(c, CHILD(n, i+3));
3200 com_addfwref(c, JUMP_FORWARD, &anchor);
3201 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003202 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003203 com_addbyte(c, POP_TOP);
3204 }
3205 if (i+2 < NCH(n))
3206 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003207 if (anchor)
3208 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003209}
3210
3211static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003212com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003213{
3214 int break_anchor = 0;
3215 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003216 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003217 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3218 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003219 block_push(c, SETUP_LOOP);
3220 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003221 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003222 com_node(c, CHILD(n, 1));
3223 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3224 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003225 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003226 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003227 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003228 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003229 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3230 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003231 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003232 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003233 com_addbyte(c, POP_TOP);
3234 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003235 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003236 if (NCH(n) > 4)
3237 com_node(c, CHILD(n, 6));
3238 com_backpatch(c, break_anchor);
3239}
3240
3241static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003242com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003243{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003244 int break_anchor = 0;
3245 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003246 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003247 REQ(n, for_stmt);
3248 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3249 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003250 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003251 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003252 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003253 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003254 com_set_lineno(c, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003255 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003256 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003257 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003258 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003259 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003260 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003261 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3262 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003263 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003264 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003265 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003266 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003267 if (NCH(n) > 8)
3268 com_node(c, CHILD(n, 8));
3269 com_backpatch(c, break_anchor);
3270}
3271
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003272/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003273
3274 SETUP_FINALLY L
3275 <code for S>
3276 POP_BLOCK
3277 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003278 L: <code for Sf>
3279 END_FINALLY
3280
3281 The special instructions use the block stack. Each block
3282 stack entry contains the instruction that created it (here
3283 SETUP_FINALLY), the level of the value stack at the time the
3284 block stack entry was created, and a label (here L).
3285
3286 SETUP_FINALLY:
3287 Pushes the current value stack level and the label
3288 onto the block stack.
3289 POP_BLOCK:
3290 Pops en entry from the block stack, and pops the value
3291 stack until its level is the same as indicated on the
3292 block stack. (The label is ignored.)
3293 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003294 Pops a variable number of entries from the *value* stack
3295 and re-raises the exception they specify. The number of
3296 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003297
3298 The block stack is unwound when an exception is raised:
3299 when a SETUP_FINALLY entry is found, the exception is pushed
3300 onto the value stack (and the exception condition is cleared),
3301 and the interpreter jumps to the label gotten from the block
3302 stack.
3303
3304 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003305 (The contents of the value stack is shown in [], with the top
3306 at the right; 'tb' is trace-back info, 'val' the exception's
3307 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003308
3309 Value stack Label Instruction Argument
3310 [] SETUP_EXCEPT L1
3311 [] <code for S>
3312 [] POP_BLOCK
3313 [] JUMP_FORWARD L0
3314
Guido van Rossum3f5da241990-12-20 15:06:42 +00003315 [tb, val, exc] L1: DUP )
3316 [tb, val, exc, exc] <evaluate E1> )
3317 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3318 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3319 [tb, val, exc, 1] POP )
3320 [tb, val, exc] POP
3321 [tb, val] <assign to V1> (or POP if no V1)
3322 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003323 [] <code for S1>
3324 JUMP_FORWARD L0
3325
Guido van Rossum3f5da241990-12-20 15:06:42 +00003326 [tb, val, exc, 0] L2: POP
3327 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003328 .............................etc.......................
3329
Guido van Rossum3f5da241990-12-20 15:06:42 +00003330 [tb, val, exc, 0] Ln+1: POP
3331 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003332
3333 [] L0: <next statement>
3334
3335 Of course, parts are not generated if Vi or Ei is not present.
3336*/
3337
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003338static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003339com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003340{
3341 int except_anchor = 0;
3342 int end_anchor = 0;
3343 int else_anchor = 0;
3344 int i;
3345 node *ch;
3346
3347 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3348 block_push(c, SETUP_EXCEPT);
3349 com_node(c, CHILD(n, 2));
3350 com_addbyte(c, POP_BLOCK);
3351 block_pop(c, SETUP_EXCEPT);
3352 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3353 com_backpatch(c, except_anchor);
3354 for (i = 3;
3355 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3356 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003357 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003358 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003359 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003360 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003361 break;
3362 }
3363 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003364 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003365 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003366 if (NCH(ch) > 1) {
3367 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003368 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003369 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003370 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003371 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003372 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3373 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003374 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003375 }
3376 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003377 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003378 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003379 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003380 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003381 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003382 com_pop(c, 1);
3383 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003384 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003385 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003386 com_node(c, CHILD(n, i+2));
3387 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3388 if (except_anchor) {
3389 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003390 /* We come in with [tb, val, exc, 0] on the
3391 stack; one pop and it's the same as
3392 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003393 com_addbyte(c, POP_TOP);
3394 }
3395 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003396 /* We actually come in here with [tb, val, exc] but the
3397 END_FINALLY will zap those and jump around.
3398 The c_stacklevel does not reflect them so we need not pop
3399 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003400 com_addbyte(c, END_FINALLY);
3401 com_backpatch(c, else_anchor);
3402 if (i < NCH(n))
3403 com_node(c, CHILD(n, i+2));
3404 com_backpatch(c, end_anchor);
3405}
3406
3407static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003408com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003409{
3410 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003411 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003412
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003413 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3414 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003415 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003416 com_addbyte(c, POP_BLOCK);
3417 block_pop(c, SETUP_FINALLY);
3418 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003419 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003420 /* While the generated code pushes only one item,
3421 the try-finally handling can enter here with
3422 up to three items. OK, here are the details:
3423 3 for an exception, 2 for RETURN, 1 for BREAK. */
3424 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003425 com_backpatch(c, finally_anchor);
3426 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003427 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003428 com_node(c, ch);
3429 com_addbyte(c, END_FINALLY);
3430 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003431 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003432}
3433
3434static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003435com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003436{
3437 REQ(n, try_stmt);
3438 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3439 | 'try' ':' suite 'finally' ':' suite */
3440 if (TYPE(CHILD(n, 3)) != except_clause)
3441 com_try_finally(c, n);
3442 else
3443 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003444}
3445
Guido van Rossum8b993a91997-01-17 21:04:03 +00003446static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003447get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003448{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003449 int i;
3450
Guido van Rossum8b993a91997-01-17 21:04:03 +00003451 /* Label to avoid tail recursion */
3452 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003453 switch (TYPE(n)) {
3454
3455 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003456 if (NCH(n) == 1) {
3457 n = CHILD(n, 0);
3458 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003459 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003460 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003461 case file_input:
3462 for (i = 0; i < NCH(n); i++) {
3463 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003464 if (TYPE(ch) == stmt) {
3465 n = ch;
3466 goto next;
3467 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003468 }
3469 break;
3470
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003471 case stmt:
3472 case simple_stmt:
3473 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003474 n = CHILD(n, 0);
3475 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003476
3477 case expr_stmt:
3478 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003479 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003480 case test:
3481 case and_test:
3482 case not_test:
3483 case comparison:
3484 case expr:
3485 case xor_expr:
3486 case and_expr:
3487 case shift_expr:
3488 case arith_expr:
3489 case term:
3490 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003491 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003492 if (NCH(n) == 1) {
3493 n = CHILD(n, 0);
3494 goto next;
3495 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003496 break;
3497
3498 case atom:
3499 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003500 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003501 break;
3502
3503 }
3504 return NULL;
3505}
3506
Guido van Rossum79f25d91997-04-29 20:08:16 +00003507static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003508get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003509{
Guido van Rossum541563e1999-01-28 15:08:09 +00003510 /* Don't generate doc-strings if run with -OO */
3511 if (Py_OptimizeFlag > 1)
3512 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003513 n = get_rawdocstring(n);
3514 if (n == NULL)
3515 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003516 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003517}
3518
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003519static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003520com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003521{
3522 REQ(n, suite);
3523 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3524 if (NCH(n) == 1) {
3525 com_node(c, CHILD(n, 0));
3526 }
3527 else {
3528 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003529 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003530 node *ch = CHILD(n, i);
3531 if (TYPE(ch) == stmt)
3532 com_node(c, ch);
3533 }
3534 }
3535}
3536
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003537/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003538static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003539com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003540{
3541 int i = c->c_nblocks;
3542 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3543 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3544 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003545 else if (i <= 0) {
3546 /* at the outer level */
3547 com_error(c, PyExc_SyntaxError,
3548 "'continue' not properly in loop");
3549 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003550 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003551 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003552 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003553 if (c->c_block[j] == SETUP_LOOP)
3554 break;
3555 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003556 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003557 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003558 for (; i > j; --i) {
3559 if (c->c_block[i] == SETUP_EXCEPT ||
3560 c->c_block[i] == SETUP_FINALLY) {
3561 com_addoparg(c, CONTINUE_LOOP,
3562 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003563 return;
3564 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003565 if (c->c_block[i] == END_FINALLY) {
3566 com_error(c, PyExc_SyntaxError,
3567 "'continue' not supported inside 'finally' clause");
3568 return;
3569 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003570 }
3571 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003572 com_error(c, PyExc_SyntaxError,
3573 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003574 }
3575 /* XXX Could allow it inside a 'finally' clause
3576 XXX if we could pop the exception still on the stack */
3577}
3578
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003579static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003580com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003581{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003582 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003583 if (TYPE(n) == lambdef) {
3584 /* lambdef: 'lambda' [varargslist] ':' test */
3585 n = CHILD(n, 1);
3586 }
3587 else {
3588 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3589 n = CHILD(n, 2);
3590 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3591 n = CHILD(n, 1);
3592 }
3593 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003594 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003595 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003596 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003597 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3598 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003599 nargs = 0;
3600 ndefs = 0;
3601 for (i = 0; i < nch; i++) {
3602 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003603 if (TYPE(CHILD(n, i)) == STAR ||
3604 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003605 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003606 nargs++;
3607 i++;
3608 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003609 t = RPAR; /* Anything except EQUAL or COMMA */
3610 else
3611 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003612 if (t == EQUAL) {
3613 i++;
3614 ndefs++;
3615 com_node(c, CHILD(n, i));
3616 i++;
3617 if (i >= nch)
3618 break;
3619 t = TYPE(CHILD(n, i));
3620 }
3621 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003622 /* Treat "(a=1, b)" as an error */
3623 if (ndefs)
3624 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003625 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003626 }
3627 if (t != COMMA)
3628 break;
3629 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003630 return ndefs;
3631}
3632
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003633static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003634com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003635{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003636 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003637 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003638 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003639 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003640 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3641 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003642 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003643 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003644 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003645 c->c_errors++;
3646 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003647 int closure = com_make_closure(c, (PyCodeObject *)co);
3648 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003649 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003650 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003651 if (closure)
3652 com_addoparg(c, MAKE_CLOSURE, ndefs);
3653 else
3654 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003655 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003656 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003657 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003658 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003659 }
3660}
3661
3662static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003663com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003664{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003665 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003666 REQ(n, testlist);
3667 /* testlist: test (',' test)* [','] */
3668 for (i = 0; i < NCH(n); i += 2)
3669 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003670 i = (NCH(n)+1) / 2;
3671 com_addoparg(c, BUILD_TUPLE, i);
3672 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003673}
3674
3675static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003676com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003677{
Guido van Rossum25831651993-05-19 14:50:45 +00003678 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003679 PyObject *v;
3680 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003681 char *name;
3682
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003683 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003684 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003685 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003686 c->c_errors++;
3687 return;
3688 }
3689 /* Push the class name on the stack */
3690 i = com_addconst(c, v);
3691 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003692 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003693 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003694 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003695 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003696 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003697 com_push(c, 1);
3698 }
Guido van Rossum25831651993-05-19 14:50:45 +00003699 else
3700 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003701 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003702 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003703 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003704 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003705 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003706 c->c_errors++;
3707 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003708 int closure = com_make_closure(c, co);
3709 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003710 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003711 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003712 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003713 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003714 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003715 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003716 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003717 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003718 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003719 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003720 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003721 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003722 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003723 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003724}
3725
3726static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003727com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003728{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003729 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003730 if (c->c_errors)
3731 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003732 switch (TYPE(n)) {
3733
3734 /* Definition nodes */
3735
3736 case funcdef:
3737 com_funcdef(c, n);
3738 break;
3739 case classdef:
3740 com_classdef(c, n);
3741 break;
3742
3743 /* Trivial parse tree nodes */
3744
3745 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003746 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003747 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003748 n = CHILD(n, 0);
3749 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003750
3751 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003752 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003753 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003754 {
3755 int i;
3756 for (i = 0; i < NCH(n)-1; i += 2)
3757 com_node(c, CHILD(n, i));
3758 }
3759 break;
3760
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003761 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003762 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003763 n = CHILD(n, 0);
3764 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003765
3766 /* Statement nodes */
3767
3768 case expr_stmt:
3769 com_expr_stmt(c, n);
3770 break;
3771 case print_stmt:
3772 com_print_stmt(c, n);
3773 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003774 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003775 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003776 break;
3777 case pass_stmt:
3778 break;
3779 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003780 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003781 com_error(c, PyExc_SyntaxError,
3782 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003783 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003784 com_addbyte(c, BREAK_LOOP);
3785 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003786 case continue_stmt:
3787 com_continue_stmt(c, n);
3788 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003789 case return_stmt:
3790 com_return_stmt(c, n);
3791 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003792 case yield_stmt:
3793 com_yield_stmt(c, n);
3794 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003795 case raise_stmt:
3796 com_raise_stmt(c, n);
3797 break;
3798 case import_stmt:
3799 com_import_stmt(c, n);
3800 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003801 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003802 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003803 case exec_stmt:
3804 com_exec_stmt(c, n);
3805 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003806 case assert_stmt:
3807 com_assert_stmt(c, n);
3808 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003809 case if_stmt:
3810 com_if_stmt(c, n);
3811 break;
3812 case while_stmt:
3813 com_while_stmt(c, n);
3814 break;
3815 case for_stmt:
3816 com_for_stmt(c, n);
3817 break;
3818 case try_stmt:
3819 com_try_stmt(c, n);
3820 break;
3821 case suite:
3822 com_suite(c, n);
3823 break;
3824
3825 /* Expression nodes */
3826
3827 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003828 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00003829 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003830 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003831 break;
3832 case test:
3833 com_test(c, n);
3834 break;
3835 case and_test:
3836 com_and_test(c, n);
3837 break;
3838 case not_test:
3839 com_not_test(c, n);
3840 break;
3841 case comparison:
3842 com_comparison(c, n);
3843 break;
3844 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003845 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003846 break;
3847 case expr:
3848 com_expr(c, n);
3849 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003850 case xor_expr:
3851 com_xor_expr(c, n);
3852 break;
3853 case and_expr:
3854 com_and_expr(c, n);
3855 break;
3856 case shift_expr:
3857 com_shift_expr(c, n);
3858 break;
3859 case arith_expr:
3860 com_arith_expr(c, n);
3861 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003862 case term:
3863 com_term(c, n);
3864 break;
3865 case factor:
3866 com_factor(c, n);
3867 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003868 case power:
3869 com_power(c, n);
3870 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003871 case atom:
3872 com_atom(c, n);
3873 break;
3874
3875 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003876 com_error(c, PyExc_SystemError,
3877 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003878 }
3879}
3880
Tim Petersdbd9ba62000-07-09 03:09:57 +00003881static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003882
3883static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003884com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003885{
3886 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3887 if (TYPE(CHILD(n, 0)) == LPAR)
3888 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003889 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003890 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003891 com_pop(c, 1);
3892 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003893}
3894
3895static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003896com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003897{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003898 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003899 if (NCH(n) == 1) {
3900 com_fpdef(c, CHILD(n, 0));
3901 }
3902 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003903 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003904 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003905 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003906 for (i = 0; i < NCH(n); i += 2)
3907 com_fpdef(c, CHILD(n, i));
3908 }
3909}
3910
3911static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003912com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003913{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003914 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003915 int complex = 0;
Barry Warsaw8f6d8682001-11-28 21:10:39 +00003916 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003917 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003918 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003919 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003920 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003921 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003922 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003923 node *ch = CHILD(n, i);
3924 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003925 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003926 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003927 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3928 fp = CHILD(ch, 0);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00003929 if (TYPE(fp) != NAME) {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00003930 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003931 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003932 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003933 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003934 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003935 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003936 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003937 ch = CHILD(n, i);
3938 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003939 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003940 else
3941 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003942 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003943 if (complex) {
3944 /* Generate code for complex arguments only after
3945 having counted the simple arguments */
3946 int ilocal = 0;
3947 for (i = 0; i < nch; i++) {
3948 node *ch = CHILD(n, i);
3949 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003950 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003951 break;
3952 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3953 fp = CHILD(ch, 0);
3954 if (TYPE(fp) != NAME) {
3955 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003956 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003957 com_fpdef(c, ch);
3958 }
3959 ilocal++;
3960 if (++i >= nch)
3961 break;
3962 ch = CHILD(n, i);
3963 if (TYPE(ch) == EQUAL)
3964 i += 2;
3965 else
3966 REQ(ch, COMMA);
3967 }
3968 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003969}
3970
3971static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003972com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003973{
3974 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003975 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003976 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003977 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003978 if (doc != NULL) {
3979 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003980 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003981 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003982 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003983 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003984 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003985 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003986 for (i = 0; i < NCH(n); i++) {
3987 node *ch = CHILD(n, i);
3988 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3989 com_node(c, ch);
3990 }
3991}
3992
3993/* Top-level compile-node interface */
3994
3995static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003996compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003997{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003998 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003999 node *ch;
4000 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00004001 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004002 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004003 if (doc != NULL) {
4004 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004005 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004006 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004007 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004008 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004009 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
4010 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004011 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004012 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004013 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004014 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004015 c->c_infunction = 0;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004016 com_addbyte(c, RETURN_NONE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004017}
4018
4019static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004020compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004021{
Guido van Rossum590baa41993-11-30 13:40:46 +00004022 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004023 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004024 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004025
4026 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004027 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004028 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004029 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004030 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004031 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004032 else
4033 ch = CHILD(n, 2);
4034 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004035 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004036 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004037}
4038
4039static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004040compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004041{
4042 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004043 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004044 REQ(n, classdef);
4045 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4046 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004047 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004048 /* Initialize local __module__ from global __name__ */
4049 com_addop_name(c, LOAD_GLOBAL, "__name__");
4050 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004051 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004052 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004053 if (doc != NULL) {
4054 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004055 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004056 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004057 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004058 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004059 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004060 }
4061 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004062 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004063 com_node(c, ch);
4064 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004065 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004066 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004067 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004068}
4069
4070static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004071compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004072{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004073 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004074
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004075 switch (TYPE(n)) {
4076
Guido van Rossum4c417781991-01-21 16:09:22 +00004077 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004078 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004079 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004080 n = CHILD(n, 0);
4081 if (TYPE(n) != NEWLINE)
4082 com_node(c, n);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004083 com_addbyte(c, RETURN_NONE);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004084 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004085 break;
4086
Guido van Rossum4c417781991-01-21 16:09:22 +00004087 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004088 com_file_input(c, n);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004089 com_addbyte(c, RETURN_NONE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004090 break;
4091
Guido van Rossum590baa41993-11-30 13:40:46 +00004092 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004093 com_node(c, CHILD(n, 0));
4094 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004095 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004096 break;
4097
Guido van Rossum590baa41993-11-30 13:40:46 +00004098 case lambdef: /* anonymous function definition */
4099 compile_lambdef(c, n);
4100 break;
4101
Guido van Rossum4c417781991-01-21 16:09:22 +00004102 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004103 compile_funcdef(c, n);
4104 break;
4105
Guido van Rossum4c417781991-01-21 16:09:22 +00004106 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004107 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004108 break;
4109
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004110 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004111 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004112 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004113 }
4114}
4115
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004116static PyObject *
4117dict_keys_inorder(PyObject *dict, int offset)
4118{
4119 PyObject *tuple, *k, *v;
4120 int i, pos = 0, size = PyDict_Size(dict);
4121
4122 tuple = PyTuple_New(size);
4123 if (tuple == NULL)
4124 return NULL;
4125 while (PyDict_Next(dict, &pos, &k, &v)) {
4126 i = PyInt_AS_LONG(v);
4127 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004128 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004129 PyTuple_SET_ITEM(tuple, i - offset, k);
4130 }
4131 return tuple;
4132}
4133
Guido van Rossum79f25d91997-04-29 20:08:16 +00004134PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004135PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004136{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004137 return PyNode_CompileFlags(n, filename, NULL);
4138}
4139
4140PyCodeObject *
4141PyNode_CompileFlags(node *n, char *filename, PyCompilerFlags *flags)
4142{
4143 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004144}
4145
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004146struct symtable *
4147PyNode_CompileSymtable(node *n, char *filename)
4148{
4149 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004150 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004151
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004152 ff = PyNode_Future(n, filename);
4153 if (ff == NULL)
4154 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004155
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004156 st = symtable_init();
Tim Peters8c5e4152001-11-04 19:26:58 +00004157 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004158 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004159 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004160 }
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004161 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004162 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004163 if (st->st_errors > 0)
4164 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004165 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004166 if (st->st_errors > 0)
4167 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004168
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004169 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004170 fail:
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004171 PyObject_FREE((void *)ff);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004172 st->st_future = NULL;
4173 PySymtable_Free(st);
4174 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004175}
4176
Guido van Rossum79f25d91997-04-29 20:08:16 +00004177static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004178icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004179{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004180 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004181}
4182
Guido van Rossum79f25d91997-04-29 20:08:16 +00004183static PyCodeObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004184jcompile(node *n, char *filename, struct compiling *base,
4185 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004186{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004187 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004188 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004189 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004190 return NULL;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004191 if (TYPE(n) == encoding_decl) {
4192 sc.c_encoding = STR(n);
4193 n = CHILD(n, 0);
4194 } else {
4195 sc.c_encoding = NULL;
4196 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004197 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004198 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004199 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004200 /* c_symtable still points to parent's symbols */
4201 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004202 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004203 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004204 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004205 if (base->c_encoding != NULL) {
4206 assert(sc.c_encoding == NULL);
4207 sc.c_encoding = base->c_encoding;
4208 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004209 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004210 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004211 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004212 if (sc.c_future == NULL) {
4213 com_free(&sc);
4214 return NULL;
4215 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004216 if (flags) {
4217 int merged = sc.c_future->ff_features |
4218 flags->cf_flags;
4219 sc.c_future->ff_features = merged;
4220 flags->cf_flags = merged;
4221 }
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004222 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004223 com_free(&sc);
4224 return NULL;
4225 }
4226 }
4227 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004228 if (symtable_load_symbols(&sc) < 0) {
4229 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004230 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004231 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004232 compile_node(&sc, n);
4233 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004234 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004235 PyObject *consts, *names, *varnames, *filename, *name,
4236 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004237 consts = PyList_AsTuple(sc.c_consts);
4238 names = PyList_AsTuple(sc.c_names);
4239 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004240 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4241 freevars = dict_keys_inorder(sc.c_freevars,
4242 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004243 filename = PyString_InternFromString(sc.c_filename);
4244 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004245 if (!PyErr_Occurred())
4246 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004247 sc.c_nlocals,
4248 sc.c_maxstacklevel,
4249 sc.c_flags,
4250 sc.c_code,
4251 consts,
4252 names,
4253 varnames,
4254 freevars,
4255 cellvars,
4256 filename,
4257 name,
4258 sc.c_firstlineno,
4259 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004260 Py_XDECREF(consts);
4261 Py_XDECREF(names);
4262 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004263 Py_XDECREF(freevars);
4264 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004265 Py_XDECREF(filename);
4266 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004267 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004268 else if (!PyErr_Occurred()) {
4269 /* This could happen if someone called PyErr_Clear() after an
4270 error was reported above. That's not supposed to happen,
4271 but I just plugged one case and I'm not sure there can't be
4272 others. In that case, raise SystemError so that at least
4273 it gets reported instead dumping core. */
4274 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4275 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004276 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004277 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004278 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004279 sc.c_symtable = NULL;
4280 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004281 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004282 return co;
4283}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004284
4285int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004286PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004287{
4288 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004289 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004290 int line = co->co_firstlineno;
4291 int addr = 0;
4292 while (--size >= 0) {
4293 addr += *p++;
4294 if (addr > addrq)
4295 break;
4296 line += *p++;
4297 }
4298 return line;
4299}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004300
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004301/* The test for LOCAL must come before the test for FREE in order to
4302 handle classes where name is both local and free. The local var is
4303 a method and the free var is a free var referenced within a method.
4304*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004305
4306static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004307get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004308{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004309 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004310 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004311
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004312 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4313 return CELL;
4314 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4315 return LOCAL;
4316 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4317 return FREE;
4318 v = PyDict_GetItemString(c->c_globals, name);
4319 if (v) {
4320 if (v == Py_None)
4321 return GLOBAL_EXPLICIT;
4322 else {
4323 return GLOBAL_IMPLICIT;
4324 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004325 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004326 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004327 "unknown scope for %.100s in %.100s(%s) "
4328 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4329 name, c->c_name,
4330 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4331 c->c_filename,
4332 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4333 PyObject_REPR(c->c_locals),
4334 PyObject_REPR(c->c_globals)
4335 );
4336
4337 Py_FatalError(buf);
4338 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004339}
4340
Guido van Rossum207fda62001-03-02 03:30:41 +00004341/* Helper functions to issue warnings */
4342
4343static int
4344issue_warning(char *msg, char *filename, int lineno)
4345{
4346 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4347 lineno, NULL, NULL) < 0) {
4348 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4349 PyErr_SetString(PyExc_SyntaxError, msg);
4350 PyErr_SyntaxLocation(filename, lineno);
4351 }
4352 return -1;
4353 }
4354 return 0;
4355}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004356
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004357static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004358symtable_warn(struct symtable *st, char *msg)
4359{
Guido van Rossum207fda62001-03-02 03:30:41 +00004360 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004361 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004362 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004363 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004364 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004365}
4366
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004367/* Helper function for setting lineno and filename */
4368
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004369static int
4370symtable_build(struct compiling *c, node *n)
4371{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004372 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004373 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004374 c->c_symtable->st_future = c->c_future;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004375 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004376 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4377 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004378 return -1;
4379 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004380 if (c->c_symtable->st_errors > 0)
4381 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004382 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004383 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004384 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004385 return 0;
4386}
4387
4388static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004389symtable_init_compiling_symbols(struct compiling *c)
4390{
4391 PyObject *varnames;
4392
4393 varnames = c->c_symtable->st_cur->ste_varnames;
4394 if (varnames == NULL) {
4395 varnames = PyList_New(0);
4396 if (varnames == NULL)
4397 return -1;
4398 c->c_symtable->st_cur->ste_varnames = varnames;
4399 Py_INCREF(varnames);
4400 } else
4401 Py_INCREF(varnames);
4402 c->c_varnames = varnames;
4403
4404 c->c_globals = PyDict_New();
4405 if (c->c_globals == NULL)
4406 return -1;
4407 c->c_freevars = PyDict_New();
4408 if (c->c_freevars == NULL)
4409 return -1;
4410 c->c_cellvars = PyDict_New();
4411 if (c->c_cellvars == NULL)
4412 return -1;
4413 return 0;
4414}
4415
4416struct symbol_info {
4417 int si_nlocals;
4418 int si_ncells;
4419 int si_nfrees;
4420 int si_nimplicit;
4421};
4422
4423static void
4424symtable_init_info(struct symbol_info *si)
4425{
4426 si->si_nlocals = 0;
4427 si->si_ncells = 0;
4428 si->si_nfrees = 0;
4429 si->si_nimplicit = 0;
4430}
4431
4432static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004433symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004434 struct symbol_info *si)
4435{
4436 PyObject *dict, *v;
4437
4438 /* Seperate logic for DEF_FREE. If it occurs in a function,
4439 it indicates a local that we must allocate storage for (a
4440 cell var). If it occurs in a class, then the class has a
4441 method and a free variable with the same name.
4442 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004443 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004444 /* If it isn't declared locally, it can't be a cell. */
4445 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4446 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004447 v = PyInt_FromLong(si->si_ncells++);
4448 dict = c->c_cellvars;
4449 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004450 /* If it is free anyway, then there is no need to do
4451 anything here.
4452 */
4453 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004454 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004455 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004456 v = PyInt_FromLong(si->si_nfrees++);
4457 dict = c->c_freevars;
4458 }
4459 if (v == NULL)
4460 return -1;
4461 if (PyDict_SetItem(dict, name, v) < 0) {
4462 Py_DECREF(v);
4463 return -1;
4464 }
4465 Py_DECREF(v);
4466 return 0;
4467}
4468
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004469/* If a variable is a cell and an argument, make sure that appears in
4470 co_cellvars before any variable to its right in varnames.
4471*/
4472
4473
4474static int
4475symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4476 PyObject *varnames, int flags)
4477{
4478 PyObject *v, *w, *d, *list = NULL;
4479 int i, pos;
4480
4481 if (flags & CO_VARARGS)
4482 argcount++;
4483 if (flags & CO_VARKEYWORDS)
4484 argcount++;
4485 for (i = argcount; --i >= 0; ) {
4486 v = PyList_GET_ITEM(varnames, i);
4487 if (PyDict_GetItem(*cellvars, v)) {
4488 if (list == NULL) {
4489 list = PyList_New(1);
4490 if (list == NULL)
4491 return -1;
4492 PyList_SET_ITEM(list, 0, v);
4493 Py_INCREF(v);
4494 } else
4495 PyList_Insert(list, 0, v);
4496 }
4497 }
4498 if (list == NULL || PyList_GET_SIZE(list) == 0)
4499 return 0;
4500 /* There are cellvars that are also arguments. Create a dict
4501 to replace cellvars and put the args at the front.
4502 */
4503 d = PyDict_New();
4504 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4505 v = PyInt_FromLong(i);
4506 if (v == NULL)
4507 goto fail;
4508 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4509 goto fail;
4510 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4511 goto fail;
4512 }
4513 pos = 0;
4514 i = PyList_GET_SIZE(list);
4515 Py_DECREF(list);
4516 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4517 w = PyInt_FromLong(i++); /* don't care about the old key */
4518 if (PyDict_SetItem(d, v, w) < 0) {
4519 Py_DECREF(w);
4520 goto fail;
4521 }
4522 Py_DECREF(w);
4523 }
4524 Py_DECREF(*cellvars);
4525 *cellvars = d;
4526 return 1;
4527 fail:
4528 Py_DECREF(d);
4529 return -1;
4530}
4531
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004532static int
4533symtable_freevar_offsets(PyObject *freevars, int offset)
4534{
4535 PyObject *name, *v;
4536 int pos;
4537
4538 /* The cell vars are the first elements of the closure,
4539 followed by the free vars. Update the offsets in
4540 c_freevars to account for number of cellvars. */
4541 pos = 0;
4542 while (PyDict_Next(freevars, &pos, &name, &v)) {
4543 int i = PyInt_AS_LONG(v) + offset;
4544 PyObject *o = PyInt_FromLong(i);
4545 if (o == NULL)
4546 return -1;
4547 if (PyDict_SetItem(freevars, name, o) < 0) {
4548 Py_DECREF(o);
4549 return -1;
4550 }
4551 Py_DECREF(o);
4552 }
4553 return 0;
4554}
4555
4556static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004557symtable_check_unoptimized(struct compiling *c,
4558 PySymtableEntryObject *ste,
4559 struct symbol_info *si)
4560{
4561 char buf[300];
4562
4563 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4564 || (ste->ste_nested && si->si_nimplicit)))
4565 return 0;
4566
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004567#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4568
4569#define ILLEGAL_IS "is a nested function"
4570
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004571#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004572"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004573
4574#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004575"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004576
4577#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00004578"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004579"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004580
4581 /* XXX perhaps the linenos for these opt-breaking statements
4582 should be stored so the exception can point to them. */
4583
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004584 if (ste->ste_child_free) {
4585 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004586 PyOS_snprintf(buf, sizeof(buf),
4587 ILLEGAL_IMPORT_STAR,
4588 PyString_AS_STRING(ste->ste_name),
4589 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004590 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004591 PyOS_snprintf(buf, sizeof(buf),
4592 ILLEGAL_BARE_EXEC,
4593 PyString_AS_STRING(ste->ste_name),
4594 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004595 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004596 PyOS_snprintf(buf, sizeof(buf),
4597 ILLEGAL_EXEC_AND_IMPORT_STAR,
4598 PyString_AS_STRING(ste->ste_name),
4599 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004600 }
4601 } else {
4602 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004603 PyOS_snprintf(buf, sizeof(buf),
4604 ILLEGAL_IMPORT_STAR,
4605 PyString_AS_STRING(ste->ste_name),
4606 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004607 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004608 PyOS_snprintf(buf, sizeof(buf),
4609 ILLEGAL_BARE_EXEC,
4610 PyString_AS_STRING(ste->ste_name),
4611 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004612 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004613 PyOS_snprintf(buf, sizeof(buf),
4614 ILLEGAL_EXEC_AND_IMPORT_STAR,
4615 PyString_AS_STRING(ste->ste_name),
4616 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004617 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004618 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004619
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004620 PyErr_SetString(PyExc_SyntaxError, buf);
4621 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4622 ste->ste_opt_lineno);
4623 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004624}
4625
4626static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004627symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4628 struct symbol_info *si)
4629{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004630 if (c->c_future)
4631 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004632 if (ste->ste_generator)
4633 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004634 if (ste->ste_type != TYPE_MODULE)
4635 c->c_flags |= CO_NEWLOCALS;
4636 if (ste->ste_type == TYPE_FUNCTION) {
4637 c->c_nlocals = si->si_nlocals;
4638 if (ste->ste_optimized == 0)
4639 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004640 else if (ste->ste_optimized != OPT_EXEC)
4641 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004642 }
4643 return 0;
4644}
4645
4646static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004647symtable_load_symbols(struct compiling *c)
4648{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004649 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004650 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004651 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004652 PyObject *name, *varnames, *v;
4653 int i, flags, pos;
4654 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004655
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004656 if (implicit == NULL) {
4657 implicit = PyInt_FromLong(1);
4658 if (implicit == NULL)
4659 return -1;
4660 }
4661 v = NULL;
4662
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004663 if (symtable_init_compiling_symbols(c) < 0)
4664 goto fail;
4665 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004666 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004667 si.si_nlocals = PyList_GET_SIZE(varnames);
4668 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004669
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004670 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004671 v = PyInt_FromLong(i);
4672 if (PyDict_SetItem(c->c_locals,
4673 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004674 goto fail;
4675 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004676 }
4677
4678 /* XXX The cases below define the rules for whether a name is
4679 local or global. The logic could probably be clearer. */
4680 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004681 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4682 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004683
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004684 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004685 /* undo the original DEF_FREE */
4686 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004687
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004688 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004689 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004690 2. Free variables in methods that are also class
4691 variables or declared global.
4692 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004693 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004694 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004695
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004696 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004697 c->c_argcount--;
4698 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004699 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004700 c->c_argcount--;
4701 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004702 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004703 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004704 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004705 if (flags & DEF_PARAM) {
4706 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004707 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004708 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004709 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004710 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004711 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004712 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004713 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4714 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004715 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004716 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004717 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4718 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004719 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004720 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004721 if (v == NULL)
4722 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004723 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004724 goto fail;
4725 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004726 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004727 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004728 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004729 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004730 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004731 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004732 if (v == NULL)
4733 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004734 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004735 goto fail;
4736 Py_DECREF(v);
4737 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004738 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004739 if (PyDict_SetItem(c->c_globals, name,
4740 implicit) < 0)
4741 goto fail;
4742 if (st->st_nscopes != 1) {
4743 v = PyInt_FromLong(flags);
4744 if (PyDict_SetItem(st->st_global,
4745 name, v))
4746 goto fail;
4747 Py_DECREF(v);
4748 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004749 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004750 }
4751 }
4752
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004753 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4754
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004755 if (si.si_ncells > 1) { /* one cell is always in order */
4756 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4757 c->c_varnames, c->c_flags) < 0)
4758 return -1;
4759 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004760 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4761 return -1;
4762 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004763 fail:
4764 /* is this always the right thing to do? */
4765 Py_XDECREF(v);
4766 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004767}
4768
4769static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004770symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004771{
4772 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004773
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004774 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004775 if (st == NULL)
4776 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004777 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00004778
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004779 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004780 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004781 goto fail;
4782 if ((st->st_symbols = PyDict_New()) == NULL)
4783 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004784 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004785 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004786 st->st_errors = 0;
4787 st->st_tmpname = 0;
4788 st->st_private = NULL;
4789 return st;
4790 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004791 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004792 return NULL;
4793}
4794
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004795void
4796PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004797{
4798 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004799 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004800 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004801 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004802}
4803
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004804/* When the compiler exits a scope, it must should update the scope's
4805 free variable information with the list of free variables in its
4806 children.
4807
4808 Variables that are free in children and defined in the current
4809 scope are cellvars.
4810
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004811 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004812 false), free variables in children that are not defined here are
4813 implicit globals.
4814
4815*/
4816
4817static int
4818symtable_update_free_vars(struct symtable *st)
4819{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004820 int i, j, def;
4821 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004822 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004823
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004824 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004825 def = DEF_FREE_CLASS;
4826 else
4827 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004828 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004829 int pos = 0;
4830
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004831 if (list)
4832 PyList_SetSlice(list, 0,
4833 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004834 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004835 PyList_GET_ITEM(ste->ste_children, i);
4836 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004837 int flags = PyInt_AS_LONG(o);
4838 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004839 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004840 if (list == NULL) {
4841 list = PyList_New(0);
4842 if (list == NULL)
4843 return -1;
4844 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004845 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004846 if (PyList_Append(list, name) < 0) {
4847 Py_DECREF(list);
4848 return -1;
4849 }
4850 }
4851 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004852 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004853 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004854 v = PyDict_GetItem(ste->ste_symbols, name);
4855 /* If a name N is declared global in scope A and
4856 referenced in scope B contained (perhaps
4857 indirectly) in A and there are no scopes
4858 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004859 is global in B. Unless A is a class scope,
4860 because class scopes are not considered for
4861 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004862 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004863 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004864 int flags = PyInt_AS_LONG(v);
4865 if (flags & DEF_GLOBAL) {
4866 symtable_undo_free(st, child->ste_id,
4867 name);
4868 continue;
4869 }
4870 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004871 if (ste->ste_nested) {
4872 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004873 name, def) < 0) {
4874 Py_DECREF(list);
4875 return -1;
4876 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004877 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004878 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004879 name) < 0) {
4880 Py_DECREF(list);
4881 return -1;
4882 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004883 }
4884 }
4885 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004886
4887 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004888 return 0;
4889}
4890
4891/* If the current scope is a non-nested class or if name is not
4892 defined in the current, non-nested scope, then it is an implicit
4893 global in all nested scopes.
4894*/
4895
4896static int
4897symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4898{
4899 PyObject *o;
4900 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004901 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004902
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004903 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004904 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004905 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004906 if (o == NULL)
4907 return symtable_undo_free(st, child, name);
4908 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004909
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004910 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004911 return symtable_undo_free(st, child, name);
4912 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004913 return symtable_add_def_o(st, ste->ste_symbols,
4914 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004915}
4916
4917static int
4918symtable_undo_free(struct symtable *st, PyObject *id,
4919 PyObject *name)
4920{
4921 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004922 PyObject *info;
4923 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004924
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004925 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4926 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004927 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00004928
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004929 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004930 if (info == NULL)
4931 return 0;
4932 v = PyInt_AS_LONG(info);
4933 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004934 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004935 DEF_FREE_GLOBAL) < 0)
4936 return -1;
4937 } else
4938 /* If the name is defined here or declared global,
4939 then the recursion stops. */
4940 return 0;
4941
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004942 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4943 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004944 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004945 PyList_GET_ITEM(ste->ste_children, i);
4946 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004947 if (x < 0)
4948 return x;
4949 }
4950 return 0;
4951}
4952
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004953/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4954 This reference is released when the scope is exited, via the DECREF
4955 in symtable_exit_scope().
4956*/
4957
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004958static int
4959symtable_exit_scope(struct symtable *st)
4960{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004961 int end;
4962
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004963 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004964 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004965 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004966 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004967 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4968 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004969 if (PySequence_DelItem(st->st_stack, end) < 0)
4970 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004971 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004972}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004973
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004974static void
4975symtable_enter_scope(struct symtable *st, char *name, int type,
4976 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004977{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004978 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004979
4980 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004981 prev = st->st_cur;
4982 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4983 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004984 st->st_errors++;
4985 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004986 }
4987 }
Barry Warsaw0372af72001-02-23 18:22:59 +00004988 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004989 PySymtableEntry_New(st, name, type, lineno);
4990 if (strcmp(name, TOP) == 0)
4991 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004992 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004993 if (PyList_Append(prev->ste_children,
4994 (PyObject *)st->st_cur) < 0)
4995 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004996 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004997}
4998
4999static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005000symtable_lookup(struct symtable *st, char *name)
5001{
5002 char buffer[MANGLE_LEN];
5003 PyObject *v;
5004 int flags;
5005
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005006 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005007 name = buffer;
5008 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5009 if (v == NULL) {
5010 if (PyErr_Occurred())
5011 return -1;
5012 else
5013 return 0;
5014 }
5015
5016 flags = PyInt_AS_LONG(v);
5017 return flags;
5018}
5019
5020static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005021symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005022{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005023 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005024 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005025 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005026
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005027 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005028 name = buffer;
5029 if ((s = PyString_InternFromString(name)) == NULL)
5030 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005031 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5032 Py_DECREF(s);
5033 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005034}
5035
5036/* Must only be called with mangled names */
5037
5038static int
5039symtable_add_def_o(struct symtable *st, PyObject *dict,
5040 PyObject *name, int flag)
5041{
5042 PyObject *o;
5043 int val;
5044
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005045 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005046 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005047 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005048 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005049 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005050 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005051 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005052 return -1;
5053 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005054 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005055 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005056 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005057 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005058 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005059 Py_DECREF(o);
5060 return -1;
5061 }
5062 Py_DECREF(o);
5063
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005064 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005065 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005066 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005067 } else if (flag & DEF_GLOBAL) {
5068 /* XXX need to update DEF_GLOBAL for other flags too;
5069 perhaps only DEF_FREE_GLOBAL */
5070 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005071 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005072 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005073 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005074 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005075 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005076 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005077 Py_DECREF(o);
5078 return -1;
5079 }
5080 Py_DECREF(o);
5081 }
5082 return 0;
5083}
5084
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005085#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005086
Tim Peters08a898f2001-06-28 01:52:22 +00005087/* Look for a yield stmt under n. Return 1 if found, else 0.
5088 This hack is used to look inside "if 0:" blocks (which are normally
5089 ignored) in case those are the only places a yield occurs (so that this
5090 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005091static int
5092look_for_yield(node *n)
5093{
5094 int i;
5095
5096 for (i = 0; i < NCH(n); ++i) {
5097 node *kid = CHILD(n, i);
5098
5099 switch (TYPE(kid)) {
5100
5101 case classdef:
5102 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005103 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005104 /* Stuff in nested functions and classes can't make
5105 the parent a generator. */
5106 return 0;
5107
5108 case yield_stmt:
5109 return 1;
5110
5111 default:
5112 if (look_for_yield(kid))
5113 return 1;
5114 }
5115 }
5116 return 0;
5117}
5118
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005119static void
5120symtable_node(struct symtable *st, node *n)
5121{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005122 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005123
5124 loop:
5125 switch (TYPE(n)) {
5126 case funcdef: {
5127 char *func_name = STR(CHILD(n, 1));
5128 symtable_add_def(st, func_name, DEF_LOCAL);
5129 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005130 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005131 symtable_funcdef(st, n);
5132 symtable_exit_scope(st);
5133 break;
5134 }
5135 case lambdef:
5136 if (NCH(n) == 4)
5137 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005138 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005139 symtable_funcdef(st, n);
5140 symtable_exit_scope(st);
5141 break;
5142 case classdef: {
5143 char *tmp, *class_name = STR(CHILD(n, 1));
5144 symtable_add_def(st, class_name, DEF_LOCAL);
5145 if (TYPE(CHILD(n, 2)) == LPAR) {
5146 node *bases = CHILD(n, 3);
5147 int i;
5148 for (i = 0; i < NCH(bases); i += 2) {
5149 symtable_node(st, CHILD(bases, i));
5150 }
5151 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005152 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005153 tmp = st->st_private;
5154 st->st_private = class_name;
5155 symtable_node(st, CHILD(n, NCH(n) - 1));
5156 st->st_private = tmp;
5157 symtable_exit_scope(st);
5158 break;
5159 }
5160 case if_stmt:
5161 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005162 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5163 if (st->st_cur->ste_generator == 0)
5164 st->st_cur->ste_generator =
5165 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005166 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005167 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005168 symtable_node(st, CHILD(n, i + 1));
5169 symtable_node(st, CHILD(n, i + 3));
5170 }
5171 if (i + 2 < NCH(n))
5172 symtable_node(st, CHILD(n, i + 2));
5173 break;
5174 case global_stmt:
5175 symtable_global(st, n);
5176 break;
5177 case import_stmt:
5178 symtable_import(st, n);
5179 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005180 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005181 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005182 symtable_node(st, CHILD(n, 1));
5183 if (NCH(n) > 2)
5184 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005185 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005186 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005187 st->st_cur->ste_opt_lineno = n->n_lineno;
5188 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005189 if (NCH(n) > 4)
5190 symtable_node(st, CHILD(n, 5));
5191 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005192
5193 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005194 case assert_stmt:
5195 if (Py_OptimizeFlag)
5196 return;
5197 if (NCH(n) == 2) {
5198 n = CHILD(n, 1);
5199 goto loop;
5200 } else {
5201 symtable_node(st, CHILD(n, 1));
5202 n = CHILD(n, 3);
5203 goto loop;
5204 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005205 case except_clause:
5206 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005207 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005208 if (NCH(n) > 1) {
5209 n = CHILD(n, 1);
5210 goto loop;
5211 }
5212 break;
5213 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005214 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005215 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005216 case yield_stmt:
5217 st->st_cur->ste_generator = 1;
5218 n = CHILD(n, 1);
5219 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005220 case expr_stmt:
5221 if (NCH(n) == 1)
5222 n = CHILD(n, 0);
5223 else {
5224 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005225 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005226 symtable_node(st, CHILD(n, 2));
5227 break;
5228 } else {
5229 int i;
5230 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005231 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005232 n = CHILD(n, NCH(n) - 1);
5233 }
5234 }
5235 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005236 case list_iter:
5237 n = CHILD(n, 0);
5238 if (TYPE(n) == list_for) {
5239 st->st_tmpname++;
5240 symtable_list_comprehension(st, n);
5241 st->st_tmpname--;
5242 } else {
5243 REQ(n, list_if);
5244 symtable_node(st, CHILD(n, 1));
5245 if (NCH(n) == 3) {
5246 n = CHILD(n, 2);
5247 goto loop;
5248 }
5249 }
5250 break;
5251 case for_stmt:
5252 symtable_assign(st, CHILD(n, 1), 0);
5253 for (i = 3; i < NCH(n); ++i)
5254 if (TYPE(CHILD(n, i)) >= single_input)
5255 symtable_node(st, CHILD(n, i));
5256 break;
5257 /* The remaining cases fall through to default except in
5258 special circumstances. This requires the individual cases
5259 to be coded with great care, even though they look like
5260 rather innocuous. Each case must double-check TYPE(n).
5261 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005262 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005263 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005264 n = CHILD(n, 2);
5265 goto loop;
5266 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005267 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005268 case listmaker:
5269 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00005270 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005271 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00005272 symtable_node(st, CHILD(n, 0));
5273 st->st_tmpname--;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005274 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005275 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005276 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005277 case atom:
5278 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5279 symtable_add_use(st, STR(CHILD(n, 0)));
5280 break;
5281 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005282 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005283 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005284 /* Walk over every non-token child with a special case
5285 for one child.
5286 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005287 if (NCH(n) == 1) {
5288 n = CHILD(n, 0);
5289 goto loop;
5290 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005291 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005292 if (TYPE(CHILD(n, i)) >= single_input)
5293 symtable_node(st, CHILD(n, i));
5294 }
5295}
5296
5297static void
5298symtable_funcdef(struct symtable *st, node *n)
5299{
5300 node *body;
5301
5302 if (TYPE(n) == lambdef) {
5303 if (NCH(n) == 4)
5304 symtable_params(st, CHILD(n, 1));
5305 } else
5306 symtable_params(st, CHILD(n, 2));
5307 body = CHILD(n, NCH(n) - 1);
5308 symtable_node(st, body);
5309}
5310
5311/* The next two functions parse the argument tuple.
5312 symtable_default_arg() checks for names in the default arguments,
5313 which are references in the defining scope. symtable_params()
5314 parses the parameter names, which are defined in the function's
5315 body.
5316
5317 varargslist:
5318 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5319 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5320*/
5321
5322static void
5323symtable_default_args(struct symtable *st, node *n)
5324{
5325 node *c;
5326 int i;
5327
5328 if (TYPE(n) == parameters) {
5329 n = CHILD(n, 1);
5330 if (TYPE(n) == RPAR)
5331 return;
5332 }
5333 REQ(n, varargslist);
5334 for (i = 0; i < NCH(n); i += 2) {
5335 c = CHILD(n, i);
5336 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5337 break;
5338 }
5339 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5340 symtable_node(st, CHILD(n, i));
5341 }
5342}
5343
5344static void
5345symtable_params(struct symtable *st, node *n)
5346{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005347 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005348 node *c = NULL;
5349
5350 if (TYPE(n) == parameters) {
5351 n = CHILD(n, 1);
5352 if (TYPE(n) == RPAR)
5353 return;
5354 }
5355 REQ(n, varargslist);
5356 for (i = 0; i < NCH(n); i += 2) {
5357 c = CHILD(n, i);
5358 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5359 ext = 1;
5360 break;
5361 }
5362 if (TYPE(c) == test) {
5363 continue;
5364 }
5365 if (TYPE(CHILD(c, 0)) == NAME)
5366 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
5367 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005368 char nbuf[30];
5369 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005370 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005371 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005372 }
5373 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005374 if (ext) {
5375 c = CHILD(n, i);
5376 if (TYPE(c) == STAR) {
5377 i++;
5378 symtable_add_def(st, STR(CHILD(n, i)),
5379 DEF_PARAM | DEF_STAR);
5380 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005381 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005382 c = NULL;
5383 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005384 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005385 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005386 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005387 i++;
5388 symtable_add_def(st, STR(CHILD(n, i)),
5389 DEF_PARAM | DEF_DOUBLESTAR);
5390 }
5391 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005392 if (complex >= 0) {
5393 int j;
5394 for (j = 0; j <= complex; j++) {
5395 c = CHILD(n, j);
5396 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005397 c = CHILD(n, ++j);
5398 else if (TYPE(c) == EQUAL)
5399 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005400 if (TYPE(CHILD(c, 0)) == LPAR)
5401 symtable_params_fplist(st, CHILD(c, 1));
5402 }
5403 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005404}
5405
5406static void
5407symtable_params_fplist(struct symtable *st, node *n)
5408{
5409 int i;
5410 node *c;
5411
5412 REQ(n, fplist);
5413 for (i = 0; i < NCH(n); i += 2) {
5414 c = CHILD(n, i);
5415 REQ(c, fpdef);
5416 if (NCH(c) == 1)
5417 symtable_add_def(st, STR(CHILD(c, 0)),
5418 DEF_PARAM | DEF_INTUPLE);
5419 else
5420 symtable_params_fplist(st, CHILD(c, 1));
5421 }
5422
5423}
5424
5425static void
5426symtable_global(struct symtable *st, node *n)
5427{
5428 int i;
5429
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005430 /* XXX It might be helpful to warn about module-level global
5431 statements, but it's hard to tell the difference between
5432 module-level and a string passed to exec.
5433 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005434
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005435 for (i = 1; i < NCH(n); i += 2) {
5436 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005437 int flags;
5438
5439 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005440 if (flags < 0)
5441 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005442 if (flags && flags != DEF_GLOBAL) {
5443 char buf[500];
5444 if (flags & DEF_PARAM) {
5445 PyErr_Format(PyExc_SyntaxError,
5446 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005447 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005448 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005449 st->st_cur->ste_lineno);
5450 st->st_errors++;
5451 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005452 }
5453 else {
5454 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005455 PyOS_snprintf(buf, sizeof(buf),
5456 GLOBAL_AFTER_ASSIGN,
5457 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005458 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005459 PyOS_snprintf(buf, sizeof(buf),
5460 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005461 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005462 }
5463 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005464 symtable_add_def(st, name, DEF_GLOBAL);
5465 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005466}
5467
5468static void
5469symtable_list_comprehension(struct symtable *st, node *n)
5470{
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005471 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005472
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005473 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005474 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005475 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005476 symtable_node(st, CHILD(n, 3));
5477 if (NCH(n) == 5)
5478 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005479}
5480
5481static void
5482symtable_import(struct symtable *st, node *n)
5483{
5484 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005485 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005486 | 'from' dotted_name 'import'
5487 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005488 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005489 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005490 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005491 node *dotname = CHILD(n, 1);
5492 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5493 /* check for bogus imports */
5494 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5495 PyErr_SetString(PyExc_SyntaxError,
5496 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005497 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005498 n->n_lineno);
5499 st->st_errors++;
5500 return;
5501 }
5502 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005503 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005504 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005505 if (symtable_warn(st,
5506 "import * only allowed at module level") < 0)
5507 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005508 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005509 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005510 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005511 } else {
5512 for (i = 3; i < NCH(n); i += 2) {
5513 node *c = CHILD(n, i);
5514 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005515 symtable_assign(st, CHILD(c, 2),
5516 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005517 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005518 symtable_assign(st, CHILD(c, 0),
5519 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005520 }
5521 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005522 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005523 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005524 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005525 }
5526 }
5527}
5528
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005529/* The third argument to symatble_assign() is a flag to be passed to
5530 symtable_add_def() if it is eventually called. The flag is useful
5531 to specify the particular type of assignment that should be
5532 recorded, e.g. an assignment caused by import.
5533 */
5534
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005535static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005536symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005537{
5538 node *tmp;
5539 int i;
5540
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005541 loop:
5542 switch (TYPE(n)) {
5543 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005544 /* invalid assignment, e.g. lambda x:x=2. The next
5545 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005546 return;
5547 case power:
5548 if (NCH(n) > 2) {
5549 for (i = 2; i < NCH(n); ++i)
5550 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5551 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005552 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005553 if (NCH(n) > 1) {
5554 symtable_node(st, CHILD(n, 0));
5555 symtable_node(st, CHILD(n, 1));
5556 } else {
5557 n = CHILD(n, 0);
5558 goto loop;
5559 }
5560 return;
5561 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005562 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5563 /* XXX This is an error, but the next pass
5564 will catch it. */
5565 return;
5566 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005567 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005568 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005569 }
5570 return;
5571 case exprlist:
5572 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00005573 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005574 if (NCH(n) == 1) {
5575 n = CHILD(n, 0);
5576 goto loop;
5577 }
5578 else {
5579 int i;
5580 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005581 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005582 return;
5583 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005584 case atom:
5585 tmp = CHILD(n, 0);
5586 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5587 n = CHILD(n, 1);
5588 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005589 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00005590 if (strcmp(STR(tmp), "__debug__") == 0) {
5591 PyErr_SetString(PyExc_SyntaxError,
5592 ASSIGN_DEBUG);
5593 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton86424e32001-12-04 02:41:46 +00005594 n->n_lineno);
Jeremy Hylton778e2652001-11-09 19:50:08 +00005595 st->st_errors++;
5596 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005597 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005598 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005599 return;
5600 case dotted_as_name:
5601 if (NCH(n) == 3)
5602 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005603 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005604 else
5605 symtable_add_def(st,
5606 STR(CHILD(CHILD(n,
5607 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005608 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005609 return;
5610 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005611 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005612 return;
5613 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005614 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005615 return;
5616 default:
5617 if (NCH(n) == 0)
5618 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005619 if (NCH(n) == 1) {
5620 n = CHILD(n, 0);
5621 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005622 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005623 /* Should only occur for errors like x + 1 = 1,
5624 which will be caught in the next pass. */
5625 for (i = 0; i < NCH(n); ++i)
5626 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005627 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005628 }
5629}