blob: b67193773c7893af74bd9fdcb8565b9b68535e03 [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
410c_lnotab is an array of unsigned bytes disguised as a Python string. In -O
411mode, SET_LINENO opcodes aren't generated, and bytecode offsets are mapped
412to source code line #s (when needed for tracebacks) via c_lnotab instead.
413The array is conceptually a list of
414 (bytecode offset increment, line number increment)
415pairs. The details are important and delicate, best illustrated by example:
416
417 byte code offset source code line number
418 0 1
419 6 2
420 50 7
421 350 307
422 361 308
423
424The first trick is that these numbers aren't stored, only the increments
425from one row to the next (this doesn't really work, but it's a start):
426
427 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
428
429The second trick is that an unsigned byte can't hold negative values, or
430values larger than 255, so (a) there's a deep assumption that byte code
431offsets and their corresponding line #s both increase monotonically, and (b)
432if at least one column jumps by more than 255 from one row to the next, more
433than one pair is written to the table. In case #b, there's no way to know
434from looking at the table later how many were written. That's the delicate
435part. A user of c_lnotab desiring to find the source line number
436corresponding to a bytecode address A should do something like this
437
438 lineno = addr = 0
439 for addr_incr, line_incr in c_lnotab:
440 addr += addr_incr
441 if addr > A:
442 return lineno
443 lineno += line_incr
444
445In order for this to work, when the addr field increments by more than 255,
446the line # increment in each pair generated must be 0 until the remaining addr
447increment is < 256. So, in the example above, com_set_lineno should not (as
448was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
449255, 0, 45, 255, 0, 45.
450*/
451
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000452struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000453 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000454 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000455 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000456 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000457 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000458 PyObject *c_globals; /* dictionary (value=None) */
459 PyObject *c_locals; /* dictionary (value=localID) */
460 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000461 PyObject *c_freevars; /* dictionary (value=None) */
462 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000463 int c_nlocals; /* index of next local */
464 int c_argcount; /* number of top-level arguments */
465 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000466 int c_nexti; /* index into c_code */
467 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000468 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000469 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000470 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000471 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000472 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000473 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000474 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000475 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000476 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000477 int c_stacklevel; /* Current stack level */
478 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000479 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000480 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000481 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000482 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000483 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000484 int c_nested; /* Is block nested funcdef or lamdef? */
485 int c_closure; /* Is nested w/freevars? */
486 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000487 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000488 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000489};
490
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000491static int
492is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000493{
494 if ((v & (USE | DEF_FREE))
495 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
496 return 1;
497 if (v & DEF_FREE_CLASS)
498 return 1;
499 return 0;
500}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000501
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000502static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000503com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000504{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000505 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
506
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000507 if (c == NULL) {
508 /* Error occurred via symtable call to
509 is_constant_false */
510 PyErr_SetString(exc, msg);
511 return;
512 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000513 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000514 if (c->c_lineno < 1 || c->c_interactive) {
515 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000516 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000517 return;
518 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000519 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000520 if (v == NULL)
521 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000522
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000523 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000524 if (line == NULL) {
525 Py_INCREF(Py_None);
526 line = Py_None;
527 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000528 if (exc == PyExc_SyntaxError) {
529 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
530 Py_None, line);
531 if (t == NULL)
532 goto exit;
533 w = Py_BuildValue("(OO)", v, t);
534 if (w == NULL)
535 goto exit;
536 PyErr_SetObject(exc, w);
537 } else {
538 /* Make sure additional exceptions are printed with
539 file and line, also. */
540 PyErr_SetObject(exc, v);
541 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
542 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000543 exit:
544 Py_XDECREF(t);
545 Py_XDECREF(v);
546 Py_XDECREF(w);
547 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000548}
549
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000550/* Interface to the block stack */
551
552static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000553block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000554{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000555 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000556 com_error(c, PyExc_SystemError,
557 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000558 }
559 else {
560 c->c_block[c->c_nblocks++] = type;
561 }
562}
563
564static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000565block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000566{
567 if (c->c_nblocks > 0)
568 c->c_nblocks--;
569 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000570 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000571 }
572}
573
Guido van Rossum681d79a1995-07-18 14:51:37 +0000574/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000575
Tim Petersdbd9ba62000-07-09 03:09:57 +0000576static int com_init(struct compiling *, char *);
577static void com_free(struct compiling *);
578static void com_push(struct compiling *, int);
579static void com_pop(struct compiling *, int);
580static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000581static void com_node(struct compiling *, node *);
582static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000583static void com_addbyte(struct compiling *, int);
584static void com_addint(struct compiling *, int);
585static void com_addoparg(struct compiling *, int, int);
586static void com_addfwref(struct compiling *, int, int *);
587static void com_backpatch(struct compiling *, int);
588static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
589static int com_addconst(struct compiling *, PyObject *);
590static int com_addname(struct compiling *, PyObject *);
591static void com_addopname(struct compiling *, int, node *);
592static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000593static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000594static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000595static void com_assign(struct compiling *, node *, int, node *);
596static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000597static PyCodeObject *icompile(node *, struct compiling *);
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000598static PyCodeObject *jcompile(node *, char *, struct compiling *,
599 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000600static PyObject *parsestrplus(struct compiling*, node *);
601static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000602static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000603
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000604static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000605
606/* symtable operations */
607static int symtable_build(struct compiling *, node *);
608static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000609static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000610static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000611static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000612static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000613static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000614
615static void symtable_node(struct symtable *, node *);
616static void symtable_funcdef(struct symtable *, node *);
617static void symtable_default_args(struct symtable *, node *);
618static void symtable_params(struct symtable *, node *);
619static void symtable_params_fplist(struct symtable *, node *n);
620static void symtable_global(struct symtable *, node *);
621static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000622static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000623static void symtable_list_comprehension(struct symtable *, node *);
624
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000625static int symtable_update_free_vars(struct symtable *);
626static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
627static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
628
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000629/* helper */
630static void
631do_pad(int pad)
632{
633 int i;
634 for (i = 0; i < pad; ++i)
635 fprintf(stderr, " ");
636}
637
638static void
639dump(node *n, int pad, int depth)
640{
641 int i;
642 if (depth == 0)
643 return;
644 do_pad(pad);
645 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
646 if (depth > 0)
647 depth--;
648 for (i = 0; i < NCH(n); ++i)
649 dump(CHILD(n, i), pad + 1, depth);
650}
651
652#define DUMP(N) dump(N, 0, -1)
653
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000654static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000655com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000656{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000657 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000658 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
659 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000660 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000661 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000662 goto fail;
663 if ((c->c_const_dict = PyDict_New()) == NULL)
664 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000665 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000666 goto fail;
667 if ((c->c_name_dict = PyDict_New()) == NULL)
668 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000669 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000670 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000671 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
672 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000673 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000674 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000675 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000676 c->c_freevars = NULL;
677 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000678 c->c_nlocals = 0;
679 c->c_argcount = 0;
680 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000681 c->c_nexti = 0;
682 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000683 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000684 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000685 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000686 c->c_begin = 0;
687 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000688 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000689 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000690 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000691 c->c_stacklevel = 0;
692 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000693 c->c_firstlineno = 0;
694 c->c_last_addr = 0;
695 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000696 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000697 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000698 c->c_nested = 0;
699 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000700 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000701 return 1;
702
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000703 fail:
704 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000705 return 0;
706}
707
708static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000709com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000710{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000711 Py_XDECREF(c->c_code);
712 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000713 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000714 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000715 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000716 Py_XDECREF(c->c_globals);
717 Py_XDECREF(c->c_locals);
718 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000719 Py_XDECREF(c->c_freevars);
720 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000721 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000722 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +0000723 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000724}
725
726static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000727com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000728{
729 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000730 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +0000731 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000732 /*
733 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
734 c->c_filename, c->c_name, c->c_lineno,
735 c->c_nexti, c->c_stacklevel, n);
736 */
737 }
Guido van Rossum8b993a91997-01-17 21:04:03 +0000738}
739
740static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000741com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000742{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000743 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000744 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000745 else
746 c->c_stacklevel -= n;
747}
748
749static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000750com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000751{
752 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000753 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000754 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000755 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000756}
757
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000758static int
759com_check_size(PyObject **s, int offset)
760{
761 int len = PyString_GET_SIZE(*s);
762 if (offset >= len)
763 return _PyString_Resize(s, len * 2);
764 return 0;
765}
766
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000767static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000768com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000769{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000770 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000771 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +0000772 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000773 if (com_check_size(&c->c_code, c->c_nexti)) {
774 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000775 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000776 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000777 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000778}
779
780static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000781com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000782{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000783 com_addbyte(c, x & 0xff);
784 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000785}
786
787static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000788com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000789{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000790 char *p;
791 if (c->c_lnotab == NULL)
792 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000793 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
794 c->c_errors++;
795 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000796 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000797 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000798 *p++ = addr;
799 *p++ = line;
800 c->c_lnotab_next += 2;
801}
802
803static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000804com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000805{
806 c->c_lineno = lineno;
807 if (c->c_firstlineno == 0) {
808 c->c_firstlineno = c->c_last_line = lineno;
809 }
810 else {
811 int incr_addr = c->c_nexti - c->c_last_addr;
812 int incr_line = lineno - c->c_last_line;
Tim Peters2a7f3842001-06-09 09:26:21 +0000813 while (incr_addr > 255) {
814 com_add_lnotab(c, 255, 0);
815 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000816 }
Tim Peters2a7f3842001-06-09 09:26:21 +0000817 while (incr_line > 255) {
818 com_add_lnotab(c, incr_addr, 255);
819 incr_line -=255;
820 incr_addr = 0;
821 }
822 if (incr_addr > 0 || incr_line > 0)
823 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000824 c->c_last_addr = c->c_nexti;
825 c->c_last_line = lineno;
826 }
827}
828
829static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000830com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000831{
Fred Drakeef8ace32000-08-24 00:32:09 +0000832 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000833 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000834 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000835 if (Py_OptimizeFlag)
836 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000837 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000838 if (extended_arg){
839 com_addbyte(c, EXTENDED_ARG);
840 com_addint(c, extended_arg);
841 arg &= 0xffff;
842 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000843 com_addbyte(c, op);
844 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000845}
846
847static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000848com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000849{
850 /* Compile a forward reference for backpatching */
851 int here;
852 int anchor;
853 com_addbyte(c, op);
854 here = c->c_nexti;
855 anchor = *p_anchor;
856 *p_anchor = here;
857 com_addint(c, anchor == 0 ? 0 : here - anchor);
858}
859
860static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000861com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000862{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000863 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000864 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000865 int dist;
866 int prev;
867 for (;;) {
868 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000869 prev = code[anchor] + (code[anchor+1] << 8);
870 dist = target - (anchor+2);
871 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000872 dist >>= 8;
873 code[anchor+1] = dist;
874 dist >>= 8;
875 if (dist) {
876 com_error(c, PyExc_SystemError,
877 "com_backpatch: offset too large");
878 break;
879 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000880 if (!prev)
881 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000882 anchor -= prev;
883 }
884}
885
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000886/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000887
888static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000889com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000890{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000891 PyObject *w, *t, *np=NULL;
892 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000893
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000894 t = Py_BuildValue("(OO)", v, v->ob_type);
895 if (t == NULL)
896 goto fail;
897 w = PyDict_GetItem(dict, t);
898 if (w != NULL) {
899 n = PyInt_AsLong(w);
900 } else {
901 n = PyList_Size(list);
902 np = PyInt_FromLong(n);
903 if (np == NULL)
904 goto fail;
905 if (PyList_Append(list, v) != 0)
906 goto fail;
907 if (PyDict_SetItem(dict, t, np) != 0)
908 goto fail;
909 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000910 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000911 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000912 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000913 fail:
914 Py_XDECREF(np);
915 Py_XDECREF(t);
916 c->c_errors++;
917 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000918}
919
920static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000921com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000922{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000923 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000924}
925
926static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000927com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000928{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000929 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000930}
931
Raymond Hettinger0ae0c072002-06-20 22:23:15 +0000932int
933_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000934{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000935 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000936 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000937 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000938 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
939 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000940 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000941 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000942 return 0; /* Don't mangle __extremely_long_names */
943 if (name[nlen-1] == '_' && name[nlen-2] == '_')
944 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000945 /* Strip leading underscores from class name */
946 while (*p == '_')
947 p++;
948 if (*p == '\0')
949 return 0; /* Don't mangle if class is just underscores */
950 plen = strlen(p);
951 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000952 plen = maxlen-nlen-2; /* Truncate class name if too long */
953 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000954 buffer[0] = '_';
955 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000956 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000957 return 1;
958}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000959
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000960static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000961com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000962{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000963 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000964 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000965 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000966
Raymond Hettinger0ae0c072002-06-20 22:23:15 +0000967 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000968 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000969 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000970 c->c_errors++;
971 i = 255;
972 }
973 else {
974 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000975 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000976 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000977 com_addoparg(c, op, i);
978}
979
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000980#define NAME_LOCAL 0
981#define NAME_GLOBAL 1
982#define NAME_DEFAULT 2
983#define NAME_CLOSURE 3
984
985static int
986com_lookup_arg(PyObject *dict, PyObject *name)
987{
988 PyObject *v = PyDict_GetItem(dict, name);
989 if (v == NULL)
990 return -1;
991 else
992 return PyInt_AS_LONG(v);
993}
994
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000995static void
996com_addop_varname(struct compiling *c, int kind, char *name)
997{
998 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000999 int i, reftype;
1000 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001001 int op = STOP_CODE;
1002 char buffer[MANGLE_LEN];
1003
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001004 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001005 name = buffer;
1006 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1007 c->c_errors++;
1008 i = 255;
1009 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001010 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001011
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001012 reftype = get_ref_type(c, name);
1013 switch (reftype) {
1014 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001015 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001016 scope = NAME_LOCAL;
1017 break;
1018 case GLOBAL_EXPLICIT:
1019 scope = NAME_GLOBAL;
1020 break;
1021 case GLOBAL_IMPLICIT:
1022 if (c->c_flags & CO_OPTIMIZED)
1023 scope = NAME_GLOBAL;
1024 break;
1025 case FREE:
1026 case CELL:
1027 scope = NAME_CLOSURE;
1028 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001029 }
1030
1031 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001032 if (scope == NAME_LOCAL)
1033 i = com_lookup_arg(c->c_locals, v);
1034 else if (reftype == FREE)
1035 i = com_lookup_arg(c->c_freevars, v);
1036 else if (reftype == CELL)
1037 i = com_lookup_arg(c->c_cellvars, v);
1038 if (i == -1) {
1039 c->c_errors++; /* XXX no exception set */
1040 i = 255;
1041 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001042 }
1043 Py_DECREF(v);
1044
1045 switch (kind) {
1046 case VAR_LOAD:
1047 switch (scope) {
1048 case NAME_LOCAL:
1049 op = LOAD_FAST;
1050 break;
1051 case NAME_GLOBAL:
1052 op = LOAD_GLOBAL;
1053 break;
1054 case NAME_DEFAULT:
1055 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001056 break;
1057 case NAME_CLOSURE:
1058 op = LOAD_DEREF;
1059 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001060 }
1061 break;
1062 case VAR_STORE:
1063 switch (scope) {
1064 case NAME_LOCAL:
1065 op = STORE_FAST;
1066 break;
1067 case NAME_GLOBAL:
1068 op = STORE_GLOBAL;
1069 break;
1070 case NAME_DEFAULT:
1071 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001072 break;
1073 case NAME_CLOSURE:
1074 op = STORE_DEREF;
1075 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001076 }
1077 break;
1078 case VAR_DELETE:
1079 switch (scope) {
1080 case NAME_LOCAL:
1081 op = DELETE_FAST;
1082 break;
1083 case NAME_GLOBAL:
1084 op = DELETE_GLOBAL;
1085 break;
1086 case NAME_DEFAULT:
1087 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001088 break;
1089 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001090 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001091 PyOS_snprintf(buf, sizeof(buf),
1092 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001093 com_error(c, PyExc_SyntaxError, buf);
1094 i = 255;
1095 break;
1096 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001097 }
1098 break;
1099 }
1100done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001101 com_addoparg(c, op, i);
1102}
1103
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001104static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001105com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001106{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001107 char *name;
1108 char buffer[1000];
1109 /* XXX it is possible to write this code without the 1000
1110 chars on the total length of dotted names, I just can't be
1111 bothered right now */
1112 if (TYPE(n) == STAR)
1113 name = "*";
1114 else if (TYPE(n) == dotted_name) {
1115 char *p = buffer;
1116 int i;
1117 name = buffer;
1118 for (i = 0; i < NCH(n); i += 2) {
1119 char *s = STR(CHILD(n, i));
1120 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001121 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001122 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001123 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001124 break;
1125 }
1126 if (p != buffer)
1127 *p++ = '.';
1128 strcpy(p, s);
1129 p = strchr(p, '\0');
1130 }
1131 }
1132 else {
1133 REQ(n, NAME);
1134 name = STR(n);
1135 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001136 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001137}
1138
Guido van Rossum79f25d91997-04-29 20:08:16 +00001139static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001140parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001141{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001142 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001143 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001144 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001145#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +00001146 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +00001147 int imflag;
1148#endif
1149
Guido van Rossum282914b1991-04-04 10:42:56 +00001150 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001151 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001152#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001153 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001154#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001155 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001156 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001157 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001158 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001159 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001160 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001161 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001162 if (errno != 0)
1163 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001164 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001165 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001166 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001167#ifndef WITHOUT_COMPLEX
1168 if (imflag) {
1169 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001170 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001171 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001172 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001173 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001174 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001175 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001176#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001177 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001178 PyFPE_START_PROTECT("atof", return 0)
1179 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001180 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001181 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001182 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001183}
1184
Guido van Rossum79f25d91997-04-29 20:08:16 +00001185static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001186decode_utf8(char **sPtr, char *end, char* encoding)
1187{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001188#ifndef Py_USING_UNICODE
1189 abort();
1190#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001191 PyObject *u, *v;
1192 char *s, *t;
1193 t = s = *sPtr;
1194 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1195 while (s < end && (*s & 0x80)) s++;
1196 *sPtr = s;
1197 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1198 if (u == NULL)
1199 return NULL;
1200 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1201 Py_DECREF(u);
1202 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001203#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001204}
1205
1206static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001207parsestr(struct compiling *com, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001208{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001209 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001210 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001211 char *buf;
1212 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001213 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001214 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001215 int first = *s;
1216 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001217 int rawmode = 0;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001218 char* encoding = ((com == NULL) ? NULL : com->c_encoding);
1219 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001220 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001221
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001222 if (isalpha(quote) || quote == '_') {
1223 if (quote == 'u' || quote == 'U') {
1224 quote = *++s;
1225 unicode = 1;
1226 }
1227 if (quote == 'r' || quote == 'R') {
1228 quote = *++s;
1229 rawmode = 1;
1230 }
1231 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001232 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001233 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001234 return NULL;
1235 }
1236 s++;
1237 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001238 if (len > INT_MAX) {
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001239 com_error(com, PyExc_OverflowError,
1240 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001241 return NULL;
1242 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001243 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001244 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001245 return NULL;
1246 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001247 if (len >= 4 && s[0] == quote && s[1] == quote) {
1248 s += 2;
1249 len -= 2;
1250 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001251 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001252 return NULL;
1253 }
1254 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001255#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001256 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001257 PyObject *u, *w;
1258 if (encoding == NULL) {
1259 buf = s;
1260 u = NULL;
1261 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1262 buf = s;
1263 u = NULL;
1264 } else {
1265 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1266 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1267 if (u == NULL)
1268 return NULL;
1269 p = buf = PyString_AsString(u);
1270 end = s + len;
1271 while (s < end) {
1272 if (*s == '\\') {
1273 *p++ = *s++;
1274 if (*s & 0x80) {
1275 strcpy(p, "u005c");
1276 p += 5;
1277 }
1278 }
1279 if (*s & 0x80) { /* XXX inefficient */
1280 char *r;
1281 int rn, i;
1282 w = decode_utf8(&s, end, "utf-16-be");
1283 if (w == NULL) {
1284 Py_DECREF(u);
1285 return NULL;
1286 }
1287 r = PyString_AsString(w);
1288 rn = PyString_Size(w);
1289 assert(rn % 2 == 0);
1290 for (i = 0; i < rn; i += 2) {
1291 sprintf(p, "\\u%02x%02x",
1292 r[i + 0] & 0xFF,
1293 r[i + 1] & 0xFF);
1294 p += 6;
1295 }
1296 Py_DECREF(w);
1297 } else {
1298 *p++ = *s++;
1299 }
1300 }
1301 len = p - buf;
1302 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001303 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001304 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001305 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001306 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1307 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001308 if (v == NULL)
1309 PyErr_SyntaxLocation(com->c_filename, com->c_lineno);
1310 return v;
1311
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001312 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001313#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001314 need_encoding = (encoding != NULL &&
1315 strcmp(encoding, "utf-8") != 0 &&
1316 strcmp(encoding, "iso-8859-1") != 0);
1317 if (rawmode || strchr(s, '\\') == NULL) {
1318 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001319#ifndef Py_USING_UNICODE
1320 /* This should not happen - we never see any other
1321 encoding. */
1322 abort();
1323#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001324 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1325 if (u == NULL)
1326 return NULL;
1327 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1328 Py_DECREF(u);
1329 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001330#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001331 } else {
1332 return PyString_FromStringAndSize(s, len);
1333 }
1334 }
1335 v = PyString_FromStringAndSize((char *)NULL, /* XXX 4 is enough? */
1336 need_encoding ? len * 4 : len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001337 if (v == NULL)
1338 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001339 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001340 end = s + len;
1341 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001342 if (*s != '\\') {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001343 ORDINAL:
1344 if (need_encoding && (*s & 0x80)) {
1345 char *r;
1346 int rn;
1347 PyObject* w = decode_utf8(&s, end, encoding);
1348 if (w == NULL)
1349 return NULL;
1350 r = PyString_AsString(w);
1351 rn = PyString_Size(w);
1352 memcpy(p, r, rn);
1353 p += rn;
1354 Py_DECREF(w);
1355 } else {
1356 *p++ = *s++;
1357 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001358 continue;
1359 }
1360 s++;
1361 switch (*s++) {
1362 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001363 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001364 case '\\': *p++ = '\\'; break;
1365 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001366 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001367 case 'b': *p++ = '\b'; break;
1368 case 'f': *p++ = '\014'; break; /* FF */
1369 case 't': *p++ = '\t'; break;
1370 case 'n': *p++ = '\n'; break;
1371 case 'r': *p++ = '\r'; break;
1372 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001373 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1374 case '0': case '1': case '2': case '3':
1375 case '4': case '5': case '6': case '7':
1376 c = s[-1] - '0';
1377 if ('0' <= *s && *s <= '7') {
1378 c = (c<<3) + *s++ - '0';
1379 if ('0' <= *s && *s <= '7')
1380 c = (c<<3) + *s++ - '0';
1381 }
1382 *p++ = c;
1383 break;
1384 case 'x':
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001385 if (isxdigit(Py_CHARMASK(s[0]))
1386 && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +00001387 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001388 c = Py_CHARMASK(*s);
1389 s++;
1390 if (isdigit(c))
1391 x = c - '0';
1392 else if (islower(c))
1393 x = 10 + c - 'a';
1394 else
1395 x = 10 + c - 'A';
1396 x = x << 4;
1397 c = Py_CHARMASK(*s);
1398 s++;
1399 if (isdigit(c))
1400 x += c - '0';
1401 else if (islower(c))
1402 x += 10 + c - 'a';
1403 else
1404 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +00001405 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001406 break;
1407 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001408 Py_DECREF(v);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001409 com_error(com, PyExc_ValueError,
1410 "invalid \\x escape");
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001411 return NULL;
Guido van Rossum05459c52002-05-28 18:47:29 +00001412#ifndef Py_USING_UNICODE
1413 case 'u':
1414 case 'U':
1415 case 'N':
1416 if (unicode) {
1417 Py_DECREF(v);
1418 com_error(com, PyExc_ValueError,
1419 "Unicode escapes not legal "
1420 "when Unicode disabled");
1421 return NULL;
1422 }
1423#endif
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001424 default:
1425 *p++ = '\\';
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001426 s--;
1427 goto ORDINAL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001428 }
1429 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001430 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001431 return v;
1432}
1433
Guido van Rossum79f25d91997-04-29 20:08:16 +00001434static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001435parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001436{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001437 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001438 int i;
1439 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001440 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001441 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001442 for (i = 1; i < NCH(n); i++) {
1443 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001444 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001445 if (s == NULL)
1446 goto onError;
1447 if (PyString_Check(v) && PyString_Check(s)) {
1448 PyString_ConcatAndDel(&v, s);
1449 if (v == NULL)
1450 goto onError;
1451 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001452#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001453 else {
1454 PyObject *temp;
1455 temp = PyUnicode_Concat(v, s);
1456 Py_DECREF(s);
1457 if (temp == NULL)
1458 goto onError;
1459 Py_DECREF(v);
1460 v = temp;
1461 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001462#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001463 }
1464 }
1465 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001466
1467 onError:
1468 Py_XDECREF(v);
1469 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001470}
1471
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001472static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001473com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001474{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001475 int anchor = 0;
1476 int save_begin = c->c_begin;
1477
1478 /* list_iter: for v in expr [list_iter] */
1479 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001480 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001481 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001482 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001483 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001484 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001485 c->c_loops++;
1486 com_list_iter(c, n, e, t);
1487 c->c_loops--;
1488 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1489 c->c_begin = save_begin;
1490 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001491 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001492}
1493
1494static void
1495com_list_if(struct compiling *c, node *n, node *e, char *t)
1496{
1497 int anchor = 0;
1498 int a = 0;
1499 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001500 com_node(c, CHILD(n, 1));
1501 com_addfwref(c, JUMP_IF_FALSE, &a);
1502 com_addbyte(c, POP_TOP);
1503 com_pop(c, 1);
1504 com_list_iter(c, n, e, t);
1505 com_addfwref(c, JUMP_FORWARD, &anchor);
1506 com_backpatch(c, a);
1507 /* We jump here with an extra entry which we now pop */
1508 com_addbyte(c, POP_TOP);
1509 com_backpatch(c, anchor);
1510}
1511
1512static void
1513com_list_iter(struct compiling *c,
1514 node *p, /* parent of list_iter node */
1515 node *e, /* element expression node */
1516 char *t /* name of result list temp local */)
1517{
1518 /* list_iter is the last child in a listmaker, list_for, or list_if */
1519 node *n = CHILD(p, NCH(p)-1);
1520 if (TYPE(n) == list_iter) {
1521 n = CHILD(n, 0);
1522 switch (TYPE(n)) {
1523 case list_for:
1524 com_list_for(c, n, e, t);
1525 break;
1526 case list_if:
1527 com_list_if(c, n, e, t);
1528 break;
1529 default:
1530 com_error(c, PyExc_SystemError,
1531 "invalid list_iter node type");
1532 }
1533 }
1534 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001535 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001536 com_push(c, 1);
1537 com_node(c, e);
1538 com_addoparg(c, CALL_FUNCTION, 1);
1539 com_addbyte(c, POP_TOP);
1540 com_pop(c, 2);
1541 }
1542}
1543
1544static void
1545com_list_comprehension(struct compiling *c, node *n)
1546{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001547 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001548 char tmpname[30];
1549 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001550 com_addoparg(c, BUILD_LIST, 0);
1551 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1552 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001553 com_addop_name(c, LOAD_ATTR, "append");
1554 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001555 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001556 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001557 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001558 --c->c_tmpname;
1559}
1560
1561static void
1562com_listmaker(struct compiling *c, node *n)
1563{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001564 /* listmaker: test ( list_for | (',' test)* [','] ) */
1565 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001566 com_list_comprehension(c, n);
1567 else {
1568 int len = 0;
1569 int i;
1570 for (i = 0; i < NCH(n); i += 2, len++)
1571 com_node(c, CHILD(n, i));
1572 com_addoparg(c, BUILD_LIST, len);
1573 com_pop(c, len-1);
1574 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001575}
1576
1577static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001578com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001579{
1580 int i;
1581 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1582 for (i = 0; i+2 < NCH(n); i += 4) {
1583 /* We must arrange things just right for STORE_SUBSCR.
1584 It wants the stack to look like (value) (dict) (key) */
1585 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001586 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001587 com_node(c, CHILD(n, i+2)); /* value */
1588 com_addbyte(c, ROT_TWO);
1589 com_node(c, CHILD(n, i)); /* key */
1590 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001591 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001592 }
1593}
1594
1595static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001596com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001597{
1598 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001599 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001600 int i;
1601 REQ(n, atom);
1602 ch = CHILD(n, 0);
1603 switch (TYPE(ch)) {
1604 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001605 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001606 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001607 com_push(c, 1);
1608 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001609 else
1610 com_node(c, CHILD(n, 1));
1611 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001612 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001613 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001614 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001615 com_push(c, 1);
1616 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001617 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001618 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001619 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001620 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001621 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001622 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001623 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001624 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001625 break;
1626 case BACKQUOTE:
1627 com_node(c, CHILD(n, 1));
1628 com_addbyte(c, UNARY_CONVERT);
1629 break;
1630 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001631 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001632 i = 255;
1633 }
1634 else {
1635 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001636 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001637 }
1638 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001639 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001640 break;
1641 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001642 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001643 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001644 c->c_errors++;
1645 i = 255;
1646 }
1647 else {
1648 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001649 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001650 }
1651 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001652 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001653 break;
1654 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001655 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001656 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001657 break;
1658 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001659 com_error(c, PyExc_SystemError,
1660 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001661 }
1662}
1663
1664static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001665com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001666{
1667 if (NCH(n) == 1) {
1668 com_addbyte(c, op);
1669 }
1670 else if (NCH(n) == 2) {
1671 if (TYPE(CHILD(n, 0)) != COLON) {
1672 com_node(c, CHILD(n, 0));
1673 com_addbyte(c, op+1);
1674 }
1675 else {
1676 com_node(c, CHILD(n, 1));
1677 com_addbyte(c, op+2);
1678 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001679 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001680 }
1681 else {
1682 com_node(c, CHILD(n, 0));
1683 com_node(c, CHILD(n, 2));
1684 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001685 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001686 }
1687}
1688
Guido van Rossum635abd21997-01-06 22:56:52 +00001689static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001690com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1691{
1692 if (NCH(n) == 1) {
1693 com_addbyte(c, DUP_TOP);
1694 com_push(c, 1);
1695 com_addbyte(c, SLICE);
1696 com_node(c, augn);
1697 com_addbyte(c, opcode);
1698 com_pop(c, 1);
1699 com_addbyte(c, ROT_TWO);
1700 com_addbyte(c, STORE_SLICE);
1701 com_pop(c, 2);
1702 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1703 com_node(c, CHILD(n, 0));
1704 com_addoparg(c, DUP_TOPX, 2);
1705 com_push(c, 2);
1706 com_addbyte(c, SLICE+1);
1707 com_pop(c, 1);
1708 com_node(c, augn);
1709 com_addbyte(c, opcode);
1710 com_pop(c, 1);
1711 com_addbyte(c, ROT_THREE);
1712 com_addbyte(c, STORE_SLICE+1);
1713 com_pop(c, 3);
1714 } else if (NCH(n) == 2) {
1715 com_node(c, CHILD(n, 1));
1716 com_addoparg(c, DUP_TOPX, 2);
1717 com_push(c, 2);
1718 com_addbyte(c, SLICE+2);
1719 com_pop(c, 1);
1720 com_node(c, augn);
1721 com_addbyte(c, opcode);
1722 com_pop(c, 1);
1723 com_addbyte(c, ROT_THREE);
1724 com_addbyte(c, STORE_SLICE+2);
1725 com_pop(c, 3);
1726 } else {
1727 com_node(c, CHILD(n, 0));
1728 com_node(c, CHILD(n, 2));
1729 com_addoparg(c, DUP_TOPX, 3);
1730 com_push(c, 3);
1731 com_addbyte(c, SLICE+3);
1732 com_pop(c, 2);
1733 com_node(c, augn);
1734 com_addbyte(c, opcode);
1735 com_pop(c, 1);
1736 com_addbyte(c, ROT_FOUR);
1737 com_addbyte(c, STORE_SLICE+3);
1738 com_pop(c, 4);
1739 }
1740}
1741
1742static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001743com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001744{
1745 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001746 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001747 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001748 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001749 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001750 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001751 }
1752 else {
1753 com_node(c, CHILD(n, 0));
1754 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001755 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001756 }
1757 m = n;
1758 do {
1759 m = CHILD(m, 0);
1760 } while (NCH(m) == 1);
1761 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001762 /* f(lambda x: x[0] = 3) ends up getting parsed with
1763 * LHS test = lambda x: x[0], and RHS test = 3.
1764 * SF bug 132313 points out that complaining about a keyword
1765 * then is very confusing.
1766 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001767 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001768 TYPE(m) == lambdef ?
1769 "lambda cannot contain assignment" :
1770 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001771 }
1772 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001773 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001774 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001775 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001776 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001777 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001778 else if (*pkeywords == NULL) {
1779 c->c_errors++;
1780 Py_DECREF(v);
1781 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001782 if (PyDict_GetItem(*pkeywords, v) != NULL)
1783 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001784 "duplicate keyword argument");
1785 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001786 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001787 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001788 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001789 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001790 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001791 }
1792 }
1793 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001794}
1795
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001796static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001797com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001798{
1799 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001800 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001801 }
1802 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001803 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001804 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001805 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001806 int star_flag = 0;
1807 int starstar_flag = 0;
1808 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001809 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001810 na = 0;
1811 nk = 0;
1812 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001813 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001814 if (TYPE(ch) == STAR ||
1815 TYPE(ch) == DOUBLESTAR)
1816 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001817 if (ch->n_lineno != lineno) {
1818 lineno = ch->n_lineno;
1819 com_addoparg(c, SET_LINENO, lineno);
1820 }
1821 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001822 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001823 na++;
1824 else
1825 nk++;
1826 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001827 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001828 while (i < NCH(n)) {
1829 node *tok = CHILD(n, i);
1830 node *ch = CHILD(n, i+1);
1831 i += 3;
1832 switch (TYPE(tok)) {
1833 case STAR: star_flag = 1; break;
1834 case DOUBLESTAR: starstar_flag = 1; break;
1835 }
1836 com_node(c, ch);
1837 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001838 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001839 com_error(c, PyExc_SyntaxError,
1840 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001841 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001842 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001843 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001844 star_flag + (starstar_flag << 1);
1845 else
1846 opcode = CALL_FUNCTION;
1847 com_addoparg(c, opcode, na | (nk << 8));
1848 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001849 }
1850}
1851
1852static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001853com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001854{
1855 com_addopname(c, LOAD_ATTR, n);
1856}
1857
1858static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001859com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001860{
1861 int i=0;
1862 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001863 node *ch;
1864
1865 /* first argument */
1866 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001867 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001868 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001869 i++;
1870 }
1871 else {
1872 com_node(c, CHILD(n,i));
1873 i++;
1874 REQ(CHILD(n,i),COLON);
1875 i++;
1876 }
1877 /* second argument */
1878 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1879 com_node(c, CHILD(n,i));
1880 i++;
1881 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001882 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001883 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001884 com_push(c, 1);
1885 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001886 /* remaining arguments */
1887 for (; i < NCH(n); i++) {
1888 ns++;
1889 ch=CHILD(n,i);
1890 REQ(ch, sliceop);
1891 if (NCH(ch) == 1) {
1892 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001893 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001894 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001895 }
1896 else
1897 com_node(c, CHILD(ch,1));
1898 }
1899 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001900 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001901}
1902
1903static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001904com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001905{
1906 node *ch;
1907 REQ(n, subscript);
1908 ch = CHILD(n,0);
1909 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001910 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001911 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001912 com_push(c, 1);
1913 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001914 else {
1915 /* check for slice */
1916 if ((TYPE(ch) == COLON || NCH(n) > 1))
1917 com_sliceobj(c, n);
1918 else {
1919 REQ(ch, test);
1920 com_node(c, ch);
1921 }
1922 }
1923}
1924
1925static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001926com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001927{
1928 int i, op;
1929 REQ(n, subscriptlist);
1930 /* Check to make backward compatible slice behavior for '[i:j]' */
1931 if (NCH(n) == 1) {
1932 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001933 /* 'Basic' slice, should have exactly one colon. */
1934 if ((TYPE(CHILD(sub, 0)) == COLON
1935 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1936 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1937 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001938 switch (assigning) {
1939 case OP_DELETE:
1940 op = DELETE_SLICE;
1941 break;
1942 case OP_ASSIGN:
1943 op = STORE_SLICE;
1944 break;
1945 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001946 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001947 break;
1948 default:
1949 com_augassign_slice(c, sub, assigning, augn);
1950 return;
1951 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001952 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001953 if (op == STORE_SLICE)
1954 com_pop(c, 2);
1955 else if (op == DELETE_SLICE)
1956 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001957 return;
1958 }
1959 }
1960 /* Else normal subscriptlist. Compile each subscript. */
1961 for (i = 0; i < NCH(n); i += 2)
1962 com_subscript(c, CHILD(n, i));
1963 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001964 if (NCH(n) > 1) {
1965 i = (NCH(n)+1) / 2;
1966 com_addoparg(c, BUILD_TUPLE, i);
1967 com_pop(c, i-1);
1968 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001969 switch (assigning) {
1970 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001971 op = DELETE_SUBSCR;
1972 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001973 break;
1974 default:
1975 case OP_ASSIGN:
1976 op = STORE_SUBSCR;
1977 i = 3;
1978 break;
1979 case OP_APPLY:
1980 op = BINARY_SUBSCR;
1981 i = 1;
1982 break;
1983 }
1984 if (assigning > OP_APPLY) {
1985 com_addoparg(c, DUP_TOPX, 2);
1986 com_push(c, 2);
1987 com_addbyte(c, BINARY_SUBSCR);
1988 com_pop(c, 1);
1989 com_node(c, augn);
1990 com_addbyte(c, assigning);
1991 com_pop(c, 1);
1992 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001993 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001994 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001995 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001996}
1997
1998static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001999com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002000{
2001 REQ(n, trailer);
2002 switch (TYPE(CHILD(n, 0))) {
2003 case LPAR:
2004 com_call_function(c, CHILD(n, 1));
2005 break;
2006 case DOT:
2007 com_select_member(c, CHILD(n, 1));
2008 break;
2009 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002010 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002011 break;
2012 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002013 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002014 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002015 }
2016}
2017
2018static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002019com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002020{
2021 int i;
2022 REQ(n, power);
2023 com_atom(c, CHILD(n, 0));
2024 for (i = 1; i < NCH(n); i++) {
2025 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2026 com_factor(c, CHILD(n, i+1));
2027 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002028 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002029 break;
2030 }
2031 else
2032 com_apply_trailer(c, CHILD(n, i));
2033 }
2034}
2035
2036static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002037com_invert_constant(struct compiling *c, node *n)
2038{
2039 /* Compute the inverse of int and longs and use them directly,
2040 but be prepared to generate code for all other
2041 possibilities (invalid numbers, floats, complex).
2042 */
2043 PyObject *num, *inv = NULL;
2044 int i;
2045
2046 REQ(n, NUMBER);
2047 num = parsenumber(c, STR(n));
2048 if (num == NULL)
2049 i = 255;
2050 else {
2051 inv = PyNumber_Invert(num);
2052 if (inv == NULL) {
2053 PyErr_Clear();
2054 i = com_addconst(c, num);
2055 } else {
2056 i = com_addconst(c, inv);
2057 Py_DECREF(inv);
2058 }
2059 Py_DECREF(num);
2060 }
2061 com_addoparg(c, LOAD_CONST, i);
2062 com_push(c, 1);
2063 if (num != NULL && inv == NULL)
2064 com_addbyte(c, UNARY_INVERT);
2065}
2066
Tim Peters51e26512001-09-07 08:45:55 +00002067static int
2068is_float_zero(const char *p)
2069{
2070 int found_radix_point = 0;
2071 int ch;
2072 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2073 switch (ch) {
2074 case '0':
2075 /* no reason to believe it's not 0 -- continue */
2076 break;
2077
2078 case 'e': case 'E': case 'j': case 'J':
2079 /* If this was a hex constant, we already would have
2080 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2081 must be an exponent marker, and we haven't yet
2082 seen a non-zero digit, and it doesn't matter what
2083 the exponent is then. For 'j' or 'J' similarly,
2084 except that this is an imaginary 0 then. */
2085 return 1;
2086
2087 case '.':
2088 found_radix_point = 1;
2089 break;
2090
2091 default:
2092 return 0;
2093 }
2094 }
2095 return found_radix_point;
2096}
2097
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002098static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002099com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002100{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002101 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002102 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002103 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002104 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002105 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002106 approriate value as a constant. If the value is negative,
2107 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002108 negative in the 0th position -- unless we're doing unary minus
2109 of a floating zero! In that case the sign is significant, but
2110 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002111 */
2112 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002113 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002114 && TYPE((pfactor = CHILD(n, 1))) == factor
2115 && NCH(pfactor) == 1
2116 && TYPE((ppower = CHILD(pfactor, 0))) == power
2117 && NCH(ppower) == 1
2118 && TYPE((patom = CHILD(ppower, 0))) == atom
2119 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
2120 && !(childtype == MINUS && is_float_zero(STR(pnum)))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002121 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002122 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002123 return;
2124 }
2125 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002126 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002127 if (s == NULL) {
2128 com_error(c, PyExc_MemoryError, "");
2129 com_addbyte(c, 255);
2130 return;
2131 }
2132 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002133 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002134 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002135 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002136 }
Tim Peters51e26512001-09-07 08:45:55 +00002137 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002138 }
2139 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002140 com_factor(c, CHILD(n, 1));
2141 com_addbyte(c, UNARY_POSITIVE);
2142 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002143 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002144 com_factor(c, CHILD(n, 1));
2145 com_addbyte(c, UNARY_NEGATIVE);
2146 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002147 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002148 com_factor(c, CHILD(n, 1));
2149 com_addbyte(c, UNARY_INVERT);
2150 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002151 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002152 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002153 }
2154}
2155
2156static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002157com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002158{
2159 int i;
2160 int op;
2161 REQ(n, term);
2162 com_factor(c, CHILD(n, 0));
2163 for (i = 2; i < NCH(n); i += 2) {
2164 com_factor(c, CHILD(n, i));
2165 switch (TYPE(CHILD(n, i-1))) {
2166 case STAR:
2167 op = BINARY_MULTIPLY;
2168 break;
2169 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002170 if (c->c_flags & CO_FUTURE_DIVISION)
2171 op = BINARY_TRUE_DIVIDE;
2172 else
2173 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002174 break;
2175 case PERCENT:
2176 op = BINARY_MODULO;
2177 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002178 case DOUBLESLASH:
2179 op = BINARY_FLOOR_DIVIDE;
2180 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002181 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002182 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002183 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002184 op = 255;
2185 }
2186 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002187 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002188 }
2189}
2190
2191static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002192com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002193{
2194 int i;
2195 int op;
2196 REQ(n, arith_expr);
2197 com_term(c, CHILD(n, 0));
2198 for (i = 2; i < NCH(n); i += 2) {
2199 com_term(c, CHILD(n, i));
2200 switch (TYPE(CHILD(n, i-1))) {
2201 case PLUS:
2202 op = BINARY_ADD;
2203 break;
2204 case MINUS:
2205 op = BINARY_SUBTRACT;
2206 break;
2207 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002208 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002209 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002210 op = 255;
2211 }
2212 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002213 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002214 }
2215}
2216
2217static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002218com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002219{
2220 int i;
2221 int op;
2222 REQ(n, shift_expr);
2223 com_arith_expr(c, CHILD(n, 0));
2224 for (i = 2; i < NCH(n); i += 2) {
2225 com_arith_expr(c, CHILD(n, i));
2226 switch (TYPE(CHILD(n, i-1))) {
2227 case LEFTSHIFT:
2228 op = BINARY_LSHIFT;
2229 break;
2230 case RIGHTSHIFT:
2231 op = BINARY_RSHIFT;
2232 break;
2233 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002234 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002235 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002236 op = 255;
2237 }
2238 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002239 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002240 }
2241}
2242
2243static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002244com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002245{
2246 int i;
2247 int op;
2248 REQ(n, and_expr);
2249 com_shift_expr(c, CHILD(n, 0));
2250 for (i = 2; i < NCH(n); i += 2) {
2251 com_shift_expr(c, CHILD(n, i));
2252 if (TYPE(CHILD(n, i-1)) == AMPER) {
2253 op = BINARY_AND;
2254 }
2255 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002256 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002257 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002258 op = 255;
2259 }
2260 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002261 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002262 }
2263}
2264
2265static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002266com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002267{
2268 int i;
2269 int op;
2270 REQ(n, xor_expr);
2271 com_and_expr(c, CHILD(n, 0));
2272 for (i = 2; i < NCH(n); i += 2) {
2273 com_and_expr(c, CHILD(n, i));
2274 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2275 op = BINARY_XOR;
2276 }
2277 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002278 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002279 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002280 op = 255;
2281 }
2282 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002283 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002284 }
2285}
2286
2287static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002288com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002289{
2290 int i;
2291 int op;
2292 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002293 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002294 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002295 com_xor_expr(c, CHILD(n, i));
2296 if (TYPE(CHILD(n, i-1)) == VBAR) {
2297 op = BINARY_OR;
2298 }
2299 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002300 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002301 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002302 op = 255;
2303 }
2304 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002305 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002306 }
2307}
2308
2309static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002310cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002311{
2312 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00002313 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002314 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2315 if (NCH(n) == 1) {
2316 n = CHILD(n, 0);
2317 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002318 case LESS: return PyCmp_LT;
2319 case GREATER: return PyCmp_GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002320 case EQEQUAL: /* == */
Martin v. Löwis7198a522002-01-01 19:59:11 +00002321 case EQUAL: return PyCmp_EQ;
2322 case LESSEQUAL: return PyCmp_LE;
2323 case GREATEREQUAL: return PyCmp_GE;
2324 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2325 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2326 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002327 }
2328 }
2329 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002330 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002331 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002332 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002333 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002334 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002335 }
2336 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002337 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002338}
2339
2340static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002341com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002342{
2343 int i;
2344 enum cmp_op op;
2345 int anchor;
2346 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2347 com_expr(c, CHILD(n, 0));
2348 if (NCH(n) == 1)
2349 return;
2350
2351 /****************************************************************
2352 The following code is generated for all but the last
2353 comparison in a chain:
2354
2355 label: on stack: opcode: jump to:
2356
2357 a <code to load b>
2358 a, b DUP_TOP
2359 a, b, b ROT_THREE
2360 b, a, b COMPARE_OP
2361 b, 0-or-1 JUMP_IF_FALSE L1
2362 b, 1 POP_TOP
2363 b
2364
2365 We are now ready to repeat this sequence for the next
2366 comparison in the chain.
2367
2368 For the last we generate:
2369
2370 b <code to load c>
2371 b, c COMPARE_OP
2372 0-or-1
2373
2374 If there were any jumps to L1 (i.e., there was more than one
2375 comparison), we generate:
2376
2377 0-or-1 JUMP_FORWARD L2
2378 L1: b, 0 ROT_TWO
2379 0, b POP_TOP
2380 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002381 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002382 ****************************************************************/
2383
2384 anchor = 0;
2385
2386 for (i = 2; i < NCH(n); i += 2) {
2387 com_expr(c, CHILD(n, i));
2388 if (i+2 < NCH(n)) {
2389 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002390 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002391 com_addbyte(c, ROT_THREE);
2392 }
2393 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002394 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002395 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002396 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002397 }
2398 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002399 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002400 if (i+2 < NCH(n)) {
2401 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2402 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002403 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002404 }
2405 }
2406
2407 if (anchor) {
2408 int anchor2 = 0;
2409 com_addfwref(c, JUMP_FORWARD, &anchor2);
2410 com_backpatch(c, anchor);
2411 com_addbyte(c, ROT_TWO);
2412 com_addbyte(c, POP_TOP);
2413 com_backpatch(c, anchor2);
2414 }
2415}
2416
2417static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002418com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002419{
2420 REQ(n, not_test); /* 'not' not_test | comparison */
2421 if (NCH(n) == 1) {
2422 com_comparison(c, CHILD(n, 0));
2423 }
2424 else {
2425 com_not_test(c, CHILD(n, 1));
2426 com_addbyte(c, UNARY_NOT);
2427 }
2428}
2429
2430static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002431com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002432{
2433 int i;
2434 int anchor;
2435 REQ(n, and_test); /* not_test ('and' not_test)* */
2436 anchor = 0;
2437 i = 0;
2438 for (;;) {
2439 com_not_test(c, CHILD(n, i));
2440 if ((i += 2) >= NCH(n))
2441 break;
2442 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2443 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002444 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002445 }
2446 if (anchor)
2447 com_backpatch(c, anchor);
2448}
2449
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002450static int
2451com_make_closure(struct compiling *c, PyCodeObject *co)
2452{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002453 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002454 if (free == 0)
2455 return 0;
2456 for (i = 0; i < free; ++i) {
2457 /* Bypass com_addop_varname because it will generate
2458 LOAD_DEREF but LOAD_CLOSURE is needed.
2459 */
2460 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2461 int arg, reftype;
2462
2463 /* Special case: If a class contains a method with a
2464 free variable that has the same name as a method,
2465 the name will be considered free *and* local in the
2466 class. It should be handled by the closure, as
2467 well as by the normal name loookup logic.
2468 */
2469 reftype = get_ref_type(c, PyString_AS_STRING(name));
2470 if (reftype == CELL)
2471 arg = com_lookup_arg(c->c_cellvars, name);
2472 else /* (reftype == FREE) */
2473 arg = com_lookup_arg(c->c_freevars, name);
2474 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002475 fprintf(stderr, "lookup %s in %s %d %d\n"
2476 "freevars of %s: %s\n",
2477 PyObject_REPR(name),
2478 c->c_name,
2479 reftype, arg,
2480 PyString_AS_STRING(co->co_name),
2481 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002482 Py_FatalError("com_make_closure()");
2483 }
2484 com_addoparg(c, LOAD_CLOSURE, arg);
2485
2486 }
2487 com_push(c, free);
2488 return 1;
2489}
2490
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002491static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002492com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002493{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002494 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002495 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002496 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002497 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002498 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002499 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2500 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002501 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002502 if (co == NULL) {
2503 c->c_errors++;
2504 return;
2505 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002506 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002507 i = com_addconst(c, (PyObject *)co);
2508 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002509 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002510 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002511 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002512 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002513 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002514 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002515 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002516 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002517 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002518 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002519 else {
2520 int anchor = 0;
2521 int i = 0;
2522 for (;;) {
2523 com_and_test(c, CHILD(n, i));
2524 if ((i += 2) >= NCH(n))
2525 break;
2526 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2527 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002528 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002529 }
2530 if (anchor)
2531 com_backpatch(c, anchor);
2532 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002533}
2534
2535static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002536com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002537{
2538 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002539 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002540 com_node(c, CHILD(n, 0));
2541 }
2542 else {
2543 int i;
2544 int len;
2545 len = (NCH(n) + 1) / 2;
2546 for (i = 0; i < NCH(n); i += 2)
2547 com_node(c, CHILD(n, i));
2548 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002549 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002550 }
2551}
2552
2553
2554/* Begin of assignment compilation */
2555
Thomas Wouters434d0822000-08-24 20:11:32 +00002556
2557static void
2558com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2559{
2560 com_addbyte(c, DUP_TOP);
2561 com_push(c, 1);
2562 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002563 com_node(c, augn);
2564 com_addbyte(c, opcode);
2565 com_pop(c, 1);
2566 com_addbyte(c, ROT_TWO);
2567 com_addopname(c, STORE_ATTR, n);
2568 com_pop(c, 2);
2569}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002570
2571static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002572com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002573{
2574 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002575 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002576}
2577
2578static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002579com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002580{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002581 REQ(n, trailer);
2582 switch (TYPE(CHILD(n, 0))) {
2583 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002584 if (assigning == OP_DELETE)
2585 com_error(c, PyExc_SyntaxError,
2586 "can't delete function call");
2587 else
2588 com_error(c, PyExc_SyntaxError,
2589 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002590 break;
2591 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002592 if (assigning > OP_APPLY)
2593 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2594 else
2595 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002596 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002597 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002598 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002599 break;
2600 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002601 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002602 }
2603}
2604
2605static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002606com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002607{
2608 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002609 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002610 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002611 if (assigning) {
2612 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002613 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002614 com_push(c, i-1);
2615 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002616 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002617 com_assign(c, CHILD(n, i), assigning, NULL);
2618}
2619
2620static void
2621com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2622{
2623 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002624 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002625 com_push(c, 1);
2626 com_node(c, augn);
2627 com_addbyte(c, opcode);
2628 com_pop(c, 1);
2629 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002630}
2631
2632static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002633com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002634{
2635 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002636 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002637 if (assigning)
2638 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002639}
2640
2641static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002642com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002643{
2644 /* Loop to avoid trivial recursion */
2645 for (;;) {
2646 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002647
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002648 case exprlist:
2649 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002650 case testlist1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002651 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002652 if (assigning > OP_APPLY) {
2653 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002654 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002655 return;
2656 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002657 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002658 return;
2659 }
2660 n = CHILD(n, 0);
2661 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002662
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002663 case test:
2664 case and_test:
2665 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002666 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002667 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002668 case xor_expr:
2669 case and_expr:
2670 case shift_expr:
2671 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002672 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002673 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002674 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002675 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002676 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002677 return;
2678 }
2679 n = CHILD(n, 0);
2680 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002681
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002682 case power: /* atom trailer* ('**' power)*
2683 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002684 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002685 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002686 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002687 return;
2688 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002689 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002690 int i;
2691 com_node(c, CHILD(n, 0));
2692 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002693 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002694 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002695 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002696 return;
2697 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002698 com_apply_trailer(c, CHILD(n, i));
2699 } /* NB i is still alive */
2700 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002701 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002702 return;
2703 }
2704 n = CHILD(n, 0);
2705 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002706
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002707 case atom:
2708 switch (TYPE(CHILD(n, 0))) {
2709 case LPAR:
2710 n = CHILD(n, 1);
2711 if (TYPE(n) == RPAR) {
2712 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002713 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002714 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002715 return;
2716 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002717 if (assigning > OP_APPLY) {
2718 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002719 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002720 return;
2721 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002722 break;
2723 case LSQB:
2724 n = CHILD(n, 1);
2725 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002726 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002727 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002728 return;
2729 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002730 if (assigning > OP_APPLY) {
2731 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002732 "augmented assign to list not possible");
2733 return;
2734 }
2735 if (NCH(n) > 1
2736 && TYPE(CHILD(n, 1)) == list_for) {
2737 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002738 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002739 return;
2740 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002741 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002742 return;
2743 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002744 if (assigning > OP_APPLY)
2745 com_augassign_name(c, CHILD(n, 0),
2746 assigning, augn);
2747 else
2748 com_assign_name(c, CHILD(n, 0),
2749 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002750 return;
2751 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002752 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002753 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002754 return;
2755 }
2756 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002757
2758 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002759 com_error(c, PyExc_SyntaxError,
2760 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002761 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002762
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002763 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002764 com_error(c, PyExc_SystemError,
2765 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002766 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002767
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002768 }
2769 }
2770}
Guido van Rossum7c531111997-03-11 18:42:21 +00002771
Thomas Wouters434d0822000-08-24 20:11:32 +00002772static void
2773com_augassign(struct compiling *c, node *n)
2774{
2775 int opcode;
2776
2777 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2778 case '+': opcode = INPLACE_ADD; break;
2779 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002780 case '/':
2781 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
2782 opcode = INPLACE_FLOOR_DIVIDE;
2783 else if (c->c_flags & CO_FUTURE_DIVISION)
2784 opcode = INPLACE_TRUE_DIVIDE;
2785 else
2786 opcode = INPLACE_DIVIDE;
2787 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00002788 case '%': opcode = INPLACE_MODULO; break;
2789 case '<': opcode = INPLACE_LSHIFT; break;
2790 case '>': opcode = INPLACE_RSHIFT; break;
2791 case '&': opcode = INPLACE_AND; break;
2792 case '^': opcode = INPLACE_XOR; break;
2793 case '|': opcode = INPLACE_OR; break;
2794 case '*':
2795 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2796 opcode = INPLACE_POWER;
2797 else
2798 opcode = INPLACE_MULTIPLY;
2799 break;
2800 default:
2801 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2802 return;
2803 }
2804 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2805}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002806
2807static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002808com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002809{
Thomas Wouters434d0822000-08-24 20:11:32 +00002810 REQ(n, expr_stmt);
2811 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002812 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002813 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002814 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002815 if (NCH(n) == 1) {
2816 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002817 if (c->c_interactive)
2818 com_addbyte(c, PRINT_EXPR);
2819 else
2820 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002821 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002822 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002823 else if (TYPE(CHILD(n,1)) == augassign)
2824 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002825 else {
2826 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002827 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002828 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002829 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002830 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002831 com_push(c, 1);
2832 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002833 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002834 }
2835 }
2836}
2837
2838static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002839com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002840{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002841 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002842 int i;
2843 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002844 if (Py_OptimizeFlag)
2845 return;
2846 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00002847
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002848 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00002849 raise AssertionError [, <message>]
2850
2851 where <message> is the second test, if present.
2852 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002853 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002854 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002855 com_addbyte(c, POP_TOP);
2856 com_pop(c, 1);
2857 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002858 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002859 com_push(c, 1);
2860 i = NCH(n)/2; /* Either 2 or 4 */
2861 if (i > 1)
2862 com_node(c, CHILD(n, 3));
2863 com_addoparg(c, RAISE_VARARGS, i);
2864 com_pop(c, i);
2865 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002866 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002867 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002868 com_addbyte(c, POP_TOP);
2869}
2870
2871static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002872com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002873{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002874 int i = 1;
2875 node* stream = NULL;
2876
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002877 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002878
2879 /* are we using the extended print form? */
2880 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2881 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002882 com_node(c, stream);
2883 /* stack: [...] => [... stream] */
2884 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002885 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2886 i = 4;
2887 else
2888 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002889 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002890 for (; i < NCH(n); i += 2) {
2891 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002892 com_addbyte(c, DUP_TOP);
2893 /* stack: [stream] => [stream stream] */
2894 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002895 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002896 /* stack: [stream stream] => [stream stream obj] */
2897 com_addbyte(c, ROT_TWO);
2898 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002899 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002900 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002901 com_pop(c, 2);
2902 }
2903 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002904 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002905 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002906 com_addbyte(c, PRINT_ITEM);
2907 com_pop(c, 1);
2908 }
2909 }
2910 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002911 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002912 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002913 /* must pop the extra stream object off the stack */
2914 com_addbyte(c, POP_TOP);
2915 /* stack: [... stream] => [...] */
2916 com_pop(c, 1);
2917 }
2918 }
2919 else {
2920 if (stream != NULL) {
2921 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002922 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002923 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002924 com_pop(c, 1);
2925 }
2926 else
2927 com_addbyte(c, PRINT_NEWLINE);
2928 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002929}
2930
2931static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002932com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002933{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002934 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002935 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002936 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002937 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002938 if (c->c_flags & CO_GENERATOR) {
2939 if (NCH(n) > 1) {
2940 com_error(c, PyExc_SyntaxError,
2941 "'return' with argument inside generator");
2942 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002943 }
2944 if (NCH(n) < 2) {
2945 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002946 com_push(c, 1);
2947 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002948 else
2949 com_node(c, CHILD(n, 1));
2950 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00002951 com_pop(c, 1);
2952}
2953
2954static void
2955com_yield_stmt(struct compiling *c, node *n)
2956{
Tim Peters95c80f82001-06-23 02:07:08 +00002957 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00002958 REQ(n, yield_stmt); /* 'yield' testlist */
2959 if (!c->c_infunction) {
2960 com_error(c, PyExc_SyntaxError, "'yield' outside function");
2961 }
Tim Peters95c80f82001-06-23 02:07:08 +00002962
2963 for (i = 0; i < c->c_nblocks; ++i) {
2964 if (c->c_block[i] == SETUP_FINALLY) {
2965 com_error(c, PyExc_SyntaxError,
2966 "'yield' not allowed in a 'try' block "
2967 "with a 'finally' clause");
2968 return;
2969 }
2970 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002971 com_node(c, CHILD(n, 1));
2972 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002973 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002974}
2975
2976static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002977com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002978{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002979 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002980 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2981 if (NCH(n) > 1) {
2982 com_node(c, CHILD(n, 1));
2983 if (NCH(n) > 3) {
2984 com_node(c, CHILD(n, 3));
2985 if (NCH(n) > 5)
2986 com_node(c, CHILD(n, 5));
2987 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002988 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002989 i = NCH(n)/2;
2990 com_addoparg(c, RAISE_VARARGS, i);
2991 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002992}
2993
2994static void
Thomas Wouters52152252000-08-17 22:55:00 +00002995com_from_import(struct compiling *c, node *n)
2996{
2997 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2998 com_push(c, 1);
2999 if (NCH(n) > 1) {
3000 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3001 com_error(c, PyExc_SyntaxError, "invalid syntax");
3002 return;
3003 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003004 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003005 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003006 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003007 com_pop(c, 1);
3008}
3009
3010static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003011com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003012{
3013 int i;
3014 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003015 /* 'import' dotted_name (',' dotted_name)* |
3016 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003017 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00003018 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003019 /* 'from' dotted_name 'import' ... */
3020 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003021
3022 if (TYPE(CHILD(n, 3)) == STAR) {
3023 tup = Py_BuildValue("(s)", "*");
3024 } else {
3025 tup = PyTuple_New((NCH(n) - 2)/2);
3026 for (i = 3; i < NCH(n); i += 2) {
3027 PyTuple_SET_ITEM(tup, (i-3)/2,
3028 PyString_FromString(STR(
Jeremy Hylton4419ac12001-02-28 22:54:51 +00003029 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003030 }
3031 }
3032 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003033 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003034 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003035 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00003036 if (TYPE(CHILD(n, 3)) == STAR)
3037 com_addbyte(c, IMPORT_STAR);
3038 else {
3039 for (i = 3; i < NCH(n); i += 2)
3040 com_from_import(c, CHILD(n, i));
3041 com_addbyte(c, POP_TOP);
3042 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003043 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003044 }
3045 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003046 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003047 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003048 node *subn = CHILD(n, i);
3049 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003050 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003051 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003052 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003053 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003054 int j;
3055 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003056 com_error(c, PyExc_SyntaxError,
3057 "invalid syntax");
3058 return;
3059 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003060 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3061 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003062 CHILD(CHILD(subn, 0),
3063 j));
3064 com_addop_varname(c, VAR_STORE,
3065 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003066 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003067 com_addop_varname(c, VAR_STORE,
3068 STR(CHILD(CHILD(subn, 0),
3069 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003070 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003071 }
3072 }
3073}
3074
3075static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003076com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003077{
3078 REQ(n, exec_stmt);
3079 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3080 com_node(c, CHILD(n, 1));
3081 if (NCH(n) >= 4)
3082 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003083 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003084 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003085 com_push(c, 1);
3086 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003087 if (NCH(n) >= 6)
3088 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003089 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003090 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003091 com_push(c, 1);
3092 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003093 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003094 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003095}
3096
Guido van Rossum7c531111997-03-11 18:42:21 +00003097static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003098is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003099{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003100 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003101 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003102 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003103
3104 /* Label to avoid tail recursion */
3105 next:
3106 switch (TYPE(n)) {
3107
3108 case suite:
3109 if (NCH(n) == 1) {
3110 n = CHILD(n, 0);
3111 goto next;
3112 }
3113 /* Fall through */
3114 case file_input:
3115 for (i = 0; i < NCH(n); i++) {
3116 node *ch = CHILD(n, i);
3117 if (TYPE(ch) == stmt) {
3118 n = ch;
3119 goto next;
3120 }
3121 }
3122 break;
3123
3124 case stmt:
3125 case simple_stmt:
3126 case small_stmt:
3127 n = CHILD(n, 0);
3128 goto next;
3129
3130 case expr_stmt:
3131 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003132 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003133 case test:
3134 case and_test:
3135 case not_test:
3136 case comparison:
3137 case expr:
3138 case xor_expr:
3139 case and_expr:
3140 case shift_expr:
3141 case arith_expr:
3142 case term:
3143 case factor:
3144 case power:
3145 case atom:
3146 if (NCH(n) == 1) {
3147 n = CHILD(n, 0);
3148 goto next;
3149 }
3150 break;
3151
3152 case NAME:
3153 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3154 return 1;
3155 break;
3156
3157 case NUMBER:
3158 v = parsenumber(c, STR(n));
3159 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003160 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003161 break;
3162 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003163 i = PyObject_IsTrue(v);
3164 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003165 return i == 0;
3166
3167 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003168 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003169 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003170 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003171 break;
3172 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003173 i = PyObject_IsTrue(v);
3174 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003175 return i == 0;
3176
3177 }
3178 return 0;
3179}
3180
Tim Peters08a898f2001-06-28 01:52:22 +00003181
3182/* Look under n for a return stmt with an expression.
3183 * This hack is used to find illegal returns under "if 0:" blocks in
3184 * functions already known to be generators (as determined by the symtable
3185 * pass).
3186 * Return the offending return node if found, else NULL.
3187 */
3188static node *
3189look_for_offending_return(node *n)
3190{
3191 int i;
3192
3193 for (i = 0; i < NCH(n); ++i) {
3194 node *kid = CHILD(n, i);
3195
3196 switch (TYPE(kid)) {
3197 case classdef:
3198 case funcdef:
3199 case lambdef:
3200 /* Stuff in nested functions & classes doesn't
3201 affect the code block we started in. */
3202 return NULL;
3203
3204 case return_stmt:
3205 if (NCH(kid) > 1)
3206 return kid;
3207 break;
3208
3209 default: {
3210 node *bad = look_for_offending_return(kid);
3211 if (bad != NULL)
3212 return bad;
3213 }
3214 }
3215 }
3216
3217 return NULL;
3218}
3219
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003220static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003221com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003222{
3223 int i;
3224 int anchor = 0;
3225 REQ(n, if_stmt);
3226 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3227 for (i = 0; i+3 < NCH(n); i+=4) {
3228 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003229 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003230 if (is_constant_false(c, ch)) {
3231 /* We're going to skip this block. However, if this
3232 is a generator, we have to check the dead code
3233 anyway to make sure there aren't any return stmts
3234 with expressions, in the same scope. */
3235 if (c->c_flags & CO_GENERATOR) {
3236 node *p = look_for_offending_return(n);
3237 if (p != NULL) {
3238 int savelineno = c->c_lineno;
3239 c->c_lineno = p->n_lineno;
3240 com_error(c, PyExc_SyntaxError,
3241 "'return' with argument "
3242 "inside generator");
3243 c->c_lineno = savelineno;
3244 }
3245 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003246 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003247 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003248 if (i > 0)
3249 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003250 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003251 com_addfwref(c, JUMP_IF_FALSE, &a);
3252 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003253 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003254 com_node(c, CHILD(n, i+3));
3255 com_addfwref(c, JUMP_FORWARD, &anchor);
3256 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003257 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003258 com_addbyte(c, POP_TOP);
3259 }
3260 if (i+2 < NCH(n))
3261 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003262 if (anchor)
3263 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003264}
3265
3266static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003267com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003268{
3269 int break_anchor = 0;
3270 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003271 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003272 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3273 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003274 block_push(c, SETUP_LOOP);
3275 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003276 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003277 com_node(c, CHILD(n, 1));
3278 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3279 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003280 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003281 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003282 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003283 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003284 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3285 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003286 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003287 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003288 com_addbyte(c, POP_TOP);
3289 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003290 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003291 if (NCH(n) > 4)
3292 com_node(c, CHILD(n, 6));
3293 com_backpatch(c, break_anchor);
3294}
3295
3296static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003297com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003298{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003299 int break_anchor = 0;
3300 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003301 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003302 REQ(n, for_stmt);
3303 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3304 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003305 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003306 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003307 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003308 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003309 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003310 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003311 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003312 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003313 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003314 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003315 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003316 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3317 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003318 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003319 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003320 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003321 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003322 if (NCH(n) > 8)
3323 com_node(c, CHILD(n, 8));
3324 com_backpatch(c, break_anchor);
3325}
3326
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003327/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003328
3329 SETUP_FINALLY L
3330 <code for S>
3331 POP_BLOCK
3332 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003333 L: <code for Sf>
3334 END_FINALLY
3335
3336 The special instructions use the block stack. Each block
3337 stack entry contains the instruction that created it (here
3338 SETUP_FINALLY), the level of the value stack at the time the
3339 block stack entry was created, and a label (here L).
3340
3341 SETUP_FINALLY:
3342 Pushes the current value stack level and the label
3343 onto the block stack.
3344 POP_BLOCK:
3345 Pops en entry from the block stack, and pops the value
3346 stack until its level is the same as indicated on the
3347 block stack. (The label is ignored.)
3348 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003349 Pops a variable number of entries from the *value* stack
3350 and re-raises the exception they specify. The number of
3351 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003352
3353 The block stack is unwound when an exception is raised:
3354 when a SETUP_FINALLY entry is found, the exception is pushed
3355 onto the value stack (and the exception condition is cleared),
3356 and the interpreter jumps to the label gotten from the block
3357 stack.
3358
3359 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003360 (The contents of the value stack is shown in [], with the top
3361 at the right; 'tb' is trace-back info, 'val' the exception's
3362 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003363
3364 Value stack Label Instruction Argument
3365 [] SETUP_EXCEPT L1
3366 [] <code for S>
3367 [] POP_BLOCK
3368 [] JUMP_FORWARD L0
3369
Guido van Rossum3f5da241990-12-20 15:06:42 +00003370 [tb, val, exc] L1: DUP )
3371 [tb, val, exc, exc] <evaluate E1> )
3372 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3373 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3374 [tb, val, exc, 1] POP )
3375 [tb, val, exc] POP
3376 [tb, val] <assign to V1> (or POP if no V1)
3377 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003378 [] <code for S1>
3379 JUMP_FORWARD L0
3380
Guido van Rossum3f5da241990-12-20 15:06:42 +00003381 [tb, val, exc, 0] L2: POP
3382 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003383 .............................etc.......................
3384
Guido van Rossum3f5da241990-12-20 15:06:42 +00003385 [tb, val, exc, 0] Ln+1: POP
3386 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003387
3388 [] L0: <next statement>
3389
3390 Of course, parts are not generated if Vi or Ei is not present.
3391*/
3392
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003393static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003394com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003395{
3396 int except_anchor = 0;
3397 int end_anchor = 0;
3398 int else_anchor = 0;
3399 int i;
3400 node *ch;
3401
3402 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3403 block_push(c, SETUP_EXCEPT);
3404 com_node(c, CHILD(n, 2));
3405 com_addbyte(c, POP_BLOCK);
3406 block_pop(c, SETUP_EXCEPT);
3407 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3408 com_backpatch(c, except_anchor);
3409 for (i = 3;
3410 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3411 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003412 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003413 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003414 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003415 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003416 break;
3417 }
3418 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003419 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003420 com_addoparg(c, SET_LINENO, ch->n_lineno);
3421 if (NCH(ch) > 1) {
3422 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003423 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003424 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003425 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003426 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003427 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3428 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003429 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003430 }
3431 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003432 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003433 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003434 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003435 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003436 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003437 com_pop(c, 1);
3438 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003439 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003440 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003441 com_node(c, CHILD(n, i+2));
3442 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3443 if (except_anchor) {
3444 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003445 /* We come in with [tb, val, exc, 0] on the
3446 stack; one pop and it's the same as
3447 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003448 com_addbyte(c, POP_TOP);
3449 }
3450 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003451 /* We actually come in here with [tb, val, exc] but the
3452 END_FINALLY will zap those and jump around.
3453 The c_stacklevel does not reflect them so we need not pop
3454 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003455 com_addbyte(c, END_FINALLY);
3456 com_backpatch(c, else_anchor);
3457 if (i < NCH(n))
3458 com_node(c, CHILD(n, i+2));
3459 com_backpatch(c, end_anchor);
3460}
3461
3462static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003463com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003464{
3465 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003466 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003467
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003468 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3469 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003470 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003471 com_addbyte(c, POP_BLOCK);
3472 block_pop(c, SETUP_FINALLY);
3473 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003474 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003475 /* While the generated code pushes only one item,
3476 the try-finally handling can enter here with
3477 up to three items. OK, here are the details:
3478 3 for an exception, 2 for RETURN, 1 for BREAK. */
3479 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003480 com_backpatch(c, finally_anchor);
3481 ch = CHILD(n, NCH(n)-1);
3482 com_addoparg(c, SET_LINENO, ch->n_lineno);
3483 com_node(c, ch);
3484 com_addbyte(c, END_FINALLY);
3485 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003486 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003487}
3488
3489static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003490com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003491{
3492 REQ(n, try_stmt);
3493 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3494 | 'try' ':' suite 'finally' ':' suite */
3495 if (TYPE(CHILD(n, 3)) != except_clause)
3496 com_try_finally(c, n);
3497 else
3498 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003499}
3500
Guido van Rossum8b993a91997-01-17 21:04:03 +00003501static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003502get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003503{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003504 int i;
3505
Guido van Rossum8b993a91997-01-17 21:04:03 +00003506 /* Label to avoid tail recursion */
3507 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003508 switch (TYPE(n)) {
3509
3510 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003511 if (NCH(n) == 1) {
3512 n = CHILD(n, 0);
3513 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003514 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003515 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003516 case file_input:
3517 for (i = 0; i < NCH(n); i++) {
3518 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003519 if (TYPE(ch) == stmt) {
3520 n = ch;
3521 goto next;
3522 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003523 }
3524 break;
3525
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003526 case stmt:
3527 case simple_stmt:
3528 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003529 n = CHILD(n, 0);
3530 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003531
3532 case expr_stmt:
3533 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003534 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003535 case test:
3536 case and_test:
3537 case not_test:
3538 case comparison:
3539 case expr:
3540 case xor_expr:
3541 case and_expr:
3542 case shift_expr:
3543 case arith_expr:
3544 case term:
3545 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003546 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003547 if (NCH(n) == 1) {
3548 n = CHILD(n, 0);
3549 goto next;
3550 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003551 break;
3552
3553 case atom:
3554 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003555 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003556 break;
3557
3558 }
3559 return NULL;
3560}
3561
Guido van Rossum79f25d91997-04-29 20:08:16 +00003562static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003563get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003564{
Guido van Rossum541563e1999-01-28 15:08:09 +00003565 /* Don't generate doc-strings if run with -OO */
3566 if (Py_OptimizeFlag > 1)
3567 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003568 n = get_rawdocstring(n);
3569 if (n == NULL)
3570 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003571 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003572}
3573
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003574static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003575com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003576{
3577 REQ(n, suite);
3578 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3579 if (NCH(n) == 1) {
3580 com_node(c, CHILD(n, 0));
3581 }
3582 else {
3583 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003584 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003585 node *ch = CHILD(n, i);
3586 if (TYPE(ch) == stmt)
3587 com_node(c, ch);
3588 }
3589 }
3590}
3591
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003592/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003593static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003594com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003595{
3596 int i = c->c_nblocks;
3597 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3598 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3599 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003600 else if (i <= 0) {
3601 /* at the outer level */
3602 com_error(c, PyExc_SyntaxError,
3603 "'continue' not properly in loop");
3604 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003605 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003606 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003607 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003608 if (c->c_block[j] == SETUP_LOOP)
3609 break;
3610 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003611 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003612 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003613 for (; i > j; --i) {
3614 if (c->c_block[i] == SETUP_EXCEPT ||
3615 c->c_block[i] == SETUP_FINALLY) {
3616 com_addoparg(c, CONTINUE_LOOP,
3617 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003618 return;
3619 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003620 if (c->c_block[i] == END_FINALLY) {
3621 com_error(c, PyExc_SyntaxError,
3622 "'continue' not supported inside 'finally' clause");
3623 return;
3624 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003625 }
3626 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003627 com_error(c, PyExc_SyntaxError,
3628 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003629 }
3630 /* XXX Could allow it inside a 'finally' clause
3631 XXX if we could pop the exception still on the stack */
3632}
3633
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003634static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003635com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003636{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003637 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003638 if (TYPE(n) == lambdef) {
3639 /* lambdef: 'lambda' [varargslist] ':' test */
3640 n = CHILD(n, 1);
3641 }
3642 else {
3643 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3644 n = CHILD(n, 2);
3645 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3646 n = CHILD(n, 1);
3647 }
3648 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003649 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003650 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003651 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003652 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3653 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003654 nargs = 0;
3655 ndefs = 0;
3656 for (i = 0; i < nch; i++) {
3657 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003658 if (TYPE(CHILD(n, i)) == STAR ||
3659 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003660 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003661 nargs++;
3662 i++;
3663 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003664 t = RPAR; /* Anything except EQUAL or COMMA */
3665 else
3666 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003667 if (t == EQUAL) {
3668 i++;
3669 ndefs++;
3670 com_node(c, CHILD(n, i));
3671 i++;
3672 if (i >= nch)
3673 break;
3674 t = TYPE(CHILD(n, i));
3675 }
3676 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003677 /* Treat "(a=1, b)" as an error */
3678 if (ndefs)
3679 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003680 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003681 }
3682 if (t != COMMA)
3683 break;
3684 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003685 return ndefs;
3686}
3687
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003688static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003689com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003690{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003691 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003692 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003693 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003694 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003695 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3696 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003697 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003698 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003699 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003700 c->c_errors++;
3701 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003702 int closure = com_make_closure(c, (PyCodeObject *)co);
3703 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003704 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003705 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003706 if (closure)
3707 com_addoparg(c, MAKE_CLOSURE, ndefs);
3708 else
3709 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003710 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003711 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003712 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003713 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003714 }
3715}
3716
3717static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003718com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003719{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003720 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003721 REQ(n, testlist);
3722 /* testlist: test (',' test)* [','] */
3723 for (i = 0; i < NCH(n); i += 2)
3724 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003725 i = (NCH(n)+1) / 2;
3726 com_addoparg(c, BUILD_TUPLE, i);
3727 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003728}
3729
3730static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003731com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003732{
Guido van Rossum25831651993-05-19 14:50:45 +00003733 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003734 PyObject *v;
3735 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003736 char *name;
3737
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003738 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003739 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003740 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003741 c->c_errors++;
3742 return;
3743 }
3744 /* Push the class name on the stack */
3745 i = com_addconst(c, v);
3746 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003747 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003748 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003749 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003750 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003751 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003752 com_push(c, 1);
3753 }
Guido van Rossum25831651993-05-19 14:50:45 +00003754 else
3755 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003756 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003757 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003758 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003759 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003760 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003761 c->c_errors++;
3762 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003763 int closure = com_make_closure(c, co);
3764 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003765 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003766 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003767 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003768 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003769 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003770 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003771 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003772 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003773 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003774 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003775 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003776 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003777 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003778 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003779}
3780
3781static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003782com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003783{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003784 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003785 if (c->c_errors)
3786 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003787 switch (TYPE(n)) {
3788
3789 /* Definition nodes */
3790
3791 case funcdef:
3792 com_funcdef(c, n);
3793 break;
3794 case classdef:
3795 com_classdef(c, n);
3796 break;
3797
3798 /* Trivial parse tree nodes */
3799
3800 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003801 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003802 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003803 n = CHILD(n, 0);
3804 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003805
3806 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003807 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3808 com_addoparg(c, SET_LINENO, n->n_lineno);
3809 {
3810 int i;
3811 for (i = 0; i < NCH(n)-1; i += 2)
3812 com_node(c, CHILD(n, i));
3813 }
3814 break;
3815
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003816 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003817 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003818 n = CHILD(n, 0);
3819 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003820
3821 /* Statement nodes */
3822
3823 case expr_stmt:
3824 com_expr_stmt(c, n);
3825 break;
3826 case print_stmt:
3827 com_print_stmt(c, n);
3828 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003829 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003830 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003831 break;
3832 case pass_stmt:
3833 break;
3834 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003835 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003836 com_error(c, PyExc_SyntaxError,
3837 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003838 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003839 com_addbyte(c, BREAK_LOOP);
3840 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003841 case continue_stmt:
3842 com_continue_stmt(c, n);
3843 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003844 case return_stmt:
3845 com_return_stmt(c, n);
3846 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003847 case yield_stmt:
3848 com_yield_stmt(c, n);
3849 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003850 case raise_stmt:
3851 com_raise_stmt(c, n);
3852 break;
3853 case import_stmt:
3854 com_import_stmt(c, n);
3855 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003856 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003857 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003858 case exec_stmt:
3859 com_exec_stmt(c, n);
3860 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003861 case assert_stmt:
3862 com_assert_stmt(c, n);
3863 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003864 case if_stmt:
3865 com_if_stmt(c, n);
3866 break;
3867 case while_stmt:
3868 com_while_stmt(c, n);
3869 break;
3870 case for_stmt:
3871 com_for_stmt(c, n);
3872 break;
3873 case try_stmt:
3874 com_try_stmt(c, n);
3875 break;
3876 case suite:
3877 com_suite(c, n);
3878 break;
3879
3880 /* Expression nodes */
3881
3882 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003883 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00003884 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003885 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003886 break;
3887 case test:
3888 com_test(c, n);
3889 break;
3890 case and_test:
3891 com_and_test(c, n);
3892 break;
3893 case not_test:
3894 com_not_test(c, n);
3895 break;
3896 case comparison:
3897 com_comparison(c, n);
3898 break;
3899 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003900 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003901 break;
3902 case expr:
3903 com_expr(c, n);
3904 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003905 case xor_expr:
3906 com_xor_expr(c, n);
3907 break;
3908 case and_expr:
3909 com_and_expr(c, n);
3910 break;
3911 case shift_expr:
3912 com_shift_expr(c, n);
3913 break;
3914 case arith_expr:
3915 com_arith_expr(c, n);
3916 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003917 case term:
3918 com_term(c, n);
3919 break;
3920 case factor:
3921 com_factor(c, n);
3922 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003923 case power:
3924 com_power(c, n);
3925 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003926 case atom:
3927 com_atom(c, n);
3928 break;
3929
3930 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003931 com_error(c, PyExc_SystemError,
3932 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003933 }
3934}
3935
Tim Petersdbd9ba62000-07-09 03:09:57 +00003936static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003937
3938static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003939com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003940{
3941 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3942 if (TYPE(CHILD(n, 0)) == LPAR)
3943 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003944 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003945 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003946 com_pop(c, 1);
3947 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003948}
3949
3950static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003951com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003952{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003953 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003954 if (NCH(n) == 1) {
3955 com_fpdef(c, CHILD(n, 0));
3956 }
3957 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003958 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003959 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003960 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003961 for (i = 0; i < NCH(n); i += 2)
3962 com_fpdef(c, CHILD(n, i));
3963 }
3964}
3965
3966static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003967com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003968{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003969 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003970 int complex = 0;
Barry Warsaw8f6d8682001-11-28 21:10:39 +00003971 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003972 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003973 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003974 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003975 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003976 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003977 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003978 node *ch = CHILD(n, i);
3979 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003980 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003981 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003982 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3983 fp = CHILD(ch, 0);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00003984 if (TYPE(fp) != NAME) {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00003985 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003986 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003987 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003988 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003989 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003990 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003991 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003992 ch = CHILD(n, i);
3993 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003994 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003995 else
3996 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003997 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003998 if (complex) {
3999 /* Generate code for complex arguments only after
4000 having counted the simple arguments */
4001 int ilocal = 0;
4002 for (i = 0; i < nch; i++) {
4003 node *ch = CHILD(n, i);
4004 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004005 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004006 break;
4007 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4008 fp = CHILD(ch, 0);
4009 if (TYPE(fp) != NAME) {
4010 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004011 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004012 com_fpdef(c, ch);
4013 }
4014 ilocal++;
4015 if (++i >= nch)
4016 break;
4017 ch = CHILD(n, i);
4018 if (TYPE(ch) == EQUAL)
4019 i += 2;
4020 else
4021 REQ(ch, COMMA);
4022 }
4023 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004024}
4025
4026static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004027com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004028{
4029 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004030 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004031 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004032 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004033 if (doc != NULL) {
4034 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004035 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004036 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004037 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004038 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004039 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004040 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004041 for (i = 0; i < NCH(n); i++) {
4042 node *ch = CHILD(n, i);
4043 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4044 com_node(c, ch);
4045 }
4046}
4047
4048/* Top-level compile-node interface */
4049
4050static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004051compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004052{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004053 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004054 node *ch;
4055 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00004056 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004057 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004058 if (doc != NULL) {
4059 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004060 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004061 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004062 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004063 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004064 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
4065 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004066 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004067 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004068 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004069 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004070 c->c_infunction = 0;
Tim Petersad1a18b2001-06-23 06:19:16 +00004071 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4072 com_push(c, 1);
4073 com_addbyte(c, RETURN_VALUE);
4074 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004075}
4076
4077static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004078compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004079{
Guido van Rossum590baa41993-11-30 13:40:46 +00004080 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004081 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004082 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004083
4084 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004085 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004086 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004087 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004088 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004089 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004090 else
4091 ch = CHILD(n, 2);
4092 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004093 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004094 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004095}
4096
4097static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004098compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004099{
4100 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004101 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004102 REQ(n, classdef);
4103 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4104 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004105 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004106 /* Initialize local __module__ from global __name__ */
4107 com_addop_name(c, LOAD_GLOBAL, "__name__");
4108 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004109 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004110 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004111 if (doc != NULL) {
4112 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004113 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004114 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004115 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004116 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004117 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004118 }
4119 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004120 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004121 com_node(c, ch);
4122 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004123 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004124 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004125 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004126}
4127
4128static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004129compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004130{
Guido van Rossum3f5da241990-12-20 15:06:42 +00004131 com_addoparg(c, SET_LINENO, n->n_lineno);
4132
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004133 switch (TYPE(n)) {
4134
Guido van Rossum4c417781991-01-21 16:09:22 +00004135 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004136 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004137 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004138 n = CHILD(n, 0);
4139 if (TYPE(n) != NEWLINE)
4140 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004141 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004142 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004143 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004144 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004145 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004146 break;
4147
Guido van Rossum4c417781991-01-21 16:09:22 +00004148 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004149 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004150 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004151 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004152 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004153 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004154 break;
4155
Guido van Rossum590baa41993-11-30 13:40:46 +00004156 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004157 com_node(c, CHILD(n, 0));
4158 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004159 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004160 break;
4161
Guido van Rossum590baa41993-11-30 13:40:46 +00004162 case lambdef: /* anonymous function definition */
4163 compile_lambdef(c, n);
4164 break;
4165
Guido van Rossum4c417781991-01-21 16:09:22 +00004166 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004167 compile_funcdef(c, n);
4168 break;
4169
Guido van Rossum4c417781991-01-21 16:09:22 +00004170 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004171 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004172 break;
4173
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004174 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004175 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004176 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004177 }
4178}
4179
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004180static PyObject *
4181dict_keys_inorder(PyObject *dict, int offset)
4182{
4183 PyObject *tuple, *k, *v;
4184 int i, pos = 0, size = PyDict_Size(dict);
4185
4186 tuple = PyTuple_New(size);
4187 if (tuple == NULL)
4188 return NULL;
4189 while (PyDict_Next(dict, &pos, &k, &v)) {
4190 i = PyInt_AS_LONG(v);
4191 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004192 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004193 PyTuple_SET_ITEM(tuple, i - offset, k);
4194 }
4195 return tuple;
4196}
4197
Guido van Rossum79f25d91997-04-29 20:08:16 +00004198PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004199PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004200{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004201 return PyNode_CompileFlags(n, filename, NULL);
4202}
4203
4204PyCodeObject *
4205PyNode_CompileFlags(node *n, char *filename, PyCompilerFlags *flags)
4206{
4207 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004208}
4209
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004210struct symtable *
4211PyNode_CompileSymtable(node *n, char *filename)
4212{
4213 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004214 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004215
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004216 ff = PyNode_Future(n, filename);
4217 if (ff == NULL)
4218 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004219
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004220 st = symtable_init();
Tim Peters8c5e4152001-11-04 19:26:58 +00004221 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004222 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004223 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004224 }
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004225 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004226 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004227 if (st->st_errors > 0)
4228 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004229 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004230 if (st->st_errors > 0)
4231 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004232
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004233 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004234 fail:
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004235 PyObject_FREE((void *)ff);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004236 st->st_future = NULL;
4237 PySymtable_Free(st);
4238 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004239}
4240
Guido van Rossum79f25d91997-04-29 20:08:16 +00004241static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004242icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004243{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004244 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004245}
4246
Guido van Rossum79f25d91997-04-29 20:08:16 +00004247static PyCodeObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004248jcompile(node *n, char *filename, struct compiling *base,
4249 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004250{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004251 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004252 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004253 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004254 return NULL;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004255 if (TYPE(n) == encoding_decl) {
4256 sc.c_encoding = STR(n);
4257 n = CHILD(n, 0);
4258 } else {
4259 sc.c_encoding = NULL;
4260 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004261 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004262 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004263 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004264 /* c_symtable still points to parent's symbols */
4265 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004266 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004267 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004268 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004269 if (base->c_encoding != NULL) {
4270 assert(sc.c_encoding == NULL);
4271 sc.c_encoding = base->c_encoding;
4272 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004273 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004274 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004275 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004276 if (sc.c_future == NULL) {
4277 com_free(&sc);
4278 return NULL;
4279 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004280 if (flags) {
4281 int merged = sc.c_future->ff_features |
4282 flags->cf_flags;
4283 sc.c_future->ff_features = merged;
4284 flags->cf_flags = merged;
4285 }
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004286 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004287 com_free(&sc);
4288 return NULL;
4289 }
4290 }
4291 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004292 if (symtable_load_symbols(&sc) < 0) {
4293 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004294 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004295 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004296 compile_node(&sc, n);
4297 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004298 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004299 PyObject *consts, *names, *varnames, *filename, *name,
4300 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004301 consts = PyList_AsTuple(sc.c_consts);
4302 names = PyList_AsTuple(sc.c_names);
4303 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004304 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4305 freevars = dict_keys_inorder(sc.c_freevars,
4306 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004307 filename = PyString_InternFromString(sc.c_filename);
4308 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004309 if (!PyErr_Occurred())
4310 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004311 sc.c_nlocals,
4312 sc.c_maxstacklevel,
4313 sc.c_flags,
4314 sc.c_code,
4315 consts,
4316 names,
4317 varnames,
4318 freevars,
4319 cellvars,
4320 filename,
4321 name,
4322 sc.c_firstlineno,
4323 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004324 Py_XDECREF(consts);
4325 Py_XDECREF(names);
4326 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004327 Py_XDECREF(freevars);
4328 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004329 Py_XDECREF(filename);
4330 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004331 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004332 else if (!PyErr_Occurred()) {
4333 /* This could happen if someone called PyErr_Clear() after an
4334 error was reported above. That's not supposed to happen,
4335 but I just plugged one case and I'm not sure there can't be
4336 others. In that case, raise SystemError so that at least
4337 it gets reported instead dumping core. */
4338 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4339 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004340 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004341 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004342 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004343 sc.c_symtable = NULL;
4344 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004345 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004346 return co;
4347}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004348
4349int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004350PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004351{
4352 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004353 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004354 int line = co->co_firstlineno;
4355 int addr = 0;
4356 while (--size >= 0) {
4357 addr += *p++;
4358 if (addr > addrq)
4359 break;
4360 line += *p++;
4361 }
4362 return line;
4363}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004364
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004365/* The test for LOCAL must come before the test for FREE in order to
4366 handle classes where name is both local and free. The local var is
4367 a method and the free var is a free var referenced within a method.
4368*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004369
4370static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004371get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004372{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004373 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004374 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004375
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004376 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4377 return CELL;
4378 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4379 return LOCAL;
4380 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4381 return FREE;
4382 v = PyDict_GetItemString(c->c_globals, name);
4383 if (v) {
4384 if (v == Py_None)
4385 return GLOBAL_EXPLICIT;
4386 else {
4387 return GLOBAL_IMPLICIT;
4388 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004389 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004390 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004391 "unknown scope for %.100s in %.100s(%s) "
4392 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4393 name, c->c_name,
4394 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4395 c->c_filename,
4396 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4397 PyObject_REPR(c->c_locals),
4398 PyObject_REPR(c->c_globals)
4399 );
4400
4401 Py_FatalError(buf);
4402 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004403}
4404
Guido van Rossum207fda62001-03-02 03:30:41 +00004405/* Helper functions to issue warnings */
4406
4407static int
4408issue_warning(char *msg, char *filename, int lineno)
4409{
4410 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4411 lineno, NULL, NULL) < 0) {
4412 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4413 PyErr_SetString(PyExc_SyntaxError, msg);
4414 PyErr_SyntaxLocation(filename, lineno);
4415 }
4416 return -1;
4417 }
4418 return 0;
4419}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004420
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004421static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004422symtable_warn(struct symtable *st, char *msg)
4423{
Guido van Rossum207fda62001-03-02 03:30:41 +00004424 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004425 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004426 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004427 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004428 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004429}
4430
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004431/* Helper function for setting lineno and filename */
4432
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004433static int
4434symtable_build(struct compiling *c, node *n)
4435{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004436 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004437 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004438 c->c_symtable->st_future = c->c_future;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004439 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004440 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4441 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004442 return -1;
4443 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004444 if (c->c_symtable->st_errors > 0)
4445 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004446 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004447 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004448 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004449 return 0;
4450}
4451
4452static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004453symtable_init_compiling_symbols(struct compiling *c)
4454{
4455 PyObject *varnames;
4456
4457 varnames = c->c_symtable->st_cur->ste_varnames;
4458 if (varnames == NULL) {
4459 varnames = PyList_New(0);
4460 if (varnames == NULL)
4461 return -1;
4462 c->c_symtable->st_cur->ste_varnames = varnames;
4463 Py_INCREF(varnames);
4464 } else
4465 Py_INCREF(varnames);
4466 c->c_varnames = varnames;
4467
4468 c->c_globals = PyDict_New();
4469 if (c->c_globals == NULL)
4470 return -1;
4471 c->c_freevars = PyDict_New();
4472 if (c->c_freevars == NULL)
4473 return -1;
4474 c->c_cellvars = PyDict_New();
4475 if (c->c_cellvars == NULL)
4476 return -1;
4477 return 0;
4478}
4479
4480struct symbol_info {
4481 int si_nlocals;
4482 int si_ncells;
4483 int si_nfrees;
4484 int si_nimplicit;
4485};
4486
4487static void
4488symtable_init_info(struct symbol_info *si)
4489{
4490 si->si_nlocals = 0;
4491 si->si_ncells = 0;
4492 si->si_nfrees = 0;
4493 si->si_nimplicit = 0;
4494}
4495
4496static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004497symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004498 struct symbol_info *si)
4499{
4500 PyObject *dict, *v;
4501
4502 /* Seperate logic for DEF_FREE. If it occurs in a function,
4503 it indicates a local that we must allocate storage for (a
4504 cell var). If it occurs in a class, then the class has a
4505 method and a free variable with the same name.
4506 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004507 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004508 /* If it isn't declared locally, it can't be a cell. */
4509 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4510 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004511 v = PyInt_FromLong(si->si_ncells++);
4512 dict = c->c_cellvars;
4513 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004514 /* If it is free anyway, then there is no need to do
4515 anything here.
4516 */
4517 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004518 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004519 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004520 v = PyInt_FromLong(si->si_nfrees++);
4521 dict = c->c_freevars;
4522 }
4523 if (v == NULL)
4524 return -1;
4525 if (PyDict_SetItem(dict, name, v) < 0) {
4526 Py_DECREF(v);
4527 return -1;
4528 }
4529 Py_DECREF(v);
4530 return 0;
4531}
4532
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004533/* If a variable is a cell and an argument, make sure that appears in
4534 co_cellvars before any variable to its right in varnames.
4535*/
4536
4537
4538static int
4539symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4540 PyObject *varnames, int flags)
4541{
4542 PyObject *v, *w, *d, *list = NULL;
4543 int i, pos;
4544
4545 if (flags & CO_VARARGS)
4546 argcount++;
4547 if (flags & CO_VARKEYWORDS)
4548 argcount++;
4549 for (i = argcount; --i >= 0; ) {
4550 v = PyList_GET_ITEM(varnames, i);
4551 if (PyDict_GetItem(*cellvars, v)) {
4552 if (list == NULL) {
4553 list = PyList_New(1);
4554 if (list == NULL)
4555 return -1;
4556 PyList_SET_ITEM(list, 0, v);
4557 Py_INCREF(v);
4558 } else
4559 PyList_Insert(list, 0, v);
4560 }
4561 }
4562 if (list == NULL || PyList_GET_SIZE(list) == 0)
4563 return 0;
4564 /* There are cellvars that are also arguments. Create a dict
4565 to replace cellvars and put the args at the front.
4566 */
4567 d = PyDict_New();
4568 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4569 v = PyInt_FromLong(i);
4570 if (v == NULL)
4571 goto fail;
4572 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4573 goto fail;
4574 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4575 goto fail;
4576 }
4577 pos = 0;
4578 i = PyList_GET_SIZE(list);
4579 Py_DECREF(list);
4580 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4581 w = PyInt_FromLong(i++); /* don't care about the old key */
4582 if (PyDict_SetItem(d, v, w) < 0) {
4583 Py_DECREF(w);
4584 goto fail;
4585 }
4586 Py_DECREF(w);
4587 }
4588 Py_DECREF(*cellvars);
4589 *cellvars = d;
4590 return 1;
4591 fail:
4592 Py_DECREF(d);
4593 return -1;
4594}
4595
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004596static int
4597symtable_freevar_offsets(PyObject *freevars, int offset)
4598{
4599 PyObject *name, *v;
4600 int pos;
4601
4602 /* The cell vars are the first elements of the closure,
4603 followed by the free vars. Update the offsets in
4604 c_freevars to account for number of cellvars. */
4605 pos = 0;
4606 while (PyDict_Next(freevars, &pos, &name, &v)) {
4607 int i = PyInt_AS_LONG(v) + offset;
4608 PyObject *o = PyInt_FromLong(i);
4609 if (o == NULL)
4610 return -1;
4611 if (PyDict_SetItem(freevars, name, o) < 0) {
4612 Py_DECREF(o);
4613 return -1;
4614 }
4615 Py_DECREF(o);
4616 }
4617 return 0;
4618}
4619
4620static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004621symtable_check_unoptimized(struct compiling *c,
4622 PySymtableEntryObject *ste,
4623 struct symbol_info *si)
4624{
4625 char buf[300];
4626
4627 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4628 || (ste->ste_nested && si->si_nimplicit)))
4629 return 0;
4630
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004631#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4632
4633#define ILLEGAL_IS "is a nested function"
4634
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004635#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004636"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004637
4638#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004639"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004640
4641#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00004642"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004643"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004644
4645 /* XXX perhaps the linenos for these opt-breaking statements
4646 should be stored so the exception can point to them. */
4647
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004648 if (ste->ste_child_free) {
4649 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004650 PyOS_snprintf(buf, sizeof(buf),
4651 ILLEGAL_IMPORT_STAR,
4652 PyString_AS_STRING(ste->ste_name),
4653 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004654 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004655 PyOS_snprintf(buf, sizeof(buf),
4656 ILLEGAL_BARE_EXEC,
4657 PyString_AS_STRING(ste->ste_name),
4658 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004659 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004660 PyOS_snprintf(buf, sizeof(buf),
4661 ILLEGAL_EXEC_AND_IMPORT_STAR,
4662 PyString_AS_STRING(ste->ste_name),
4663 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004664 }
4665 } else {
4666 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004667 PyOS_snprintf(buf, sizeof(buf),
4668 ILLEGAL_IMPORT_STAR,
4669 PyString_AS_STRING(ste->ste_name),
4670 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004671 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004672 PyOS_snprintf(buf, sizeof(buf),
4673 ILLEGAL_BARE_EXEC,
4674 PyString_AS_STRING(ste->ste_name),
4675 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004676 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004677 PyOS_snprintf(buf, sizeof(buf),
4678 ILLEGAL_EXEC_AND_IMPORT_STAR,
4679 PyString_AS_STRING(ste->ste_name),
4680 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004681 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004682 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004683
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004684 PyErr_SetString(PyExc_SyntaxError, buf);
4685 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4686 ste->ste_opt_lineno);
4687 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004688}
4689
4690static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004691symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4692 struct symbol_info *si)
4693{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004694 if (c->c_future)
4695 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004696 if (ste->ste_generator)
4697 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004698 if (ste->ste_type != TYPE_MODULE)
4699 c->c_flags |= CO_NEWLOCALS;
4700 if (ste->ste_type == TYPE_FUNCTION) {
4701 c->c_nlocals = si->si_nlocals;
4702 if (ste->ste_optimized == 0)
4703 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004704 else if (ste->ste_optimized != OPT_EXEC)
4705 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004706 }
4707 return 0;
4708}
4709
4710static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004711symtable_load_symbols(struct compiling *c)
4712{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004713 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004714 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004715 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004716 PyObject *name, *varnames, *v;
4717 int i, flags, pos;
4718 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004719
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004720 if (implicit == NULL) {
4721 implicit = PyInt_FromLong(1);
4722 if (implicit == NULL)
4723 return -1;
4724 }
4725 v = NULL;
4726
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004727 if (symtable_init_compiling_symbols(c) < 0)
4728 goto fail;
4729 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004730 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004731 si.si_nlocals = PyList_GET_SIZE(varnames);
4732 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004733
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004734 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004735 v = PyInt_FromLong(i);
4736 if (PyDict_SetItem(c->c_locals,
4737 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004738 goto fail;
4739 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004740 }
4741
4742 /* XXX The cases below define the rules for whether a name is
4743 local or global. The logic could probably be clearer. */
4744 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004745 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4746 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004747
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004748 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004749 /* undo the original DEF_FREE */
4750 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004751
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004752 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004753 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004754 2. Free variables in methods that are also class
4755 variables or declared global.
4756 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004757 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004758 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004759
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004760 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004761 c->c_argcount--;
4762 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004763 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004764 c->c_argcount--;
4765 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004766 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004767 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004768 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004769 if (flags & DEF_PARAM) {
4770 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004771 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004772 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004773 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004774 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004775 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004776 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004777 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4778 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004779 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004780 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004781 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4782 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004783 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004784 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004785 if (v == NULL)
4786 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004787 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004788 goto fail;
4789 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004790 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004791 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004792 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004793 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004794 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004795 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004796 if (v == NULL)
4797 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004798 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004799 goto fail;
4800 Py_DECREF(v);
4801 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004802 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004803 if (PyDict_SetItem(c->c_globals, name,
4804 implicit) < 0)
4805 goto fail;
4806 if (st->st_nscopes != 1) {
4807 v = PyInt_FromLong(flags);
4808 if (PyDict_SetItem(st->st_global,
4809 name, v))
4810 goto fail;
4811 Py_DECREF(v);
4812 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004813 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004814 }
4815 }
4816
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004817 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4818
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004819 if (si.si_ncells > 1) { /* one cell is always in order */
4820 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4821 c->c_varnames, c->c_flags) < 0)
4822 return -1;
4823 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004824 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4825 return -1;
4826 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004827 fail:
4828 /* is this always the right thing to do? */
4829 Py_XDECREF(v);
4830 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004831}
4832
4833static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004834symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004835{
4836 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004837
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004838 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004839 if (st == NULL)
4840 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004841 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00004842
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004843 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004844 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004845 goto fail;
4846 if ((st->st_symbols = PyDict_New()) == NULL)
4847 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004848 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004849 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004850 st->st_errors = 0;
4851 st->st_tmpname = 0;
4852 st->st_private = NULL;
4853 return st;
4854 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004855 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004856 return NULL;
4857}
4858
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004859void
4860PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004861{
4862 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004863 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004864 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004865 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004866}
4867
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004868/* When the compiler exits a scope, it must should update the scope's
4869 free variable information with the list of free variables in its
4870 children.
4871
4872 Variables that are free in children and defined in the current
4873 scope are cellvars.
4874
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004875 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004876 false), free variables in children that are not defined here are
4877 implicit globals.
4878
4879*/
4880
4881static int
4882symtable_update_free_vars(struct symtable *st)
4883{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004884 int i, j, def;
4885 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004886 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004887
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004888 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004889 def = DEF_FREE_CLASS;
4890 else
4891 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004892 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004893 int pos = 0;
4894
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004895 if (list)
4896 PyList_SetSlice(list, 0,
4897 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004898 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004899 PyList_GET_ITEM(ste->ste_children, i);
4900 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004901 int flags = PyInt_AS_LONG(o);
4902 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004903 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004904 if (list == NULL) {
4905 list = PyList_New(0);
4906 if (list == NULL)
4907 return -1;
4908 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004909 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004910 if (PyList_Append(list, name) < 0) {
4911 Py_DECREF(list);
4912 return -1;
4913 }
4914 }
4915 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004916 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004917 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004918 v = PyDict_GetItem(ste->ste_symbols, name);
4919 /* If a name N is declared global in scope A and
4920 referenced in scope B contained (perhaps
4921 indirectly) in A and there are no scopes
4922 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004923 is global in B. Unless A is a class scope,
4924 because class scopes are not considered for
4925 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004926 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004927 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004928 int flags = PyInt_AS_LONG(v);
4929 if (flags & DEF_GLOBAL) {
4930 symtable_undo_free(st, child->ste_id,
4931 name);
4932 continue;
4933 }
4934 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004935 if (ste->ste_nested) {
4936 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004937 name, def) < 0) {
4938 Py_DECREF(list);
4939 return -1;
4940 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004941 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004942 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004943 name) < 0) {
4944 Py_DECREF(list);
4945 return -1;
4946 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004947 }
4948 }
4949 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004950
4951 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004952 return 0;
4953}
4954
4955/* If the current scope is a non-nested class or if name is not
4956 defined in the current, non-nested scope, then it is an implicit
4957 global in all nested scopes.
4958*/
4959
4960static int
4961symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4962{
4963 PyObject *o;
4964 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004965 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004966
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004967 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004968 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004969 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004970 if (o == NULL)
4971 return symtable_undo_free(st, child, name);
4972 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004973
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004974 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004975 return symtable_undo_free(st, child, name);
4976 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004977 return symtable_add_def_o(st, ste->ste_symbols,
4978 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004979}
4980
4981static int
4982symtable_undo_free(struct symtable *st, PyObject *id,
4983 PyObject *name)
4984{
4985 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004986 PyObject *info;
4987 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004988
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004989 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4990 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004991 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00004992
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004993 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004994 if (info == NULL)
4995 return 0;
4996 v = PyInt_AS_LONG(info);
4997 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004998 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004999 DEF_FREE_GLOBAL) < 0)
5000 return -1;
5001 } else
5002 /* If the name is defined here or declared global,
5003 then the recursion stops. */
5004 return 0;
5005
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005006 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5007 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005008 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005009 PyList_GET_ITEM(ste->ste_children, i);
5010 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005011 if (x < 0)
5012 return x;
5013 }
5014 return 0;
5015}
5016
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005017/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5018 This reference is released when the scope is exited, via the DECREF
5019 in symtable_exit_scope().
5020*/
5021
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005022static int
5023symtable_exit_scope(struct symtable *st)
5024{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005025 int end;
5026
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005027 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005028 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005029 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005030 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005031 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5032 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005033 if (PySequence_DelItem(st->st_stack, end) < 0)
5034 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005035 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005036}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005037
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005038static void
5039symtable_enter_scope(struct symtable *st, char *name, int type,
5040 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005041{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005042 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005043
5044 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005045 prev = st->st_cur;
5046 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
5047 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005048 st->st_errors++;
5049 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005050 }
5051 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005052 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005053 PySymtableEntry_New(st, name, type, lineno);
5054 if (strcmp(name, TOP) == 0)
5055 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005056 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005057 if (PyList_Append(prev->ste_children,
5058 (PyObject *)st->st_cur) < 0)
5059 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005060 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005061}
5062
5063static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005064symtable_lookup(struct symtable *st, char *name)
5065{
5066 char buffer[MANGLE_LEN];
5067 PyObject *v;
5068 int flags;
5069
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005070 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005071 name = buffer;
5072 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5073 if (v == NULL) {
5074 if (PyErr_Occurred())
5075 return -1;
5076 else
5077 return 0;
5078 }
5079
5080 flags = PyInt_AS_LONG(v);
5081 return flags;
5082}
5083
5084static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005085symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005086{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005087 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005088 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005089 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005090
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005091 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005092 name = buffer;
5093 if ((s = PyString_InternFromString(name)) == NULL)
5094 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005095 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5096 Py_DECREF(s);
5097 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005098}
5099
5100/* Must only be called with mangled names */
5101
5102static int
5103symtable_add_def_o(struct symtable *st, PyObject *dict,
5104 PyObject *name, int flag)
5105{
5106 PyObject *o;
5107 int val;
5108
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005109 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005110 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005111 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005112 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005113 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005114 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005115 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005116 return -1;
5117 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005118 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005119 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005120 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005121 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005122 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005123 Py_DECREF(o);
5124 return -1;
5125 }
5126 Py_DECREF(o);
5127
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005128 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005129 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005130 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005131 } else if (flag & DEF_GLOBAL) {
5132 /* XXX need to update DEF_GLOBAL for other flags too;
5133 perhaps only DEF_FREE_GLOBAL */
5134 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005135 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005136 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005137 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005138 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005139 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005140 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005141 Py_DECREF(o);
5142 return -1;
5143 }
5144 Py_DECREF(o);
5145 }
5146 return 0;
5147}
5148
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005149#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005150
Tim Peters08a898f2001-06-28 01:52:22 +00005151/* Look for a yield stmt under n. Return 1 if found, else 0.
5152 This hack is used to look inside "if 0:" blocks (which are normally
5153 ignored) in case those are the only places a yield occurs (so that this
5154 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005155static int
5156look_for_yield(node *n)
5157{
5158 int i;
5159
5160 for (i = 0; i < NCH(n); ++i) {
5161 node *kid = CHILD(n, i);
5162
5163 switch (TYPE(kid)) {
5164
5165 case classdef:
5166 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005167 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005168 /* Stuff in nested functions and classes can't make
5169 the parent a generator. */
5170 return 0;
5171
5172 case yield_stmt:
5173 return 1;
5174
5175 default:
5176 if (look_for_yield(kid))
5177 return 1;
5178 }
5179 }
5180 return 0;
5181}
5182
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005183static void
5184symtable_node(struct symtable *st, node *n)
5185{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005186 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005187
5188 loop:
5189 switch (TYPE(n)) {
5190 case funcdef: {
5191 char *func_name = STR(CHILD(n, 1));
5192 symtable_add_def(st, func_name, DEF_LOCAL);
5193 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005194 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005195 symtable_funcdef(st, n);
5196 symtable_exit_scope(st);
5197 break;
5198 }
5199 case lambdef:
5200 if (NCH(n) == 4)
5201 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005202 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005203 symtable_funcdef(st, n);
5204 symtable_exit_scope(st);
5205 break;
5206 case classdef: {
5207 char *tmp, *class_name = STR(CHILD(n, 1));
5208 symtable_add_def(st, class_name, DEF_LOCAL);
5209 if (TYPE(CHILD(n, 2)) == LPAR) {
5210 node *bases = CHILD(n, 3);
5211 int i;
5212 for (i = 0; i < NCH(bases); i += 2) {
5213 symtable_node(st, CHILD(bases, i));
5214 }
5215 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005216 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005217 tmp = st->st_private;
5218 st->st_private = class_name;
5219 symtable_node(st, CHILD(n, NCH(n) - 1));
5220 st->st_private = tmp;
5221 symtable_exit_scope(st);
5222 break;
5223 }
5224 case if_stmt:
5225 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005226 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5227 if (st->st_cur->ste_generator == 0)
5228 st->st_cur->ste_generator =
5229 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005230 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005231 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005232 symtable_node(st, CHILD(n, i + 1));
5233 symtable_node(st, CHILD(n, i + 3));
5234 }
5235 if (i + 2 < NCH(n))
5236 symtable_node(st, CHILD(n, i + 2));
5237 break;
5238 case global_stmt:
5239 symtable_global(st, n);
5240 break;
5241 case import_stmt:
5242 symtable_import(st, n);
5243 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005244 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005245 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005246 symtable_node(st, CHILD(n, 1));
5247 if (NCH(n) > 2)
5248 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005249 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005250 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005251 st->st_cur->ste_opt_lineno = n->n_lineno;
5252 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005253 if (NCH(n) > 4)
5254 symtable_node(st, CHILD(n, 5));
5255 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005256
5257 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005258 case assert_stmt:
5259 if (Py_OptimizeFlag)
5260 return;
5261 if (NCH(n) == 2) {
5262 n = CHILD(n, 1);
5263 goto loop;
5264 } else {
5265 symtable_node(st, CHILD(n, 1));
5266 n = CHILD(n, 3);
5267 goto loop;
5268 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005269 case except_clause:
5270 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005271 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005272 if (NCH(n) > 1) {
5273 n = CHILD(n, 1);
5274 goto loop;
5275 }
5276 break;
5277 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005278 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005279 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005280 case yield_stmt:
5281 st->st_cur->ste_generator = 1;
5282 n = CHILD(n, 1);
5283 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005284 case expr_stmt:
5285 if (NCH(n) == 1)
5286 n = CHILD(n, 0);
5287 else {
5288 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005289 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005290 symtable_node(st, CHILD(n, 2));
5291 break;
5292 } else {
5293 int i;
5294 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005295 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005296 n = CHILD(n, NCH(n) - 1);
5297 }
5298 }
5299 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005300 case list_iter:
5301 n = CHILD(n, 0);
5302 if (TYPE(n) == list_for) {
5303 st->st_tmpname++;
5304 symtable_list_comprehension(st, n);
5305 st->st_tmpname--;
5306 } else {
5307 REQ(n, list_if);
5308 symtable_node(st, CHILD(n, 1));
5309 if (NCH(n) == 3) {
5310 n = CHILD(n, 2);
5311 goto loop;
5312 }
5313 }
5314 break;
5315 case for_stmt:
5316 symtable_assign(st, CHILD(n, 1), 0);
5317 for (i = 3; i < NCH(n); ++i)
5318 if (TYPE(CHILD(n, i)) >= single_input)
5319 symtable_node(st, CHILD(n, i));
5320 break;
5321 /* The remaining cases fall through to default except in
5322 special circumstances. This requires the individual cases
5323 to be coded with great care, even though they look like
5324 rather innocuous. Each case must double-check TYPE(n).
5325 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005326 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005327 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005328 n = CHILD(n, 2);
5329 goto loop;
5330 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005331 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005332 case listmaker:
5333 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00005334 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005335 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00005336 symtable_node(st, CHILD(n, 0));
5337 st->st_tmpname--;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005338 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005339 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005340 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005341 case atom:
5342 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5343 symtable_add_use(st, STR(CHILD(n, 0)));
5344 break;
5345 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005346 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005347 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005348 /* Walk over every non-token child with a special case
5349 for one child.
5350 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005351 if (NCH(n) == 1) {
5352 n = CHILD(n, 0);
5353 goto loop;
5354 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005355 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005356 if (TYPE(CHILD(n, i)) >= single_input)
5357 symtable_node(st, CHILD(n, i));
5358 }
5359}
5360
5361static void
5362symtable_funcdef(struct symtable *st, node *n)
5363{
5364 node *body;
5365
5366 if (TYPE(n) == lambdef) {
5367 if (NCH(n) == 4)
5368 symtable_params(st, CHILD(n, 1));
5369 } else
5370 symtable_params(st, CHILD(n, 2));
5371 body = CHILD(n, NCH(n) - 1);
5372 symtable_node(st, body);
5373}
5374
5375/* The next two functions parse the argument tuple.
5376 symtable_default_arg() checks for names in the default arguments,
5377 which are references in the defining scope. symtable_params()
5378 parses the parameter names, which are defined in the function's
5379 body.
5380
5381 varargslist:
5382 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5383 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5384*/
5385
5386static void
5387symtable_default_args(struct symtable *st, node *n)
5388{
5389 node *c;
5390 int i;
5391
5392 if (TYPE(n) == parameters) {
5393 n = CHILD(n, 1);
5394 if (TYPE(n) == RPAR)
5395 return;
5396 }
5397 REQ(n, varargslist);
5398 for (i = 0; i < NCH(n); i += 2) {
5399 c = CHILD(n, i);
5400 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5401 break;
5402 }
5403 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5404 symtable_node(st, CHILD(n, i));
5405 }
5406}
5407
5408static void
5409symtable_params(struct symtable *st, node *n)
5410{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005411 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005412 node *c = NULL;
5413
5414 if (TYPE(n) == parameters) {
5415 n = CHILD(n, 1);
5416 if (TYPE(n) == RPAR)
5417 return;
5418 }
5419 REQ(n, varargslist);
5420 for (i = 0; i < NCH(n); i += 2) {
5421 c = CHILD(n, i);
5422 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5423 ext = 1;
5424 break;
5425 }
5426 if (TYPE(c) == test) {
5427 continue;
5428 }
5429 if (TYPE(CHILD(c, 0)) == NAME)
5430 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
5431 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005432 char nbuf[30];
5433 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005434 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005435 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005436 }
5437 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005438 if (ext) {
5439 c = CHILD(n, i);
5440 if (TYPE(c) == STAR) {
5441 i++;
5442 symtable_add_def(st, STR(CHILD(n, i)),
5443 DEF_PARAM | DEF_STAR);
5444 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005445 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005446 c = NULL;
5447 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005448 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005449 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005450 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005451 i++;
5452 symtable_add_def(st, STR(CHILD(n, i)),
5453 DEF_PARAM | DEF_DOUBLESTAR);
5454 }
5455 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005456 if (complex >= 0) {
5457 int j;
5458 for (j = 0; j <= complex; j++) {
5459 c = CHILD(n, j);
5460 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005461 c = CHILD(n, ++j);
5462 else if (TYPE(c) == EQUAL)
5463 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005464 if (TYPE(CHILD(c, 0)) == LPAR)
5465 symtable_params_fplist(st, CHILD(c, 1));
5466 }
5467 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005468}
5469
5470static void
5471symtable_params_fplist(struct symtable *st, node *n)
5472{
5473 int i;
5474 node *c;
5475
5476 REQ(n, fplist);
5477 for (i = 0; i < NCH(n); i += 2) {
5478 c = CHILD(n, i);
5479 REQ(c, fpdef);
5480 if (NCH(c) == 1)
5481 symtable_add_def(st, STR(CHILD(c, 0)),
5482 DEF_PARAM | DEF_INTUPLE);
5483 else
5484 symtable_params_fplist(st, CHILD(c, 1));
5485 }
5486
5487}
5488
5489static void
5490symtable_global(struct symtable *st, node *n)
5491{
5492 int i;
5493
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005494 /* XXX It might be helpful to warn about module-level global
5495 statements, but it's hard to tell the difference between
5496 module-level and a string passed to exec.
5497 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005498
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005499 for (i = 1; i < NCH(n); i += 2) {
5500 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005501 int flags;
5502
5503 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005504 if (flags < 0)
5505 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005506 if (flags && flags != DEF_GLOBAL) {
5507 char buf[500];
5508 if (flags & DEF_PARAM) {
5509 PyErr_Format(PyExc_SyntaxError,
5510 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005511 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005512 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005513 st->st_cur->ste_lineno);
5514 st->st_errors++;
5515 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005516 }
5517 else {
5518 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005519 PyOS_snprintf(buf, sizeof(buf),
5520 GLOBAL_AFTER_ASSIGN,
5521 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005522 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005523 PyOS_snprintf(buf, sizeof(buf),
5524 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005525 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005526 }
5527 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005528 symtable_add_def(st, name, DEF_GLOBAL);
5529 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005530}
5531
5532static void
5533symtable_list_comprehension(struct symtable *st, node *n)
5534{
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005535 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005536
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005537 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005538 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005539 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005540 symtable_node(st, CHILD(n, 3));
5541 if (NCH(n) == 5)
5542 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005543}
5544
5545static void
5546symtable_import(struct symtable *st, node *n)
5547{
5548 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005549 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005550 | 'from' dotted_name 'import'
5551 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005552 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005553 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005554 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005555 node *dotname = CHILD(n, 1);
5556 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5557 /* check for bogus imports */
5558 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5559 PyErr_SetString(PyExc_SyntaxError,
5560 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005561 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005562 n->n_lineno);
5563 st->st_errors++;
5564 return;
5565 }
5566 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005567 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005568 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005569 if (symtable_warn(st,
5570 "import * only allowed at module level") < 0)
5571 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005572 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005573 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005574 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005575 } else {
5576 for (i = 3; i < NCH(n); i += 2) {
5577 node *c = CHILD(n, i);
5578 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005579 symtable_assign(st, CHILD(c, 2),
5580 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005581 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005582 symtable_assign(st, CHILD(c, 0),
5583 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005584 }
5585 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005586 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005587 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005588 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005589 }
5590 }
5591}
5592
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005593/* The third argument to symatble_assign() is a flag to be passed to
5594 symtable_add_def() if it is eventually called. The flag is useful
5595 to specify the particular type of assignment that should be
5596 recorded, e.g. an assignment caused by import.
5597 */
5598
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005599static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005600symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005601{
5602 node *tmp;
5603 int i;
5604
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005605 loop:
5606 switch (TYPE(n)) {
5607 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005608 /* invalid assignment, e.g. lambda x:x=2. The next
5609 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005610 return;
5611 case power:
5612 if (NCH(n) > 2) {
5613 for (i = 2; i < NCH(n); ++i)
5614 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5615 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005616 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005617 if (NCH(n) > 1) {
5618 symtable_node(st, CHILD(n, 0));
5619 symtable_node(st, CHILD(n, 1));
5620 } else {
5621 n = CHILD(n, 0);
5622 goto loop;
5623 }
5624 return;
5625 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005626 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5627 /* XXX This is an error, but the next pass
5628 will catch it. */
5629 return;
5630 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005631 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005632 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005633 }
5634 return;
5635 case exprlist:
5636 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00005637 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005638 if (NCH(n) == 1) {
5639 n = CHILD(n, 0);
5640 goto loop;
5641 }
5642 else {
5643 int i;
5644 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005645 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005646 return;
5647 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005648 case atom:
5649 tmp = CHILD(n, 0);
5650 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5651 n = CHILD(n, 1);
5652 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005653 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00005654 if (strcmp(STR(tmp), "__debug__") == 0) {
5655 PyErr_SetString(PyExc_SyntaxError,
5656 ASSIGN_DEBUG);
5657 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton86424e32001-12-04 02:41:46 +00005658 n->n_lineno);
Jeremy Hylton778e2652001-11-09 19:50:08 +00005659 st->st_errors++;
5660 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005661 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005662 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005663 return;
5664 case dotted_as_name:
5665 if (NCH(n) == 3)
5666 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005667 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005668 else
5669 symtable_add_def(st,
5670 STR(CHILD(CHILD(n,
5671 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005672 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005673 return;
5674 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005675 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005676 return;
5677 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005678 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005679 return;
5680 default:
5681 if (NCH(n) == 0)
5682 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005683 if (NCH(n) == 1) {
5684 n = CHILD(n, 0);
5685 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005686 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005687 /* Should only occur for errors like x + 1 = 1,
5688 which will be caught in the next pass. */
5689 for (i = 0; i < NCH(n); ++i)
5690 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005691 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005692 }
5693}