blob: ff8f4a56dcaa4c02687c70f7190b4e596156da9c [file] [log] [blame]
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001/* Compile an expression node to intermediate code */
2
Guido van Rossum3f5da241990-12-20 15:06:42 +00003/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004 XXX add __doc__ attribute == co_doc to code object attributes?
5 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +00006 XXX Generate simple jump for break/return outside 'try...finally'
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00007 XXX Allow 'continue' inside finally clause of try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +00008 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +00009 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000010*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011
Guido van Rossum79f25d91997-04-29 20:08:16 +000012#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000013
Guido van Rossum10dc2e81990-11-18 17:27:39 +000014#include "node.h"
15#include "token.h"
16#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000017#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000018#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000019#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000020#include "structmember.h"
21
22#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000023
Guido van Rossumb05a5c71997-05-07 17:46:13 +000024/* Three symbols from graminit.h are also defined in Python.h, with
25 Py_ prefixes to their names. Python.h can't include graminit.h
26 (which defines too many confusing symbols), but we can check here
27 that they haven't changed (which is very unlikely, but possible). */
28#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000029 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000030#endif
31#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000032 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000033#endif
34#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000035 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000036#endif
37
Guido van Rossum8e793d91997-03-03 19:13:14 +000038int Py_OptimizeFlag = 0;
39
Guido van Rossum8861b741996-07-30 16:49:37 +000040#define OP_DELETE 0
41#define OP_ASSIGN 1
42#define OP_APPLY 2
43
Jeremy Hyltone36f7782001-01-19 03:21:30 +000044#define VAR_LOAD 0
45#define VAR_STORE 1
46#define VAR_DELETE 2
47
Jeremy Hylton64949cb2001-01-25 20:06:59 +000048#define DEL_CLOSURE_ERROR \
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000049"can not delete variable '%.400s' referenced in nested scope"
50
51#define DUPLICATE_ARGUMENT \
52"duplicate argument '%s' in function definition"
53
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000054#define ILLEGAL_DYNAMIC_SCOPE \
55"%.100s: exec or 'import *' makes names ambiguous in nested scope"
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000056
Jeremy Hylton29906ee2001-02-27 04:23:34 +000057#define GLOBAL_AFTER_ASSIGN \
58"name '%.400s' is assigned to before global declaration"
59
60#define GLOBAL_AFTER_USE \
61"name '%.400s' is used prior to global declaration"
62
63#define LOCAL_GLOBAL \
Neal Norwitz2a47c0f2002-01-29 00:53:41 +000064"name '%.400s' is a function parameter and declared global"
Jeremy Hylton29906ee2001-02-27 04:23:34 +000065
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +000066#define LATE_FUTURE \
67"from __future__ imports must occur at the beginning of the file"
68
Jeremy Hylton897b8212001-03-23 14:08:38 +000069#define ASSIGN_DEBUG \
70"can not assign to __debug__"
71
Jeremy Hyltone36f7782001-01-19 03:21:30 +000072#define MANGLE_LEN 256
73
Guido van Rossum79f25d91997-04-29 20:08:16 +000074#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000075
Guido van Rossum6f799372001-09-20 20:46:19 +000076static PyMemberDef code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000077 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
78 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000079 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000080 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000081 {"co_code", T_OBJECT, OFF(co_code), READONLY},
82 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
83 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000084 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000085 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
86 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000087 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000088 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000089 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
90 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000091 {NULL} /* Sentinel */
92};
93
Guido van Rossumbea18cc2002-06-14 20:41:17 +000094PyDoc_STRVAR(code_doc,
95"code(argcount, nlocals, stacksize, flags, codestring, constants, names,\n\
96 varnames, filename, name, firstlineno, lnotab[, freevars[, cellvars]])\n\
97\n\
98Create a code object. Not for the faint of heart.");
99
100static PyObject *
101code_new(PyTypeObject *type, PyObject *args, PyObject *kw)
102{
103 int argcount;
104 int nlocals;
105 int stacksize;
106 int flags;
107 PyObject *code;
108 PyObject *consts;
109 PyObject *names;
110 PyObject *varnames;
111 PyObject *freevars = NULL;
112 PyObject *cellvars = NULL;
113 PyObject *filename;
114 PyObject *name;
115 int firstlineno;
116 PyObject *lnotab;
117
118 if (!PyArg_ParseTuple(args, "iiiiSO!O!O!SSiS|O!O!:code",
119 &argcount, &nlocals, &stacksize, &flags,
120 &code,
121 &PyTuple_Type, &consts,
122 &PyTuple_Type, &names,
123 &PyTuple_Type, &varnames,
124 &filename, &name,
125 &firstlineno, &lnotab,
126 &PyTuple_Type, &freevars,
127 &PyTuple_Type, &cellvars))
128 return NULL;
129
130 if (freevars == NULL || cellvars == NULL) {
131 PyObject *empty = PyTuple_New(0);
132 if (empty == NULL)
133 return NULL;
134 if (freevars == NULL) {
135 freevars = empty;
136 Py_INCREF(freevars);
137 }
138 if (cellvars == NULL) {
139 cellvars = empty;
140 Py_INCREF(cellvars);
141 }
142 Py_DECREF(empty);
143 }
144
145 if (!PyObject_CheckReadBuffer(code)) {
146 PyErr_SetString(PyExc_TypeError,
147 "bytecode object must be a single-segment read-only buffer");
148 return NULL;
149 }
150
151 return (PyObject *)PyCode_New(argcount, nlocals, stacksize, flags,
152 code, consts, names, varnames,
153 freevars, cellvars, filename, name,
154 firstlineno, lnotab);
155}
156
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000157static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000158code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000159{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000160 Py_XDECREF(co->co_code);
161 Py_XDECREF(co->co_consts);
162 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000163 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000164 Py_XDECREF(co->co_freevars);
165 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000166 Py_XDECREF(co->co_filename);
167 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000168 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000169 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000170}
171
Guido van Rossum79f25d91997-04-29 20:08:16 +0000172static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000173code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000174{
175 char buf[500];
176 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000177 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000178 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000179
Guido van Rossuma396a882000-04-07 01:21:36 +0000180 if (co->co_firstlineno != 0)
181 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000182 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000183 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000184 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000185 name = PyString_AS_STRING(co->co_name);
Barry Warsaw8f6d8682001-11-28 21:10:39 +0000186 PyOS_snprintf(buf, sizeof(buf),
187 "<code object %.100s at %p, file \"%.300s\", line %d>",
188 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000189 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000190}
191
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000192static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000193code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000194{
195 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000196 cmp = PyObject_Compare(co->co_name, cp->co_name);
197 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000198 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000199 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000200 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000201 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000202 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000203 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000204 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000205 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000206 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000207 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000208 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000209 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000210 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000211 if (cmp) return cmp;
212 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
213 if (cmp) return cmp;
214 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000215 return cmp;
216}
217
218static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000219code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000220{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000221 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000222 h0 = PyObject_Hash(co->co_name);
223 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000224 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000225 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000227 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000228 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000229 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000230 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000231 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000232 h5 = PyObject_Hash(co->co_freevars);
233 if (h5 == -1) return -1;
234 h6 = PyObject_Hash(co->co_cellvars);
235 if (h6 == -1) return -1;
236 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000237 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000238 if (h == -1) h = -2;
239 return h;
240}
241
Jeremy Hylton78891072001-03-01 06:09:34 +0000242/* XXX code objects need to participate in GC? */
243
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244PyTypeObject PyCode_Type = {
245 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000246 0,
247 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000248 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000249 0,
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000250 (destructor)code_dealloc, /* tp_dealloc */
251 0, /* tp_print */
252 0, /* tp_getattr */
253 0, /* tp_setattr */
254 (cmpfunc)code_compare, /* tp_compare */
255 (reprfunc)code_repr, /* tp_repr */
256 0, /* tp_as_number */
257 0, /* tp_as_sequence */
258 0, /* tp_as_mapping */
259 (hashfunc)code_hash, /* tp_hash */
260 0, /* tp_call */
261 0, /* tp_str */
262 PyObject_GenericGetAttr, /* tp_getattro */
263 0, /* tp_setattro */
264 0, /* tp_as_buffer */
265 Py_TPFLAGS_DEFAULT, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000266 code_doc, /* tp_doc */
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000267 0, /* tp_traverse */
268 0, /* tp_clear */
269 0, /* tp_richcompare */
270 0, /* tp_weaklistoffset */
271 0, /* tp_iter */
272 0, /* tp_iternext */
273 0, /* tp_methods */
274 code_memberlist, /* tp_members */
275 0, /* tp_getset */
276 0, /* tp_base */
277 0, /* tp_dict */
278 0, /* tp_descr_get */
279 0, /* tp_descr_set */
280 0, /* tp_dictoffset */
281 0, /* tp_init */
282 0, /* tp_alloc */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000283 code_new, /* tp_new */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000284};
285
Guido van Rossum644a12b1997-04-09 19:24:53 +0000286#define NAME_CHARS \
287 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
288
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000289/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
290
291static int
292all_name_chars(unsigned char *s)
293{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000294 static char ok_name_char[256];
295 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000296
Guido van Rossumcd90c202001-02-09 15:06:42 +0000297 if (ok_name_char[*name_chars] == 0) {
298 unsigned char *p;
299 for (p = name_chars; *p; p++)
300 ok_name_char[*p] = 1;
301 }
302 while (*s) {
303 if (ok_name_char[*s++] == 0)
304 return 0;
305 }
306 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000307}
308
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000309static int
310intern_strings(PyObject *tuple)
311{
312 int i;
313
314 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
315 PyObject *v = PyTuple_GET_ITEM(tuple, i);
316 if (v == NULL || !PyString_Check(v)) {
317 Py_FatalError("non-string found in code slot");
318 PyErr_BadInternalCall();
319 return -1;
320 }
321 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
322 }
323 return 0;
324}
325
Guido van Rossum79f25d91997-04-29 20:08:16 +0000326PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000327PyCode_New(int argcount, int nlocals, int stacksize, int flags,
328 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000329 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
330 PyObject *filename, PyObject *name, int firstlineno,
331 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000332{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000333 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000334 int i;
335 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000336 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000337 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000338 consts == NULL || !PyTuple_Check(consts) ||
339 names == NULL || !PyTuple_Check(names) ||
340 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000341 freevars == NULL || !PyTuple_Check(freevars) ||
342 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000343 name == NULL || !PyString_Check(name) ||
344 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000345 lnotab == NULL || !PyString_Check(lnotab) ||
346 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000347 PyErr_BadInternalCall();
348 return NULL;
349 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000350 intern_strings(names);
351 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000352 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000353 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000354 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000355 for (i = PyTuple_Size(consts); --i >= 0; ) {
356 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000357 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000358 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000359 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000360 continue;
361 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000362 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000363 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000364 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000365 co->co_argcount = argcount;
366 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000367 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000368 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000369 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000370 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000371 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000372 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000373 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000374 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000375 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000376 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000377 Py_INCREF(freevars);
378 co->co_freevars = freevars;
379 Py_INCREF(cellvars);
380 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000381 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000382 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000383 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000384 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000385 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000386 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000387 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000388 }
389 return co;
390}
391
392
393/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000394
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000395/* The compiler uses two passes to generate bytecodes. The first pass
396 builds the symbol table. The second pass generates the bytecode.
397
398 The first pass uses a single symtable struct. The second pass uses
399 a compiling struct for each code block. The compiling structs
400 share a reference to the symtable.
401
402 The two passes communicate via symtable_load_symbols() and via
403 is_local() and is_global(). The former initializes several slots
404 in the compiling struct: c_varnames, c_locals, c_nlocals,
405 c_argcount, c_globals, and c_flags.
406*/
407
Tim Peters2a7f3842001-06-09 09:26:21 +0000408/* All about c_lnotab.
409
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000410c_lnotab is an array of unsigned bytes disguised as a Python string. Since
411version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
412mapped to source code line #s via c_lnotab instead.
413
Tim Peters2a7f3842001-06-09 09:26:21 +0000414The array is conceptually a list of
415 (bytecode offset increment, line number increment)
416pairs. The details are important and delicate, best illustrated by example:
417
418 byte code offset source code line number
419 0 1
420 6 2
421 50 7
422 350 307
423 361 308
424
425The first trick is that these numbers aren't stored, only the increments
426from one row to the next (this doesn't really work, but it's a start):
427
428 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
429
430The second trick is that an unsigned byte can't hold negative values, or
431values larger than 255, so (a) there's a deep assumption that byte code
432offsets and their corresponding line #s both increase monotonically, and (b)
433if at least one column jumps by more than 255 from one row to the next, more
434than one pair is written to the table. In case #b, there's no way to know
435from looking at the table later how many were written. That's the delicate
436part. A user of c_lnotab desiring to find the source line number
437corresponding to a bytecode address A should do something like this
438
439 lineno = addr = 0
440 for addr_incr, line_incr in c_lnotab:
441 addr += addr_incr
442 if addr > A:
443 return lineno
444 lineno += line_incr
445
446In order for this to work, when the addr field increments by more than 255,
447the line # increment in each pair generated must be 0 until the remaining addr
448increment is < 256. So, in the example above, com_set_lineno should not (as
449was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
450255, 0, 45, 255, 0, 45.
451*/
452
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000453struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000454 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000455 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000456 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000457 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000458 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000459 PyObject *c_globals; /* dictionary (value=None) */
460 PyObject *c_locals; /* dictionary (value=localID) */
461 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000462 PyObject *c_freevars; /* dictionary (value=None) */
463 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000464 int c_nlocals; /* index of next local */
465 int c_argcount; /* number of top-level arguments */
466 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000467 int c_nexti; /* index into c_code */
468 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000469 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000470 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000471 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000472 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000473 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000474 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000475 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000476 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000477 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000478 int c_stacklevel; /* Current stack level */
479 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000480 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000481 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000482 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000483 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000484 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000485 int c_nested; /* Is block nested funcdef or lamdef? */
486 int c_closure; /* Is nested w/freevars? */
487 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000488 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000489 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000490};
491
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000492static int
493is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000494{
495 if ((v & (USE | DEF_FREE))
496 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
497 return 1;
498 if (v & DEF_FREE_CLASS)
499 return 1;
500 return 0;
501}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000502
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000503static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000504com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000505{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000506 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
507
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000508 if (c == NULL) {
509 /* Error occurred via symtable call to
510 is_constant_false */
511 PyErr_SetString(exc, msg);
512 return;
513 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000514 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000515 if (c->c_lineno < 1 || c->c_interactive) {
516 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000517 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000518 return;
519 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000520 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000521 if (v == NULL)
522 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000523
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000524 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000525 if (line == NULL) {
526 Py_INCREF(Py_None);
527 line = Py_None;
528 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000529 if (exc == PyExc_SyntaxError) {
530 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
531 Py_None, line);
532 if (t == NULL)
533 goto exit;
534 w = Py_BuildValue("(OO)", v, t);
535 if (w == NULL)
536 goto exit;
537 PyErr_SetObject(exc, w);
538 } else {
539 /* Make sure additional exceptions are printed with
540 file and line, also. */
541 PyErr_SetObject(exc, v);
542 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
543 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000544 exit:
545 Py_XDECREF(t);
546 Py_XDECREF(v);
547 Py_XDECREF(w);
548 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000549}
550
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000551/* Interface to the block stack */
552
553static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000554block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000555{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000556 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000557 com_error(c, PyExc_SystemError,
558 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000559 }
560 else {
561 c->c_block[c->c_nblocks++] = type;
562 }
563}
564
565static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000566block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000567{
568 if (c->c_nblocks > 0)
569 c->c_nblocks--;
570 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000571 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000572 }
573}
574
Guido van Rossum681d79a1995-07-18 14:51:37 +0000575/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000576
Tim Petersdbd9ba62000-07-09 03:09:57 +0000577static int com_init(struct compiling *, char *);
578static void com_free(struct compiling *);
579static void com_push(struct compiling *, int);
580static void com_pop(struct compiling *, int);
581static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000582static void com_node(struct compiling *, node *);
583static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000584static void com_addbyte(struct compiling *, int);
585static void com_addint(struct compiling *, int);
586static void com_addoparg(struct compiling *, int, int);
587static void com_addfwref(struct compiling *, int, int *);
588static void com_backpatch(struct compiling *, int);
589static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
590static int com_addconst(struct compiling *, PyObject *);
591static int com_addname(struct compiling *, PyObject *);
592static void com_addopname(struct compiling *, int, node *);
593static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000594static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000595static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000596static void com_assign(struct compiling *, node *, int, node *);
597static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000598static PyCodeObject *icompile(node *, struct compiling *);
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000599static PyCodeObject *jcompile(node *, char *, struct compiling *,
600 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000601static PyObject *parsestrplus(struct compiling*, node *);
602static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000603static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000604
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000605static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000606
607/* symtable operations */
608static int symtable_build(struct compiling *, node *);
609static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000610static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000611static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000612static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000613static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000614static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000615
616static void symtable_node(struct symtable *, node *);
617static void symtable_funcdef(struct symtable *, node *);
618static void symtable_default_args(struct symtable *, node *);
619static void symtable_params(struct symtable *, node *);
620static void symtable_params_fplist(struct symtable *, node *n);
621static void symtable_global(struct symtable *, node *);
622static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000623static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000624static void symtable_list_comprehension(struct symtable *, node *);
625
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000626static int symtable_update_free_vars(struct symtable *);
627static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
628static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
629
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000630/* helper */
631static void
632do_pad(int pad)
633{
634 int i;
635 for (i = 0; i < pad; ++i)
636 fprintf(stderr, " ");
637}
638
639static void
640dump(node *n, int pad, int depth)
641{
642 int i;
643 if (depth == 0)
644 return;
645 do_pad(pad);
646 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
647 if (depth > 0)
648 depth--;
649 for (i = 0; i < NCH(n); ++i)
650 dump(CHILD(n, i), pad + 1, depth);
651}
652
653#define DUMP(N) dump(N, 0, -1)
654
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000655static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000656com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000657{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000658 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000659 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
660 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000661 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000662 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000663 goto fail;
664 if ((c->c_const_dict = PyDict_New()) == NULL)
665 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000666 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000667 goto fail;
668 if ((c->c_name_dict = PyDict_New()) == NULL)
669 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000670 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000671 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000672 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
673 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000674 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000675 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000676 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000677 c->c_freevars = NULL;
678 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000679 c->c_nlocals = 0;
680 c->c_argcount = 0;
681 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000682 c->c_nexti = 0;
683 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000684 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000685 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000686 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000687 c->c_begin = 0;
688 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000689 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000690 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000691 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000692 c->c_stacklevel = 0;
693 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000694 c->c_firstlineno = 0;
695 c->c_last_addr = 0;
696 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000697 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000698 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000699 c->c_nested = 0;
700 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000701 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000702 return 1;
703
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000704 fail:
705 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000706 return 0;
707}
708
709static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000710com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000711{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000712 Py_XDECREF(c->c_code);
713 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000714 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000715 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000716 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000717 Py_XDECREF(c->c_globals);
718 Py_XDECREF(c->c_locals);
719 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000720 Py_XDECREF(c->c_freevars);
721 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000722 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000723 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +0000724 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000725}
726
727static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000728com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000729{
730 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000731 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +0000732 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000733 /*
734 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
735 c->c_filename, c->c_name, c->c_lineno,
736 c->c_nexti, c->c_stacklevel, n);
737 */
738 }
Guido van Rossum8b993a91997-01-17 21:04:03 +0000739}
740
741static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000742com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000743{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000744 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000745 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000746 else
747 c->c_stacklevel -= n;
748}
749
750static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000751com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000752{
753 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000754 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000755 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000756 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000757}
758
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000759static int
760com_check_size(PyObject **s, int offset)
761{
762 int len = PyString_GET_SIZE(*s);
763 if (offset >= len)
764 return _PyString_Resize(s, len * 2);
765 return 0;
766}
767
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000768static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000769com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000770{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000771 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000772 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +0000773 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000774 if (com_check_size(&c->c_code, c->c_nexti)) {
775 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000776 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000777 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000778 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000779}
780
781static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000782com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000783{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000784 com_addbyte(c, x & 0xff);
785 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000786}
787
788static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000789com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000790{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000791 char *p;
792 if (c->c_lnotab == NULL)
793 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000794 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
795 c->c_errors++;
796 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000797 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000798 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000799 *p++ = addr;
800 *p++ = line;
801 c->c_lnotab_next += 2;
802}
803
804static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000805com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000806{
807 c->c_lineno = lineno;
808 if (c->c_firstlineno == 0) {
809 c->c_firstlineno = c->c_last_line = lineno;
810 }
811 else {
812 int incr_addr = c->c_nexti - c->c_last_addr;
813 int incr_line = lineno - c->c_last_line;
Tim Peters2a7f3842001-06-09 09:26:21 +0000814 while (incr_addr > 255) {
815 com_add_lnotab(c, 255, 0);
816 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000817 }
Tim Peters2a7f3842001-06-09 09:26:21 +0000818 while (incr_line > 255) {
819 com_add_lnotab(c, incr_addr, 255);
820 incr_line -=255;
821 incr_addr = 0;
822 }
823 if (incr_addr > 0 || incr_line > 0)
824 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000825 c->c_last_addr = c->c_nexti;
826 c->c_last_line = lineno;
827 }
828}
829
830static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000831com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000832{
Fred Drakeef8ace32000-08-24 00:32:09 +0000833 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +0000834 if (extended_arg){
835 com_addbyte(c, EXTENDED_ARG);
836 com_addint(c, extended_arg);
837 arg &= 0xffff;
838 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000839 com_addbyte(c, op);
840 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000841}
842
843static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000844com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000845{
846 /* Compile a forward reference for backpatching */
847 int here;
848 int anchor;
849 com_addbyte(c, op);
850 here = c->c_nexti;
851 anchor = *p_anchor;
852 *p_anchor = here;
853 com_addint(c, anchor == 0 ? 0 : here - anchor);
854}
855
856static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000857com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000858{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000859 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000860 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000861 int dist;
862 int prev;
863 for (;;) {
864 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000865 prev = code[anchor] + (code[anchor+1] << 8);
866 dist = target - (anchor+2);
867 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000868 dist >>= 8;
869 code[anchor+1] = dist;
870 dist >>= 8;
871 if (dist) {
872 com_error(c, PyExc_SystemError,
873 "com_backpatch: offset too large");
874 break;
875 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000876 if (!prev)
877 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000878 anchor -= prev;
879 }
880}
881
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000882/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000883
884static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000885com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000886{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000887 PyObject *w, *t, *np=NULL;
888 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000889
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000890 t = Py_BuildValue("(OO)", v, v->ob_type);
891 if (t == NULL)
892 goto fail;
893 w = PyDict_GetItem(dict, t);
894 if (w != NULL) {
895 n = PyInt_AsLong(w);
896 } else {
897 n = PyList_Size(list);
898 np = PyInt_FromLong(n);
899 if (np == NULL)
900 goto fail;
901 if (PyList_Append(list, v) != 0)
902 goto fail;
903 if (PyDict_SetItem(dict, t, np) != 0)
904 goto fail;
905 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000906 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000907 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000908 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000909 fail:
910 Py_XDECREF(np);
911 Py_XDECREF(t);
912 c->c_errors++;
913 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000914}
915
916static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000917com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000918{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000919 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000920}
921
922static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000923com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000924{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000925 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000926}
927
Raymond Hettinger0ae0c072002-06-20 22:23:15 +0000928int
929_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000930{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000931 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000932 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000933 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000934 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
935 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000936 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000937 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000938 return 0; /* Don't mangle __extremely_long_names */
939 if (name[nlen-1] == '_' && name[nlen-2] == '_')
940 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000941 /* Strip leading underscores from class name */
942 while (*p == '_')
943 p++;
944 if (*p == '\0')
945 return 0; /* Don't mangle if class is just underscores */
946 plen = strlen(p);
947 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000948 plen = maxlen-nlen-2; /* Truncate class name if too long */
949 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000950 buffer[0] = '_';
951 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000952 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000953 return 1;
954}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000955
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000956static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000957com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000958{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000959 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000960 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000961 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000962
Raymond Hettinger0ae0c072002-06-20 22:23:15 +0000963 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000964 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000965 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000966 c->c_errors++;
967 i = 255;
968 }
969 else {
970 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000971 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000972 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000973 com_addoparg(c, op, i);
974}
975
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000976#define NAME_LOCAL 0
977#define NAME_GLOBAL 1
978#define NAME_DEFAULT 2
979#define NAME_CLOSURE 3
980
981static int
982com_lookup_arg(PyObject *dict, PyObject *name)
983{
984 PyObject *v = PyDict_GetItem(dict, name);
985 if (v == NULL)
986 return -1;
987 else
988 return PyInt_AS_LONG(v);
989}
990
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000991static void
992com_addop_varname(struct compiling *c, int kind, char *name)
993{
994 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000995 int i, reftype;
996 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000997 int op = STOP_CODE;
998 char buffer[MANGLE_LEN];
999
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001000 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001001 name = buffer;
1002 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1003 c->c_errors++;
1004 i = 255;
1005 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001006 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001007
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001008 reftype = get_ref_type(c, name);
1009 switch (reftype) {
1010 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001011 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001012 scope = NAME_LOCAL;
1013 break;
1014 case GLOBAL_EXPLICIT:
1015 scope = NAME_GLOBAL;
1016 break;
1017 case GLOBAL_IMPLICIT:
1018 if (c->c_flags & CO_OPTIMIZED)
1019 scope = NAME_GLOBAL;
1020 break;
1021 case FREE:
1022 case CELL:
1023 scope = NAME_CLOSURE;
1024 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001025 }
1026
1027 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001028 if (scope == NAME_LOCAL)
1029 i = com_lookup_arg(c->c_locals, v);
1030 else if (reftype == FREE)
1031 i = com_lookup_arg(c->c_freevars, v);
1032 else if (reftype == CELL)
1033 i = com_lookup_arg(c->c_cellvars, v);
1034 if (i == -1) {
1035 c->c_errors++; /* XXX no exception set */
1036 i = 255;
1037 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001038 }
1039 Py_DECREF(v);
1040
1041 switch (kind) {
1042 case VAR_LOAD:
1043 switch (scope) {
1044 case NAME_LOCAL:
1045 op = LOAD_FAST;
1046 break;
1047 case NAME_GLOBAL:
1048 op = LOAD_GLOBAL;
1049 break;
1050 case NAME_DEFAULT:
1051 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001052 break;
1053 case NAME_CLOSURE:
1054 op = LOAD_DEREF;
1055 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001056 }
1057 break;
1058 case VAR_STORE:
1059 switch (scope) {
1060 case NAME_LOCAL:
1061 op = STORE_FAST;
1062 break;
1063 case NAME_GLOBAL:
1064 op = STORE_GLOBAL;
1065 break;
1066 case NAME_DEFAULT:
1067 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001068 break;
1069 case NAME_CLOSURE:
1070 op = STORE_DEREF;
1071 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001072 }
1073 break;
1074 case VAR_DELETE:
1075 switch (scope) {
1076 case NAME_LOCAL:
1077 op = DELETE_FAST;
1078 break;
1079 case NAME_GLOBAL:
1080 op = DELETE_GLOBAL;
1081 break;
1082 case NAME_DEFAULT:
1083 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001084 break;
1085 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001086 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001087 PyOS_snprintf(buf, sizeof(buf),
1088 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001089 com_error(c, PyExc_SyntaxError, buf);
1090 i = 255;
1091 break;
1092 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001093 }
1094 break;
1095 }
1096done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001097 com_addoparg(c, op, i);
1098}
1099
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001100static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001101com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001102{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001103 char *name;
1104 char buffer[1000];
1105 /* XXX it is possible to write this code without the 1000
1106 chars on the total length of dotted names, I just can't be
1107 bothered right now */
1108 if (TYPE(n) == STAR)
1109 name = "*";
1110 else if (TYPE(n) == dotted_name) {
1111 char *p = buffer;
1112 int i;
1113 name = buffer;
1114 for (i = 0; i < NCH(n); i += 2) {
1115 char *s = STR(CHILD(n, i));
1116 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001117 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001118 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001119 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001120 break;
1121 }
1122 if (p != buffer)
1123 *p++ = '.';
1124 strcpy(p, s);
1125 p = strchr(p, '\0');
1126 }
1127 }
1128 else {
1129 REQ(n, NAME);
1130 name = STR(n);
1131 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001132 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001133}
1134
Guido van Rossum79f25d91997-04-29 20:08:16 +00001135static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001136parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001137{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001138 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001139 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001140 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001141#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +00001142 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +00001143 int imflag;
1144#endif
1145
Guido van Rossum282914b1991-04-04 10:42:56 +00001146 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001147 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001148#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001149 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001150#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001151 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001152 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001153 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001154 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001155 if (x < 0 && errno == 0) {
Guido van Rossum715eca92002-08-12 21:54:46 +00001156 if (PyErr_WarnExplicit(
Barry Warsaw9f007392002-08-14 15:51:29 +00001157 PyExc_FutureWarning,
Guido van Rossum715eca92002-08-12 21:54:46 +00001158 "hex/oct constants > sys.maxint "
1159 "will return positive values "
1160 "in Python 2.4 and up",
1161 co->c_filename,
1162 co->c_lineno,
1163 NULL,
1164 NULL) < 0)
Guido van Rossum078151d2002-08-11 04:24:12 +00001165 return NULL;
Guido van Rossum3cb8e542002-08-11 14:06:15 +00001166 errno = 0; /* Might be changed by PyErr_Warn() */
Guido van Rossum078151d2002-08-11 04:24:12 +00001167 }
1168 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001169 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001170 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001171 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001172 if (errno != 0)
1173 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001174 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001175 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001176 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001177#ifndef WITHOUT_COMPLEX
1178 if (imflag) {
1179 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001180 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001181 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001182 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001183 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001184 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001185 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001186#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001187 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001188 PyFPE_START_PROTECT("atof", return 0)
1189 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001190 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001191 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001192 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001193}
1194
Guido van Rossum79f25d91997-04-29 20:08:16 +00001195static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001196decode_utf8(char **sPtr, char *end, char* encoding)
1197{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001198#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001199 Py_FatalError("decode_utf8 should not be called in this build.");
1200 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001201#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001202 PyObject *u, *v;
1203 char *s, *t;
1204 t = s = *sPtr;
1205 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1206 while (s < end && (*s & 0x80)) s++;
1207 *sPtr = s;
1208 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1209 if (u == NULL)
1210 return NULL;
1211 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1212 Py_DECREF(u);
1213 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001214#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001215}
1216
1217static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001218parsestr(struct compiling *com, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001219{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001220 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001221 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001222 char *buf;
1223 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001224 char *end;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001225 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001226 int rawmode = 0;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001227 char* encoding = ((com == NULL) ? NULL : com->c_encoding);
1228 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001229 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001230
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001231 if (isalpha(quote) || quote == '_') {
1232 if (quote == 'u' || quote == 'U') {
1233 quote = *++s;
1234 unicode = 1;
1235 }
1236 if (quote == 'r' || quote == 'R') {
1237 quote = *++s;
1238 rawmode = 1;
1239 }
1240 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001241 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001242 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001243 return NULL;
1244 }
1245 s++;
1246 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001247 if (len > INT_MAX) {
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001248 com_error(com, PyExc_OverflowError,
1249 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001250 return NULL;
1251 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001252 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001253 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001254 return NULL;
1255 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001256 if (len >= 4 && s[0] == quote && s[1] == quote) {
1257 s += 2;
1258 len -= 2;
1259 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001260 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001261 return NULL;
1262 }
1263 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001264#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001265 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001266 PyObject *u, *w;
1267 if (encoding == NULL) {
1268 buf = s;
1269 u = NULL;
1270 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1271 buf = s;
1272 u = NULL;
1273 } else {
1274 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1275 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1276 if (u == NULL)
1277 return NULL;
1278 p = buf = PyString_AsString(u);
1279 end = s + len;
1280 while (s < end) {
1281 if (*s == '\\') {
1282 *p++ = *s++;
1283 if (*s & 0x80) {
1284 strcpy(p, "u005c");
1285 p += 5;
1286 }
1287 }
1288 if (*s & 0x80) { /* XXX inefficient */
1289 char *r;
1290 int rn, i;
1291 w = decode_utf8(&s, end, "utf-16-be");
1292 if (w == NULL) {
1293 Py_DECREF(u);
1294 return NULL;
1295 }
1296 r = PyString_AsString(w);
1297 rn = PyString_Size(w);
1298 assert(rn % 2 == 0);
1299 for (i = 0; i < rn; i += 2) {
1300 sprintf(p, "\\u%02x%02x",
1301 r[i + 0] & 0xFF,
1302 r[i + 1] & 0xFF);
1303 p += 6;
1304 }
1305 Py_DECREF(w);
1306 } else {
1307 *p++ = *s++;
1308 }
1309 }
1310 len = p - buf;
1311 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001312 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001313 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001314 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001315 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1316 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001317 if (v == NULL)
1318 PyErr_SyntaxLocation(com->c_filename, com->c_lineno);
1319 return v;
1320
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001321 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001322#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001323 need_encoding = (encoding != NULL &&
1324 strcmp(encoding, "utf-8") != 0 &&
1325 strcmp(encoding, "iso-8859-1") != 0);
1326 if (rawmode || strchr(s, '\\') == NULL) {
1327 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001328#ifndef Py_USING_UNICODE
1329 /* This should not happen - we never see any other
1330 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001331 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001332#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001333 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1334 if (u == NULL)
1335 return NULL;
1336 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1337 Py_DECREF(u);
1338 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001339#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001340 } else {
1341 return PyString_FromStringAndSize(s, len);
1342 }
1343 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001344
1345 v = PyString_DecodeEscape(s, len, NULL, unicode,
1346 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001347 if (v == NULL)
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001348 PyErr_SyntaxLocation(com->c_filename, com->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001349 return v;
1350}
1351
Guido van Rossum79f25d91997-04-29 20:08:16 +00001352static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001353parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001354{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001355 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001356 int i;
1357 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001358 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001359 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001360 for (i = 1; i < NCH(n); i++) {
1361 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001362 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001363 if (s == NULL)
1364 goto onError;
1365 if (PyString_Check(v) && PyString_Check(s)) {
1366 PyString_ConcatAndDel(&v, s);
1367 if (v == NULL)
1368 goto onError;
1369 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001370#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001371 else {
1372 PyObject *temp;
1373 temp = PyUnicode_Concat(v, s);
1374 Py_DECREF(s);
1375 if (temp == NULL)
1376 goto onError;
1377 Py_DECREF(v);
1378 v = temp;
1379 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001380#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001381 }
1382 }
1383 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001384
1385 onError:
1386 Py_XDECREF(v);
1387 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001388}
1389
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001390static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001391com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001392{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001393 int anchor = 0;
1394 int save_begin = c->c_begin;
1395
1396 /* list_iter: for v in expr [list_iter] */
1397 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001398 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001399 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001400 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001401 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001402 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001403 c->c_loops++;
1404 com_list_iter(c, n, e, t);
1405 c->c_loops--;
1406 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1407 c->c_begin = save_begin;
1408 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001409 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001410}
1411
1412static void
1413com_list_if(struct compiling *c, node *n, node *e, char *t)
1414{
1415 int anchor = 0;
1416 int a = 0;
1417 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001418 com_node(c, CHILD(n, 1));
1419 com_addfwref(c, JUMP_IF_FALSE, &a);
1420 com_addbyte(c, POP_TOP);
1421 com_pop(c, 1);
1422 com_list_iter(c, n, e, t);
1423 com_addfwref(c, JUMP_FORWARD, &anchor);
1424 com_backpatch(c, a);
1425 /* We jump here with an extra entry which we now pop */
1426 com_addbyte(c, POP_TOP);
1427 com_backpatch(c, anchor);
1428}
1429
1430static void
1431com_list_iter(struct compiling *c,
1432 node *p, /* parent of list_iter node */
1433 node *e, /* element expression node */
1434 char *t /* name of result list temp local */)
1435{
1436 /* list_iter is the last child in a listmaker, list_for, or list_if */
1437 node *n = CHILD(p, NCH(p)-1);
1438 if (TYPE(n) == list_iter) {
1439 n = CHILD(n, 0);
1440 switch (TYPE(n)) {
1441 case list_for:
1442 com_list_for(c, n, e, t);
1443 break;
1444 case list_if:
1445 com_list_if(c, n, e, t);
1446 break;
1447 default:
1448 com_error(c, PyExc_SystemError,
1449 "invalid list_iter node type");
1450 }
1451 }
1452 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001453 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001454 com_push(c, 1);
1455 com_node(c, e);
1456 com_addoparg(c, CALL_FUNCTION, 1);
1457 com_addbyte(c, POP_TOP);
1458 com_pop(c, 2);
1459 }
1460}
1461
1462static void
1463com_list_comprehension(struct compiling *c, node *n)
1464{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001465 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001466 char tmpname[30];
1467 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001468 com_addoparg(c, BUILD_LIST, 0);
1469 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1470 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001471 com_addop_name(c, LOAD_ATTR, "append");
1472 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001473 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001474 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001475 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001476 --c->c_tmpname;
1477}
1478
1479static void
1480com_listmaker(struct compiling *c, node *n)
1481{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001482 /* listmaker: test ( list_for | (',' test)* [','] ) */
1483 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001484 com_list_comprehension(c, n);
1485 else {
1486 int len = 0;
1487 int i;
1488 for (i = 0; i < NCH(n); i += 2, len++)
1489 com_node(c, CHILD(n, i));
1490 com_addoparg(c, BUILD_LIST, len);
1491 com_pop(c, len-1);
1492 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001493}
1494
1495static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001496com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001497{
1498 int i;
1499 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1500 for (i = 0; i+2 < NCH(n); i += 4) {
1501 /* We must arrange things just right for STORE_SUBSCR.
1502 It wants the stack to look like (value) (dict) (key) */
1503 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001504 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001505 com_node(c, CHILD(n, i+2)); /* value */
1506 com_addbyte(c, ROT_TWO);
1507 com_node(c, CHILD(n, i)); /* key */
1508 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001509 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001510 }
1511}
1512
1513static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001514com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001515{
1516 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001517 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001518 int i;
1519 REQ(n, atom);
1520 ch = CHILD(n, 0);
1521 switch (TYPE(ch)) {
1522 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001523 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001524 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001525 com_push(c, 1);
1526 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001527 else
1528 com_node(c, CHILD(n, 1));
1529 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001530 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001531 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001532 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001533 com_push(c, 1);
1534 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001535 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001536 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001537 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001538 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001539 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001540 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001541 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001542 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001543 break;
1544 case BACKQUOTE:
1545 com_node(c, CHILD(n, 1));
1546 com_addbyte(c, UNARY_CONVERT);
1547 break;
1548 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001549 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001550 i = 255;
1551 }
1552 else {
1553 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001554 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001555 }
1556 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001557 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001558 break;
1559 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001560 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001561 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001562 c->c_errors++;
1563 i = 255;
1564 }
1565 else {
1566 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001567 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001568 }
1569 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001570 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001571 break;
1572 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001573 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001574 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001575 break;
1576 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001577 com_error(c, PyExc_SystemError,
1578 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001579 }
1580}
1581
1582static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001583com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001584{
1585 if (NCH(n) == 1) {
1586 com_addbyte(c, op);
1587 }
1588 else if (NCH(n) == 2) {
1589 if (TYPE(CHILD(n, 0)) != COLON) {
1590 com_node(c, CHILD(n, 0));
1591 com_addbyte(c, op+1);
1592 }
1593 else {
1594 com_node(c, CHILD(n, 1));
1595 com_addbyte(c, op+2);
1596 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001597 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001598 }
1599 else {
1600 com_node(c, CHILD(n, 0));
1601 com_node(c, CHILD(n, 2));
1602 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001603 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001604 }
1605}
1606
Guido van Rossum635abd21997-01-06 22:56:52 +00001607static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001608com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1609{
1610 if (NCH(n) == 1) {
1611 com_addbyte(c, DUP_TOP);
1612 com_push(c, 1);
1613 com_addbyte(c, SLICE);
1614 com_node(c, augn);
1615 com_addbyte(c, opcode);
1616 com_pop(c, 1);
1617 com_addbyte(c, ROT_TWO);
1618 com_addbyte(c, STORE_SLICE);
1619 com_pop(c, 2);
1620 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1621 com_node(c, CHILD(n, 0));
1622 com_addoparg(c, DUP_TOPX, 2);
1623 com_push(c, 2);
1624 com_addbyte(c, SLICE+1);
1625 com_pop(c, 1);
1626 com_node(c, augn);
1627 com_addbyte(c, opcode);
1628 com_pop(c, 1);
1629 com_addbyte(c, ROT_THREE);
1630 com_addbyte(c, STORE_SLICE+1);
1631 com_pop(c, 3);
1632 } else if (NCH(n) == 2) {
1633 com_node(c, CHILD(n, 1));
1634 com_addoparg(c, DUP_TOPX, 2);
1635 com_push(c, 2);
1636 com_addbyte(c, SLICE+2);
1637 com_pop(c, 1);
1638 com_node(c, augn);
1639 com_addbyte(c, opcode);
1640 com_pop(c, 1);
1641 com_addbyte(c, ROT_THREE);
1642 com_addbyte(c, STORE_SLICE+2);
1643 com_pop(c, 3);
1644 } else {
1645 com_node(c, CHILD(n, 0));
1646 com_node(c, CHILD(n, 2));
1647 com_addoparg(c, DUP_TOPX, 3);
1648 com_push(c, 3);
1649 com_addbyte(c, SLICE+3);
1650 com_pop(c, 2);
1651 com_node(c, augn);
1652 com_addbyte(c, opcode);
1653 com_pop(c, 1);
1654 com_addbyte(c, ROT_FOUR);
1655 com_addbyte(c, STORE_SLICE+3);
1656 com_pop(c, 4);
1657 }
1658}
1659
1660static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001661com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001662{
1663 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001664 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001665 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001666 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001667 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001668 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001669 }
1670 else {
1671 com_node(c, CHILD(n, 0));
1672 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001673 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001674 }
1675 m = n;
1676 do {
1677 m = CHILD(m, 0);
1678 } while (NCH(m) == 1);
1679 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001680 /* f(lambda x: x[0] = 3) ends up getting parsed with
1681 * LHS test = lambda x: x[0], and RHS test = 3.
1682 * SF bug 132313 points out that complaining about a keyword
1683 * then is very confusing.
1684 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001685 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001686 TYPE(m) == lambdef ?
1687 "lambda cannot contain assignment" :
1688 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001689 }
1690 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001691 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001692 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001693 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001694 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001695 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001696 else if (*pkeywords == NULL) {
1697 c->c_errors++;
1698 Py_DECREF(v);
1699 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001700 if (PyDict_GetItem(*pkeywords, v) != NULL)
1701 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001702 "duplicate keyword argument");
1703 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001704 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001705 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001706 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001707 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001708 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001709 }
1710 }
1711 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001712}
1713
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001714static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001715com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001716{
1717 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001718 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001719 }
1720 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001721 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001722 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001723 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001724 int star_flag = 0;
1725 int starstar_flag = 0;
1726 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001727 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001728 na = 0;
1729 nk = 0;
1730 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001731 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001732 if (TYPE(ch) == STAR ||
1733 TYPE(ch) == DOUBLESTAR)
1734 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001735 if (ch->n_lineno != lineno) {
1736 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001737 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00001738 }
1739 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001740 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001741 na++;
1742 else
1743 nk++;
1744 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001745 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001746 while (i < NCH(n)) {
1747 node *tok = CHILD(n, i);
1748 node *ch = CHILD(n, i+1);
1749 i += 3;
1750 switch (TYPE(tok)) {
1751 case STAR: star_flag = 1; break;
1752 case DOUBLESTAR: starstar_flag = 1; break;
1753 }
1754 com_node(c, ch);
1755 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001756 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001757 com_error(c, PyExc_SyntaxError,
1758 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001759 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001760 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001761 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001762 star_flag + (starstar_flag << 1);
1763 else
1764 opcode = CALL_FUNCTION;
1765 com_addoparg(c, opcode, na | (nk << 8));
1766 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001767 }
1768}
1769
1770static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001771com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001772{
1773 com_addopname(c, LOAD_ATTR, n);
1774}
1775
1776static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001777com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001778{
1779 int i=0;
1780 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001781 node *ch;
1782
1783 /* first argument */
1784 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001785 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001786 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001787 i++;
1788 }
1789 else {
1790 com_node(c, CHILD(n,i));
1791 i++;
1792 REQ(CHILD(n,i),COLON);
1793 i++;
1794 }
1795 /* second argument */
1796 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1797 com_node(c, CHILD(n,i));
1798 i++;
1799 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001800 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001801 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001802 com_push(c, 1);
1803 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001804 /* remaining arguments */
1805 for (; i < NCH(n); i++) {
1806 ns++;
1807 ch=CHILD(n,i);
1808 REQ(ch, sliceop);
1809 if (NCH(ch) == 1) {
1810 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001811 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001812 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001813 }
1814 else
1815 com_node(c, CHILD(ch,1));
1816 }
1817 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001818 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001819}
1820
1821static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001822com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001823{
1824 node *ch;
1825 REQ(n, subscript);
1826 ch = CHILD(n,0);
1827 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001828 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001829 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001830 com_push(c, 1);
1831 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001832 else {
1833 /* check for slice */
1834 if ((TYPE(ch) == COLON || NCH(n) > 1))
1835 com_sliceobj(c, n);
1836 else {
1837 REQ(ch, test);
1838 com_node(c, ch);
1839 }
1840 }
1841}
1842
1843static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001844com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001845{
1846 int i, op;
1847 REQ(n, subscriptlist);
1848 /* Check to make backward compatible slice behavior for '[i:j]' */
1849 if (NCH(n) == 1) {
1850 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001851 /* 'Basic' slice, should have exactly one colon. */
1852 if ((TYPE(CHILD(sub, 0)) == COLON
1853 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1854 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1855 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001856 switch (assigning) {
1857 case OP_DELETE:
1858 op = DELETE_SLICE;
1859 break;
1860 case OP_ASSIGN:
1861 op = STORE_SLICE;
1862 break;
1863 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001864 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001865 break;
1866 default:
1867 com_augassign_slice(c, sub, assigning, augn);
1868 return;
1869 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001870 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001871 if (op == STORE_SLICE)
1872 com_pop(c, 2);
1873 else if (op == DELETE_SLICE)
1874 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001875 return;
1876 }
1877 }
1878 /* Else normal subscriptlist. Compile each subscript. */
1879 for (i = 0; i < NCH(n); i += 2)
1880 com_subscript(c, CHILD(n, i));
1881 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001882 if (NCH(n) > 1) {
1883 i = (NCH(n)+1) / 2;
1884 com_addoparg(c, BUILD_TUPLE, i);
1885 com_pop(c, i-1);
1886 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001887 switch (assigning) {
1888 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001889 op = DELETE_SUBSCR;
1890 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001891 break;
1892 default:
1893 case OP_ASSIGN:
1894 op = STORE_SUBSCR;
1895 i = 3;
1896 break;
1897 case OP_APPLY:
1898 op = BINARY_SUBSCR;
1899 i = 1;
1900 break;
1901 }
1902 if (assigning > OP_APPLY) {
1903 com_addoparg(c, DUP_TOPX, 2);
1904 com_push(c, 2);
1905 com_addbyte(c, BINARY_SUBSCR);
1906 com_pop(c, 1);
1907 com_node(c, augn);
1908 com_addbyte(c, assigning);
1909 com_pop(c, 1);
1910 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001911 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001912 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001913 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001914}
1915
1916static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001917com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001918{
1919 REQ(n, trailer);
1920 switch (TYPE(CHILD(n, 0))) {
1921 case LPAR:
1922 com_call_function(c, CHILD(n, 1));
1923 break;
1924 case DOT:
1925 com_select_member(c, CHILD(n, 1));
1926 break;
1927 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001928 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001929 break;
1930 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001931 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001932 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001933 }
1934}
1935
1936static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001937com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001938{
1939 int i;
1940 REQ(n, power);
1941 com_atom(c, CHILD(n, 0));
1942 for (i = 1; i < NCH(n); i++) {
1943 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1944 com_factor(c, CHILD(n, i+1));
1945 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001946 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001947 break;
1948 }
1949 else
1950 com_apply_trailer(c, CHILD(n, i));
1951 }
1952}
1953
1954static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001955com_invert_constant(struct compiling *c, node *n)
1956{
1957 /* Compute the inverse of int and longs and use them directly,
1958 but be prepared to generate code for all other
1959 possibilities (invalid numbers, floats, complex).
1960 */
1961 PyObject *num, *inv = NULL;
1962 int i;
1963
1964 REQ(n, NUMBER);
1965 num = parsenumber(c, STR(n));
1966 if (num == NULL)
1967 i = 255;
1968 else {
1969 inv = PyNumber_Invert(num);
1970 if (inv == NULL) {
1971 PyErr_Clear();
1972 i = com_addconst(c, num);
1973 } else {
1974 i = com_addconst(c, inv);
1975 Py_DECREF(inv);
1976 }
1977 Py_DECREF(num);
1978 }
1979 com_addoparg(c, LOAD_CONST, i);
1980 com_push(c, 1);
1981 if (num != NULL && inv == NULL)
1982 com_addbyte(c, UNARY_INVERT);
1983}
1984
Tim Peters51e26512001-09-07 08:45:55 +00001985static int
1986is_float_zero(const char *p)
1987{
1988 int found_radix_point = 0;
1989 int ch;
1990 while ((ch = Py_CHARMASK(*p++)) != '\0') {
1991 switch (ch) {
1992 case '0':
1993 /* no reason to believe it's not 0 -- continue */
1994 break;
1995
1996 case 'e': case 'E': case 'j': case 'J':
1997 /* If this was a hex constant, we already would have
1998 returned 0 due to the 'x' or 'X', so 'e' or 'E'
1999 must be an exponent marker, and we haven't yet
2000 seen a non-zero digit, and it doesn't matter what
2001 the exponent is then. For 'j' or 'J' similarly,
2002 except that this is an imaginary 0 then. */
2003 return 1;
2004
2005 case '.':
2006 found_radix_point = 1;
2007 break;
2008
2009 default:
2010 return 0;
2011 }
2012 }
2013 return found_radix_point;
2014}
2015
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002016static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002017com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002018{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002019 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002020 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002021 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002022 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002023 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002024 approriate value as a constant. If the value is negative,
2025 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002026 negative in the 0th position -- unless we're doing unary minus
2027 of a floating zero! In that case the sign is significant, but
2028 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002029 */
2030 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002031 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002032 && TYPE((pfactor = CHILD(n, 1))) == factor
2033 && NCH(pfactor) == 1
2034 && TYPE((ppower = CHILD(pfactor, 0))) == power
2035 && NCH(ppower) == 1
2036 && TYPE((patom = CHILD(ppower, 0))) == atom
2037 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
2038 && !(childtype == MINUS && is_float_zero(STR(pnum)))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002039 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002040 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002041 return;
2042 }
2043 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002044 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002045 if (s == NULL) {
2046 com_error(c, PyExc_MemoryError, "");
2047 com_addbyte(c, 255);
2048 return;
2049 }
2050 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002051 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002052 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002053 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002054 }
Tim Peters51e26512001-09-07 08:45:55 +00002055 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002056 }
2057 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002058 com_factor(c, CHILD(n, 1));
2059 com_addbyte(c, UNARY_POSITIVE);
2060 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002061 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002062 com_factor(c, CHILD(n, 1));
2063 com_addbyte(c, UNARY_NEGATIVE);
2064 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002065 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002066 com_factor(c, CHILD(n, 1));
2067 com_addbyte(c, UNARY_INVERT);
2068 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002069 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002070 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002071 }
2072}
2073
2074static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002075com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002076{
2077 int i;
2078 int op;
2079 REQ(n, term);
2080 com_factor(c, CHILD(n, 0));
2081 for (i = 2; i < NCH(n); i += 2) {
2082 com_factor(c, CHILD(n, i));
2083 switch (TYPE(CHILD(n, i-1))) {
2084 case STAR:
2085 op = BINARY_MULTIPLY;
2086 break;
2087 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002088 if (c->c_flags & CO_FUTURE_DIVISION)
2089 op = BINARY_TRUE_DIVIDE;
2090 else
2091 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002092 break;
2093 case PERCENT:
2094 op = BINARY_MODULO;
2095 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002096 case DOUBLESLASH:
2097 op = BINARY_FLOOR_DIVIDE;
2098 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002099 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002100 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002101 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002102 op = 255;
2103 }
2104 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002105 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002106 }
2107}
2108
2109static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002110com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002111{
2112 int i;
2113 int op;
2114 REQ(n, arith_expr);
2115 com_term(c, CHILD(n, 0));
2116 for (i = 2; i < NCH(n); i += 2) {
2117 com_term(c, CHILD(n, i));
2118 switch (TYPE(CHILD(n, i-1))) {
2119 case PLUS:
2120 op = BINARY_ADD;
2121 break;
2122 case MINUS:
2123 op = BINARY_SUBTRACT;
2124 break;
2125 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002126 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002127 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002128 op = 255;
2129 }
2130 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002131 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002132 }
2133}
2134
2135static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002136com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002137{
2138 int i;
2139 int op;
2140 REQ(n, shift_expr);
2141 com_arith_expr(c, CHILD(n, 0));
2142 for (i = 2; i < NCH(n); i += 2) {
2143 com_arith_expr(c, CHILD(n, i));
2144 switch (TYPE(CHILD(n, i-1))) {
2145 case LEFTSHIFT:
2146 op = BINARY_LSHIFT;
2147 break;
2148 case RIGHTSHIFT:
2149 op = BINARY_RSHIFT;
2150 break;
2151 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002152 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002153 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002154 op = 255;
2155 }
2156 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002157 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002158 }
2159}
2160
2161static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002162com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002163{
2164 int i;
2165 int op;
2166 REQ(n, and_expr);
2167 com_shift_expr(c, CHILD(n, 0));
2168 for (i = 2; i < NCH(n); i += 2) {
2169 com_shift_expr(c, CHILD(n, i));
2170 if (TYPE(CHILD(n, i-1)) == AMPER) {
2171 op = BINARY_AND;
2172 }
2173 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002174 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002175 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002176 op = 255;
2177 }
2178 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002179 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002180 }
2181}
2182
2183static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002184com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002185{
2186 int i;
2187 int op;
2188 REQ(n, xor_expr);
2189 com_and_expr(c, CHILD(n, 0));
2190 for (i = 2; i < NCH(n); i += 2) {
2191 com_and_expr(c, CHILD(n, i));
2192 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2193 op = BINARY_XOR;
2194 }
2195 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002196 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002197 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002198 op = 255;
2199 }
2200 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002201 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002202 }
2203}
2204
2205static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002206com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002207{
2208 int i;
2209 int op;
2210 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002211 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002212 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002213 com_xor_expr(c, CHILD(n, i));
2214 if (TYPE(CHILD(n, i-1)) == VBAR) {
2215 op = BINARY_OR;
2216 }
2217 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002218 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002219 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002220 op = 255;
2221 }
2222 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002223 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002224 }
2225}
2226
2227static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002228cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002229{
2230 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00002231 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002232 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2233 if (NCH(n) == 1) {
2234 n = CHILD(n, 0);
2235 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002236 case LESS: return PyCmp_LT;
2237 case GREATER: return PyCmp_GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002238 case EQEQUAL: /* == */
Martin v. Löwis7198a522002-01-01 19:59:11 +00002239 case EQUAL: return PyCmp_EQ;
2240 case LESSEQUAL: return PyCmp_LE;
2241 case GREATEREQUAL: return PyCmp_GE;
2242 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2243 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2244 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002245 }
2246 }
2247 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002248 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002249 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002250 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002251 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002252 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002253 }
2254 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002255 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002256}
2257
2258static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002259com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002260{
2261 int i;
2262 enum cmp_op op;
2263 int anchor;
2264 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2265 com_expr(c, CHILD(n, 0));
2266 if (NCH(n) == 1)
2267 return;
2268
2269 /****************************************************************
2270 The following code is generated for all but the last
2271 comparison in a chain:
2272
2273 label: on stack: opcode: jump to:
2274
2275 a <code to load b>
2276 a, b DUP_TOP
2277 a, b, b ROT_THREE
2278 b, a, b COMPARE_OP
2279 b, 0-or-1 JUMP_IF_FALSE L1
2280 b, 1 POP_TOP
2281 b
2282
2283 We are now ready to repeat this sequence for the next
2284 comparison in the chain.
2285
2286 For the last we generate:
2287
2288 b <code to load c>
2289 b, c COMPARE_OP
2290 0-or-1
2291
2292 If there were any jumps to L1 (i.e., there was more than one
2293 comparison), we generate:
2294
2295 0-or-1 JUMP_FORWARD L2
2296 L1: b, 0 ROT_TWO
2297 0, b POP_TOP
2298 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002299 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002300 ****************************************************************/
2301
2302 anchor = 0;
2303
2304 for (i = 2; i < NCH(n); i += 2) {
2305 com_expr(c, CHILD(n, i));
2306 if (i+2 < NCH(n)) {
2307 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002308 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002309 com_addbyte(c, ROT_THREE);
2310 }
2311 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002312 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002313 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002314 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002315 }
2316 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002317 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002318 if (i+2 < NCH(n)) {
2319 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2320 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002321 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002322 }
2323 }
2324
2325 if (anchor) {
2326 int anchor2 = 0;
2327 com_addfwref(c, JUMP_FORWARD, &anchor2);
2328 com_backpatch(c, anchor);
2329 com_addbyte(c, ROT_TWO);
2330 com_addbyte(c, POP_TOP);
2331 com_backpatch(c, anchor2);
2332 }
2333}
2334
2335static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002336com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002337{
2338 REQ(n, not_test); /* 'not' not_test | comparison */
2339 if (NCH(n) == 1) {
2340 com_comparison(c, CHILD(n, 0));
2341 }
2342 else {
2343 com_not_test(c, CHILD(n, 1));
2344 com_addbyte(c, UNARY_NOT);
2345 }
2346}
2347
2348static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002349com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002350{
2351 int i;
2352 int anchor;
2353 REQ(n, and_test); /* not_test ('and' not_test)* */
2354 anchor = 0;
2355 i = 0;
2356 for (;;) {
2357 com_not_test(c, CHILD(n, i));
2358 if ((i += 2) >= NCH(n))
2359 break;
2360 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2361 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002362 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002363 }
2364 if (anchor)
2365 com_backpatch(c, anchor);
2366}
2367
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002368static int
2369com_make_closure(struct compiling *c, PyCodeObject *co)
2370{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002371 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002372 if (free == 0)
2373 return 0;
2374 for (i = 0; i < free; ++i) {
2375 /* Bypass com_addop_varname because it will generate
2376 LOAD_DEREF but LOAD_CLOSURE is needed.
2377 */
2378 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2379 int arg, reftype;
2380
2381 /* Special case: If a class contains a method with a
2382 free variable that has the same name as a method,
2383 the name will be considered free *and* local in the
2384 class. It should be handled by the closure, as
2385 well as by the normal name loookup logic.
2386 */
2387 reftype = get_ref_type(c, PyString_AS_STRING(name));
2388 if (reftype == CELL)
2389 arg = com_lookup_arg(c->c_cellvars, name);
2390 else /* (reftype == FREE) */
2391 arg = com_lookup_arg(c->c_freevars, name);
2392 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002393 fprintf(stderr, "lookup %s in %s %d %d\n"
2394 "freevars of %s: %s\n",
2395 PyObject_REPR(name),
2396 c->c_name,
2397 reftype, arg,
2398 PyString_AS_STRING(co->co_name),
2399 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002400 Py_FatalError("com_make_closure()");
2401 }
2402 com_addoparg(c, LOAD_CLOSURE, arg);
2403
2404 }
2405 com_push(c, free);
2406 return 1;
2407}
2408
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002409static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002410com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002411{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002412 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002413 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002414 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002415 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002416 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002417 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2418 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002419 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002420 if (co == NULL) {
2421 c->c_errors++;
2422 return;
2423 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002424 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002425 i = com_addconst(c, (PyObject *)co);
2426 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002427 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002428 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002429 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002430 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002431 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002432 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002433 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002434 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002435 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002436 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002437 else {
2438 int anchor = 0;
2439 int i = 0;
2440 for (;;) {
2441 com_and_test(c, CHILD(n, i));
2442 if ((i += 2) >= NCH(n))
2443 break;
2444 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2445 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002446 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002447 }
2448 if (anchor)
2449 com_backpatch(c, anchor);
2450 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002451}
2452
2453static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002454com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002455{
2456 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002457 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002458 com_node(c, CHILD(n, 0));
2459 }
2460 else {
2461 int i;
2462 int len;
2463 len = (NCH(n) + 1) / 2;
2464 for (i = 0; i < NCH(n); i += 2)
2465 com_node(c, CHILD(n, i));
2466 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002467 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002468 }
2469}
2470
2471
2472/* Begin of assignment compilation */
2473
Thomas Wouters434d0822000-08-24 20:11:32 +00002474
2475static void
2476com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2477{
2478 com_addbyte(c, DUP_TOP);
2479 com_push(c, 1);
2480 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002481 com_node(c, augn);
2482 com_addbyte(c, opcode);
2483 com_pop(c, 1);
2484 com_addbyte(c, ROT_TWO);
2485 com_addopname(c, STORE_ATTR, n);
2486 com_pop(c, 2);
2487}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002488
2489static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002490com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002491{
2492 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002493 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002494}
2495
2496static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002497com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002498{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002499 REQ(n, trailer);
2500 switch (TYPE(CHILD(n, 0))) {
2501 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002502 if (assigning == OP_DELETE)
2503 com_error(c, PyExc_SyntaxError,
2504 "can't delete function call");
2505 else
2506 com_error(c, PyExc_SyntaxError,
2507 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002508 break;
2509 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002510 if (assigning > OP_APPLY)
2511 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2512 else
2513 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002514 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002515 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002516 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002517 break;
2518 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002519 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002520 }
2521}
2522
2523static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002524com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002525{
2526 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002527 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002528 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002529 if (assigning) {
2530 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002531 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002532 com_push(c, i-1);
2533 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002534 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002535 com_assign(c, CHILD(n, i), assigning, NULL);
2536}
2537
2538static void
2539com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2540{
2541 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002542 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002543 com_push(c, 1);
2544 com_node(c, augn);
2545 com_addbyte(c, opcode);
2546 com_pop(c, 1);
2547 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002548}
2549
2550static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002551com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002552{
2553 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002554 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002555 if (assigning)
2556 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002557}
2558
2559static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002560com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002561{
2562 /* Loop to avoid trivial recursion */
2563 for (;;) {
2564 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002565
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002566 case exprlist:
2567 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002568 case testlist1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002569 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002570 if (assigning > OP_APPLY) {
2571 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002572 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002573 return;
2574 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002575 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002576 return;
2577 }
2578 n = CHILD(n, 0);
2579 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002580
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002581 case test:
2582 case and_test:
2583 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002584 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002585 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002586 case xor_expr:
2587 case and_expr:
2588 case shift_expr:
2589 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002590 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002591 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002592 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002593 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002594 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002595 return;
2596 }
2597 n = CHILD(n, 0);
2598 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002599
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002600 case power: /* atom trailer* ('**' power)*
2601 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002602 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002603 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002604 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002605 return;
2606 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002607 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002608 int i;
2609 com_node(c, CHILD(n, 0));
2610 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002611 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002612 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002613 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002614 return;
2615 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002616 com_apply_trailer(c, CHILD(n, i));
2617 } /* NB i is still alive */
2618 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002619 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002620 return;
2621 }
2622 n = CHILD(n, 0);
2623 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002624
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002625 case atom:
2626 switch (TYPE(CHILD(n, 0))) {
2627 case LPAR:
2628 n = CHILD(n, 1);
2629 if (TYPE(n) == RPAR) {
2630 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002631 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002632 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002633 return;
2634 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002635 if (assigning > OP_APPLY) {
2636 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002637 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002638 return;
2639 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002640 break;
2641 case LSQB:
2642 n = CHILD(n, 1);
2643 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002644 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002645 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002646 return;
2647 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002648 if (assigning > OP_APPLY) {
2649 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002650 "augmented assign to list not possible");
2651 return;
2652 }
2653 if (NCH(n) > 1
2654 && TYPE(CHILD(n, 1)) == list_for) {
2655 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002656 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002657 return;
2658 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002659 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002660 return;
2661 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002662 if (assigning > OP_APPLY)
2663 com_augassign_name(c, CHILD(n, 0),
2664 assigning, augn);
2665 else
2666 com_assign_name(c, CHILD(n, 0),
2667 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002668 return;
2669 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002670 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002671 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002672 return;
2673 }
2674 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002675
2676 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002677 com_error(c, PyExc_SyntaxError,
2678 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002679 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002680
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002681 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002682 com_error(c, PyExc_SystemError,
2683 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002684 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002685
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002686 }
2687 }
2688}
Guido van Rossum7c531111997-03-11 18:42:21 +00002689
Thomas Wouters434d0822000-08-24 20:11:32 +00002690static void
2691com_augassign(struct compiling *c, node *n)
2692{
2693 int opcode;
2694
2695 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2696 case '+': opcode = INPLACE_ADD; break;
2697 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002698 case '/':
2699 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
2700 opcode = INPLACE_FLOOR_DIVIDE;
2701 else if (c->c_flags & CO_FUTURE_DIVISION)
2702 opcode = INPLACE_TRUE_DIVIDE;
2703 else
2704 opcode = INPLACE_DIVIDE;
2705 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00002706 case '%': opcode = INPLACE_MODULO; break;
2707 case '<': opcode = INPLACE_LSHIFT; break;
2708 case '>': opcode = INPLACE_RSHIFT; break;
2709 case '&': opcode = INPLACE_AND; break;
2710 case '^': opcode = INPLACE_XOR; break;
2711 case '|': opcode = INPLACE_OR; break;
2712 case '*':
2713 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2714 opcode = INPLACE_POWER;
2715 else
2716 opcode = INPLACE_MULTIPLY;
2717 break;
2718 default:
2719 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2720 return;
2721 }
2722 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2723}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002724
2725static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002726com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002727{
Thomas Wouters434d0822000-08-24 20:11:32 +00002728 REQ(n, expr_stmt);
2729 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002730 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002731 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002732 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002733 if (NCH(n) == 1) {
2734 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002735 if (c->c_interactive)
2736 com_addbyte(c, PRINT_EXPR);
2737 else
2738 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002739 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002740 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002741 else if (TYPE(CHILD(n,1)) == augassign)
2742 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002743 else {
2744 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002745 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002746 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002747 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002748 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002749 com_push(c, 1);
2750 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002751 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002752 }
2753 }
2754}
2755
2756static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002757com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002758{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002759 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002760 int i;
2761 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002762 if (Py_OptimizeFlag)
2763 return;
2764 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00002765
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002766 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00002767 raise AssertionError [, <message>]
2768
2769 where <message> is the second test, if present.
2770 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002771 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002772 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002773 com_addbyte(c, POP_TOP);
2774 com_pop(c, 1);
2775 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002776 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002777 com_push(c, 1);
2778 i = NCH(n)/2; /* Either 2 or 4 */
2779 if (i > 1)
2780 com_node(c, CHILD(n, 3));
2781 com_addoparg(c, RAISE_VARARGS, i);
2782 com_pop(c, i);
2783 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002784 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002785 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002786 com_addbyte(c, POP_TOP);
2787}
2788
2789static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002790com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002791{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002792 int i = 1;
2793 node* stream = NULL;
2794
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002795 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002796
2797 /* are we using the extended print form? */
2798 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2799 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002800 com_node(c, stream);
2801 /* stack: [...] => [... stream] */
2802 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002803 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2804 i = 4;
2805 else
2806 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002807 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002808 for (; i < NCH(n); i += 2) {
2809 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002810 com_addbyte(c, DUP_TOP);
2811 /* stack: [stream] => [stream stream] */
2812 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002813 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002814 /* stack: [stream stream] => [stream stream obj] */
2815 com_addbyte(c, ROT_TWO);
2816 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002817 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002818 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002819 com_pop(c, 2);
2820 }
2821 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002822 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002823 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002824 com_addbyte(c, PRINT_ITEM);
2825 com_pop(c, 1);
2826 }
2827 }
2828 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002829 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002830 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002831 /* must pop the extra stream object off the stack */
2832 com_addbyte(c, POP_TOP);
2833 /* stack: [... stream] => [...] */
2834 com_pop(c, 1);
2835 }
2836 }
2837 else {
2838 if (stream != NULL) {
2839 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002840 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002841 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002842 com_pop(c, 1);
2843 }
2844 else
2845 com_addbyte(c, PRINT_NEWLINE);
2846 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002847}
2848
2849static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002850com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002851{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002852 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002853 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002854 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002855 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002856 if (c->c_flags & CO_GENERATOR) {
2857 if (NCH(n) > 1) {
2858 com_error(c, PyExc_SyntaxError,
2859 "'return' with argument inside generator");
2860 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002861 }
2862 if (NCH(n) < 2) {
2863 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002864 com_push(c, 1);
2865 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002866 else
2867 com_node(c, CHILD(n, 1));
2868 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00002869 com_pop(c, 1);
2870}
2871
2872static void
2873com_yield_stmt(struct compiling *c, node *n)
2874{
Tim Peters95c80f82001-06-23 02:07:08 +00002875 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00002876 REQ(n, yield_stmt); /* 'yield' testlist */
2877 if (!c->c_infunction) {
2878 com_error(c, PyExc_SyntaxError, "'yield' outside function");
2879 }
Tim Peters95c80f82001-06-23 02:07:08 +00002880
2881 for (i = 0; i < c->c_nblocks; ++i) {
2882 if (c->c_block[i] == SETUP_FINALLY) {
2883 com_error(c, PyExc_SyntaxError,
2884 "'yield' not allowed in a 'try' block "
2885 "with a 'finally' clause");
2886 return;
2887 }
2888 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002889 com_node(c, CHILD(n, 1));
2890 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002891 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002892}
2893
2894static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002895com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002896{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002897 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002898 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2899 if (NCH(n) > 1) {
2900 com_node(c, CHILD(n, 1));
2901 if (NCH(n) > 3) {
2902 com_node(c, CHILD(n, 3));
2903 if (NCH(n) > 5)
2904 com_node(c, CHILD(n, 5));
2905 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002906 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002907 i = NCH(n)/2;
2908 com_addoparg(c, RAISE_VARARGS, i);
2909 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002910}
2911
2912static void
Thomas Wouters52152252000-08-17 22:55:00 +00002913com_from_import(struct compiling *c, node *n)
2914{
2915 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2916 com_push(c, 1);
2917 if (NCH(n) > 1) {
2918 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2919 com_error(c, PyExc_SyntaxError, "invalid syntax");
2920 return;
2921 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002922 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002923 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002924 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002925 com_pop(c, 1);
2926}
2927
2928static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002929com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002930{
2931 int i;
2932 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002933 /* 'import' dotted_name (',' dotted_name)* |
2934 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002935 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002936 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002937 /* 'from' dotted_name 'import' ... */
2938 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002939
2940 if (TYPE(CHILD(n, 3)) == STAR) {
2941 tup = Py_BuildValue("(s)", "*");
2942 } else {
2943 tup = PyTuple_New((NCH(n) - 2)/2);
2944 for (i = 3; i < NCH(n); i += 2) {
2945 PyTuple_SET_ITEM(tup, (i-3)/2,
2946 PyString_FromString(STR(
Jeremy Hylton4419ac12001-02-28 22:54:51 +00002947 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002948 }
2949 }
2950 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002951 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002952 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002953 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002954 if (TYPE(CHILD(n, 3)) == STAR)
2955 com_addbyte(c, IMPORT_STAR);
2956 else {
2957 for (i = 3; i < NCH(n); i += 2)
2958 com_from_import(c, CHILD(n, i));
2959 com_addbyte(c, POP_TOP);
2960 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002961 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002962 }
2963 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002964 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002965 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002966 node *subn = CHILD(n, i);
2967 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002968 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002969 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002970 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002971 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002972 int j;
2973 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002974 com_error(c, PyExc_SyntaxError,
2975 "invalid syntax");
2976 return;
2977 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002978 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2979 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002980 CHILD(CHILD(subn, 0),
2981 j));
2982 com_addop_varname(c, VAR_STORE,
2983 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002984 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002985 com_addop_varname(c, VAR_STORE,
2986 STR(CHILD(CHILD(subn, 0),
2987 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002988 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002989 }
2990 }
2991}
2992
2993static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002994com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002995{
2996 REQ(n, exec_stmt);
2997 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2998 com_node(c, CHILD(n, 1));
2999 if (NCH(n) >= 4)
3000 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003001 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003002 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003003 com_push(c, 1);
3004 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003005 if (NCH(n) >= 6)
3006 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003007 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003008 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003009 com_push(c, 1);
3010 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003011 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003012 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003013}
3014
Guido van Rossum7c531111997-03-11 18:42:21 +00003015static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003016is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003017{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003018 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003019 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003020 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003021
3022 /* Label to avoid tail recursion */
3023 next:
3024 switch (TYPE(n)) {
3025
3026 case suite:
3027 if (NCH(n) == 1) {
3028 n = CHILD(n, 0);
3029 goto next;
3030 }
3031 /* Fall through */
3032 case file_input:
3033 for (i = 0; i < NCH(n); i++) {
3034 node *ch = CHILD(n, i);
3035 if (TYPE(ch) == stmt) {
3036 n = ch;
3037 goto next;
3038 }
3039 }
3040 break;
3041
3042 case stmt:
3043 case simple_stmt:
3044 case small_stmt:
3045 n = CHILD(n, 0);
3046 goto next;
3047
3048 case expr_stmt:
3049 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003050 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003051 case test:
3052 case and_test:
3053 case not_test:
3054 case comparison:
3055 case expr:
3056 case xor_expr:
3057 case and_expr:
3058 case shift_expr:
3059 case arith_expr:
3060 case term:
3061 case factor:
3062 case power:
3063 case atom:
3064 if (NCH(n) == 1) {
3065 n = CHILD(n, 0);
3066 goto next;
3067 }
3068 break;
3069
3070 case NAME:
3071 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3072 return 1;
3073 break;
3074
3075 case NUMBER:
3076 v = parsenumber(c, STR(n));
3077 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003078 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003079 break;
3080 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003081 i = PyObject_IsTrue(v);
3082 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003083 return i == 0;
3084
3085 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003086 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003087 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003088 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003089 break;
3090 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003091 i = PyObject_IsTrue(v);
3092 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003093 return i == 0;
3094
3095 }
3096 return 0;
3097}
3098
Tim Peters08a898f2001-06-28 01:52:22 +00003099
3100/* Look under n for a return stmt with an expression.
3101 * This hack is used to find illegal returns under "if 0:" blocks in
3102 * functions already known to be generators (as determined by the symtable
3103 * pass).
3104 * Return the offending return node if found, else NULL.
3105 */
3106static node *
3107look_for_offending_return(node *n)
3108{
3109 int i;
3110
3111 for (i = 0; i < NCH(n); ++i) {
3112 node *kid = CHILD(n, i);
3113
3114 switch (TYPE(kid)) {
3115 case classdef:
3116 case funcdef:
3117 case lambdef:
3118 /* Stuff in nested functions & classes doesn't
3119 affect the code block we started in. */
3120 return NULL;
3121
3122 case return_stmt:
3123 if (NCH(kid) > 1)
3124 return kid;
3125 break;
3126
3127 default: {
3128 node *bad = look_for_offending_return(kid);
3129 if (bad != NULL)
3130 return bad;
3131 }
3132 }
3133 }
3134
3135 return NULL;
3136}
3137
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003138static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003139com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003140{
3141 int i;
3142 int anchor = 0;
3143 REQ(n, if_stmt);
3144 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3145 for (i = 0; i+3 < NCH(n); i+=4) {
3146 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003147 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003148 if (is_constant_false(c, ch)) {
3149 /* We're going to skip this block. However, if this
3150 is a generator, we have to check the dead code
3151 anyway to make sure there aren't any return stmts
3152 with expressions, in the same scope. */
3153 if (c->c_flags & CO_GENERATOR) {
3154 node *p = look_for_offending_return(n);
3155 if (p != NULL) {
3156 int savelineno = c->c_lineno;
3157 c->c_lineno = p->n_lineno;
3158 com_error(c, PyExc_SyntaxError,
3159 "'return' with argument "
3160 "inside generator");
3161 c->c_lineno = savelineno;
3162 }
3163 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003164 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003165 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003166 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003167 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003168 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003169 com_addfwref(c, JUMP_IF_FALSE, &a);
3170 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003171 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003172 com_node(c, CHILD(n, i+3));
3173 com_addfwref(c, JUMP_FORWARD, &anchor);
3174 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003175 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003176 com_addbyte(c, POP_TOP);
3177 }
3178 if (i+2 < NCH(n))
3179 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003180 if (anchor)
3181 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003182}
3183
3184static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003185com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003186{
3187 int break_anchor = 0;
3188 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003189 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003190 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3191 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003192 block_push(c, SETUP_LOOP);
3193 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003194 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003195 com_node(c, CHILD(n, 1));
3196 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3197 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003198 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003199 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003200 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003201 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003202 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3203 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003204 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003205 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003206 com_addbyte(c, POP_TOP);
3207 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003208 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003209 if (NCH(n) > 4)
3210 com_node(c, CHILD(n, 6));
3211 com_backpatch(c, break_anchor);
3212}
3213
3214static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003215com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003216{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003217 int break_anchor = 0;
3218 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003219 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003220 REQ(n, for_stmt);
3221 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3222 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003223 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003224 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003225 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003226 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003227 com_set_lineno(c, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003228 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003229 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003230 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003231 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003232 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003233 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003234 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3235 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003236 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003237 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003238 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003239 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003240 if (NCH(n) > 8)
3241 com_node(c, CHILD(n, 8));
3242 com_backpatch(c, break_anchor);
3243}
3244
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003245/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003246
3247 SETUP_FINALLY L
3248 <code for S>
3249 POP_BLOCK
3250 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003251 L: <code for Sf>
3252 END_FINALLY
3253
3254 The special instructions use the block stack. Each block
3255 stack entry contains the instruction that created it (here
3256 SETUP_FINALLY), the level of the value stack at the time the
3257 block stack entry was created, and a label (here L).
3258
3259 SETUP_FINALLY:
3260 Pushes the current value stack level and the label
3261 onto the block stack.
3262 POP_BLOCK:
3263 Pops en entry from the block stack, and pops the value
3264 stack until its level is the same as indicated on the
3265 block stack. (The label is ignored.)
3266 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003267 Pops a variable number of entries from the *value* stack
3268 and re-raises the exception they specify. The number of
3269 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003270
3271 The block stack is unwound when an exception is raised:
3272 when a SETUP_FINALLY entry is found, the exception is pushed
3273 onto the value stack (and the exception condition is cleared),
3274 and the interpreter jumps to the label gotten from the block
3275 stack.
3276
3277 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003278 (The contents of the value stack is shown in [], with the top
3279 at the right; 'tb' is trace-back info, 'val' the exception's
3280 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003281
3282 Value stack Label Instruction Argument
3283 [] SETUP_EXCEPT L1
3284 [] <code for S>
3285 [] POP_BLOCK
3286 [] JUMP_FORWARD L0
3287
Guido van Rossum3f5da241990-12-20 15:06:42 +00003288 [tb, val, exc] L1: DUP )
3289 [tb, val, exc, exc] <evaluate E1> )
3290 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3291 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3292 [tb, val, exc, 1] POP )
3293 [tb, val, exc] POP
3294 [tb, val] <assign to V1> (or POP if no V1)
3295 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003296 [] <code for S1>
3297 JUMP_FORWARD L0
3298
Guido van Rossum3f5da241990-12-20 15:06:42 +00003299 [tb, val, exc, 0] L2: POP
3300 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003301 .............................etc.......................
3302
Guido van Rossum3f5da241990-12-20 15:06:42 +00003303 [tb, val, exc, 0] Ln+1: POP
3304 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003305
3306 [] L0: <next statement>
3307
3308 Of course, parts are not generated if Vi or Ei is not present.
3309*/
3310
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003311static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003312com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003313{
3314 int except_anchor = 0;
3315 int end_anchor = 0;
3316 int else_anchor = 0;
3317 int i;
3318 node *ch;
3319
3320 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3321 block_push(c, SETUP_EXCEPT);
3322 com_node(c, CHILD(n, 2));
3323 com_addbyte(c, POP_BLOCK);
3324 block_pop(c, SETUP_EXCEPT);
3325 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3326 com_backpatch(c, except_anchor);
3327 for (i = 3;
3328 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3329 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003330 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003331 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003332 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003333 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003334 break;
3335 }
3336 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003337 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003338 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003339 if (NCH(ch) > 1) {
3340 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003341 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003342 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003343 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003344 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003345 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3346 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003347 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003348 }
3349 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003350 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003351 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003352 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003353 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003354 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003355 com_pop(c, 1);
3356 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003357 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003358 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003359 com_node(c, CHILD(n, i+2));
3360 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3361 if (except_anchor) {
3362 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003363 /* We come in with [tb, val, exc, 0] on the
3364 stack; one pop and it's the same as
3365 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003366 com_addbyte(c, POP_TOP);
3367 }
3368 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003369 /* We actually come in here with [tb, val, exc] but the
3370 END_FINALLY will zap those and jump around.
3371 The c_stacklevel does not reflect them so we need not pop
3372 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003373 com_addbyte(c, END_FINALLY);
3374 com_backpatch(c, else_anchor);
3375 if (i < NCH(n))
3376 com_node(c, CHILD(n, i+2));
3377 com_backpatch(c, end_anchor);
3378}
3379
3380static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003381com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003382{
3383 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003384 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003385
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003386 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3387 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003388 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003389 com_addbyte(c, POP_BLOCK);
3390 block_pop(c, SETUP_FINALLY);
3391 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003392 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003393 /* While the generated code pushes only one item,
3394 the try-finally handling can enter here with
3395 up to three items. OK, here are the details:
3396 3 for an exception, 2 for RETURN, 1 for BREAK. */
3397 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003398 com_backpatch(c, finally_anchor);
3399 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003400 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003401 com_node(c, ch);
3402 com_addbyte(c, END_FINALLY);
3403 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003404 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003405}
3406
3407static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003408com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003409{
3410 REQ(n, try_stmt);
3411 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3412 | 'try' ':' suite 'finally' ':' suite */
3413 if (TYPE(CHILD(n, 3)) != except_clause)
3414 com_try_finally(c, n);
3415 else
3416 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003417}
3418
Guido van Rossum8b993a91997-01-17 21:04:03 +00003419static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003420get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003421{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003422 int i;
3423
Guido van Rossum8b993a91997-01-17 21:04:03 +00003424 /* Label to avoid tail recursion */
3425 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003426 switch (TYPE(n)) {
3427
3428 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003429 if (NCH(n) == 1) {
3430 n = CHILD(n, 0);
3431 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003432 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003433 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003434 case file_input:
3435 for (i = 0; i < NCH(n); i++) {
3436 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003437 if (TYPE(ch) == stmt) {
3438 n = ch;
3439 goto next;
3440 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003441 }
3442 break;
3443
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003444 case stmt:
3445 case simple_stmt:
3446 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003447 n = CHILD(n, 0);
3448 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003449
3450 case expr_stmt:
3451 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003452 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003453 case test:
3454 case and_test:
3455 case not_test:
3456 case comparison:
3457 case expr:
3458 case xor_expr:
3459 case and_expr:
3460 case shift_expr:
3461 case arith_expr:
3462 case term:
3463 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003464 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003465 if (NCH(n) == 1) {
3466 n = CHILD(n, 0);
3467 goto next;
3468 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003469 break;
3470
3471 case atom:
3472 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003473 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003474 break;
3475
3476 }
3477 return NULL;
3478}
3479
Guido van Rossum79f25d91997-04-29 20:08:16 +00003480static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003481get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003482{
Guido van Rossum541563e1999-01-28 15:08:09 +00003483 /* Don't generate doc-strings if run with -OO */
3484 if (Py_OptimizeFlag > 1)
3485 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003486 n = get_rawdocstring(n);
3487 if (n == NULL)
3488 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003489 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003490}
3491
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003492static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003493com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003494{
3495 REQ(n, suite);
3496 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3497 if (NCH(n) == 1) {
3498 com_node(c, CHILD(n, 0));
3499 }
3500 else {
3501 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003502 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003503 node *ch = CHILD(n, i);
3504 if (TYPE(ch) == stmt)
3505 com_node(c, ch);
3506 }
3507 }
3508}
3509
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003510/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003511static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003512com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003513{
3514 int i = c->c_nblocks;
3515 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3516 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3517 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003518 else if (i <= 0) {
3519 /* at the outer level */
3520 com_error(c, PyExc_SyntaxError,
3521 "'continue' not properly in loop");
3522 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003523 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003524 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003525 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003526 if (c->c_block[j] == SETUP_LOOP)
3527 break;
3528 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003529 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003530 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003531 for (; i > j; --i) {
3532 if (c->c_block[i] == SETUP_EXCEPT ||
3533 c->c_block[i] == SETUP_FINALLY) {
3534 com_addoparg(c, CONTINUE_LOOP,
3535 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003536 return;
3537 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003538 if (c->c_block[i] == END_FINALLY) {
3539 com_error(c, PyExc_SyntaxError,
3540 "'continue' not supported inside 'finally' clause");
3541 return;
3542 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003543 }
3544 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003545 com_error(c, PyExc_SyntaxError,
3546 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003547 }
3548 /* XXX Could allow it inside a 'finally' clause
3549 XXX if we could pop the exception still on the stack */
3550}
3551
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003552static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003553com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003554{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003555 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003556 if (TYPE(n) == lambdef) {
3557 /* lambdef: 'lambda' [varargslist] ':' test */
3558 n = CHILD(n, 1);
3559 }
3560 else {
3561 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3562 n = CHILD(n, 2);
3563 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3564 n = CHILD(n, 1);
3565 }
3566 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003567 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003568 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003569 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003570 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3571 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003572 nargs = 0;
3573 ndefs = 0;
3574 for (i = 0; i < nch; i++) {
3575 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003576 if (TYPE(CHILD(n, i)) == STAR ||
3577 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003578 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003579 nargs++;
3580 i++;
3581 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003582 t = RPAR; /* Anything except EQUAL or COMMA */
3583 else
3584 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003585 if (t == EQUAL) {
3586 i++;
3587 ndefs++;
3588 com_node(c, CHILD(n, i));
3589 i++;
3590 if (i >= nch)
3591 break;
3592 t = TYPE(CHILD(n, i));
3593 }
3594 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003595 /* Treat "(a=1, b)" as an error */
3596 if (ndefs)
3597 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003598 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003599 }
3600 if (t != COMMA)
3601 break;
3602 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003603 return ndefs;
3604}
3605
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003606static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003607com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003608{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003609 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003610 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003611 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003612 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003613 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3614 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003615 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003616 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003617 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003618 c->c_errors++;
3619 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003620 int closure = com_make_closure(c, (PyCodeObject *)co);
3621 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003622 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003623 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003624 if (closure)
3625 com_addoparg(c, MAKE_CLOSURE, ndefs);
3626 else
3627 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003628 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003629 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003630 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003631 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003632 }
3633}
3634
3635static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003636com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003637{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003638 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003639 REQ(n, testlist);
3640 /* testlist: test (',' test)* [','] */
3641 for (i = 0; i < NCH(n); i += 2)
3642 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003643 i = (NCH(n)+1) / 2;
3644 com_addoparg(c, BUILD_TUPLE, i);
3645 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003646}
3647
3648static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003649com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003650{
Guido van Rossum25831651993-05-19 14:50:45 +00003651 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003652 PyObject *v;
3653 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003654 char *name;
3655
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003656 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003657 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003658 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003659 c->c_errors++;
3660 return;
3661 }
3662 /* Push the class name on the stack */
3663 i = com_addconst(c, v);
3664 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003665 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003666 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003667 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003668 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003669 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003670 com_push(c, 1);
3671 }
Guido van Rossum25831651993-05-19 14:50:45 +00003672 else
3673 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003674 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003675 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003676 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003677 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003678 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003679 c->c_errors++;
3680 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003681 int closure = com_make_closure(c, co);
3682 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003683 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003684 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003685 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003686 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003687 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003688 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003689 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003690 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003691 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003692 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003693 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003694 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003695 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003696 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003697}
3698
3699static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003700com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003701{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003702 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003703 if (c->c_errors)
3704 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003705 switch (TYPE(n)) {
3706
3707 /* Definition nodes */
3708
3709 case funcdef:
3710 com_funcdef(c, n);
3711 break;
3712 case classdef:
3713 com_classdef(c, n);
3714 break;
3715
3716 /* Trivial parse tree nodes */
3717
3718 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003719 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003720 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003721 n = CHILD(n, 0);
3722 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003723
3724 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003725 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003726 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003727 {
3728 int i;
3729 for (i = 0; i < NCH(n)-1; i += 2)
3730 com_node(c, CHILD(n, i));
3731 }
3732 break;
3733
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003734 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003735 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003736 n = CHILD(n, 0);
3737 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003738
3739 /* Statement nodes */
3740
3741 case expr_stmt:
3742 com_expr_stmt(c, n);
3743 break;
3744 case print_stmt:
3745 com_print_stmt(c, n);
3746 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003747 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003748 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003749 break;
3750 case pass_stmt:
3751 break;
3752 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003753 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003754 com_error(c, PyExc_SyntaxError,
3755 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003756 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003757 com_addbyte(c, BREAK_LOOP);
3758 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003759 case continue_stmt:
3760 com_continue_stmt(c, n);
3761 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003762 case return_stmt:
3763 com_return_stmt(c, n);
3764 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003765 case yield_stmt:
3766 com_yield_stmt(c, n);
3767 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003768 case raise_stmt:
3769 com_raise_stmt(c, n);
3770 break;
3771 case import_stmt:
3772 com_import_stmt(c, n);
3773 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003774 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003775 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003776 case exec_stmt:
3777 com_exec_stmt(c, n);
3778 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003779 case assert_stmt:
3780 com_assert_stmt(c, n);
3781 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003782 case if_stmt:
3783 com_if_stmt(c, n);
3784 break;
3785 case while_stmt:
3786 com_while_stmt(c, n);
3787 break;
3788 case for_stmt:
3789 com_for_stmt(c, n);
3790 break;
3791 case try_stmt:
3792 com_try_stmt(c, n);
3793 break;
3794 case suite:
3795 com_suite(c, n);
3796 break;
3797
3798 /* Expression nodes */
3799
3800 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003801 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00003802 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003803 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003804 break;
3805 case test:
3806 com_test(c, n);
3807 break;
3808 case and_test:
3809 com_and_test(c, n);
3810 break;
3811 case not_test:
3812 com_not_test(c, n);
3813 break;
3814 case comparison:
3815 com_comparison(c, n);
3816 break;
3817 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003818 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003819 break;
3820 case expr:
3821 com_expr(c, n);
3822 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003823 case xor_expr:
3824 com_xor_expr(c, n);
3825 break;
3826 case and_expr:
3827 com_and_expr(c, n);
3828 break;
3829 case shift_expr:
3830 com_shift_expr(c, n);
3831 break;
3832 case arith_expr:
3833 com_arith_expr(c, n);
3834 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003835 case term:
3836 com_term(c, n);
3837 break;
3838 case factor:
3839 com_factor(c, n);
3840 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003841 case power:
3842 com_power(c, n);
3843 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003844 case atom:
3845 com_atom(c, n);
3846 break;
3847
3848 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003849 com_error(c, PyExc_SystemError,
3850 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003851 }
3852}
3853
Tim Petersdbd9ba62000-07-09 03:09:57 +00003854static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003855
3856static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003857com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003858{
3859 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3860 if (TYPE(CHILD(n, 0)) == LPAR)
3861 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003862 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003863 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003864 com_pop(c, 1);
3865 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003866}
3867
3868static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003869com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003870{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003871 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003872 if (NCH(n) == 1) {
3873 com_fpdef(c, CHILD(n, 0));
3874 }
3875 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003876 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003877 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003878 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003879 for (i = 0; i < NCH(n); i += 2)
3880 com_fpdef(c, CHILD(n, i));
3881 }
3882}
3883
3884static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003885com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003886{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003887 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003888 int complex = 0;
Barry Warsaw8f6d8682001-11-28 21:10:39 +00003889 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003890 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003891 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003892 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003893 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003894 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003895 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003896 node *ch = CHILD(n, i);
3897 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003898 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003899 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003900 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3901 fp = CHILD(ch, 0);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00003902 if (TYPE(fp) != NAME) {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00003903 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003904 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003905 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003906 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003907 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003908 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003909 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003910 ch = CHILD(n, i);
3911 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003912 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003913 else
3914 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003915 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003916 if (complex) {
3917 /* Generate code for complex arguments only after
3918 having counted the simple arguments */
3919 int ilocal = 0;
3920 for (i = 0; i < nch; i++) {
3921 node *ch = CHILD(n, i);
3922 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003923 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003924 break;
3925 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3926 fp = CHILD(ch, 0);
3927 if (TYPE(fp) != NAME) {
3928 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003929 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003930 com_fpdef(c, ch);
3931 }
3932 ilocal++;
3933 if (++i >= nch)
3934 break;
3935 ch = CHILD(n, i);
3936 if (TYPE(ch) == EQUAL)
3937 i += 2;
3938 else
3939 REQ(ch, COMMA);
3940 }
3941 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003942}
3943
3944static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003945com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003946{
3947 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003948 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003949 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003950 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003951 if (doc != NULL) {
3952 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003953 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003954 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003955 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003956 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003957 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003958 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003959 for (i = 0; i < NCH(n); i++) {
3960 node *ch = CHILD(n, i);
3961 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3962 com_node(c, ch);
3963 }
3964}
3965
3966/* Top-level compile-node interface */
3967
3968static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003969compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003970{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003971 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003972 node *ch;
3973 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003974 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003975 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003976 if (doc != NULL) {
3977 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003978 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003979 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003980 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003981 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003982 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3983 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003984 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003985 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003986 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003987 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003988 c->c_infunction = 0;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003989 com_addbyte(c, RETURN_NONE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003990}
3991
3992static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003993compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003994{
Guido van Rossum590baa41993-11-30 13:40:46 +00003995 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003996 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003997 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003998
3999 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004000 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004001 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004002 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004003 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004004 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004005 else
4006 ch = CHILD(n, 2);
4007 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004008 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004009 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004010}
4011
4012static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004013compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004014{
4015 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004016 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004017 REQ(n, classdef);
4018 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4019 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004020 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004021 /* Initialize local __module__ from global __name__ */
4022 com_addop_name(c, LOAD_GLOBAL, "__name__");
4023 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004024 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004025 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004026 if (doc != NULL) {
4027 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004028 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004029 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004030 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004031 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004032 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004033 }
4034 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004035 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004036 com_node(c, ch);
4037 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004038 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004039 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004040 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004041}
4042
4043static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004044compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004045{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004046 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004047
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004048 switch (TYPE(n)) {
4049
Guido van Rossum4c417781991-01-21 16:09:22 +00004050 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004051 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004052 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004053 n = CHILD(n, 0);
4054 if (TYPE(n) != NEWLINE)
4055 com_node(c, n);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004056 com_addbyte(c, RETURN_NONE);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004057 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004058 break;
4059
Guido van Rossum4c417781991-01-21 16:09:22 +00004060 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004061 com_file_input(c, n);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004062 com_addbyte(c, RETURN_NONE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004063 break;
4064
Guido van Rossum590baa41993-11-30 13:40:46 +00004065 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004066 com_node(c, CHILD(n, 0));
4067 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004068 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004069 break;
4070
Guido van Rossum590baa41993-11-30 13:40:46 +00004071 case lambdef: /* anonymous function definition */
4072 compile_lambdef(c, n);
4073 break;
4074
Guido van Rossum4c417781991-01-21 16:09:22 +00004075 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004076 compile_funcdef(c, n);
4077 break;
4078
Guido van Rossum4c417781991-01-21 16:09:22 +00004079 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004080 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004081 break;
4082
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004083 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004084 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004085 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004086 }
4087}
4088
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004089static PyObject *
4090dict_keys_inorder(PyObject *dict, int offset)
4091{
4092 PyObject *tuple, *k, *v;
4093 int i, pos = 0, size = PyDict_Size(dict);
4094
4095 tuple = PyTuple_New(size);
4096 if (tuple == NULL)
4097 return NULL;
4098 while (PyDict_Next(dict, &pos, &k, &v)) {
4099 i = PyInt_AS_LONG(v);
4100 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004101 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004102 PyTuple_SET_ITEM(tuple, i - offset, k);
4103 }
4104 return tuple;
4105}
4106
Guido van Rossum79f25d91997-04-29 20:08:16 +00004107PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004108PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004109{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004110 return PyNode_CompileFlags(n, filename, NULL);
4111}
4112
4113PyCodeObject *
4114PyNode_CompileFlags(node *n, char *filename, PyCompilerFlags *flags)
4115{
4116 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004117}
4118
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004119struct symtable *
4120PyNode_CompileSymtable(node *n, char *filename)
4121{
4122 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004123 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004124
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004125 ff = PyNode_Future(n, filename);
4126 if (ff == NULL)
4127 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004128
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004129 st = symtable_init();
Tim Peters8c5e4152001-11-04 19:26:58 +00004130 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004131 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004132 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004133 }
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004134 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004135 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004136 if (st->st_errors > 0)
4137 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004138 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004139 if (st->st_errors > 0)
4140 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004141
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004142 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004143 fail:
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004144 PyObject_FREE((void *)ff);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004145 st->st_future = NULL;
4146 PySymtable_Free(st);
4147 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004148}
4149
Guido van Rossum79f25d91997-04-29 20:08:16 +00004150static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004151icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004152{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004153 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004154}
4155
Guido van Rossum79f25d91997-04-29 20:08:16 +00004156static PyCodeObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004157jcompile(node *n, char *filename, struct compiling *base,
4158 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004159{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004160 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004161 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004162 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004163 return NULL;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004164 if (TYPE(n) == encoding_decl) {
4165 sc.c_encoding = STR(n);
4166 n = CHILD(n, 0);
4167 } else {
4168 sc.c_encoding = NULL;
4169 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004170 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004171 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004172 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004173 /* c_symtable still points to parent's symbols */
4174 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004175 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004176 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004177 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004178 if (base->c_encoding != NULL) {
4179 assert(sc.c_encoding == NULL);
4180 sc.c_encoding = base->c_encoding;
4181 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004182 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004183 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004184 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004185 if (sc.c_future == NULL) {
4186 com_free(&sc);
4187 return NULL;
4188 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004189 if (flags) {
4190 int merged = sc.c_future->ff_features |
4191 flags->cf_flags;
4192 sc.c_future->ff_features = merged;
4193 flags->cf_flags = merged;
4194 }
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004195 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004196 com_free(&sc);
4197 return NULL;
4198 }
4199 }
4200 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004201 if (symtable_load_symbols(&sc) < 0) {
4202 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004203 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004204 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004205 compile_node(&sc, n);
4206 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004207 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004208 PyObject *consts, *names, *varnames, *filename, *name,
4209 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004210 consts = PyList_AsTuple(sc.c_consts);
4211 names = PyList_AsTuple(sc.c_names);
4212 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004213 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4214 freevars = dict_keys_inorder(sc.c_freevars,
4215 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004216 filename = PyString_InternFromString(sc.c_filename);
4217 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004218 if (!PyErr_Occurred())
4219 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004220 sc.c_nlocals,
4221 sc.c_maxstacklevel,
4222 sc.c_flags,
4223 sc.c_code,
4224 consts,
4225 names,
4226 varnames,
4227 freevars,
4228 cellvars,
4229 filename,
4230 name,
4231 sc.c_firstlineno,
4232 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004233 Py_XDECREF(consts);
4234 Py_XDECREF(names);
4235 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004236 Py_XDECREF(freevars);
4237 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004238 Py_XDECREF(filename);
4239 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004240 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004241 else if (!PyErr_Occurred()) {
4242 /* This could happen if someone called PyErr_Clear() after an
4243 error was reported above. That's not supposed to happen,
4244 but I just plugged one case and I'm not sure there can't be
4245 others. In that case, raise SystemError so that at least
4246 it gets reported instead dumping core. */
4247 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4248 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004249 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004250 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004251 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004252 sc.c_symtable = NULL;
4253 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004254 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004255 return co;
4256}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004257
4258int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004259PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004260{
4261 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004262 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004263 int line = co->co_firstlineno;
4264 int addr = 0;
4265 while (--size >= 0) {
4266 addr += *p++;
4267 if (addr > addrq)
4268 break;
4269 line += *p++;
4270 }
4271 return line;
4272}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004273
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004274/* The test for LOCAL must come before the test for FREE in order to
4275 handle classes where name is both local and free. The local var is
4276 a method and the free var is a free var referenced within a method.
4277*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004278
4279static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004280get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004281{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004282 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004283 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004284
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004285 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4286 return CELL;
4287 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4288 return LOCAL;
4289 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4290 return FREE;
4291 v = PyDict_GetItemString(c->c_globals, name);
4292 if (v) {
4293 if (v == Py_None)
4294 return GLOBAL_EXPLICIT;
4295 else {
4296 return GLOBAL_IMPLICIT;
4297 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004298 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004299 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004300 "unknown scope for %.100s in %.100s(%s) "
4301 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4302 name, c->c_name,
4303 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4304 c->c_filename,
4305 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4306 PyObject_REPR(c->c_locals),
4307 PyObject_REPR(c->c_globals)
4308 );
4309
4310 Py_FatalError(buf);
4311 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004312}
4313
Guido van Rossum207fda62001-03-02 03:30:41 +00004314/* Helper functions to issue warnings */
4315
4316static int
4317issue_warning(char *msg, char *filename, int lineno)
4318{
4319 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4320 lineno, NULL, NULL) < 0) {
4321 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4322 PyErr_SetString(PyExc_SyntaxError, msg);
4323 PyErr_SyntaxLocation(filename, lineno);
4324 }
4325 return -1;
4326 }
4327 return 0;
4328}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004329
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004330static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004331symtable_warn(struct symtable *st, char *msg)
4332{
Guido van Rossum207fda62001-03-02 03:30:41 +00004333 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004334 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004335 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004336 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004337 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004338}
4339
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004340/* Helper function for setting lineno and filename */
4341
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004342static int
4343symtable_build(struct compiling *c, node *n)
4344{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004345 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004346 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004347 c->c_symtable->st_future = c->c_future;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004348 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004349 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4350 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004351 return -1;
4352 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004353 if (c->c_symtable->st_errors > 0)
4354 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004355 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004356 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004357 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004358 return 0;
4359}
4360
4361static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004362symtable_init_compiling_symbols(struct compiling *c)
4363{
4364 PyObject *varnames;
4365
4366 varnames = c->c_symtable->st_cur->ste_varnames;
4367 if (varnames == NULL) {
4368 varnames = PyList_New(0);
4369 if (varnames == NULL)
4370 return -1;
4371 c->c_symtable->st_cur->ste_varnames = varnames;
4372 Py_INCREF(varnames);
4373 } else
4374 Py_INCREF(varnames);
4375 c->c_varnames = varnames;
4376
4377 c->c_globals = PyDict_New();
4378 if (c->c_globals == NULL)
4379 return -1;
4380 c->c_freevars = PyDict_New();
4381 if (c->c_freevars == NULL)
4382 return -1;
4383 c->c_cellvars = PyDict_New();
4384 if (c->c_cellvars == NULL)
4385 return -1;
4386 return 0;
4387}
4388
4389struct symbol_info {
4390 int si_nlocals;
4391 int si_ncells;
4392 int si_nfrees;
4393 int si_nimplicit;
4394};
4395
4396static void
4397symtable_init_info(struct symbol_info *si)
4398{
4399 si->si_nlocals = 0;
4400 si->si_ncells = 0;
4401 si->si_nfrees = 0;
4402 si->si_nimplicit = 0;
4403}
4404
4405static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004406symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004407 struct symbol_info *si)
4408{
4409 PyObject *dict, *v;
4410
4411 /* Seperate logic for DEF_FREE. If it occurs in a function,
4412 it indicates a local that we must allocate storage for (a
4413 cell var). If it occurs in a class, then the class has a
4414 method and a free variable with the same name.
4415 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004416 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004417 /* If it isn't declared locally, it can't be a cell. */
4418 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4419 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004420 v = PyInt_FromLong(si->si_ncells++);
4421 dict = c->c_cellvars;
4422 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004423 /* If it is free anyway, then there is no need to do
4424 anything here.
4425 */
4426 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004427 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004428 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004429 v = PyInt_FromLong(si->si_nfrees++);
4430 dict = c->c_freevars;
4431 }
4432 if (v == NULL)
4433 return -1;
4434 if (PyDict_SetItem(dict, name, v) < 0) {
4435 Py_DECREF(v);
4436 return -1;
4437 }
4438 Py_DECREF(v);
4439 return 0;
4440}
4441
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004442/* If a variable is a cell and an argument, make sure that appears in
4443 co_cellvars before any variable to its right in varnames.
4444*/
4445
4446
4447static int
4448symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4449 PyObject *varnames, int flags)
4450{
4451 PyObject *v, *w, *d, *list = NULL;
4452 int i, pos;
4453
4454 if (flags & CO_VARARGS)
4455 argcount++;
4456 if (flags & CO_VARKEYWORDS)
4457 argcount++;
4458 for (i = argcount; --i >= 0; ) {
4459 v = PyList_GET_ITEM(varnames, i);
4460 if (PyDict_GetItem(*cellvars, v)) {
4461 if (list == NULL) {
4462 list = PyList_New(1);
4463 if (list == NULL)
4464 return -1;
4465 PyList_SET_ITEM(list, 0, v);
4466 Py_INCREF(v);
4467 } else
4468 PyList_Insert(list, 0, v);
4469 }
4470 }
4471 if (list == NULL || PyList_GET_SIZE(list) == 0)
4472 return 0;
4473 /* There are cellvars that are also arguments. Create a dict
4474 to replace cellvars and put the args at the front.
4475 */
4476 d = PyDict_New();
4477 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4478 v = PyInt_FromLong(i);
4479 if (v == NULL)
4480 goto fail;
4481 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4482 goto fail;
4483 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4484 goto fail;
4485 }
4486 pos = 0;
4487 i = PyList_GET_SIZE(list);
4488 Py_DECREF(list);
4489 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4490 w = PyInt_FromLong(i++); /* don't care about the old key */
4491 if (PyDict_SetItem(d, v, w) < 0) {
4492 Py_DECREF(w);
4493 goto fail;
4494 }
4495 Py_DECREF(w);
4496 }
4497 Py_DECREF(*cellvars);
4498 *cellvars = d;
4499 return 1;
4500 fail:
4501 Py_DECREF(d);
4502 return -1;
4503}
4504
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004505static int
4506symtable_freevar_offsets(PyObject *freevars, int offset)
4507{
4508 PyObject *name, *v;
4509 int pos;
4510
4511 /* The cell vars are the first elements of the closure,
4512 followed by the free vars. Update the offsets in
4513 c_freevars to account for number of cellvars. */
4514 pos = 0;
4515 while (PyDict_Next(freevars, &pos, &name, &v)) {
4516 int i = PyInt_AS_LONG(v) + offset;
4517 PyObject *o = PyInt_FromLong(i);
4518 if (o == NULL)
4519 return -1;
4520 if (PyDict_SetItem(freevars, name, o) < 0) {
4521 Py_DECREF(o);
4522 return -1;
4523 }
4524 Py_DECREF(o);
4525 }
4526 return 0;
4527}
4528
4529static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004530symtable_check_unoptimized(struct compiling *c,
4531 PySymtableEntryObject *ste,
4532 struct symbol_info *si)
4533{
4534 char buf[300];
4535
4536 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4537 || (ste->ste_nested && si->si_nimplicit)))
4538 return 0;
4539
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004540#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4541
4542#define ILLEGAL_IS "is a nested function"
4543
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004544#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004545"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004546
4547#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004548"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004549
4550#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00004551"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004552"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004553
4554 /* XXX perhaps the linenos for these opt-breaking statements
4555 should be stored so the exception can point to them. */
4556
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004557 if (ste->ste_child_free) {
4558 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004559 PyOS_snprintf(buf, sizeof(buf),
4560 ILLEGAL_IMPORT_STAR,
4561 PyString_AS_STRING(ste->ste_name),
4562 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004563 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004564 PyOS_snprintf(buf, sizeof(buf),
4565 ILLEGAL_BARE_EXEC,
4566 PyString_AS_STRING(ste->ste_name),
4567 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004568 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004569 PyOS_snprintf(buf, sizeof(buf),
4570 ILLEGAL_EXEC_AND_IMPORT_STAR,
4571 PyString_AS_STRING(ste->ste_name),
4572 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004573 }
4574 } else {
4575 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004576 PyOS_snprintf(buf, sizeof(buf),
4577 ILLEGAL_IMPORT_STAR,
4578 PyString_AS_STRING(ste->ste_name),
4579 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004580 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004581 PyOS_snprintf(buf, sizeof(buf),
4582 ILLEGAL_BARE_EXEC,
4583 PyString_AS_STRING(ste->ste_name),
4584 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004585 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004586 PyOS_snprintf(buf, sizeof(buf),
4587 ILLEGAL_EXEC_AND_IMPORT_STAR,
4588 PyString_AS_STRING(ste->ste_name),
4589 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004590 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004591 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004592
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004593 PyErr_SetString(PyExc_SyntaxError, buf);
4594 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4595 ste->ste_opt_lineno);
4596 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004597}
4598
4599static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004600symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4601 struct symbol_info *si)
4602{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004603 if (c->c_future)
4604 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004605 if (ste->ste_generator)
4606 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004607 if (ste->ste_type != TYPE_MODULE)
4608 c->c_flags |= CO_NEWLOCALS;
4609 if (ste->ste_type == TYPE_FUNCTION) {
4610 c->c_nlocals = si->si_nlocals;
4611 if (ste->ste_optimized == 0)
4612 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004613 else if (ste->ste_optimized != OPT_EXEC)
4614 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004615 }
4616 return 0;
4617}
4618
4619static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004620symtable_load_symbols(struct compiling *c)
4621{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004622 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004623 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004624 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004625 PyObject *name, *varnames, *v;
4626 int i, flags, pos;
4627 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004628
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004629 if (implicit == NULL) {
4630 implicit = PyInt_FromLong(1);
4631 if (implicit == NULL)
4632 return -1;
4633 }
4634 v = NULL;
4635
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004636 if (symtable_init_compiling_symbols(c) < 0)
4637 goto fail;
4638 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004639 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004640 si.si_nlocals = PyList_GET_SIZE(varnames);
4641 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004642
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004643 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004644 v = PyInt_FromLong(i);
4645 if (PyDict_SetItem(c->c_locals,
4646 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004647 goto fail;
4648 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004649 }
4650
4651 /* XXX The cases below define the rules for whether a name is
4652 local or global. The logic could probably be clearer. */
4653 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004654 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4655 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004656
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004657 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004658 /* undo the original DEF_FREE */
4659 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004660
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004661 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004662 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004663 2. Free variables in methods that are also class
4664 variables or declared global.
4665 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004666 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004667 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004668
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004669 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004670 c->c_argcount--;
4671 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004672 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004673 c->c_argcount--;
4674 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004675 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004676 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004677 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004678 if (flags & DEF_PARAM) {
4679 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004680 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004681 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004682 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004683 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004684 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004685 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004686 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4687 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004688 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004689 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004690 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4691 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004692 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004693 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004694 if (v == NULL)
4695 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004696 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004697 goto fail;
4698 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004699 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004700 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004701 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004702 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004703 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004704 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004705 if (v == NULL)
4706 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004707 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004708 goto fail;
4709 Py_DECREF(v);
4710 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004711 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004712 if (PyDict_SetItem(c->c_globals, name,
4713 implicit) < 0)
4714 goto fail;
4715 if (st->st_nscopes != 1) {
4716 v = PyInt_FromLong(flags);
4717 if (PyDict_SetItem(st->st_global,
4718 name, v))
4719 goto fail;
4720 Py_DECREF(v);
4721 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004722 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004723 }
4724 }
4725
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004726 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4727
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004728 if (si.si_ncells > 1) { /* one cell is always in order */
4729 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4730 c->c_varnames, c->c_flags) < 0)
4731 return -1;
4732 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004733 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4734 return -1;
4735 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004736 fail:
4737 /* is this always the right thing to do? */
4738 Py_XDECREF(v);
4739 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004740}
4741
4742static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004743symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004744{
4745 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004746
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004747 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004748 if (st == NULL)
4749 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004750 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00004751
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004752 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004753 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004754 goto fail;
4755 if ((st->st_symbols = PyDict_New()) == NULL)
4756 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004757 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004758 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004759 st->st_errors = 0;
4760 st->st_tmpname = 0;
4761 st->st_private = NULL;
4762 return st;
4763 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004764 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004765 return NULL;
4766}
4767
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004768void
4769PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004770{
4771 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004772 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004773 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004774 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004775}
4776
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004777/* When the compiler exits a scope, it must should update the scope's
4778 free variable information with the list of free variables in its
4779 children.
4780
4781 Variables that are free in children and defined in the current
4782 scope are cellvars.
4783
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004784 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004785 false), free variables in children that are not defined here are
4786 implicit globals.
4787
4788*/
4789
4790static int
4791symtable_update_free_vars(struct symtable *st)
4792{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004793 int i, j, def;
4794 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004795 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004796
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004797 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004798 def = DEF_FREE_CLASS;
4799 else
4800 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004801 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004802 int pos = 0;
4803
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004804 if (list)
4805 PyList_SetSlice(list, 0,
4806 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004807 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004808 PyList_GET_ITEM(ste->ste_children, i);
4809 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004810 int flags = PyInt_AS_LONG(o);
4811 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004812 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004813 if (list == NULL) {
4814 list = PyList_New(0);
4815 if (list == NULL)
4816 return -1;
4817 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004818 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004819 if (PyList_Append(list, name) < 0) {
4820 Py_DECREF(list);
4821 return -1;
4822 }
4823 }
4824 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004825 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004826 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004827 v = PyDict_GetItem(ste->ste_symbols, name);
4828 /* If a name N is declared global in scope A and
4829 referenced in scope B contained (perhaps
4830 indirectly) in A and there are no scopes
4831 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004832 is global in B. Unless A is a class scope,
4833 because class scopes are not considered for
4834 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004835 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004836 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004837 int flags = PyInt_AS_LONG(v);
4838 if (flags & DEF_GLOBAL) {
4839 symtable_undo_free(st, child->ste_id,
4840 name);
4841 continue;
4842 }
4843 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004844 if (ste->ste_nested) {
4845 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004846 name, def) < 0) {
4847 Py_DECREF(list);
4848 return -1;
4849 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004850 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004851 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004852 name) < 0) {
4853 Py_DECREF(list);
4854 return -1;
4855 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004856 }
4857 }
4858 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004859
4860 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004861 return 0;
4862}
4863
4864/* If the current scope is a non-nested class or if name is not
4865 defined in the current, non-nested scope, then it is an implicit
4866 global in all nested scopes.
4867*/
4868
4869static int
4870symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4871{
4872 PyObject *o;
4873 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004874 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004875
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004876 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004877 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004878 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004879 if (o == NULL)
4880 return symtable_undo_free(st, child, name);
4881 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004882
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004883 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004884 return symtable_undo_free(st, child, name);
4885 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004886 return symtable_add_def_o(st, ste->ste_symbols,
4887 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004888}
4889
4890static int
4891symtable_undo_free(struct symtable *st, PyObject *id,
4892 PyObject *name)
4893{
4894 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004895 PyObject *info;
4896 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004897
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004898 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4899 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004900 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00004901
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004902 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004903 if (info == NULL)
4904 return 0;
4905 v = PyInt_AS_LONG(info);
4906 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004907 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004908 DEF_FREE_GLOBAL) < 0)
4909 return -1;
4910 } else
4911 /* If the name is defined here or declared global,
4912 then the recursion stops. */
4913 return 0;
4914
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004915 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4916 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004917 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004918 PyList_GET_ITEM(ste->ste_children, i);
4919 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004920 if (x < 0)
4921 return x;
4922 }
4923 return 0;
4924}
4925
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004926/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4927 This reference is released when the scope is exited, via the DECREF
4928 in symtable_exit_scope().
4929*/
4930
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004931static int
4932symtable_exit_scope(struct symtable *st)
4933{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004934 int end;
4935
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004936 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004937 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004938 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004939 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004940 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4941 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004942 if (PySequence_DelItem(st->st_stack, end) < 0)
4943 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004944 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004945}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004946
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004947static void
4948symtable_enter_scope(struct symtable *st, char *name, int type,
4949 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004950{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004951 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004952
4953 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004954 prev = st->st_cur;
4955 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4956 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004957 st->st_errors++;
4958 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004959 }
4960 }
Barry Warsaw0372af72001-02-23 18:22:59 +00004961 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004962 PySymtableEntry_New(st, name, type, lineno);
4963 if (strcmp(name, TOP) == 0)
4964 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004965 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004966 if (PyList_Append(prev->ste_children,
4967 (PyObject *)st->st_cur) < 0)
4968 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004969 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004970}
4971
4972static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004973symtable_lookup(struct symtable *st, char *name)
4974{
4975 char buffer[MANGLE_LEN];
4976 PyObject *v;
4977 int flags;
4978
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00004979 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004980 name = buffer;
4981 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
4982 if (v == NULL) {
4983 if (PyErr_Occurred())
4984 return -1;
4985 else
4986 return 0;
4987 }
4988
4989 flags = PyInt_AS_LONG(v);
4990 return flags;
4991}
4992
4993static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004994symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004995{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004996 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004997 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004998 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004999
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005000 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005001 name = buffer;
5002 if ((s = PyString_InternFromString(name)) == NULL)
5003 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005004 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5005 Py_DECREF(s);
5006 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005007}
5008
5009/* Must only be called with mangled names */
5010
5011static int
5012symtable_add_def_o(struct symtable *st, PyObject *dict,
5013 PyObject *name, int flag)
5014{
5015 PyObject *o;
5016 int val;
5017
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005018 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005019 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005020 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005021 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005022 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005023 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005024 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005025 return -1;
5026 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005027 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005028 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005029 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005030 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005031 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005032 Py_DECREF(o);
5033 return -1;
5034 }
5035 Py_DECREF(o);
5036
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005037 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005038 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005039 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005040 } else if (flag & DEF_GLOBAL) {
5041 /* XXX need to update DEF_GLOBAL for other flags too;
5042 perhaps only DEF_FREE_GLOBAL */
5043 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005044 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005045 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005046 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005047 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005048 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005049 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005050 Py_DECREF(o);
5051 return -1;
5052 }
5053 Py_DECREF(o);
5054 }
5055 return 0;
5056}
5057
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005058#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005059
Tim Peters08a898f2001-06-28 01:52:22 +00005060/* Look for a yield stmt under n. Return 1 if found, else 0.
5061 This hack is used to look inside "if 0:" blocks (which are normally
5062 ignored) in case those are the only places a yield occurs (so that this
5063 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005064static int
5065look_for_yield(node *n)
5066{
5067 int i;
5068
5069 for (i = 0; i < NCH(n); ++i) {
5070 node *kid = CHILD(n, i);
5071
5072 switch (TYPE(kid)) {
5073
5074 case classdef:
5075 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005076 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005077 /* Stuff in nested functions and classes can't make
5078 the parent a generator. */
5079 return 0;
5080
5081 case yield_stmt:
5082 return 1;
5083
5084 default:
5085 if (look_for_yield(kid))
5086 return 1;
5087 }
5088 }
5089 return 0;
5090}
5091
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005092static void
5093symtable_node(struct symtable *st, node *n)
5094{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005095 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005096
5097 loop:
5098 switch (TYPE(n)) {
5099 case funcdef: {
5100 char *func_name = STR(CHILD(n, 1));
5101 symtable_add_def(st, func_name, DEF_LOCAL);
5102 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005103 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005104 symtable_funcdef(st, n);
5105 symtable_exit_scope(st);
5106 break;
5107 }
5108 case lambdef:
5109 if (NCH(n) == 4)
5110 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005111 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005112 symtable_funcdef(st, n);
5113 symtable_exit_scope(st);
5114 break;
5115 case classdef: {
5116 char *tmp, *class_name = STR(CHILD(n, 1));
5117 symtable_add_def(st, class_name, DEF_LOCAL);
5118 if (TYPE(CHILD(n, 2)) == LPAR) {
5119 node *bases = CHILD(n, 3);
5120 int i;
5121 for (i = 0; i < NCH(bases); i += 2) {
5122 symtable_node(st, CHILD(bases, i));
5123 }
5124 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005125 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005126 tmp = st->st_private;
5127 st->st_private = class_name;
5128 symtable_node(st, CHILD(n, NCH(n) - 1));
5129 st->st_private = tmp;
5130 symtable_exit_scope(st);
5131 break;
5132 }
5133 case if_stmt:
5134 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005135 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5136 if (st->st_cur->ste_generator == 0)
5137 st->st_cur->ste_generator =
5138 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005139 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005140 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005141 symtable_node(st, CHILD(n, i + 1));
5142 symtable_node(st, CHILD(n, i + 3));
5143 }
5144 if (i + 2 < NCH(n))
5145 symtable_node(st, CHILD(n, i + 2));
5146 break;
5147 case global_stmt:
5148 symtable_global(st, n);
5149 break;
5150 case import_stmt:
5151 symtable_import(st, n);
5152 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005153 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005154 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005155 symtable_node(st, CHILD(n, 1));
5156 if (NCH(n) > 2)
5157 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005158 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005159 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005160 st->st_cur->ste_opt_lineno = n->n_lineno;
5161 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005162 if (NCH(n) > 4)
5163 symtable_node(st, CHILD(n, 5));
5164 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005165
5166 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005167 case assert_stmt:
5168 if (Py_OptimizeFlag)
5169 return;
5170 if (NCH(n) == 2) {
5171 n = CHILD(n, 1);
5172 goto loop;
5173 } else {
5174 symtable_node(st, CHILD(n, 1));
5175 n = CHILD(n, 3);
5176 goto loop;
5177 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005178 case except_clause:
5179 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005180 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005181 if (NCH(n) > 1) {
5182 n = CHILD(n, 1);
5183 goto loop;
5184 }
5185 break;
5186 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005187 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005188 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005189 case yield_stmt:
5190 st->st_cur->ste_generator = 1;
5191 n = CHILD(n, 1);
5192 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005193 case expr_stmt:
5194 if (NCH(n) == 1)
5195 n = CHILD(n, 0);
5196 else {
5197 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005198 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005199 symtable_node(st, CHILD(n, 2));
5200 break;
5201 } else {
5202 int i;
5203 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005204 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005205 n = CHILD(n, NCH(n) - 1);
5206 }
5207 }
5208 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005209 case list_iter:
5210 n = CHILD(n, 0);
5211 if (TYPE(n) == list_for) {
5212 st->st_tmpname++;
5213 symtable_list_comprehension(st, n);
5214 st->st_tmpname--;
5215 } else {
5216 REQ(n, list_if);
5217 symtable_node(st, CHILD(n, 1));
5218 if (NCH(n) == 3) {
5219 n = CHILD(n, 2);
5220 goto loop;
5221 }
5222 }
5223 break;
5224 case for_stmt:
5225 symtable_assign(st, CHILD(n, 1), 0);
5226 for (i = 3; i < NCH(n); ++i)
5227 if (TYPE(CHILD(n, i)) >= single_input)
5228 symtable_node(st, CHILD(n, i));
5229 break;
5230 /* The remaining cases fall through to default except in
5231 special circumstances. This requires the individual cases
5232 to be coded with great care, even though they look like
5233 rather innocuous. Each case must double-check TYPE(n).
5234 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005235 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005236 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005237 n = CHILD(n, 2);
5238 goto loop;
5239 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005240 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005241 case listmaker:
5242 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00005243 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005244 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00005245 symtable_node(st, CHILD(n, 0));
5246 st->st_tmpname--;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005247 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005248 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005249 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005250 case atom:
5251 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5252 symtable_add_use(st, STR(CHILD(n, 0)));
5253 break;
5254 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005255 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005256 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005257 /* Walk over every non-token child with a special case
5258 for one child.
5259 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005260 if (NCH(n) == 1) {
5261 n = CHILD(n, 0);
5262 goto loop;
5263 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005264 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005265 if (TYPE(CHILD(n, i)) >= single_input)
5266 symtable_node(st, CHILD(n, i));
5267 }
5268}
5269
5270static void
5271symtable_funcdef(struct symtable *st, node *n)
5272{
5273 node *body;
5274
5275 if (TYPE(n) == lambdef) {
5276 if (NCH(n) == 4)
5277 symtable_params(st, CHILD(n, 1));
5278 } else
5279 symtable_params(st, CHILD(n, 2));
5280 body = CHILD(n, NCH(n) - 1);
5281 symtable_node(st, body);
5282}
5283
5284/* The next two functions parse the argument tuple.
5285 symtable_default_arg() checks for names in the default arguments,
5286 which are references in the defining scope. symtable_params()
5287 parses the parameter names, which are defined in the function's
5288 body.
5289
5290 varargslist:
5291 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5292 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5293*/
5294
5295static void
5296symtable_default_args(struct symtable *st, node *n)
5297{
5298 node *c;
5299 int i;
5300
5301 if (TYPE(n) == parameters) {
5302 n = CHILD(n, 1);
5303 if (TYPE(n) == RPAR)
5304 return;
5305 }
5306 REQ(n, varargslist);
5307 for (i = 0; i < NCH(n); i += 2) {
5308 c = CHILD(n, i);
5309 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5310 break;
5311 }
5312 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5313 symtable_node(st, CHILD(n, i));
5314 }
5315}
5316
5317static void
5318symtable_params(struct symtable *st, node *n)
5319{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005320 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005321 node *c = NULL;
5322
5323 if (TYPE(n) == parameters) {
5324 n = CHILD(n, 1);
5325 if (TYPE(n) == RPAR)
5326 return;
5327 }
5328 REQ(n, varargslist);
5329 for (i = 0; i < NCH(n); i += 2) {
5330 c = CHILD(n, i);
5331 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5332 ext = 1;
5333 break;
5334 }
5335 if (TYPE(c) == test) {
5336 continue;
5337 }
5338 if (TYPE(CHILD(c, 0)) == NAME)
5339 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
5340 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005341 char nbuf[30];
5342 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005343 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005344 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005345 }
5346 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005347 if (ext) {
5348 c = CHILD(n, i);
5349 if (TYPE(c) == STAR) {
5350 i++;
5351 symtable_add_def(st, STR(CHILD(n, i)),
5352 DEF_PARAM | DEF_STAR);
5353 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005354 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005355 c = NULL;
5356 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005357 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005358 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005359 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005360 i++;
5361 symtable_add_def(st, STR(CHILD(n, i)),
5362 DEF_PARAM | DEF_DOUBLESTAR);
5363 }
5364 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005365 if (complex >= 0) {
5366 int j;
5367 for (j = 0; j <= complex; j++) {
5368 c = CHILD(n, j);
5369 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005370 c = CHILD(n, ++j);
5371 else if (TYPE(c) == EQUAL)
5372 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005373 if (TYPE(CHILD(c, 0)) == LPAR)
5374 symtable_params_fplist(st, CHILD(c, 1));
5375 }
5376 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005377}
5378
5379static void
5380symtable_params_fplist(struct symtable *st, node *n)
5381{
5382 int i;
5383 node *c;
5384
5385 REQ(n, fplist);
5386 for (i = 0; i < NCH(n); i += 2) {
5387 c = CHILD(n, i);
5388 REQ(c, fpdef);
5389 if (NCH(c) == 1)
5390 symtable_add_def(st, STR(CHILD(c, 0)),
5391 DEF_PARAM | DEF_INTUPLE);
5392 else
5393 symtable_params_fplist(st, CHILD(c, 1));
5394 }
5395
5396}
5397
5398static void
5399symtable_global(struct symtable *st, node *n)
5400{
5401 int i;
5402
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005403 /* XXX It might be helpful to warn about module-level global
5404 statements, but it's hard to tell the difference between
5405 module-level and a string passed to exec.
5406 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005407
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005408 for (i = 1; i < NCH(n); i += 2) {
5409 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005410 int flags;
5411
5412 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005413 if (flags < 0)
5414 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005415 if (flags && flags != DEF_GLOBAL) {
5416 char buf[500];
5417 if (flags & DEF_PARAM) {
5418 PyErr_Format(PyExc_SyntaxError,
5419 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005420 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005421 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005422 st->st_cur->ste_lineno);
5423 st->st_errors++;
5424 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005425 }
5426 else {
5427 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005428 PyOS_snprintf(buf, sizeof(buf),
5429 GLOBAL_AFTER_ASSIGN,
5430 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005431 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005432 PyOS_snprintf(buf, sizeof(buf),
5433 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005434 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005435 }
5436 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005437 symtable_add_def(st, name, DEF_GLOBAL);
5438 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005439}
5440
5441static void
5442symtable_list_comprehension(struct symtable *st, node *n)
5443{
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005444 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005445
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005446 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005447 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005448 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005449 symtable_node(st, CHILD(n, 3));
5450 if (NCH(n) == 5)
5451 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005452}
5453
5454static void
5455symtable_import(struct symtable *st, node *n)
5456{
5457 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005458 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005459 | 'from' dotted_name 'import'
5460 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005461 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005462 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005463 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005464 node *dotname = CHILD(n, 1);
5465 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5466 /* check for bogus imports */
5467 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5468 PyErr_SetString(PyExc_SyntaxError,
5469 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005470 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005471 n->n_lineno);
5472 st->st_errors++;
5473 return;
5474 }
5475 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005476 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005477 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005478 if (symtable_warn(st,
5479 "import * only allowed at module level") < 0)
5480 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005481 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005482 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005483 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005484 } else {
5485 for (i = 3; i < NCH(n); i += 2) {
5486 node *c = CHILD(n, i);
5487 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005488 symtable_assign(st, CHILD(c, 2),
5489 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005490 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005491 symtable_assign(st, CHILD(c, 0),
5492 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005493 }
5494 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005495 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005496 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005497 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005498 }
5499 }
5500}
5501
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005502/* The third argument to symatble_assign() is a flag to be passed to
5503 symtable_add_def() if it is eventually called. The flag is useful
5504 to specify the particular type of assignment that should be
5505 recorded, e.g. an assignment caused by import.
5506 */
5507
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005508static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005509symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005510{
5511 node *tmp;
5512 int i;
5513
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005514 loop:
5515 switch (TYPE(n)) {
5516 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005517 /* invalid assignment, e.g. lambda x:x=2. The next
5518 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005519 return;
5520 case power:
5521 if (NCH(n) > 2) {
5522 for (i = 2; i < NCH(n); ++i)
5523 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5524 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005525 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005526 if (NCH(n) > 1) {
5527 symtable_node(st, CHILD(n, 0));
5528 symtable_node(st, CHILD(n, 1));
5529 } else {
5530 n = CHILD(n, 0);
5531 goto loop;
5532 }
5533 return;
5534 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005535 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5536 /* XXX This is an error, but the next pass
5537 will catch it. */
5538 return;
5539 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005540 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005541 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005542 }
5543 return;
5544 case exprlist:
5545 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00005546 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005547 if (NCH(n) == 1) {
5548 n = CHILD(n, 0);
5549 goto loop;
5550 }
5551 else {
5552 int i;
5553 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005554 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005555 return;
5556 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005557 case atom:
5558 tmp = CHILD(n, 0);
5559 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5560 n = CHILD(n, 1);
5561 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005562 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00005563 if (strcmp(STR(tmp), "__debug__") == 0) {
5564 PyErr_SetString(PyExc_SyntaxError,
5565 ASSIGN_DEBUG);
5566 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton86424e32001-12-04 02:41:46 +00005567 n->n_lineno);
Jeremy Hylton778e2652001-11-09 19:50:08 +00005568 st->st_errors++;
5569 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005570 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005571 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005572 return;
5573 case dotted_as_name:
5574 if (NCH(n) == 3)
5575 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005576 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005577 else
5578 symtable_add_def(st,
5579 STR(CHILD(CHILD(n,
5580 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005581 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005582 return;
5583 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005584 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005585 return;
5586 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005587 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005588 return;
5589 default:
5590 if (NCH(n) == 0)
5591 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005592 if (NCH(n) == 1) {
5593 n = CHILD(n, 0);
5594 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005595 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005596 /* Should only occur for errors like x + 1 = 1,
5597 which will be caught in the next pass. */
5598 for (i = 0; i < NCH(n); ++i)
5599 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005600 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005601 }
5602}