blob: dbff9b03ae6851ca0a609ca2da731ca82dfdc29f [file] [log] [blame]
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001/* Compile an expression node to intermediate code */
2
Guido van Rossum3f5da241990-12-20 15:06:42 +00003/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004 XXX add __doc__ attribute == co_doc to code object attributes?
5 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +00006 XXX Generate simple jump for break/return outside 'try...finally'
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00007 XXX Allow 'continue' inside finally clause of try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +00008 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +00009 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000010*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011
Guido van Rossum79f25d91997-04-29 20:08:16 +000012#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000013
Guido van Rossum10dc2e81990-11-18 17:27:39 +000014#include "node.h"
15#include "token.h"
16#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000017#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000018#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000019#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000020#include "structmember.h"
21
22#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000023
Guido van Rossumb05a5c71997-05-07 17:46:13 +000024/* Three symbols from graminit.h are also defined in Python.h, with
25 Py_ prefixes to their names. Python.h can't include graminit.h
26 (which defines too many confusing symbols), but we can check here
27 that they haven't changed (which is very unlikely, but possible). */
28#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000029 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000030#endif
31#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000032 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000033#endif
34#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000035 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000036#endif
37
Guido van Rossum8e793d91997-03-03 19:13:14 +000038int Py_OptimizeFlag = 0;
39
Guido van Rossum8861b741996-07-30 16:49:37 +000040#define OP_DELETE 0
41#define OP_ASSIGN 1
42#define OP_APPLY 2
43
Jeremy Hyltone36f7782001-01-19 03:21:30 +000044#define VAR_LOAD 0
45#define VAR_STORE 1
46#define VAR_DELETE 2
47
Jeremy Hylton64949cb2001-01-25 20:06:59 +000048#define DEL_CLOSURE_ERROR \
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000049"can not delete variable '%.400s' referenced in nested scope"
50
51#define DUPLICATE_ARGUMENT \
52"duplicate argument '%s' in function definition"
53
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000054#define ILLEGAL_DYNAMIC_SCOPE \
55"%.100s: exec or 'import *' makes names ambiguous in nested scope"
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000056
Jeremy Hylton29906ee2001-02-27 04:23:34 +000057#define GLOBAL_AFTER_ASSIGN \
58"name '%.400s' is assigned to before global declaration"
59
60#define GLOBAL_AFTER_USE \
61"name '%.400s' is used prior to global declaration"
62
63#define LOCAL_GLOBAL \
Neal Norwitz2a47c0f2002-01-29 00:53:41 +000064"name '%.400s' is a function parameter and declared global"
Jeremy Hylton29906ee2001-02-27 04:23:34 +000065
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +000066#define LATE_FUTURE \
67"from __future__ imports must occur at the beginning of the file"
68
Jeremy Hylton897b8212001-03-23 14:08:38 +000069#define ASSIGN_DEBUG \
70"can not assign to __debug__"
71
Jeremy Hyltone36f7782001-01-19 03:21:30 +000072#define MANGLE_LEN 256
73
Guido van Rossum79f25d91997-04-29 20:08:16 +000074#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000075
Guido van Rossum6f799372001-09-20 20:46:19 +000076static PyMemberDef code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000077 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
78 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000079 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000080 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000081 {"co_code", T_OBJECT, OFF(co_code), READONLY},
82 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
83 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000084 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000085 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
86 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000087 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000088 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000089 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
90 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000091 {NULL} /* Sentinel */
92};
93
Guido van Rossumbea18cc2002-06-14 20:41:17 +000094PyDoc_STRVAR(code_doc,
95"code(argcount, nlocals, stacksize, flags, codestring, constants, names,\n\
96 varnames, filename, name, firstlineno, lnotab[, freevars[, cellvars]])\n\
97\n\
98Create a code object. Not for the faint of heart.");
99
100static PyObject *
101code_new(PyTypeObject *type, PyObject *args, PyObject *kw)
102{
103 int argcount;
104 int nlocals;
105 int stacksize;
106 int flags;
107 PyObject *code;
108 PyObject *consts;
109 PyObject *names;
110 PyObject *varnames;
111 PyObject *freevars = NULL;
112 PyObject *cellvars = NULL;
113 PyObject *filename;
114 PyObject *name;
115 int firstlineno;
116 PyObject *lnotab;
117
118 if (!PyArg_ParseTuple(args, "iiiiSO!O!O!SSiS|O!O!:code",
119 &argcount, &nlocals, &stacksize, &flags,
120 &code,
121 &PyTuple_Type, &consts,
122 &PyTuple_Type, &names,
123 &PyTuple_Type, &varnames,
124 &filename, &name,
125 &firstlineno, &lnotab,
126 &PyTuple_Type, &freevars,
127 &PyTuple_Type, &cellvars))
128 return NULL;
129
130 if (freevars == NULL || cellvars == NULL) {
131 PyObject *empty = PyTuple_New(0);
132 if (empty == NULL)
133 return NULL;
134 if (freevars == NULL) {
135 freevars = empty;
136 Py_INCREF(freevars);
137 }
138 if (cellvars == NULL) {
139 cellvars = empty;
140 Py_INCREF(cellvars);
141 }
142 Py_DECREF(empty);
143 }
144
145 if (!PyObject_CheckReadBuffer(code)) {
146 PyErr_SetString(PyExc_TypeError,
147 "bytecode object must be a single-segment read-only buffer");
148 return NULL;
149 }
150
151 return (PyObject *)PyCode_New(argcount, nlocals, stacksize, flags,
152 code, consts, names, varnames,
153 freevars, cellvars, filename, name,
154 firstlineno, lnotab);
155}
156
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000157static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000158code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000159{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000160 Py_XDECREF(co->co_code);
161 Py_XDECREF(co->co_consts);
162 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000163 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000164 Py_XDECREF(co->co_freevars);
165 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000166 Py_XDECREF(co->co_filename);
167 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000168 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000169 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000170}
171
Guido van Rossum79f25d91997-04-29 20:08:16 +0000172static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000173code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000174{
175 char buf[500];
176 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000177 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000178 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000179
Guido van Rossuma396a882000-04-07 01:21:36 +0000180 if (co->co_firstlineno != 0)
181 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000182 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000183 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000184 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000185 name = PyString_AS_STRING(co->co_name);
Barry Warsaw8f6d8682001-11-28 21:10:39 +0000186 PyOS_snprintf(buf, sizeof(buf),
187 "<code object %.100s at %p, file \"%.300s\", line %d>",
188 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000189 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000190}
191
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000192static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000193code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000194{
195 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000196 cmp = PyObject_Compare(co->co_name, cp->co_name);
197 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000198 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000199 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000200 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000201 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000202 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000203 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000204 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000205 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000206 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000207 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000208 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000209 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000210 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000211 if (cmp) return cmp;
212 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
213 if (cmp) return cmp;
214 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000215 return cmp;
216}
217
218static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000219code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000220{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000221 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000222 h0 = PyObject_Hash(co->co_name);
223 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000224 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000225 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000227 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000228 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000229 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000230 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000231 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000232 h5 = PyObject_Hash(co->co_freevars);
233 if (h5 == -1) return -1;
234 h6 = PyObject_Hash(co->co_cellvars);
235 if (h6 == -1) return -1;
236 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000237 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000238 if (h == -1) h = -2;
239 return h;
240}
241
Jeremy Hylton78891072001-03-01 06:09:34 +0000242/* XXX code objects need to participate in GC? */
243
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244PyTypeObject PyCode_Type = {
245 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000246 0,
247 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000248 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000249 0,
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000250 (destructor)code_dealloc, /* tp_dealloc */
251 0, /* tp_print */
252 0, /* tp_getattr */
253 0, /* tp_setattr */
254 (cmpfunc)code_compare, /* tp_compare */
255 (reprfunc)code_repr, /* tp_repr */
256 0, /* tp_as_number */
257 0, /* tp_as_sequence */
258 0, /* tp_as_mapping */
259 (hashfunc)code_hash, /* tp_hash */
260 0, /* tp_call */
261 0, /* tp_str */
262 PyObject_GenericGetAttr, /* tp_getattro */
263 0, /* tp_setattro */
264 0, /* tp_as_buffer */
265 Py_TPFLAGS_DEFAULT, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000266 code_doc, /* tp_doc */
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000267 0, /* tp_traverse */
268 0, /* tp_clear */
269 0, /* tp_richcompare */
270 0, /* tp_weaklistoffset */
271 0, /* tp_iter */
272 0, /* tp_iternext */
273 0, /* tp_methods */
274 code_memberlist, /* tp_members */
275 0, /* tp_getset */
276 0, /* tp_base */
277 0, /* tp_dict */
278 0, /* tp_descr_get */
279 0, /* tp_descr_set */
280 0, /* tp_dictoffset */
281 0, /* tp_init */
282 0, /* tp_alloc */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000283 code_new, /* tp_new */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000284};
285
Guido van Rossum644a12b1997-04-09 19:24:53 +0000286#define NAME_CHARS \
287 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
288
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000289/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
290
291static int
292all_name_chars(unsigned char *s)
293{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000294 static char ok_name_char[256];
295 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000296
Guido van Rossumcd90c202001-02-09 15:06:42 +0000297 if (ok_name_char[*name_chars] == 0) {
298 unsigned char *p;
299 for (p = name_chars; *p; p++)
300 ok_name_char[*p] = 1;
301 }
302 while (*s) {
303 if (ok_name_char[*s++] == 0)
304 return 0;
305 }
306 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000307}
308
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000309static int
310intern_strings(PyObject *tuple)
311{
312 int i;
313
314 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
315 PyObject *v = PyTuple_GET_ITEM(tuple, i);
316 if (v == NULL || !PyString_Check(v)) {
317 Py_FatalError("non-string found in code slot");
318 PyErr_BadInternalCall();
319 return -1;
320 }
321 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
322 }
323 return 0;
324}
325
Guido van Rossum79f25d91997-04-29 20:08:16 +0000326PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000327PyCode_New(int argcount, int nlocals, int stacksize, int flags,
328 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000329 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
330 PyObject *filename, PyObject *name, int firstlineno,
331 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000332{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000333 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000334 int i;
335 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000336 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000337 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000338 consts == NULL || !PyTuple_Check(consts) ||
339 names == NULL || !PyTuple_Check(names) ||
340 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000341 freevars == NULL || !PyTuple_Check(freevars) ||
342 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000343 name == NULL || !PyString_Check(name) ||
344 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000345 lnotab == NULL || !PyString_Check(lnotab) ||
346 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000347 PyErr_BadInternalCall();
348 return NULL;
349 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000350 intern_strings(names);
351 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000352 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000353 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000354 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000355 for (i = PyTuple_Size(consts); --i >= 0; ) {
356 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000357 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000358 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000359 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000360 continue;
361 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000362 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000363 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000364 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000365 co->co_argcount = argcount;
366 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000367 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000368 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000369 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000370 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000371 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000372 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000373 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000374 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000375 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000376 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000377 Py_INCREF(freevars);
378 co->co_freevars = freevars;
379 Py_INCREF(cellvars);
380 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000381 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000382 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000383 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000384 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000385 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000386 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000387 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000388 }
389 return co;
390}
391
392
393/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000394
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000395/* The compiler uses two passes to generate bytecodes. The first pass
396 builds the symbol table. The second pass generates the bytecode.
397
398 The first pass uses a single symtable struct. The second pass uses
399 a compiling struct for each code block. The compiling structs
400 share a reference to the symtable.
401
402 The two passes communicate via symtable_load_symbols() and via
403 is_local() and is_global(). The former initializes several slots
404 in the compiling struct: c_varnames, c_locals, c_nlocals,
405 c_argcount, c_globals, and c_flags.
406*/
407
Tim Peters2a7f3842001-06-09 09:26:21 +0000408/* All about c_lnotab.
409
410c_lnotab is an array of unsigned bytes disguised as a Python string. In -O
411mode, SET_LINENO opcodes aren't generated, and bytecode offsets are mapped
412to source code line #s (when needed for tracebacks) via c_lnotab instead.
413The array is conceptually a list of
414 (bytecode offset increment, line number increment)
415pairs. The details are important and delicate, best illustrated by example:
416
417 byte code offset source code line number
418 0 1
419 6 2
420 50 7
421 350 307
422 361 308
423
424The first trick is that these numbers aren't stored, only the increments
425from one row to the next (this doesn't really work, but it's a start):
426
427 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
428
429The second trick is that an unsigned byte can't hold negative values, or
430values larger than 255, so (a) there's a deep assumption that byte code
431offsets and their corresponding line #s both increase monotonically, and (b)
432if at least one column jumps by more than 255 from one row to the next, more
433than one pair is written to the table. In case #b, there's no way to know
434from looking at the table later how many were written. That's the delicate
435part. A user of c_lnotab desiring to find the source line number
436corresponding to a bytecode address A should do something like this
437
438 lineno = addr = 0
439 for addr_incr, line_incr in c_lnotab:
440 addr += addr_incr
441 if addr > A:
442 return lineno
443 lineno += line_incr
444
445In order for this to work, when the addr field increments by more than 255,
446the line # increment in each pair generated must be 0 until the remaining addr
447increment is < 256. So, in the example above, com_set_lineno should not (as
448was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
449255, 0, 45, 255, 0, 45.
450*/
451
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000452struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000453 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000454 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000455 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000456 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000457 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000458 PyObject *c_globals; /* dictionary (value=None) */
459 PyObject *c_locals; /* dictionary (value=localID) */
460 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000461 PyObject *c_freevars; /* dictionary (value=None) */
462 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000463 int c_nlocals; /* index of next local */
464 int c_argcount; /* number of top-level arguments */
465 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000466 int c_nexti; /* index into c_code */
467 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000468 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000469 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000470 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000471 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000472 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000473 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000474 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000475 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000476 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000477 int c_stacklevel; /* Current stack level */
478 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000479 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000480 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000481 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000482 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000483 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000484 int c_nested; /* Is block nested funcdef or lamdef? */
485 int c_closure; /* Is nested w/freevars? */
486 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000487 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000488 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000489};
490
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000491static int
492is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000493{
494 if ((v & (USE | DEF_FREE))
495 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
496 return 1;
497 if (v & DEF_FREE_CLASS)
498 return 1;
499 return 0;
500}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000501
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000502static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000503com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000504{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000505 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
506
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000507 if (c == NULL) {
508 /* Error occurred via symtable call to
509 is_constant_false */
510 PyErr_SetString(exc, msg);
511 return;
512 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000513 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000514 if (c->c_lineno < 1 || c->c_interactive) {
515 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000516 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000517 return;
518 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000519 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000520 if (v == NULL)
521 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000522
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000523 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000524 if (line == NULL) {
525 Py_INCREF(Py_None);
526 line = Py_None;
527 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000528 if (exc == PyExc_SyntaxError) {
529 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
530 Py_None, line);
531 if (t == NULL)
532 goto exit;
533 w = Py_BuildValue("(OO)", v, t);
534 if (w == NULL)
535 goto exit;
536 PyErr_SetObject(exc, w);
537 } else {
538 /* Make sure additional exceptions are printed with
539 file and line, also. */
540 PyErr_SetObject(exc, v);
541 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
542 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000543 exit:
544 Py_XDECREF(t);
545 Py_XDECREF(v);
546 Py_XDECREF(w);
547 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000548}
549
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000550/* Interface to the block stack */
551
552static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000553block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000554{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000555 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000556 com_error(c, PyExc_SystemError,
557 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000558 }
559 else {
560 c->c_block[c->c_nblocks++] = type;
561 }
562}
563
564static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000565block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000566{
567 if (c->c_nblocks > 0)
568 c->c_nblocks--;
569 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000570 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000571 }
572}
573
Guido van Rossum681d79a1995-07-18 14:51:37 +0000574/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000575
Tim Petersdbd9ba62000-07-09 03:09:57 +0000576static int com_init(struct compiling *, char *);
577static void com_free(struct compiling *);
578static void com_push(struct compiling *, int);
579static void com_pop(struct compiling *, int);
580static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000581static void com_node(struct compiling *, node *);
582static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000583static void com_addbyte(struct compiling *, int);
584static void com_addint(struct compiling *, int);
585static void com_addoparg(struct compiling *, int, int);
586static void com_addfwref(struct compiling *, int, int *);
587static void com_backpatch(struct compiling *, int);
588static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
589static int com_addconst(struct compiling *, PyObject *);
590static int com_addname(struct compiling *, PyObject *);
591static void com_addopname(struct compiling *, int, node *);
592static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000593static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000594static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000595static void com_assign(struct compiling *, node *, int, node *);
596static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000597static PyCodeObject *icompile(node *, struct compiling *);
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000598static PyCodeObject *jcompile(node *, char *, struct compiling *,
599 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000600static PyObject *parsestrplus(struct compiling*, node *);
601static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000602static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000603
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000604static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000605
606/* symtable operations */
607static int symtable_build(struct compiling *, node *);
608static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000609static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000610static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000611static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000612static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000613static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000614
615static void symtable_node(struct symtable *, node *);
616static void symtable_funcdef(struct symtable *, node *);
617static void symtable_default_args(struct symtable *, node *);
618static void symtable_params(struct symtable *, node *);
619static void symtable_params_fplist(struct symtable *, node *n);
620static void symtable_global(struct symtable *, node *);
621static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000622static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000623static void symtable_list_comprehension(struct symtable *, node *);
624
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000625static int symtable_update_free_vars(struct symtable *);
626static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
627static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
628
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000629/* helper */
630static void
631do_pad(int pad)
632{
633 int i;
634 for (i = 0; i < pad; ++i)
635 fprintf(stderr, " ");
636}
637
638static void
639dump(node *n, int pad, int depth)
640{
641 int i;
642 if (depth == 0)
643 return;
644 do_pad(pad);
645 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
646 if (depth > 0)
647 depth--;
648 for (i = 0; i < NCH(n); ++i)
649 dump(CHILD(n, i), pad + 1, depth);
650}
651
652#define DUMP(N) dump(N, 0, -1)
653
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000654static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000655com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000656{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000657 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000658 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
659 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000660 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000661 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000662 goto fail;
663 if ((c->c_const_dict = PyDict_New()) == NULL)
664 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000665 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000666 goto fail;
667 if ((c->c_name_dict = PyDict_New()) == NULL)
668 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000669 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000670 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000671 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
672 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000673 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000674 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000675 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000676 c->c_freevars = NULL;
677 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000678 c->c_nlocals = 0;
679 c->c_argcount = 0;
680 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000681 c->c_nexti = 0;
682 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000683 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000684 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000685 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000686 c->c_begin = 0;
687 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000688 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000689 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000690 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000691 c->c_stacklevel = 0;
692 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000693 c->c_firstlineno = 0;
694 c->c_last_addr = 0;
695 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000696 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000697 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000698 c->c_nested = 0;
699 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000700 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000701 return 1;
702
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000703 fail:
704 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000705 return 0;
706}
707
708static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000709com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000710{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000711 Py_XDECREF(c->c_code);
712 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000713 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000714 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000715 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000716 Py_XDECREF(c->c_globals);
717 Py_XDECREF(c->c_locals);
718 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000719 Py_XDECREF(c->c_freevars);
720 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000721 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000722 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +0000723 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000724}
725
726static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000727com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000728{
729 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000730 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +0000731 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000732 /*
733 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
734 c->c_filename, c->c_name, c->c_lineno,
735 c->c_nexti, c->c_stacklevel, n);
736 */
737 }
Guido van Rossum8b993a91997-01-17 21:04:03 +0000738}
739
740static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000741com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000742{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000743 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000744 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000745 else
746 c->c_stacklevel -= n;
747}
748
749static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000750com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000751{
752 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000753 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000754 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000755 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000756}
757
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000758static int
759com_check_size(PyObject **s, int offset)
760{
761 int len = PyString_GET_SIZE(*s);
762 if (offset >= len)
763 return _PyString_Resize(s, len * 2);
764 return 0;
765}
766
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000767static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000768com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000769{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000770 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000771 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +0000772 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000773 if (com_check_size(&c->c_code, c->c_nexti)) {
774 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000775 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000776 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000777 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000778}
779
780static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000781com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000782{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000783 com_addbyte(c, x & 0xff);
784 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000785}
786
787static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000788com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000789{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000790 char *p;
791 if (c->c_lnotab == NULL)
792 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000793 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
794 c->c_errors++;
795 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000796 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000797 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000798 *p++ = addr;
799 *p++ = line;
800 c->c_lnotab_next += 2;
801}
802
803static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000804com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000805{
806 c->c_lineno = lineno;
807 if (c->c_firstlineno == 0) {
808 c->c_firstlineno = c->c_last_line = lineno;
809 }
810 else {
811 int incr_addr = c->c_nexti - c->c_last_addr;
812 int incr_line = lineno - c->c_last_line;
Tim Peters2a7f3842001-06-09 09:26:21 +0000813 while (incr_addr > 255) {
814 com_add_lnotab(c, 255, 0);
815 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000816 }
Tim Peters2a7f3842001-06-09 09:26:21 +0000817 while (incr_line > 255) {
818 com_add_lnotab(c, incr_addr, 255);
819 incr_line -=255;
820 incr_addr = 0;
821 }
822 if (incr_addr > 0 || incr_line > 0)
823 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000824 c->c_last_addr = c->c_nexti;
825 c->c_last_line = lineno;
826 }
827}
828
829static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000830com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000831{
Fred Drakeef8ace32000-08-24 00:32:09 +0000832 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000833 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000834 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000835 if (Py_OptimizeFlag)
836 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000837 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000838 if (extended_arg){
839 com_addbyte(c, EXTENDED_ARG);
840 com_addint(c, extended_arg);
841 arg &= 0xffff;
842 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000843 com_addbyte(c, op);
844 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000845}
846
847static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000848com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000849{
850 /* Compile a forward reference for backpatching */
851 int here;
852 int anchor;
853 com_addbyte(c, op);
854 here = c->c_nexti;
855 anchor = *p_anchor;
856 *p_anchor = here;
857 com_addint(c, anchor == 0 ? 0 : here - anchor);
858}
859
860static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000861com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000862{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000863 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000864 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000865 int dist;
866 int prev;
867 for (;;) {
868 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000869 prev = code[anchor] + (code[anchor+1] << 8);
870 dist = target - (anchor+2);
871 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000872 dist >>= 8;
873 code[anchor+1] = dist;
874 dist >>= 8;
875 if (dist) {
876 com_error(c, PyExc_SystemError,
877 "com_backpatch: offset too large");
878 break;
879 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000880 if (!prev)
881 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000882 anchor -= prev;
883 }
884}
885
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000886/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000887
888static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000889com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000890{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000891 PyObject *w, *t, *np=NULL;
892 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000893
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000894 t = Py_BuildValue("(OO)", v, v->ob_type);
895 if (t == NULL)
896 goto fail;
897 w = PyDict_GetItem(dict, t);
898 if (w != NULL) {
899 n = PyInt_AsLong(w);
900 } else {
901 n = PyList_Size(list);
902 np = PyInt_FromLong(n);
903 if (np == NULL)
904 goto fail;
905 if (PyList_Append(list, v) != 0)
906 goto fail;
907 if (PyDict_SetItem(dict, t, np) != 0)
908 goto fail;
909 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000910 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000911 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000912 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000913 fail:
914 Py_XDECREF(np);
915 Py_XDECREF(t);
916 c->c_errors++;
917 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000918}
919
920static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000921com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000922{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000923 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000924}
925
926static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000927com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000928{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000929 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000930}
931
Raymond Hettinger0ae0c072002-06-20 22:23:15 +0000932int
933_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000934{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000935 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000936 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000937 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000938 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
939 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000940 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000941 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000942 return 0; /* Don't mangle __extremely_long_names */
943 if (name[nlen-1] == '_' && name[nlen-2] == '_')
944 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000945 /* Strip leading underscores from class name */
946 while (*p == '_')
947 p++;
948 if (*p == '\0')
949 return 0; /* Don't mangle if class is just underscores */
950 plen = strlen(p);
951 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000952 plen = maxlen-nlen-2; /* Truncate class name if too long */
953 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000954 buffer[0] = '_';
955 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000956 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000957 return 1;
958}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000959
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000960static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000961com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000962{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000963 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000964 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000965 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000966
Raymond Hettinger0ae0c072002-06-20 22:23:15 +0000967 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000968 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000969 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000970 c->c_errors++;
971 i = 255;
972 }
973 else {
974 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000975 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000976 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000977 com_addoparg(c, op, i);
978}
979
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000980#define NAME_LOCAL 0
981#define NAME_GLOBAL 1
982#define NAME_DEFAULT 2
983#define NAME_CLOSURE 3
984
985static int
986com_lookup_arg(PyObject *dict, PyObject *name)
987{
988 PyObject *v = PyDict_GetItem(dict, name);
989 if (v == NULL)
990 return -1;
991 else
992 return PyInt_AS_LONG(v);
993}
994
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000995static void
996com_addop_varname(struct compiling *c, int kind, char *name)
997{
998 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000999 int i, reftype;
1000 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001001 int op = STOP_CODE;
1002 char buffer[MANGLE_LEN];
1003
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001004 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001005 name = buffer;
1006 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1007 c->c_errors++;
1008 i = 255;
1009 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001010 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001011
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001012 reftype = get_ref_type(c, name);
1013 switch (reftype) {
1014 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001015 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001016 scope = NAME_LOCAL;
1017 break;
1018 case GLOBAL_EXPLICIT:
1019 scope = NAME_GLOBAL;
1020 break;
1021 case GLOBAL_IMPLICIT:
1022 if (c->c_flags & CO_OPTIMIZED)
1023 scope = NAME_GLOBAL;
1024 break;
1025 case FREE:
1026 case CELL:
1027 scope = NAME_CLOSURE;
1028 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001029 }
1030
1031 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001032 if (scope == NAME_LOCAL)
1033 i = com_lookup_arg(c->c_locals, v);
1034 else if (reftype == FREE)
1035 i = com_lookup_arg(c->c_freevars, v);
1036 else if (reftype == CELL)
1037 i = com_lookup_arg(c->c_cellvars, v);
1038 if (i == -1) {
1039 c->c_errors++; /* XXX no exception set */
1040 i = 255;
1041 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001042 }
1043 Py_DECREF(v);
1044
1045 switch (kind) {
1046 case VAR_LOAD:
1047 switch (scope) {
1048 case NAME_LOCAL:
1049 op = LOAD_FAST;
1050 break;
1051 case NAME_GLOBAL:
1052 op = LOAD_GLOBAL;
1053 break;
1054 case NAME_DEFAULT:
1055 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001056 break;
1057 case NAME_CLOSURE:
1058 op = LOAD_DEREF;
1059 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001060 }
1061 break;
1062 case VAR_STORE:
1063 switch (scope) {
1064 case NAME_LOCAL:
1065 op = STORE_FAST;
1066 break;
1067 case NAME_GLOBAL:
1068 op = STORE_GLOBAL;
1069 break;
1070 case NAME_DEFAULT:
1071 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001072 break;
1073 case NAME_CLOSURE:
1074 op = STORE_DEREF;
1075 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001076 }
1077 break;
1078 case VAR_DELETE:
1079 switch (scope) {
1080 case NAME_LOCAL:
1081 op = DELETE_FAST;
1082 break;
1083 case NAME_GLOBAL:
1084 op = DELETE_GLOBAL;
1085 break;
1086 case NAME_DEFAULT:
1087 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001088 break;
1089 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001090 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001091 PyOS_snprintf(buf, sizeof(buf),
1092 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001093 com_error(c, PyExc_SyntaxError, buf);
1094 i = 255;
1095 break;
1096 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001097 }
1098 break;
1099 }
1100done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001101 com_addoparg(c, op, i);
1102}
1103
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001104static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001105com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001106{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001107 char *name;
1108 char buffer[1000];
1109 /* XXX it is possible to write this code without the 1000
1110 chars on the total length of dotted names, I just can't be
1111 bothered right now */
1112 if (TYPE(n) == STAR)
1113 name = "*";
1114 else if (TYPE(n) == dotted_name) {
1115 char *p = buffer;
1116 int i;
1117 name = buffer;
1118 for (i = 0; i < NCH(n); i += 2) {
1119 char *s = STR(CHILD(n, i));
1120 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001121 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001122 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001123 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001124 break;
1125 }
1126 if (p != buffer)
1127 *p++ = '.';
1128 strcpy(p, s);
1129 p = strchr(p, '\0');
1130 }
1131 }
1132 else {
1133 REQ(n, NAME);
1134 name = STR(n);
1135 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001136 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001137}
1138
Guido van Rossum79f25d91997-04-29 20:08:16 +00001139static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001140parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001141{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001142 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001143 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001144 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001145#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +00001146 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +00001147 int imflag;
1148#endif
1149
Guido van Rossum282914b1991-04-04 10:42:56 +00001150 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001151 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001152#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001153 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001154#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001155 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001156 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001157 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001158 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001159 if (x < 0 && errno == 0) {
1160 if (PyErr_Warn(PyExc_DeprecationWarning,
1161 "hex/oct constants > sys.maxint "
1162 "will return positive values "
1163 "in Python 2.4 and up") < 0)
1164 return NULL;
Guido van Rossum3cb8e542002-08-11 14:06:15 +00001165 errno = 0; /* Might be changed by PyErr_Warn() */
Guido van Rossum078151d2002-08-11 04:24:12 +00001166 }
1167 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001168 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001169 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001170 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001171 if (errno != 0)
1172 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001173 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001174 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001175 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001176#ifndef WITHOUT_COMPLEX
1177 if (imflag) {
1178 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001179 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001180 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001181 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001182 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001183 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001184 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001185#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001186 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001187 PyFPE_START_PROTECT("atof", return 0)
1188 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001189 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001190 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001191 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001192}
1193
Guido van Rossum79f25d91997-04-29 20:08:16 +00001194static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001195decode_utf8(char **sPtr, char *end, char* encoding)
1196{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001197#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001198 Py_FatalError("decode_utf8 should not be called in this build.");
1199 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001200#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001201 PyObject *u, *v;
1202 char *s, *t;
1203 t = s = *sPtr;
1204 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1205 while (s < end && (*s & 0x80)) s++;
1206 *sPtr = s;
1207 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1208 if (u == NULL)
1209 return NULL;
1210 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1211 Py_DECREF(u);
1212 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001213#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001214}
1215
1216static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001217parsestr(struct compiling *com, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001218{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001219 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001220 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001221 char *buf;
1222 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001223 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001224 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001225 int first = *s;
1226 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001227 int rawmode = 0;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001228 char* encoding = ((com == NULL) ? NULL : com->c_encoding);
1229 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001230 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001231
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001232 if (isalpha(quote) || quote == '_') {
1233 if (quote == 'u' || quote == 'U') {
1234 quote = *++s;
1235 unicode = 1;
1236 }
1237 if (quote == 'r' || quote == 'R') {
1238 quote = *++s;
1239 rawmode = 1;
1240 }
1241 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001242 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001243 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001244 return NULL;
1245 }
1246 s++;
1247 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001248 if (len > INT_MAX) {
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001249 com_error(com, PyExc_OverflowError,
1250 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001251 return NULL;
1252 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001253 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001254 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001255 return NULL;
1256 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001257 if (len >= 4 && s[0] == quote && s[1] == quote) {
1258 s += 2;
1259 len -= 2;
1260 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001261 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001262 return NULL;
1263 }
1264 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001265#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001266 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001267 PyObject *u, *w;
1268 if (encoding == NULL) {
1269 buf = s;
1270 u = NULL;
1271 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1272 buf = s;
1273 u = NULL;
1274 } else {
1275 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1276 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1277 if (u == NULL)
1278 return NULL;
1279 p = buf = PyString_AsString(u);
1280 end = s + len;
1281 while (s < end) {
1282 if (*s == '\\') {
1283 *p++ = *s++;
1284 if (*s & 0x80) {
1285 strcpy(p, "u005c");
1286 p += 5;
1287 }
1288 }
1289 if (*s & 0x80) { /* XXX inefficient */
1290 char *r;
1291 int rn, i;
1292 w = decode_utf8(&s, end, "utf-16-be");
1293 if (w == NULL) {
1294 Py_DECREF(u);
1295 return NULL;
1296 }
1297 r = PyString_AsString(w);
1298 rn = PyString_Size(w);
1299 assert(rn % 2 == 0);
1300 for (i = 0; i < rn; i += 2) {
1301 sprintf(p, "\\u%02x%02x",
1302 r[i + 0] & 0xFF,
1303 r[i + 1] & 0xFF);
1304 p += 6;
1305 }
1306 Py_DECREF(w);
1307 } else {
1308 *p++ = *s++;
1309 }
1310 }
1311 len = p - buf;
1312 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001313 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001314 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001315 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001316 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1317 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001318 if (v == NULL)
1319 PyErr_SyntaxLocation(com->c_filename, com->c_lineno);
1320 return v;
1321
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001322 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001323#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001324 need_encoding = (encoding != NULL &&
1325 strcmp(encoding, "utf-8") != 0 &&
1326 strcmp(encoding, "iso-8859-1") != 0);
1327 if (rawmode || strchr(s, '\\') == NULL) {
1328 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001329#ifndef Py_USING_UNICODE
1330 /* This should not happen - we never see any other
1331 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001332 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001333#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001334 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1335 if (u == NULL)
1336 return NULL;
1337 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1338 Py_DECREF(u);
1339 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001340#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001341 } else {
1342 return PyString_FromStringAndSize(s, len);
1343 }
1344 }
1345 v = PyString_FromStringAndSize((char *)NULL, /* XXX 4 is enough? */
1346 need_encoding ? len * 4 : len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001347 if (v == NULL)
1348 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001349 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001350 end = s + len;
1351 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001352 if (*s != '\\') {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001353 ORDINAL:
1354 if (need_encoding && (*s & 0x80)) {
1355 char *r;
1356 int rn;
1357 PyObject* w = decode_utf8(&s, end, encoding);
1358 if (w == NULL)
1359 return NULL;
1360 r = PyString_AsString(w);
1361 rn = PyString_Size(w);
1362 memcpy(p, r, rn);
1363 p += rn;
1364 Py_DECREF(w);
1365 } else {
1366 *p++ = *s++;
1367 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001368 continue;
1369 }
1370 s++;
1371 switch (*s++) {
1372 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001373 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001374 case '\\': *p++ = '\\'; break;
1375 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001376 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001377 case 'b': *p++ = '\b'; break;
1378 case 'f': *p++ = '\014'; break; /* FF */
1379 case 't': *p++ = '\t'; break;
1380 case 'n': *p++ = '\n'; break;
1381 case 'r': *p++ = '\r'; break;
1382 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001383 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1384 case '0': case '1': case '2': case '3':
1385 case '4': case '5': case '6': case '7':
1386 c = s[-1] - '0';
1387 if ('0' <= *s && *s <= '7') {
1388 c = (c<<3) + *s++ - '0';
1389 if ('0' <= *s && *s <= '7')
1390 c = (c<<3) + *s++ - '0';
1391 }
1392 *p++ = c;
1393 break;
1394 case 'x':
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001395 if (isxdigit(Py_CHARMASK(s[0]))
1396 && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +00001397 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001398 c = Py_CHARMASK(*s);
1399 s++;
1400 if (isdigit(c))
1401 x = c - '0';
1402 else if (islower(c))
1403 x = 10 + c - 'a';
1404 else
1405 x = 10 + c - 'A';
1406 x = x << 4;
1407 c = Py_CHARMASK(*s);
1408 s++;
1409 if (isdigit(c))
1410 x += c - '0';
1411 else if (islower(c))
1412 x += 10 + c - 'a';
1413 else
1414 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +00001415 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001416 break;
1417 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001418 Py_DECREF(v);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001419 com_error(com, PyExc_ValueError,
1420 "invalid \\x escape");
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001421 return NULL;
Guido van Rossum05459c52002-05-28 18:47:29 +00001422#ifndef Py_USING_UNICODE
1423 case 'u':
1424 case 'U':
1425 case 'N':
1426 if (unicode) {
1427 Py_DECREF(v);
1428 com_error(com, PyExc_ValueError,
1429 "Unicode escapes not legal "
1430 "when Unicode disabled");
1431 return NULL;
1432 }
1433#endif
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001434 default:
1435 *p++ = '\\';
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001436 s--;
1437 goto ORDINAL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001438 }
1439 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001440 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001441 return v;
1442}
1443
Guido van Rossum79f25d91997-04-29 20:08:16 +00001444static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001445parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001446{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001447 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001448 int i;
1449 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001450 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001451 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001452 for (i = 1; i < NCH(n); i++) {
1453 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001454 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001455 if (s == NULL)
1456 goto onError;
1457 if (PyString_Check(v) && PyString_Check(s)) {
1458 PyString_ConcatAndDel(&v, s);
1459 if (v == NULL)
1460 goto onError;
1461 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001462#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001463 else {
1464 PyObject *temp;
1465 temp = PyUnicode_Concat(v, s);
1466 Py_DECREF(s);
1467 if (temp == NULL)
1468 goto onError;
1469 Py_DECREF(v);
1470 v = temp;
1471 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001472#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001473 }
1474 }
1475 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001476
1477 onError:
1478 Py_XDECREF(v);
1479 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001480}
1481
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001482static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001483com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001484{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001485 int anchor = 0;
1486 int save_begin = c->c_begin;
1487
1488 /* list_iter: for v in expr [list_iter] */
1489 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001490 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001491 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001492 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001493 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001494 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001495 c->c_loops++;
1496 com_list_iter(c, n, e, t);
1497 c->c_loops--;
1498 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1499 c->c_begin = save_begin;
1500 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001501 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001502}
1503
1504static void
1505com_list_if(struct compiling *c, node *n, node *e, char *t)
1506{
1507 int anchor = 0;
1508 int a = 0;
1509 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001510 com_node(c, CHILD(n, 1));
1511 com_addfwref(c, JUMP_IF_FALSE, &a);
1512 com_addbyte(c, POP_TOP);
1513 com_pop(c, 1);
1514 com_list_iter(c, n, e, t);
1515 com_addfwref(c, JUMP_FORWARD, &anchor);
1516 com_backpatch(c, a);
1517 /* We jump here with an extra entry which we now pop */
1518 com_addbyte(c, POP_TOP);
1519 com_backpatch(c, anchor);
1520}
1521
1522static void
1523com_list_iter(struct compiling *c,
1524 node *p, /* parent of list_iter node */
1525 node *e, /* element expression node */
1526 char *t /* name of result list temp local */)
1527{
1528 /* list_iter is the last child in a listmaker, list_for, or list_if */
1529 node *n = CHILD(p, NCH(p)-1);
1530 if (TYPE(n) == list_iter) {
1531 n = CHILD(n, 0);
1532 switch (TYPE(n)) {
1533 case list_for:
1534 com_list_for(c, n, e, t);
1535 break;
1536 case list_if:
1537 com_list_if(c, n, e, t);
1538 break;
1539 default:
1540 com_error(c, PyExc_SystemError,
1541 "invalid list_iter node type");
1542 }
1543 }
1544 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001545 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001546 com_push(c, 1);
1547 com_node(c, e);
1548 com_addoparg(c, CALL_FUNCTION, 1);
1549 com_addbyte(c, POP_TOP);
1550 com_pop(c, 2);
1551 }
1552}
1553
1554static void
1555com_list_comprehension(struct compiling *c, node *n)
1556{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001557 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001558 char tmpname[30];
1559 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001560 com_addoparg(c, BUILD_LIST, 0);
1561 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1562 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001563 com_addop_name(c, LOAD_ATTR, "append");
1564 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001565 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001566 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001567 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001568 --c->c_tmpname;
1569}
1570
1571static void
1572com_listmaker(struct compiling *c, node *n)
1573{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001574 /* listmaker: test ( list_for | (',' test)* [','] ) */
1575 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001576 com_list_comprehension(c, n);
1577 else {
1578 int len = 0;
1579 int i;
1580 for (i = 0; i < NCH(n); i += 2, len++)
1581 com_node(c, CHILD(n, i));
1582 com_addoparg(c, BUILD_LIST, len);
1583 com_pop(c, len-1);
1584 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001585}
1586
1587static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001588com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001589{
1590 int i;
1591 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1592 for (i = 0; i+2 < NCH(n); i += 4) {
1593 /* We must arrange things just right for STORE_SUBSCR.
1594 It wants the stack to look like (value) (dict) (key) */
1595 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001596 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001597 com_node(c, CHILD(n, i+2)); /* value */
1598 com_addbyte(c, ROT_TWO);
1599 com_node(c, CHILD(n, i)); /* key */
1600 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001601 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001602 }
1603}
1604
1605static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001606com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001607{
1608 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001609 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001610 int i;
1611 REQ(n, atom);
1612 ch = CHILD(n, 0);
1613 switch (TYPE(ch)) {
1614 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001615 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001616 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001617 com_push(c, 1);
1618 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001619 else
1620 com_node(c, CHILD(n, 1));
1621 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001622 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001623 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001624 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001625 com_push(c, 1);
1626 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001627 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001628 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001629 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001630 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001631 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001632 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001633 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001634 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001635 break;
1636 case BACKQUOTE:
1637 com_node(c, CHILD(n, 1));
1638 com_addbyte(c, UNARY_CONVERT);
1639 break;
1640 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001641 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001642 i = 255;
1643 }
1644 else {
1645 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001646 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001647 }
1648 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001649 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001650 break;
1651 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001652 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001653 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001654 c->c_errors++;
1655 i = 255;
1656 }
1657 else {
1658 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001659 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001660 }
1661 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001662 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001663 break;
1664 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001665 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001666 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001667 break;
1668 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001669 com_error(c, PyExc_SystemError,
1670 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001671 }
1672}
1673
1674static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001675com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001676{
1677 if (NCH(n) == 1) {
1678 com_addbyte(c, op);
1679 }
1680 else if (NCH(n) == 2) {
1681 if (TYPE(CHILD(n, 0)) != COLON) {
1682 com_node(c, CHILD(n, 0));
1683 com_addbyte(c, op+1);
1684 }
1685 else {
1686 com_node(c, CHILD(n, 1));
1687 com_addbyte(c, op+2);
1688 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001689 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001690 }
1691 else {
1692 com_node(c, CHILD(n, 0));
1693 com_node(c, CHILD(n, 2));
1694 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001695 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001696 }
1697}
1698
Guido van Rossum635abd21997-01-06 22:56:52 +00001699static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001700com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1701{
1702 if (NCH(n) == 1) {
1703 com_addbyte(c, DUP_TOP);
1704 com_push(c, 1);
1705 com_addbyte(c, SLICE);
1706 com_node(c, augn);
1707 com_addbyte(c, opcode);
1708 com_pop(c, 1);
1709 com_addbyte(c, ROT_TWO);
1710 com_addbyte(c, STORE_SLICE);
1711 com_pop(c, 2);
1712 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1713 com_node(c, CHILD(n, 0));
1714 com_addoparg(c, DUP_TOPX, 2);
1715 com_push(c, 2);
1716 com_addbyte(c, SLICE+1);
1717 com_pop(c, 1);
1718 com_node(c, augn);
1719 com_addbyte(c, opcode);
1720 com_pop(c, 1);
1721 com_addbyte(c, ROT_THREE);
1722 com_addbyte(c, STORE_SLICE+1);
1723 com_pop(c, 3);
1724 } else if (NCH(n) == 2) {
1725 com_node(c, CHILD(n, 1));
1726 com_addoparg(c, DUP_TOPX, 2);
1727 com_push(c, 2);
1728 com_addbyte(c, SLICE+2);
1729 com_pop(c, 1);
1730 com_node(c, augn);
1731 com_addbyte(c, opcode);
1732 com_pop(c, 1);
1733 com_addbyte(c, ROT_THREE);
1734 com_addbyte(c, STORE_SLICE+2);
1735 com_pop(c, 3);
1736 } else {
1737 com_node(c, CHILD(n, 0));
1738 com_node(c, CHILD(n, 2));
1739 com_addoparg(c, DUP_TOPX, 3);
1740 com_push(c, 3);
1741 com_addbyte(c, SLICE+3);
1742 com_pop(c, 2);
1743 com_node(c, augn);
1744 com_addbyte(c, opcode);
1745 com_pop(c, 1);
1746 com_addbyte(c, ROT_FOUR);
1747 com_addbyte(c, STORE_SLICE+3);
1748 com_pop(c, 4);
1749 }
1750}
1751
1752static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001753com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001754{
1755 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001756 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001757 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001758 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001759 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001760 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001761 }
1762 else {
1763 com_node(c, CHILD(n, 0));
1764 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001765 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001766 }
1767 m = n;
1768 do {
1769 m = CHILD(m, 0);
1770 } while (NCH(m) == 1);
1771 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001772 /* f(lambda x: x[0] = 3) ends up getting parsed with
1773 * LHS test = lambda x: x[0], and RHS test = 3.
1774 * SF bug 132313 points out that complaining about a keyword
1775 * then is very confusing.
1776 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001777 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001778 TYPE(m) == lambdef ?
1779 "lambda cannot contain assignment" :
1780 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001781 }
1782 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001783 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001784 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001785 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001786 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001787 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001788 else if (*pkeywords == NULL) {
1789 c->c_errors++;
1790 Py_DECREF(v);
1791 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001792 if (PyDict_GetItem(*pkeywords, v) != NULL)
1793 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001794 "duplicate keyword argument");
1795 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001796 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001797 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001798 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001799 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001800 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001801 }
1802 }
1803 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001804}
1805
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001806static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001807com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001808{
1809 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001810 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001811 }
1812 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001813 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001814 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001815 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001816 int star_flag = 0;
1817 int starstar_flag = 0;
1818 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001819 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001820 na = 0;
1821 nk = 0;
1822 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001823 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001824 if (TYPE(ch) == STAR ||
1825 TYPE(ch) == DOUBLESTAR)
1826 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001827 if (ch->n_lineno != lineno) {
1828 lineno = ch->n_lineno;
1829 com_addoparg(c, SET_LINENO, lineno);
1830 }
1831 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001832 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001833 na++;
1834 else
1835 nk++;
1836 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001837 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001838 while (i < NCH(n)) {
1839 node *tok = CHILD(n, i);
1840 node *ch = CHILD(n, i+1);
1841 i += 3;
1842 switch (TYPE(tok)) {
1843 case STAR: star_flag = 1; break;
1844 case DOUBLESTAR: starstar_flag = 1; break;
1845 }
1846 com_node(c, ch);
1847 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001848 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001849 com_error(c, PyExc_SyntaxError,
1850 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001851 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001852 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001853 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001854 star_flag + (starstar_flag << 1);
1855 else
1856 opcode = CALL_FUNCTION;
1857 com_addoparg(c, opcode, na | (nk << 8));
1858 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001859 }
1860}
1861
1862static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001863com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001864{
1865 com_addopname(c, LOAD_ATTR, n);
1866}
1867
1868static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001869com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001870{
1871 int i=0;
1872 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001873 node *ch;
1874
1875 /* first argument */
1876 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001877 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001878 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001879 i++;
1880 }
1881 else {
1882 com_node(c, CHILD(n,i));
1883 i++;
1884 REQ(CHILD(n,i),COLON);
1885 i++;
1886 }
1887 /* second argument */
1888 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1889 com_node(c, CHILD(n,i));
1890 i++;
1891 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001892 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001893 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001894 com_push(c, 1);
1895 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001896 /* remaining arguments */
1897 for (; i < NCH(n); i++) {
1898 ns++;
1899 ch=CHILD(n,i);
1900 REQ(ch, sliceop);
1901 if (NCH(ch) == 1) {
1902 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001903 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001904 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001905 }
1906 else
1907 com_node(c, CHILD(ch,1));
1908 }
1909 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001910 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001911}
1912
1913static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001914com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001915{
1916 node *ch;
1917 REQ(n, subscript);
1918 ch = CHILD(n,0);
1919 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001920 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001921 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001922 com_push(c, 1);
1923 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001924 else {
1925 /* check for slice */
1926 if ((TYPE(ch) == COLON || NCH(n) > 1))
1927 com_sliceobj(c, n);
1928 else {
1929 REQ(ch, test);
1930 com_node(c, ch);
1931 }
1932 }
1933}
1934
1935static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001936com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001937{
1938 int i, op;
1939 REQ(n, subscriptlist);
1940 /* Check to make backward compatible slice behavior for '[i:j]' */
1941 if (NCH(n) == 1) {
1942 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001943 /* 'Basic' slice, should have exactly one colon. */
1944 if ((TYPE(CHILD(sub, 0)) == COLON
1945 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1946 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1947 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001948 switch (assigning) {
1949 case OP_DELETE:
1950 op = DELETE_SLICE;
1951 break;
1952 case OP_ASSIGN:
1953 op = STORE_SLICE;
1954 break;
1955 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001956 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001957 break;
1958 default:
1959 com_augassign_slice(c, sub, assigning, augn);
1960 return;
1961 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001962 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001963 if (op == STORE_SLICE)
1964 com_pop(c, 2);
1965 else if (op == DELETE_SLICE)
1966 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001967 return;
1968 }
1969 }
1970 /* Else normal subscriptlist. Compile each subscript. */
1971 for (i = 0; i < NCH(n); i += 2)
1972 com_subscript(c, CHILD(n, i));
1973 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001974 if (NCH(n) > 1) {
1975 i = (NCH(n)+1) / 2;
1976 com_addoparg(c, BUILD_TUPLE, i);
1977 com_pop(c, i-1);
1978 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001979 switch (assigning) {
1980 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001981 op = DELETE_SUBSCR;
1982 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001983 break;
1984 default:
1985 case OP_ASSIGN:
1986 op = STORE_SUBSCR;
1987 i = 3;
1988 break;
1989 case OP_APPLY:
1990 op = BINARY_SUBSCR;
1991 i = 1;
1992 break;
1993 }
1994 if (assigning > OP_APPLY) {
1995 com_addoparg(c, DUP_TOPX, 2);
1996 com_push(c, 2);
1997 com_addbyte(c, BINARY_SUBSCR);
1998 com_pop(c, 1);
1999 com_node(c, augn);
2000 com_addbyte(c, assigning);
2001 com_pop(c, 1);
2002 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002003 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002004 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002005 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002006}
2007
2008static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002009com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002010{
2011 REQ(n, trailer);
2012 switch (TYPE(CHILD(n, 0))) {
2013 case LPAR:
2014 com_call_function(c, CHILD(n, 1));
2015 break;
2016 case DOT:
2017 com_select_member(c, CHILD(n, 1));
2018 break;
2019 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002020 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002021 break;
2022 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002023 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002024 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002025 }
2026}
2027
2028static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002029com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002030{
2031 int i;
2032 REQ(n, power);
2033 com_atom(c, CHILD(n, 0));
2034 for (i = 1; i < NCH(n); i++) {
2035 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2036 com_factor(c, CHILD(n, i+1));
2037 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002038 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002039 break;
2040 }
2041 else
2042 com_apply_trailer(c, CHILD(n, i));
2043 }
2044}
2045
2046static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002047com_invert_constant(struct compiling *c, node *n)
2048{
2049 /* Compute the inverse of int and longs and use them directly,
2050 but be prepared to generate code for all other
2051 possibilities (invalid numbers, floats, complex).
2052 */
2053 PyObject *num, *inv = NULL;
2054 int i;
2055
2056 REQ(n, NUMBER);
2057 num = parsenumber(c, STR(n));
2058 if (num == NULL)
2059 i = 255;
2060 else {
2061 inv = PyNumber_Invert(num);
2062 if (inv == NULL) {
2063 PyErr_Clear();
2064 i = com_addconst(c, num);
2065 } else {
2066 i = com_addconst(c, inv);
2067 Py_DECREF(inv);
2068 }
2069 Py_DECREF(num);
2070 }
2071 com_addoparg(c, LOAD_CONST, i);
2072 com_push(c, 1);
2073 if (num != NULL && inv == NULL)
2074 com_addbyte(c, UNARY_INVERT);
2075}
2076
Tim Peters51e26512001-09-07 08:45:55 +00002077static int
2078is_float_zero(const char *p)
2079{
2080 int found_radix_point = 0;
2081 int ch;
2082 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2083 switch (ch) {
2084 case '0':
2085 /* no reason to believe it's not 0 -- continue */
2086 break;
2087
2088 case 'e': case 'E': case 'j': case 'J':
2089 /* If this was a hex constant, we already would have
2090 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2091 must be an exponent marker, and we haven't yet
2092 seen a non-zero digit, and it doesn't matter what
2093 the exponent is then. For 'j' or 'J' similarly,
2094 except that this is an imaginary 0 then. */
2095 return 1;
2096
2097 case '.':
2098 found_radix_point = 1;
2099 break;
2100
2101 default:
2102 return 0;
2103 }
2104 }
2105 return found_radix_point;
2106}
2107
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002108static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002109com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002110{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002111 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002112 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002113 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002114 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002115 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002116 approriate value as a constant. If the value is negative,
2117 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002118 negative in the 0th position -- unless we're doing unary minus
2119 of a floating zero! In that case the sign is significant, but
2120 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002121 */
2122 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002123 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002124 && TYPE((pfactor = CHILD(n, 1))) == factor
2125 && NCH(pfactor) == 1
2126 && TYPE((ppower = CHILD(pfactor, 0))) == power
2127 && NCH(ppower) == 1
2128 && TYPE((patom = CHILD(ppower, 0))) == atom
2129 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
2130 && !(childtype == MINUS && is_float_zero(STR(pnum)))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002131 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002132 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002133 return;
2134 }
2135 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002136 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002137 if (s == NULL) {
2138 com_error(c, PyExc_MemoryError, "");
2139 com_addbyte(c, 255);
2140 return;
2141 }
2142 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002143 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002144 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002145 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002146 }
Tim Peters51e26512001-09-07 08:45:55 +00002147 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002148 }
2149 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002150 com_factor(c, CHILD(n, 1));
2151 com_addbyte(c, UNARY_POSITIVE);
2152 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002153 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002154 com_factor(c, CHILD(n, 1));
2155 com_addbyte(c, UNARY_NEGATIVE);
2156 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002157 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002158 com_factor(c, CHILD(n, 1));
2159 com_addbyte(c, UNARY_INVERT);
2160 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002161 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002162 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002163 }
2164}
2165
2166static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002167com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002168{
2169 int i;
2170 int op;
2171 REQ(n, term);
2172 com_factor(c, CHILD(n, 0));
2173 for (i = 2; i < NCH(n); i += 2) {
2174 com_factor(c, CHILD(n, i));
2175 switch (TYPE(CHILD(n, i-1))) {
2176 case STAR:
2177 op = BINARY_MULTIPLY;
2178 break;
2179 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002180 if (c->c_flags & CO_FUTURE_DIVISION)
2181 op = BINARY_TRUE_DIVIDE;
2182 else
2183 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002184 break;
2185 case PERCENT:
2186 op = BINARY_MODULO;
2187 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002188 case DOUBLESLASH:
2189 op = BINARY_FLOOR_DIVIDE;
2190 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002191 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002192 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002193 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002194 op = 255;
2195 }
2196 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002197 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002198 }
2199}
2200
2201static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002202com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002203{
2204 int i;
2205 int op;
2206 REQ(n, arith_expr);
2207 com_term(c, CHILD(n, 0));
2208 for (i = 2; i < NCH(n); i += 2) {
2209 com_term(c, CHILD(n, i));
2210 switch (TYPE(CHILD(n, i-1))) {
2211 case PLUS:
2212 op = BINARY_ADD;
2213 break;
2214 case MINUS:
2215 op = BINARY_SUBTRACT;
2216 break;
2217 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002218 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002219 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002220 op = 255;
2221 }
2222 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002223 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002224 }
2225}
2226
2227static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002228com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002229{
2230 int i;
2231 int op;
2232 REQ(n, shift_expr);
2233 com_arith_expr(c, CHILD(n, 0));
2234 for (i = 2; i < NCH(n); i += 2) {
2235 com_arith_expr(c, CHILD(n, i));
2236 switch (TYPE(CHILD(n, i-1))) {
2237 case LEFTSHIFT:
2238 op = BINARY_LSHIFT;
2239 break;
2240 case RIGHTSHIFT:
2241 op = BINARY_RSHIFT;
2242 break;
2243 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002244 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002245 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002246 op = 255;
2247 }
2248 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002249 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002250 }
2251}
2252
2253static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002254com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002255{
2256 int i;
2257 int op;
2258 REQ(n, and_expr);
2259 com_shift_expr(c, CHILD(n, 0));
2260 for (i = 2; i < NCH(n); i += 2) {
2261 com_shift_expr(c, CHILD(n, i));
2262 if (TYPE(CHILD(n, i-1)) == AMPER) {
2263 op = BINARY_AND;
2264 }
2265 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002266 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002267 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002268 op = 255;
2269 }
2270 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002271 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002272 }
2273}
2274
2275static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002276com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002277{
2278 int i;
2279 int op;
2280 REQ(n, xor_expr);
2281 com_and_expr(c, CHILD(n, 0));
2282 for (i = 2; i < NCH(n); i += 2) {
2283 com_and_expr(c, CHILD(n, i));
2284 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2285 op = BINARY_XOR;
2286 }
2287 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002288 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002289 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002290 op = 255;
2291 }
2292 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002293 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002294 }
2295}
2296
2297static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002298com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002299{
2300 int i;
2301 int op;
2302 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002303 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002304 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002305 com_xor_expr(c, CHILD(n, i));
2306 if (TYPE(CHILD(n, i-1)) == VBAR) {
2307 op = BINARY_OR;
2308 }
2309 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002310 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002311 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002312 op = 255;
2313 }
2314 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002315 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002316 }
2317}
2318
2319static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002320cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002321{
2322 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00002323 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002324 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2325 if (NCH(n) == 1) {
2326 n = CHILD(n, 0);
2327 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002328 case LESS: return PyCmp_LT;
2329 case GREATER: return PyCmp_GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002330 case EQEQUAL: /* == */
Martin v. Löwis7198a522002-01-01 19:59:11 +00002331 case EQUAL: return PyCmp_EQ;
2332 case LESSEQUAL: return PyCmp_LE;
2333 case GREATEREQUAL: return PyCmp_GE;
2334 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2335 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2336 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002337 }
2338 }
2339 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002340 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002341 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002342 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002343 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002344 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002345 }
2346 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002347 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002348}
2349
2350static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002351com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002352{
2353 int i;
2354 enum cmp_op op;
2355 int anchor;
2356 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2357 com_expr(c, CHILD(n, 0));
2358 if (NCH(n) == 1)
2359 return;
2360
2361 /****************************************************************
2362 The following code is generated for all but the last
2363 comparison in a chain:
2364
2365 label: on stack: opcode: jump to:
2366
2367 a <code to load b>
2368 a, b DUP_TOP
2369 a, b, b ROT_THREE
2370 b, a, b COMPARE_OP
2371 b, 0-or-1 JUMP_IF_FALSE L1
2372 b, 1 POP_TOP
2373 b
2374
2375 We are now ready to repeat this sequence for the next
2376 comparison in the chain.
2377
2378 For the last we generate:
2379
2380 b <code to load c>
2381 b, c COMPARE_OP
2382 0-or-1
2383
2384 If there were any jumps to L1 (i.e., there was more than one
2385 comparison), we generate:
2386
2387 0-or-1 JUMP_FORWARD L2
2388 L1: b, 0 ROT_TWO
2389 0, b POP_TOP
2390 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002391 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002392 ****************************************************************/
2393
2394 anchor = 0;
2395
2396 for (i = 2; i < NCH(n); i += 2) {
2397 com_expr(c, CHILD(n, i));
2398 if (i+2 < NCH(n)) {
2399 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002400 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002401 com_addbyte(c, ROT_THREE);
2402 }
2403 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002404 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002405 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002406 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002407 }
2408 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002409 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002410 if (i+2 < NCH(n)) {
2411 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2412 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002413 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002414 }
2415 }
2416
2417 if (anchor) {
2418 int anchor2 = 0;
2419 com_addfwref(c, JUMP_FORWARD, &anchor2);
2420 com_backpatch(c, anchor);
2421 com_addbyte(c, ROT_TWO);
2422 com_addbyte(c, POP_TOP);
2423 com_backpatch(c, anchor2);
2424 }
2425}
2426
2427static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002428com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002429{
2430 REQ(n, not_test); /* 'not' not_test | comparison */
2431 if (NCH(n) == 1) {
2432 com_comparison(c, CHILD(n, 0));
2433 }
2434 else {
2435 com_not_test(c, CHILD(n, 1));
2436 com_addbyte(c, UNARY_NOT);
2437 }
2438}
2439
2440static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002441com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002442{
2443 int i;
2444 int anchor;
2445 REQ(n, and_test); /* not_test ('and' not_test)* */
2446 anchor = 0;
2447 i = 0;
2448 for (;;) {
2449 com_not_test(c, CHILD(n, i));
2450 if ((i += 2) >= NCH(n))
2451 break;
2452 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2453 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002454 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002455 }
2456 if (anchor)
2457 com_backpatch(c, anchor);
2458}
2459
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002460static int
2461com_make_closure(struct compiling *c, PyCodeObject *co)
2462{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002463 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002464 if (free == 0)
2465 return 0;
2466 for (i = 0; i < free; ++i) {
2467 /* Bypass com_addop_varname because it will generate
2468 LOAD_DEREF but LOAD_CLOSURE is needed.
2469 */
2470 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2471 int arg, reftype;
2472
2473 /* Special case: If a class contains a method with a
2474 free variable that has the same name as a method,
2475 the name will be considered free *and* local in the
2476 class. It should be handled by the closure, as
2477 well as by the normal name loookup logic.
2478 */
2479 reftype = get_ref_type(c, PyString_AS_STRING(name));
2480 if (reftype == CELL)
2481 arg = com_lookup_arg(c->c_cellvars, name);
2482 else /* (reftype == FREE) */
2483 arg = com_lookup_arg(c->c_freevars, name);
2484 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002485 fprintf(stderr, "lookup %s in %s %d %d\n"
2486 "freevars of %s: %s\n",
2487 PyObject_REPR(name),
2488 c->c_name,
2489 reftype, arg,
2490 PyString_AS_STRING(co->co_name),
2491 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002492 Py_FatalError("com_make_closure()");
2493 }
2494 com_addoparg(c, LOAD_CLOSURE, arg);
2495
2496 }
2497 com_push(c, free);
2498 return 1;
2499}
2500
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002501static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002502com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002503{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002504 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002505 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002506 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002507 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002508 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002509 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2510 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002511 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002512 if (co == NULL) {
2513 c->c_errors++;
2514 return;
2515 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002516 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002517 i = com_addconst(c, (PyObject *)co);
2518 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002519 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002520 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002521 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002522 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002523 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002524 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002525 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002526 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002527 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002528 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002529 else {
2530 int anchor = 0;
2531 int i = 0;
2532 for (;;) {
2533 com_and_test(c, CHILD(n, i));
2534 if ((i += 2) >= NCH(n))
2535 break;
2536 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2537 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002538 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002539 }
2540 if (anchor)
2541 com_backpatch(c, anchor);
2542 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002543}
2544
2545static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002546com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002547{
2548 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002549 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002550 com_node(c, CHILD(n, 0));
2551 }
2552 else {
2553 int i;
2554 int len;
2555 len = (NCH(n) + 1) / 2;
2556 for (i = 0; i < NCH(n); i += 2)
2557 com_node(c, CHILD(n, i));
2558 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002559 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002560 }
2561}
2562
2563
2564/* Begin of assignment compilation */
2565
Thomas Wouters434d0822000-08-24 20:11:32 +00002566
2567static void
2568com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2569{
2570 com_addbyte(c, DUP_TOP);
2571 com_push(c, 1);
2572 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002573 com_node(c, augn);
2574 com_addbyte(c, opcode);
2575 com_pop(c, 1);
2576 com_addbyte(c, ROT_TWO);
2577 com_addopname(c, STORE_ATTR, n);
2578 com_pop(c, 2);
2579}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002580
2581static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002582com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002583{
2584 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002585 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002586}
2587
2588static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002589com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002590{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002591 REQ(n, trailer);
2592 switch (TYPE(CHILD(n, 0))) {
2593 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002594 if (assigning == OP_DELETE)
2595 com_error(c, PyExc_SyntaxError,
2596 "can't delete function call");
2597 else
2598 com_error(c, PyExc_SyntaxError,
2599 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002600 break;
2601 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002602 if (assigning > OP_APPLY)
2603 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2604 else
2605 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002606 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002607 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002608 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002609 break;
2610 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002611 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002612 }
2613}
2614
2615static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002616com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002617{
2618 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002619 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002620 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002621 if (assigning) {
2622 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002623 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002624 com_push(c, i-1);
2625 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002626 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002627 com_assign(c, CHILD(n, i), assigning, NULL);
2628}
2629
2630static void
2631com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2632{
2633 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002634 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002635 com_push(c, 1);
2636 com_node(c, augn);
2637 com_addbyte(c, opcode);
2638 com_pop(c, 1);
2639 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002640}
2641
2642static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002643com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002644{
2645 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002646 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002647 if (assigning)
2648 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002649}
2650
2651static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002652com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002653{
2654 /* Loop to avoid trivial recursion */
2655 for (;;) {
2656 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002657
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002658 case exprlist:
2659 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002660 case testlist1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002661 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002662 if (assigning > OP_APPLY) {
2663 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002664 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002665 return;
2666 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002667 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002668 return;
2669 }
2670 n = CHILD(n, 0);
2671 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002672
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002673 case test:
2674 case and_test:
2675 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002676 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002677 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002678 case xor_expr:
2679 case and_expr:
2680 case shift_expr:
2681 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002682 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002683 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002684 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002685 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002686 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002687 return;
2688 }
2689 n = CHILD(n, 0);
2690 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002691
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002692 case power: /* atom trailer* ('**' power)*
2693 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002694 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002695 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002696 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002697 return;
2698 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002699 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002700 int i;
2701 com_node(c, CHILD(n, 0));
2702 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002703 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002704 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002705 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002706 return;
2707 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002708 com_apply_trailer(c, CHILD(n, i));
2709 } /* NB i is still alive */
2710 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002711 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002712 return;
2713 }
2714 n = CHILD(n, 0);
2715 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002716
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002717 case atom:
2718 switch (TYPE(CHILD(n, 0))) {
2719 case LPAR:
2720 n = CHILD(n, 1);
2721 if (TYPE(n) == RPAR) {
2722 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002723 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002724 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002725 return;
2726 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002727 if (assigning > OP_APPLY) {
2728 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002729 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002730 return;
2731 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002732 break;
2733 case LSQB:
2734 n = CHILD(n, 1);
2735 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002736 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002737 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002738 return;
2739 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002740 if (assigning > OP_APPLY) {
2741 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002742 "augmented assign to list not possible");
2743 return;
2744 }
2745 if (NCH(n) > 1
2746 && TYPE(CHILD(n, 1)) == list_for) {
2747 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002748 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002749 return;
2750 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002751 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002752 return;
2753 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002754 if (assigning > OP_APPLY)
2755 com_augassign_name(c, CHILD(n, 0),
2756 assigning, augn);
2757 else
2758 com_assign_name(c, CHILD(n, 0),
2759 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002760 return;
2761 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002762 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002763 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002764 return;
2765 }
2766 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002767
2768 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002769 com_error(c, PyExc_SyntaxError,
2770 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002771 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002772
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002773 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002774 com_error(c, PyExc_SystemError,
2775 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002776 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002777
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002778 }
2779 }
2780}
Guido van Rossum7c531111997-03-11 18:42:21 +00002781
Thomas Wouters434d0822000-08-24 20:11:32 +00002782static void
2783com_augassign(struct compiling *c, node *n)
2784{
2785 int opcode;
2786
2787 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2788 case '+': opcode = INPLACE_ADD; break;
2789 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002790 case '/':
2791 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
2792 opcode = INPLACE_FLOOR_DIVIDE;
2793 else if (c->c_flags & CO_FUTURE_DIVISION)
2794 opcode = INPLACE_TRUE_DIVIDE;
2795 else
2796 opcode = INPLACE_DIVIDE;
2797 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00002798 case '%': opcode = INPLACE_MODULO; break;
2799 case '<': opcode = INPLACE_LSHIFT; break;
2800 case '>': opcode = INPLACE_RSHIFT; break;
2801 case '&': opcode = INPLACE_AND; break;
2802 case '^': opcode = INPLACE_XOR; break;
2803 case '|': opcode = INPLACE_OR; break;
2804 case '*':
2805 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2806 opcode = INPLACE_POWER;
2807 else
2808 opcode = INPLACE_MULTIPLY;
2809 break;
2810 default:
2811 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2812 return;
2813 }
2814 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2815}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002816
2817static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002818com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002819{
Thomas Wouters434d0822000-08-24 20:11:32 +00002820 REQ(n, expr_stmt);
2821 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002822 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002823 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002824 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002825 if (NCH(n) == 1) {
2826 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002827 if (c->c_interactive)
2828 com_addbyte(c, PRINT_EXPR);
2829 else
2830 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002831 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002832 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002833 else if (TYPE(CHILD(n,1)) == augassign)
2834 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002835 else {
2836 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002837 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002838 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002839 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002840 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002841 com_push(c, 1);
2842 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002843 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002844 }
2845 }
2846}
2847
2848static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002849com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002850{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002851 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002852 int i;
2853 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002854 if (Py_OptimizeFlag)
2855 return;
2856 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00002857
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002858 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00002859 raise AssertionError [, <message>]
2860
2861 where <message> is the second test, if present.
2862 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002863 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002864 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002865 com_addbyte(c, POP_TOP);
2866 com_pop(c, 1);
2867 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002868 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002869 com_push(c, 1);
2870 i = NCH(n)/2; /* Either 2 or 4 */
2871 if (i > 1)
2872 com_node(c, CHILD(n, 3));
2873 com_addoparg(c, RAISE_VARARGS, i);
2874 com_pop(c, i);
2875 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002876 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002877 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002878 com_addbyte(c, POP_TOP);
2879}
2880
2881static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002882com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002883{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002884 int i = 1;
2885 node* stream = NULL;
2886
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002887 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002888
2889 /* are we using the extended print form? */
2890 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2891 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002892 com_node(c, stream);
2893 /* stack: [...] => [... stream] */
2894 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002895 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2896 i = 4;
2897 else
2898 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002899 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002900 for (; i < NCH(n); i += 2) {
2901 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002902 com_addbyte(c, DUP_TOP);
2903 /* stack: [stream] => [stream stream] */
2904 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002905 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002906 /* stack: [stream stream] => [stream stream obj] */
2907 com_addbyte(c, ROT_TWO);
2908 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002909 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002910 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002911 com_pop(c, 2);
2912 }
2913 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002914 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002915 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002916 com_addbyte(c, PRINT_ITEM);
2917 com_pop(c, 1);
2918 }
2919 }
2920 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002921 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002922 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002923 /* must pop the extra stream object off the stack */
2924 com_addbyte(c, POP_TOP);
2925 /* stack: [... stream] => [...] */
2926 com_pop(c, 1);
2927 }
2928 }
2929 else {
2930 if (stream != NULL) {
2931 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002932 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002933 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002934 com_pop(c, 1);
2935 }
2936 else
2937 com_addbyte(c, PRINT_NEWLINE);
2938 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002939}
2940
2941static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002942com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002943{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002944 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002945 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002946 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002947 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002948 if (c->c_flags & CO_GENERATOR) {
2949 if (NCH(n) > 1) {
2950 com_error(c, PyExc_SyntaxError,
2951 "'return' with argument inside generator");
2952 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002953 }
2954 if (NCH(n) < 2) {
2955 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002956 com_push(c, 1);
2957 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002958 else
2959 com_node(c, CHILD(n, 1));
2960 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00002961 com_pop(c, 1);
2962}
2963
2964static void
2965com_yield_stmt(struct compiling *c, node *n)
2966{
Tim Peters95c80f82001-06-23 02:07:08 +00002967 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00002968 REQ(n, yield_stmt); /* 'yield' testlist */
2969 if (!c->c_infunction) {
2970 com_error(c, PyExc_SyntaxError, "'yield' outside function");
2971 }
Tim Peters95c80f82001-06-23 02:07:08 +00002972
2973 for (i = 0; i < c->c_nblocks; ++i) {
2974 if (c->c_block[i] == SETUP_FINALLY) {
2975 com_error(c, PyExc_SyntaxError,
2976 "'yield' not allowed in a 'try' block "
2977 "with a 'finally' clause");
2978 return;
2979 }
2980 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002981 com_node(c, CHILD(n, 1));
2982 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002983 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002984}
2985
2986static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002987com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002988{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002989 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002990 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2991 if (NCH(n) > 1) {
2992 com_node(c, CHILD(n, 1));
2993 if (NCH(n) > 3) {
2994 com_node(c, CHILD(n, 3));
2995 if (NCH(n) > 5)
2996 com_node(c, CHILD(n, 5));
2997 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002998 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002999 i = NCH(n)/2;
3000 com_addoparg(c, RAISE_VARARGS, i);
3001 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003002}
3003
3004static void
Thomas Wouters52152252000-08-17 22:55:00 +00003005com_from_import(struct compiling *c, node *n)
3006{
3007 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3008 com_push(c, 1);
3009 if (NCH(n) > 1) {
3010 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3011 com_error(c, PyExc_SyntaxError, "invalid syntax");
3012 return;
3013 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003014 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003015 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003016 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003017 com_pop(c, 1);
3018}
3019
3020static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003021com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003022{
3023 int i;
3024 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003025 /* 'import' dotted_name (',' dotted_name)* |
3026 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003027 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00003028 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003029 /* 'from' dotted_name 'import' ... */
3030 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003031
3032 if (TYPE(CHILD(n, 3)) == STAR) {
3033 tup = Py_BuildValue("(s)", "*");
3034 } else {
3035 tup = PyTuple_New((NCH(n) - 2)/2);
3036 for (i = 3; i < NCH(n); i += 2) {
3037 PyTuple_SET_ITEM(tup, (i-3)/2,
3038 PyString_FromString(STR(
Jeremy Hylton4419ac12001-02-28 22:54:51 +00003039 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003040 }
3041 }
3042 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003043 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003044 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003045 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00003046 if (TYPE(CHILD(n, 3)) == STAR)
3047 com_addbyte(c, IMPORT_STAR);
3048 else {
3049 for (i = 3; i < NCH(n); i += 2)
3050 com_from_import(c, CHILD(n, i));
3051 com_addbyte(c, POP_TOP);
3052 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003053 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003054 }
3055 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003056 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003057 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003058 node *subn = CHILD(n, i);
3059 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003060 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003061 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003062 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003063 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003064 int j;
3065 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003066 com_error(c, PyExc_SyntaxError,
3067 "invalid syntax");
3068 return;
3069 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003070 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3071 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003072 CHILD(CHILD(subn, 0),
3073 j));
3074 com_addop_varname(c, VAR_STORE,
3075 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003076 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003077 com_addop_varname(c, VAR_STORE,
3078 STR(CHILD(CHILD(subn, 0),
3079 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003080 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003081 }
3082 }
3083}
3084
3085static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003086com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003087{
3088 REQ(n, exec_stmt);
3089 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3090 com_node(c, CHILD(n, 1));
3091 if (NCH(n) >= 4)
3092 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003093 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003094 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003095 com_push(c, 1);
3096 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003097 if (NCH(n) >= 6)
3098 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003099 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003100 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003101 com_push(c, 1);
3102 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003103 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003104 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003105}
3106
Guido van Rossum7c531111997-03-11 18:42:21 +00003107static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003108is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003109{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003110 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003111 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003112 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003113
3114 /* Label to avoid tail recursion */
3115 next:
3116 switch (TYPE(n)) {
3117
3118 case suite:
3119 if (NCH(n) == 1) {
3120 n = CHILD(n, 0);
3121 goto next;
3122 }
3123 /* Fall through */
3124 case file_input:
3125 for (i = 0; i < NCH(n); i++) {
3126 node *ch = CHILD(n, i);
3127 if (TYPE(ch) == stmt) {
3128 n = ch;
3129 goto next;
3130 }
3131 }
3132 break;
3133
3134 case stmt:
3135 case simple_stmt:
3136 case small_stmt:
3137 n = CHILD(n, 0);
3138 goto next;
3139
3140 case expr_stmt:
3141 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003142 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003143 case test:
3144 case and_test:
3145 case not_test:
3146 case comparison:
3147 case expr:
3148 case xor_expr:
3149 case and_expr:
3150 case shift_expr:
3151 case arith_expr:
3152 case term:
3153 case factor:
3154 case power:
3155 case atom:
3156 if (NCH(n) == 1) {
3157 n = CHILD(n, 0);
3158 goto next;
3159 }
3160 break;
3161
3162 case NAME:
3163 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3164 return 1;
3165 break;
3166
3167 case NUMBER:
3168 v = parsenumber(c, STR(n));
3169 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003170 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003171 break;
3172 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003173 i = PyObject_IsTrue(v);
3174 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003175 return i == 0;
3176
3177 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003178 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003179 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003180 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003181 break;
3182 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003183 i = PyObject_IsTrue(v);
3184 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003185 return i == 0;
3186
3187 }
3188 return 0;
3189}
3190
Tim Peters08a898f2001-06-28 01:52:22 +00003191
3192/* Look under n for a return stmt with an expression.
3193 * This hack is used to find illegal returns under "if 0:" blocks in
3194 * functions already known to be generators (as determined by the symtable
3195 * pass).
3196 * Return the offending return node if found, else NULL.
3197 */
3198static node *
3199look_for_offending_return(node *n)
3200{
3201 int i;
3202
3203 for (i = 0; i < NCH(n); ++i) {
3204 node *kid = CHILD(n, i);
3205
3206 switch (TYPE(kid)) {
3207 case classdef:
3208 case funcdef:
3209 case lambdef:
3210 /* Stuff in nested functions & classes doesn't
3211 affect the code block we started in. */
3212 return NULL;
3213
3214 case return_stmt:
3215 if (NCH(kid) > 1)
3216 return kid;
3217 break;
3218
3219 default: {
3220 node *bad = look_for_offending_return(kid);
3221 if (bad != NULL)
3222 return bad;
3223 }
3224 }
3225 }
3226
3227 return NULL;
3228}
3229
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003230static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003231com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003232{
3233 int i;
3234 int anchor = 0;
3235 REQ(n, if_stmt);
3236 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3237 for (i = 0; i+3 < NCH(n); i+=4) {
3238 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003239 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003240 if (is_constant_false(c, ch)) {
3241 /* We're going to skip this block. However, if this
3242 is a generator, we have to check the dead code
3243 anyway to make sure there aren't any return stmts
3244 with expressions, in the same scope. */
3245 if (c->c_flags & CO_GENERATOR) {
3246 node *p = look_for_offending_return(n);
3247 if (p != NULL) {
3248 int savelineno = c->c_lineno;
3249 c->c_lineno = p->n_lineno;
3250 com_error(c, PyExc_SyntaxError,
3251 "'return' with argument "
3252 "inside generator");
3253 c->c_lineno = savelineno;
3254 }
3255 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003256 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003257 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003258 if (i > 0)
3259 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003260 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003261 com_addfwref(c, JUMP_IF_FALSE, &a);
3262 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003263 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003264 com_node(c, CHILD(n, i+3));
3265 com_addfwref(c, JUMP_FORWARD, &anchor);
3266 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003267 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003268 com_addbyte(c, POP_TOP);
3269 }
3270 if (i+2 < NCH(n))
3271 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003272 if (anchor)
3273 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003274}
3275
3276static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003277com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003278{
3279 int break_anchor = 0;
3280 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003281 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003282 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3283 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003284 block_push(c, SETUP_LOOP);
3285 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003286 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003287 com_node(c, CHILD(n, 1));
3288 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3289 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003290 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003291 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003292 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003293 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003294 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3295 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003296 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003297 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003298 com_addbyte(c, POP_TOP);
3299 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003300 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003301 if (NCH(n) > 4)
3302 com_node(c, CHILD(n, 6));
3303 com_backpatch(c, break_anchor);
3304}
3305
3306static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003307com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003308{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003309 int break_anchor = 0;
3310 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003311 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003312 REQ(n, for_stmt);
3313 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3314 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003315 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003316 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003317 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003318 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003319 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003320 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003321 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003322 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003323 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003324 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003325 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003326 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3327 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003328 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003329 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003330 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003331 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003332 if (NCH(n) > 8)
3333 com_node(c, CHILD(n, 8));
3334 com_backpatch(c, break_anchor);
3335}
3336
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003337/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003338
3339 SETUP_FINALLY L
3340 <code for S>
3341 POP_BLOCK
3342 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003343 L: <code for Sf>
3344 END_FINALLY
3345
3346 The special instructions use the block stack. Each block
3347 stack entry contains the instruction that created it (here
3348 SETUP_FINALLY), the level of the value stack at the time the
3349 block stack entry was created, and a label (here L).
3350
3351 SETUP_FINALLY:
3352 Pushes the current value stack level and the label
3353 onto the block stack.
3354 POP_BLOCK:
3355 Pops en entry from the block stack, and pops the value
3356 stack until its level is the same as indicated on the
3357 block stack. (The label is ignored.)
3358 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003359 Pops a variable number of entries from the *value* stack
3360 and re-raises the exception they specify. The number of
3361 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003362
3363 The block stack is unwound when an exception is raised:
3364 when a SETUP_FINALLY entry is found, the exception is pushed
3365 onto the value stack (and the exception condition is cleared),
3366 and the interpreter jumps to the label gotten from the block
3367 stack.
3368
3369 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003370 (The contents of the value stack is shown in [], with the top
3371 at the right; 'tb' is trace-back info, 'val' the exception's
3372 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003373
3374 Value stack Label Instruction Argument
3375 [] SETUP_EXCEPT L1
3376 [] <code for S>
3377 [] POP_BLOCK
3378 [] JUMP_FORWARD L0
3379
Guido van Rossum3f5da241990-12-20 15:06:42 +00003380 [tb, val, exc] L1: DUP )
3381 [tb, val, exc, exc] <evaluate E1> )
3382 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3383 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3384 [tb, val, exc, 1] POP )
3385 [tb, val, exc] POP
3386 [tb, val] <assign to V1> (or POP if no V1)
3387 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003388 [] <code for S1>
3389 JUMP_FORWARD L0
3390
Guido van Rossum3f5da241990-12-20 15:06:42 +00003391 [tb, val, exc, 0] L2: POP
3392 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003393 .............................etc.......................
3394
Guido van Rossum3f5da241990-12-20 15:06:42 +00003395 [tb, val, exc, 0] Ln+1: POP
3396 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003397
3398 [] L0: <next statement>
3399
3400 Of course, parts are not generated if Vi or Ei is not present.
3401*/
3402
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003403static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003404com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003405{
3406 int except_anchor = 0;
3407 int end_anchor = 0;
3408 int else_anchor = 0;
3409 int i;
3410 node *ch;
3411
3412 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3413 block_push(c, SETUP_EXCEPT);
3414 com_node(c, CHILD(n, 2));
3415 com_addbyte(c, POP_BLOCK);
3416 block_pop(c, SETUP_EXCEPT);
3417 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3418 com_backpatch(c, except_anchor);
3419 for (i = 3;
3420 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3421 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003422 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003423 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003424 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003425 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003426 break;
3427 }
3428 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003429 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003430 com_addoparg(c, SET_LINENO, ch->n_lineno);
3431 if (NCH(ch) > 1) {
3432 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003433 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003434 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003435 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003436 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003437 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3438 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003439 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003440 }
3441 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003442 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003443 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003444 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003445 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003446 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003447 com_pop(c, 1);
3448 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003449 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003450 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003451 com_node(c, CHILD(n, i+2));
3452 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3453 if (except_anchor) {
3454 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003455 /* We come in with [tb, val, exc, 0] on the
3456 stack; one pop and it's the same as
3457 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003458 com_addbyte(c, POP_TOP);
3459 }
3460 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003461 /* We actually come in here with [tb, val, exc] but the
3462 END_FINALLY will zap those and jump around.
3463 The c_stacklevel does not reflect them so we need not pop
3464 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003465 com_addbyte(c, END_FINALLY);
3466 com_backpatch(c, else_anchor);
3467 if (i < NCH(n))
3468 com_node(c, CHILD(n, i+2));
3469 com_backpatch(c, end_anchor);
3470}
3471
3472static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003473com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003474{
3475 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003476 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003477
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003478 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3479 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003480 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003481 com_addbyte(c, POP_BLOCK);
3482 block_pop(c, SETUP_FINALLY);
3483 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003484 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003485 /* While the generated code pushes only one item,
3486 the try-finally handling can enter here with
3487 up to three items. OK, here are the details:
3488 3 for an exception, 2 for RETURN, 1 for BREAK. */
3489 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003490 com_backpatch(c, finally_anchor);
3491 ch = CHILD(n, NCH(n)-1);
3492 com_addoparg(c, SET_LINENO, ch->n_lineno);
3493 com_node(c, ch);
3494 com_addbyte(c, END_FINALLY);
3495 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003496 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003497}
3498
3499static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003500com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003501{
3502 REQ(n, try_stmt);
3503 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3504 | 'try' ':' suite 'finally' ':' suite */
3505 if (TYPE(CHILD(n, 3)) != except_clause)
3506 com_try_finally(c, n);
3507 else
3508 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003509}
3510
Guido van Rossum8b993a91997-01-17 21:04:03 +00003511static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003512get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003513{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003514 int i;
3515
Guido van Rossum8b993a91997-01-17 21:04:03 +00003516 /* Label to avoid tail recursion */
3517 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003518 switch (TYPE(n)) {
3519
3520 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003521 if (NCH(n) == 1) {
3522 n = CHILD(n, 0);
3523 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003524 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003525 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003526 case file_input:
3527 for (i = 0; i < NCH(n); i++) {
3528 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003529 if (TYPE(ch) == stmt) {
3530 n = ch;
3531 goto next;
3532 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003533 }
3534 break;
3535
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003536 case stmt:
3537 case simple_stmt:
3538 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003539 n = CHILD(n, 0);
3540 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003541
3542 case expr_stmt:
3543 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003544 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003545 case test:
3546 case and_test:
3547 case not_test:
3548 case comparison:
3549 case expr:
3550 case xor_expr:
3551 case and_expr:
3552 case shift_expr:
3553 case arith_expr:
3554 case term:
3555 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003556 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003557 if (NCH(n) == 1) {
3558 n = CHILD(n, 0);
3559 goto next;
3560 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003561 break;
3562
3563 case atom:
3564 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003565 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003566 break;
3567
3568 }
3569 return NULL;
3570}
3571
Guido van Rossum79f25d91997-04-29 20:08:16 +00003572static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003573get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003574{
Guido van Rossum541563e1999-01-28 15:08:09 +00003575 /* Don't generate doc-strings if run with -OO */
3576 if (Py_OptimizeFlag > 1)
3577 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003578 n = get_rawdocstring(n);
3579 if (n == NULL)
3580 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003581 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003582}
3583
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003584static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003585com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003586{
3587 REQ(n, suite);
3588 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3589 if (NCH(n) == 1) {
3590 com_node(c, CHILD(n, 0));
3591 }
3592 else {
3593 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003594 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003595 node *ch = CHILD(n, i);
3596 if (TYPE(ch) == stmt)
3597 com_node(c, ch);
3598 }
3599 }
3600}
3601
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003602/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003603static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003604com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003605{
3606 int i = c->c_nblocks;
3607 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3608 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3609 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003610 else if (i <= 0) {
3611 /* at the outer level */
3612 com_error(c, PyExc_SyntaxError,
3613 "'continue' not properly in loop");
3614 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003615 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003616 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003617 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003618 if (c->c_block[j] == SETUP_LOOP)
3619 break;
3620 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003621 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003622 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003623 for (; i > j; --i) {
3624 if (c->c_block[i] == SETUP_EXCEPT ||
3625 c->c_block[i] == SETUP_FINALLY) {
3626 com_addoparg(c, CONTINUE_LOOP,
3627 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003628 return;
3629 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003630 if (c->c_block[i] == END_FINALLY) {
3631 com_error(c, PyExc_SyntaxError,
3632 "'continue' not supported inside 'finally' clause");
3633 return;
3634 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003635 }
3636 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003637 com_error(c, PyExc_SyntaxError,
3638 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003639 }
3640 /* XXX Could allow it inside a 'finally' clause
3641 XXX if we could pop the exception still on the stack */
3642}
3643
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003644static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003645com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003646{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003647 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003648 if (TYPE(n) == lambdef) {
3649 /* lambdef: 'lambda' [varargslist] ':' test */
3650 n = CHILD(n, 1);
3651 }
3652 else {
3653 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3654 n = CHILD(n, 2);
3655 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3656 n = CHILD(n, 1);
3657 }
3658 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003659 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003660 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003661 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003662 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3663 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003664 nargs = 0;
3665 ndefs = 0;
3666 for (i = 0; i < nch; i++) {
3667 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003668 if (TYPE(CHILD(n, i)) == STAR ||
3669 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003670 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003671 nargs++;
3672 i++;
3673 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003674 t = RPAR; /* Anything except EQUAL or COMMA */
3675 else
3676 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003677 if (t == EQUAL) {
3678 i++;
3679 ndefs++;
3680 com_node(c, CHILD(n, i));
3681 i++;
3682 if (i >= nch)
3683 break;
3684 t = TYPE(CHILD(n, i));
3685 }
3686 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003687 /* Treat "(a=1, b)" as an error */
3688 if (ndefs)
3689 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003690 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003691 }
3692 if (t != COMMA)
3693 break;
3694 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003695 return ndefs;
3696}
3697
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003698static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003699com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003700{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003701 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003702 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003703 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003704 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003705 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3706 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003707 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003708 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003709 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003710 c->c_errors++;
3711 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003712 int closure = com_make_closure(c, (PyCodeObject *)co);
3713 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003714 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003715 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003716 if (closure)
3717 com_addoparg(c, MAKE_CLOSURE, ndefs);
3718 else
3719 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003720 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003721 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003722 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003723 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003724 }
3725}
3726
3727static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003728com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003729{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003730 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003731 REQ(n, testlist);
3732 /* testlist: test (',' test)* [','] */
3733 for (i = 0; i < NCH(n); i += 2)
3734 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003735 i = (NCH(n)+1) / 2;
3736 com_addoparg(c, BUILD_TUPLE, i);
3737 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003738}
3739
3740static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003741com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003742{
Guido van Rossum25831651993-05-19 14:50:45 +00003743 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003744 PyObject *v;
3745 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003746 char *name;
3747
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003748 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003749 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003750 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003751 c->c_errors++;
3752 return;
3753 }
3754 /* Push the class name on the stack */
3755 i = com_addconst(c, v);
3756 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003757 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003758 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003759 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003760 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003761 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003762 com_push(c, 1);
3763 }
Guido van Rossum25831651993-05-19 14:50:45 +00003764 else
3765 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003766 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003767 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003768 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003769 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003770 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003771 c->c_errors++;
3772 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003773 int closure = com_make_closure(c, co);
3774 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003775 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003776 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003777 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003778 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003779 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003780 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003781 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003782 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003783 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003784 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003785 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003786 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003787 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003788 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003789}
3790
3791static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003792com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003793{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003794 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003795 if (c->c_errors)
3796 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003797 switch (TYPE(n)) {
3798
3799 /* Definition nodes */
3800
3801 case funcdef:
3802 com_funcdef(c, n);
3803 break;
3804 case classdef:
3805 com_classdef(c, n);
3806 break;
3807
3808 /* Trivial parse tree nodes */
3809
3810 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003811 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003812 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003813 n = CHILD(n, 0);
3814 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003815
3816 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003817 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3818 com_addoparg(c, SET_LINENO, n->n_lineno);
3819 {
3820 int i;
3821 for (i = 0; i < NCH(n)-1; i += 2)
3822 com_node(c, CHILD(n, i));
3823 }
3824 break;
3825
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003826 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003827 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003828 n = CHILD(n, 0);
3829 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003830
3831 /* Statement nodes */
3832
3833 case expr_stmt:
3834 com_expr_stmt(c, n);
3835 break;
3836 case print_stmt:
3837 com_print_stmt(c, n);
3838 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003839 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003840 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003841 break;
3842 case pass_stmt:
3843 break;
3844 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003845 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003846 com_error(c, PyExc_SyntaxError,
3847 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003848 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003849 com_addbyte(c, BREAK_LOOP);
3850 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003851 case continue_stmt:
3852 com_continue_stmt(c, n);
3853 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003854 case return_stmt:
3855 com_return_stmt(c, n);
3856 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003857 case yield_stmt:
3858 com_yield_stmt(c, n);
3859 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003860 case raise_stmt:
3861 com_raise_stmt(c, n);
3862 break;
3863 case import_stmt:
3864 com_import_stmt(c, n);
3865 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003866 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003867 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003868 case exec_stmt:
3869 com_exec_stmt(c, n);
3870 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003871 case assert_stmt:
3872 com_assert_stmt(c, n);
3873 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003874 case if_stmt:
3875 com_if_stmt(c, n);
3876 break;
3877 case while_stmt:
3878 com_while_stmt(c, n);
3879 break;
3880 case for_stmt:
3881 com_for_stmt(c, n);
3882 break;
3883 case try_stmt:
3884 com_try_stmt(c, n);
3885 break;
3886 case suite:
3887 com_suite(c, n);
3888 break;
3889
3890 /* Expression nodes */
3891
3892 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003893 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00003894 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003895 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003896 break;
3897 case test:
3898 com_test(c, n);
3899 break;
3900 case and_test:
3901 com_and_test(c, n);
3902 break;
3903 case not_test:
3904 com_not_test(c, n);
3905 break;
3906 case comparison:
3907 com_comparison(c, n);
3908 break;
3909 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003910 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003911 break;
3912 case expr:
3913 com_expr(c, n);
3914 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003915 case xor_expr:
3916 com_xor_expr(c, n);
3917 break;
3918 case and_expr:
3919 com_and_expr(c, n);
3920 break;
3921 case shift_expr:
3922 com_shift_expr(c, n);
3923 break;
3924 case arith_expr:
3925 com_arith_expr(c, n);
3926 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003927 case term:
3928 com_term(c, n);
3929 break;
3930 case factor:
3931 com_factor(c, n);
3932 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003933 case power:
3934 com_power(c, n);
3935 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003936 case atom:
3937 com_atom(c, n);
3938 break;
3939
3940 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003941 com_error(c, PyExc_SystemError,
3942 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003943 }
3944}
3945
Tim Petersdbd9ba62000-07-09 03:09:57 +00003946static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003947
3948static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003949com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003950{
3951 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3952 if (TYPE(CHILD(n, 0)) == LPAR)
3953 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003954 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003955 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003956 com_pop(c, 1);
3957 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003958}
3959
3960static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003961com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003962{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003963 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003964 if (NCH(n) == 1) {
3965 com_fpdef(c, CHILD(n, 0));
3966 }
3967 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003968 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003969 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003970 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003971 for (i = 0; i < NCH(n); i += 2)
3972 com_fpdef(c, CHILD(n, i));
3973 }
3974}
3975
3976static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003977com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003978{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003979 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003980 int complex = 0;
Barry Warsaw8f6d8682001-11-28 21:10:39 +00003981 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003982 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003983 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003984 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003985 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003986 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003987 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003988 node *ch = CHILD(n, i);
3989 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003990 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003991 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003992 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3993 fp = CHILD(ch, 0);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00003994 if (TYPE(fp) != NAME) {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00003995 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003996 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003997 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003998 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003999 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004000 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004001 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004002 ch = CHILD(n, i);
4003 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004004 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004005 else
4006 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004007 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004008 if (complex) {
4009 /* Generate code for complex arguments only after
4010 having counted the simple arguments */
4011 int ilocal = 0;
4012 for (i = 0; i < nch; i++) {
4013 node *ch = CHILD(n, i);
4014 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004015 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004016 break;
4017 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4018 fp = CHILD(ch, 0);
4019 if (TYPE(fp) != NAME) {
4020 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004021 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004022 com_fpdef(c, ch);
4023 }
4024 ilocal++;
4025 if (++i >= nch)
4026 break;
4027 ch = CHILD(n, i);
4028 if (TYPE(ch) == EQUAL)
4029 i += 2;
4030 else
4031 REQ(ch, COMMA);
4032 }
4033 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004034}
4035
4036static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004037com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004038{
4039 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004040 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004041 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004042 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004043 if (doc != NULL) {
4044 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004045 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004046 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004047 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004048 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004049 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004050 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004051 for (i = 0; i < NCH(n); i++) {
4052 node *ch = CHILD(n, i);
4053 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4054 com_node(c, ch);
4055 }
4056}
4057
4058/* Top-level compile-node interface */
4059
4060static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004061compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004062{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004063 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004064 node *ch;
4065 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00004066 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004067 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004068 if (doc != NULL) {
4069 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004070 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004071 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004072 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004073 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004074 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
4075 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004076 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004077 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004078 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004079 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004080 c->c_infunction = 0;
Tim Petersad1a18b2001-06-23 06:19:16 +00004081 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4082 com_push(c, 1);
4083 com_addbyte(c, RETURN_VALUE);
4084 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004085}
4086
4087static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004088compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004089{
Guido van Rossum590baa41993-11-30 13:40:46 +00004090 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004091 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004092 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004093
4094 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004095 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004096 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004097 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004098 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004099 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004100 else
4101 ch = CHILD(n, 2);
4102 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004103 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004104 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004105}
4106
4107static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004108compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004109{
4110 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004111 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004112 REQ(n, classdef);
4113 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4114 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004115 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004116 /* Initialize local __module__ from global __name__ */
4117 com_addop_name(c, LOAD_GLOBAL, "__name__");
4118 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004119 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004120 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004121 if (doc != NULL) {
4122 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004123 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004124 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004125 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004126 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004127 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004128 }
4129 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004130 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004131 com_node(c, ch);
4132 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004133 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004134 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004135 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004136}
4137
4138static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004139compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004140{
Guido van Rossum3f5da241990-12-20 15:06:42 +00004141 com_addoparg(c, SET_LINENO, n->n_lineno);
4142
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004143 switch (TYPE(n)) {
4144
Guido van Rossum4c417781991-01-21 16:09:22 +00004145 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004146 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004147 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004148 n = CHILD(n, 0);
4149 if (TYPE(n) != NEWLINE)
4150 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004151 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004152 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004153 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004154 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004155 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004156 break;
4157
Guido van Rossum4c417781991-01-21 16:09:22 +00004158 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004159 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004160 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004161 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004162 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004163 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004164 break;
4165
Guido van Rossum590baa41993-11-30 13:40:46 +00004166 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004167 com_node(c, CHILD(n, 0));
4168 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004169 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004170 break;
4171
Guido van Rossum590baa41993-11-30 13:40:46 +00004172 case lambdef: /* anonymous function definition */
4173 compile_lambdef(c, n);
4174 break;
4175
Guido van Rossum4c417781991-01-21 16:09:22 +00004176 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004177 compile_funcdef(c, n);
4178 break;
4179
Guido van Rossum4c417781991-01-21 16:09:22 +00004180 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004181 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004182 break;
4183
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004184 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004185 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004186 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004187 }
4188}
4189
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004190static PyObject *
4191dict_keys_inorder(PyObject *dict, int offset)
4192{
4193 PyObject *tuple, *k, *v;
4194 int i, pos = 0, size = PyDict_Size(dict);
4195
4196 tuple = PyTuple_New(size);
4197 if (tuple == NULL)
4198 return NULL;
4199 while (PyDict_Next(dict, &pos, &k, &v)) {
4200 i = PyInt_AS_LONG(v);
4201 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004202 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004203 PyTuple_SET_ITEM(tuple, i - offset, k);
4204 }
4205 return tuple;
4206}
4207
Guido van Rossum79f25d91997-04-29 20:08:16 +00004208PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004209PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004210{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004211 return PyNode_CompileFlags(n, filename, NULL);
4212}
4213
4214PyCodeObject *
4215PyNode_CompileFlags(node *n, char *filename, PyCompilerFlags *flags)
4216{
4217 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004218}
4219
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004220struct symtable *
4221PyNode_CompileSymtable(node *n, char *filename)
4222{
4223 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004224 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004225
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004226 ff = PyNode_Future(n, filename);
4227 if (ff == NULL)
4228 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004229
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004230 st = symtable_init();
Tim Peters8c5e4152001-11-04 19:26:58 +00004231 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004232 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004233 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004234 }
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004235 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004236 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004237 if (st->st_errors > 0)
4238 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004239 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004240 if (st->st_errors > 0)
4241 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004242
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004243 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004244 fail:
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004245 PyObject_FREE((void *)ff);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004246 st->st_future = NULL;
4247 PySymtable_Free(st);
4248 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004249}
4250
Guido van Rossum79f25d91997-04-29 20:08:16 +00004251static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004252icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004253{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004254 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004255}
4256
Guido van Rossum79f25d91997-04-29 20:08:16 +00004257static PyCodeObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004258jcompile(node *n, char *filename, struct compiling *base,
4259 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004260{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004261 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004262 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004263 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004264 return NULL;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004265 if (TYPE(n) == encoding_decl) {
4266 sc.c_encoding = STR(n);
4267 n = CHILD(n, 0);
4268 } else {
4269 sc.c_encoding = NULL;
4270 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004271 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004272 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004273 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004274 /* c_symtable still points to parent's symbols */
4275 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004276 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004277 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004278 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004279 if (base->c_encoding != NULL) {
4280 assert(sc.c_encoding == NULL);
4281 sc.c_encoding = base->c_encoding;
4282 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004283 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004284 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004285 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004286 if (sc.c_future == NULL) {
4287 com_free(&sc);
4288 return NULL;
4289 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004290 if (flags) {
4291 int merged = sc.c_future->ff_features |
4292 flags->cf_flags;
4293 sc.c_future->ff_features = merged;
4294 flags->cf_flags = merged;
4295 }
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004296 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004297 com_free(&sc);
4298 return NULL;
4299 }
4300 }
4301 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004302 if (symtable_load_symbols(&sc) < 0) {
4303 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004304 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004305 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004306 compile_node(&sc, n);
4307 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004308 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004309 PyObject *consts, *names, *varnames, *filename, *name,
4310 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004311 consts = PyList_AsTuple(sc.c_consts);
4312 names = PyList_AsTuple(sc.c_names);
4313 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004314 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4315 freevars = dict_keys_inorder(sc.c_freevars,
4316 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004317 filename = PyString_InternFromString(sc.c_filename);
4318 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004319 if (!PyErr_Occurred())
4320 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004321 sc.c_nlocals,
4322 sc.c_maxstacklevel,
4323 sc.c_flags,
4324 sc.c_code,
4325 consts,
4326 names,
4327 varnames,
4328 freevars,
4329 cellvars,
4330 filename,
4331 name,
4332 sc.c_firstlineno,
4333 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004334 Py_XDECREF(consts);
4335 Py_XDECREF(names);
4336 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004337 Py_XDECREF(freevars);
4338 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004339 Py_XDECREF(filename);
4340 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004341 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004342 else if (!PyErr_Occurred()) {
4343 /* This could happen if someone called PyErr_Clear() after an
4344 error was reported above. That's not supposed to happen,
4345 but I just plugged one case and I'm not sure there can't be
4346 others. In that case, raise SystemError so that at least
4347 it gets reported instead dumping core. */
4348 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4349 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004350 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004351 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004352 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004353 sc.c_symtable = NULL;
4354 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004355 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004356 return co;
4357}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004358
4359int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004360PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004361{
4362 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004363 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004364 int line = co->co_firstlineno;
4365 int addr = 0;
4366 while (--size >= 0) {
4367 addr += *p++;
4368 if (addr > addrq)
4369 break;
4370 line += *p++;
4371 }
4372 return line;
4373}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004374
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004375/* The test for LOCAL must come before the test for FREE in order to
4376 handle classes where name is both local and free. The local var is
4377 a method and the free var is a free var referenced within a method.
4378*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004379
4380static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004381get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004382{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004383 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004384 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004385
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004386 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4387 return CELL;
4388 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4389 return LOCAL;
4390 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4391 return FREE;
4392 v = PyDict_GetItemString(c->c_globals, name);
4393 if (v) {
4394 if (v == Py_None)
4395 return GLOBAL_EXPLICIT;
4396 else {
4397 return GLOBAL_IMPLICIT;
4398 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004399 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004400 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004401 "unknown scope for %.100s in %.100s(%s) "
4402 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4403 name, c->c_name,
4404 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4405 c->c_filename,
4406 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4407 PyObject_REPR(c->c_locals),
4408 PyObject_REPR(c->c_globals)
4409 );
4410
4411 Py_FatalError(buf);
4412 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004413}
4414
Guido van Rossum207fda62001-03-02 03:30:41 +00004415/* Helper functions to issue warnings */
4416
4417static int
4418issue_warning(char *msg, char *filename, int lineno)
4419{
4420 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4421 lineno, NULL, NULL) < 0) {
4422 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4423 PyErr_SetString(PyExc_SyntaxError, msg);
4424 PyErr_SyntaxLocation(filename, lineno);
4425 }
4426 return -1;
4427 }
4428 return 0;
4429}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004430
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004431static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004432symtable_warn(struct symtable *st, char *msg)
4433{
Guido van Rossum207fda62001-03-02 03:30:41 +00004434 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004435 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004436 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004437 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004438 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004439}
4440
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004441/* Helper function for setting lineno and filename */
4442
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004443static int
4444symtable_build(struct compiling *c, node *n)
4445{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004446 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004447 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004448 c->c_symtable->st_future = c->c_future;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004449 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004450 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4451 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004452 return -1;
4453 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004454 if (c->c_symtable->st_errors > 0)
4455 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004456 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004457 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004458 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004459 return 0;
4460}
4461
4462static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004463symtable_init_compiling_symbols(struct compiling *c)
4464{
4465 PyObject *varnames;
4466
4467 varnames = c->c_symtable->st_cur->ste_varnames;
4468 if (varnames == NULL) {
4469 varnames = PyList_New(0);
4470 if (varnames == NULL)
4471 return -1;
4472 c->c_symtable->st_cur->ste_varnames = varnames;
4473 Py_INCREF(varnames);
4474 } else
4475 Py_INCREF(varnames);
4476 c->c_varnames = varnames;
4477
4478 c->c_globals = PyDict_New();
4479 if (c->c_globals == NULL)
4480 return -1;
4481 c->c_freevars = PyDict_New();
4482 if (c->c_freevars == NULL)
4483 return -1;
4484 c->c_cellvars = PyDict_New();
4485 if (c->c_cellvars == NULL)
4486 return -1;
4487 return 0;
4488}
4489
4490struct symbol_info {
4491 int si_nlocals;
4492 int si_ncells;
4493 int si_nfrees;
4494 int si_nimplicit;
4495};
4496
4497static void
4498symtable_init_info(struct symbol_info *si)
4499{
4500 si->si_nlocals = 0;
4501 si->si_ncells = 0;
4502 si->si_nfrees = 0;
4503 si->si_nimplicit = 0;
4504}
4505
4506static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004507symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004508 struct symbol_info *si)
4509{
4510 PyObject *dict, *v;
4511
4512 /* Seperate logic for DEF_FREE. If it occurs in a function,
4513 it indicates a local that we must allocate storage for (a
4514 cell var). If it occurs in a class, then the class has a
4515 method and a free variable with the same name.
4516 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004517 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004518 /* If it isn't declared locally, it can't be a cell. */
4519 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4520 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004521 v = PyInt_FromLong(si->si_ncells++);
4522 dict = c->c_cellvars;
4523 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004524 /* If it is free anyway, then there is no need to do
4525 anything here.
4526 */
4527 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004528 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004529 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004530 v = PyInt_FromLong(si->si_nfrees++);
4531 dict = c->c_freevars;
4532 }
4533 if (v == NULL)
4534 return -1;
4535 if (PyDict_SetItem(dict, name, v) < 0) {
4536 Py_DECREF(v);
4537 return -1;
4538 }
4539 Py_DECREF(v);
4540 return 0;
4541}
4542
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004543/* If a variable is a cell and an argument, make sure that appears in
4544 co_cellvars before any variable to its right in varnames.
4545*/
4546
4547
4548static int
4549symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4550 PyObject *varnames, int flags)
4551{
4552 PyObject *v, *w, *d, *list = NULL;
4553 int i, pos;
4554
4555 if (flags & CO_VARARGS)
4556 argcount++;
4557 if (flags & CO_VARKEYWORDS)
4558 argcount++;
4559 for (i = argcount; --i >= 0; ) {
4560 v = PyList_GET_ITEM(varnames, i);
4561 if (PyDict_GetItem(*cellvars, v)) {
4562 if (list == NULL) {
4563 list = PyList_New(1);
4564 if (list == NULL)
4565 return -1;
4566 PyList_SET_ITEM(list, 0, v);
4567 Py_INCREF(v);
4568 } else
4569 PyList_Insert(list, 0, v);
4570 }
4571 }
4572 if (list == NULL || PyList_GET_SIZE(list) == 0)
4573 return 0;
4574 /* There are cellvars that are also arguments. Create a dict
4575 to replace cellvars and put the args at the front.
4576 */
4577 d = PyDict_New();
4578 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4579 v = PyInt_FromLong(i);
4580 if (v == NULL)
4581 goto fail;
4582 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4583 goto fail;
4584 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4585 goto fail;
4586 }
4587 pos = 0;
4588 i = PyList_GET_SIZE(list);
4589 Py_DECREF(list);
4590 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4591 w = PyInt_FromLong(i++); /* don't care about the old key */
4592 if (PyDict_SetItem(d, v, w) < 0) {
4593 Py_DECREF(w);
4594 goto fail;
4595 }
4596 Py_DECREF(w);
4597 }
4598 Py_DECREF(*cellvars);
4599 *cellvars = d;
4600 return 1;
4601 fail:
4602 Py_DECREF(d);
4603 return -1;
4604}
4605
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004606static int
4607symtable_freevar_offsets(PyObject *freevars, int offset)
4608{
4609 PyObject *name, *v;
4610 int pos;
4611
4612 /* The cell vars are the first elements of the closure,
4613 followed by the free vars. Update the offsets in
4614 c_freevars to account for number of cellvars. */
4615 pos = 0;
4616 while (PyDict_Next(freevars, &pos, &name, &v)) {
4617 int i = PyInt_AS_LONG(v) + offset;
4618 PyObject *o = PyInt_FromLong(i);
4619 if (o == NULL)
4620 return -1;
4621 if (PyDict_SetItem(freevars, name, o) < 0) {
4622 Py_DECREF(o);
4623 return -1;
4624 }
4625 Py_DECREF(o);
4626 }
4627 return 0;
4628}
4629
4630static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004631symtable_check_unoptimized(struct compiling *c,
4632 PySymtableEntryObject *ste,
4633 struct symbol_info *si)
4634{
4635 char buf[300];
4636
4637 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4638 || (ste->ste_nested && si->si_nimplicit)))
4639 return 0;
4640
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004641#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4642
4643#define ILLEGAL_IS "is a nested function"
4644
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004645#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004646"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004647
4648#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004649"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004650
4651#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00004652"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004653"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004654
4655 /* XXX perhaps the linenos for these opt-breaking statements
4656 should be stored so the exception can point to them. */
4657
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004658 if (ste->ste_child_free) {
4659 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004660 PyOS_snprintf(buf, sizeof(buf),
4661 ILLEGAL_IMPORT_STAR,
4662 PyString_AS_STRING(ste->ste_name),
4663 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004664 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004665 PyOS_snprintf(buf, sizeof(buf),
4666 ILLEGAL_BARE_EXEC,
4667 PyString_AS_STRING(ste->ste_name),
4668 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004669 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004670 PyOS_snprintf(buf, sizeof(buf),
4671 ILLEGAL_EXEC_AND_IMPORT_STAR,
4672 PyString_AS_STRING(ste->ste_name),
4673 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004674 }
4675 } else {
4676 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004677 PyOS_snprintf(buf, sizeof(buf),
4678 ILLEGAL_IMPORT_STAR,
4679 PyString_AS_STRING(ste->ste_name),
4680 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004681 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004682 PyOS_snprintf(buf, sizeof(buf),
4683 ILLEGAL_BARE_EXEC,
4684 PyString_AS_STRING(ste->ste_name),
4685 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004686 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004687 PyOS_snprintf(buf, sizeof(buf),
4688 ILLEGAL_EXEC_AND_IMPORT_STAR,
4689 PyString_AS_STRING(ste->ste_name),
4690 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004691 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004692 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004693
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004694 PyErr_SetString(PyExc_SyntaxError, buf);
4695 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4696 ste->ste_opt_lineno);
4697 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004698}
4699
4700static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004701symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4702 struct symbol_info *si)
4703{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004704 if (c->c_future)
4705 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004706 if (ste->ste_generator)
4707 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004708 if (ste->ste_type != TYPE_MODULE)
4709 c->c_flags |= CO_NEWLOCALS;
4710 if (ste->ste_type == TYPE_FUNCTION) {
4711 c->c_nlocals = si->si_nlocals;
4712 if (ste->ste_optimized == 0)
4713 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004714 else if (ste->ste_optimized != OPT_EXEC)
4715 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004716 }
4717 return 0;
4718}
4719
4720static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004721symtable_load_symbols(struct compiling *c)
4722{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004723 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004724 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004725 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004726 PyObject *name, *varnames, *v;
4727 int i, flags, pos;
4728 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004729
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004730 if (implicit == NULL) {
4731 implicit = PyInt_FromLong(1);
4732 if (implicit == NULL)
4733 return -1;
4734 }
4735 v = NULL;
4736
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004737 if (symtable_init_compiling_symbols(c) < 0)
4738 goto fail;
4739 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004740 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004741 si.si_nlocals = PyList_GET_SIZE(varnames);
4742 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004743
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004744 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004745 v = PyInt_FromLong(i);
4746 if (PyDict_SetItem(c->c_locals,
4747 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004748 goto fail;
4749 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004750 }
4751
4752 /* XXX The cases below define the rules for whether a name is
4753 local or global. The logic could probably be clearer. */
4754 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004755 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4756 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004757
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004758 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004759 /* undo the original DEF_FREE */
4760 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004761
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004762 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004763 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004764 2. Free variables in methods that are also class
4765 variables or declared global.
4766 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004767 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004768 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004769
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004770 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004771 c->c_argcount--;
4772 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004773 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004774 c->c_argcount--;
4775 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004776 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004777 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004778 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004779 if (flags & DEF_PARAM) {
4780 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004781 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004782 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004783 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004784 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004785 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004786 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004787 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4788 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004789 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004790 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004791 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4792 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004793 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004794 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004795 if (v == NULL)
4796 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004797 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004798 goto fail;
4799 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004800 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004801 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004802 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004803 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004804 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004805 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004806 if (v == NULL)
4807 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004808 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004809 goto fail;
4810 Py_DECREF(v);
4811 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004812 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004813 if (PyDict_SetItem(c->c_globals, name,
4814 implicit) < 0)
4815 goto fail;
4816 if (st->st_nscopes != 1) {
4817 v = PyInt_FromLong(flags);
4818 if (PyDict_SetItem(st->st_global,
4819 name, v))
4820 goto fail;
4821 Py_DECREF(v);
4822 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004823 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004824 }
4825 }
4826
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004827 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4828
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004829 if (si.si_ncells > 1) { /* one cell is always in order */
4830 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4831 c->c_varnames, c->c_flags) < 0)
4832 return -1;
4833 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004834 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4835 return -1;
4836 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004837 fail:
4838 /* is this always the right thing to do? */
4839 Py_XDECREF(v);
4840 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004841}
4842
4843static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004844symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004845{
4846 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004847
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004848 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004849 if (st == NULL)
4850 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004851 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00004852
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004853 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004854 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004855 goto fail;
4856 if ((st->st_symbols = PyDict_New()) == NULL)
4857 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004858 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004859 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004860 st->st_errors = 0;
4861 st->st_tmpname = 0;
4862 st->st_private = NULL;
4863 return st;
4864 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004865 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004866 return NULL;
4867}
4868
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004869void
4870PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004871{
4872 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004873 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004874 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004875 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004876}
4877
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004878/* When the compiler exits a scope, it must should update the scope's
4879 free variable information with the list of free variables in its
4880 children.
4881
4882 Variables that are free in children and defined in the current
4883 scope are cellvars.
4884
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004885 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004886 false), free variables in children that are not defined here are
4887 implicit globals.
4888
4889*/
4890
4891static int
4892symtable_update_free_vars(struct symtable *st)
4893{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004894 int i, j, def;
4895 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004896 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004897
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004898 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004899 def = DEF_FREE_CLASS;
4900 else
4901 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004902 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004903 int pos = 0;
4904
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004905 if (list)
4906 PyList_SetSlice(list, 0,
4907 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004908 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004909 PyList_GET_ITEM(ste->ste_children, i);
4910 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004911 int flags = PyInt_AS_LONG(o);
4912 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004913 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004914 if (list == NULL) {
4915 list = PyList_New(0);
4916 if (list == NULL)
4917 return -1;
4918 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004919 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004920 if (PyList_Append(list, name) < 0) {
4921 Py_DECREF(list);
4922 return -1;
4923 }
4924 }
4925 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004926 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004927 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004928 v = PyDict_GetItem(ste->ste_symbols, name);
4929 /* If a name N is declared global in scope A and
4930 referenced in scope B contained (perhaps
4931 indirectly) in A and there are no scopes
4932 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004933 is global in B. Unless A is a class scope,
4934 because class scopes are not considered for
4935 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004936 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004937 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004938 int flags = PyInt_AS_LONG(v);
4939 if (flags & DEF_GLOBAL) {
4940 symtable_undo_free(st, child->ste_id,
4941 name);
4942 continue;
4943 }
4944 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004945 if (ste->ste_nested) {
4946 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004947 name, def) < 0) {
4948 Py_DECREF(list);
4949 return -1;
4950 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004951 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004952 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004953 name) < 0) {
4954 Py_DECREF(list);
4955 return -1;
4956 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004957 }
4958 }
4959 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004960
4961 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004962 return 0;
4963}
4964
4965/* If the current scope is a non-nested class or if name is not
4966 defined in the current, non-nested scope, then it is an implicit
4967 global in all nested scopes.
4968*/
4969
4970static int
4971symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4972{
4973 PyObject *o;
4974 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004975 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004976
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004977 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004978 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004979 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004980 if (o == NULL)
4981 return symtable_undo_free(st, child, name);
4982 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004983
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004984 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004985 return symtable_undo_free(st, child, name);
4986 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004987 return symtable_add_def_o(st, ste->ste_symbols,
4988 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004989}
4990
4991static int
4992symtable_undo_free(struct symtable *st, PyObject *id,
4993 PyObject *name)
4994{
4995 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004996 PyObject *info;
4997 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004998
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004999 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5000 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005001 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005002
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005003 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005004 if (info == NULL)
5005 return 0;
5006 v = PyInt_AS_LONG(info);
5007 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005008 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005009 DEF_FREE_GLOBAL) < 0)
5010 return -1;
5011 } else
5012 /* If the name is defined here or declared global,
5013 then the recursion stops. */
5014 return 0;
5015
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005016 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5017 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005018 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005019 PyList_GET_ITEM(ste->ste_children, i);
5020 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005021 if (x < 0)
5022 return x;
5023 }
5024 return 0;
5025}
5026
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005027/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5028 This reference is released when the scope is exited, via the DECREF
5029 in symtable_exit_scope().
5030*/
5031
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005032static int
5033symtable_exit_scope(struct symtable *st)
5034{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005035 int end;
5036
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005037 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005038 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005039 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005040 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005041 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5042 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005043 if (PySequence_DelItem(st->st_stack, end) < 0)
5044 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005045 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005046}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005047
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005048static void
5049symtable_enter_scope(struct symtable *st, char *name, int type,
5050 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005051{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005052 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005053
5054 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005055 prev = st->st_cur;
5056 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
5057 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005058 st->st_errors++;
5059 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005060 }
5061 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005062 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005063 PySymtableEntry_New(st, name, type, lineno);
5064 if (strcmp(name, TOP) == 0)
5065 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005066 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005067 if (PyList_Append(prev->ste_children,
5068 (PyObject *)st->st_cur) < 0)
5069 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005070 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005071}
5072
5073static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005074symtable_lookup(struct symtable *st, char *name)
5075{
5076 char buffer[MANGLE_LEN];
5077 PyObject *v;
5078 int flags;
5079
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005080 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005081 name = buffer;
5082 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5083 if (v == NULL) {
5084 if (PyErr_Occurred())
5085 return -1;
5086 else
5087 return 0;
5088 }
5089
5090 flags = PyInt_AS_LONG(v);
5091 return flags;
5092}
5093
5094static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005095symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005096{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005097 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005098 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005099 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005100
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005101 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005102 name = buffer;
5103 if ((s = PyString_InternFromString(name)) == NULL)
5104 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005105 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5106 Py_DECREF(s);
5107 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005108}
5109
5110/* Must only be called with mangled names */
5111
5112static int
5113symtable_add_def_o(struct symtable *st, PyObject *dict,
5114 PyObject *name, int flag)
5115{
5116 PyObject *o;
5117 int val;
5118
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005119 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005120 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005121 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005122 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005123 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005124 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005125 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005126 return -1;
5127 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005128 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005129 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005130 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005131 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005132 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005133 Py_DECREF(o);
5134 return -1;
5135 }
5136 Py_DECREF(o);
5137
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005138 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005139 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005140 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005141 } else if (flag & DEF_GLOBAL) {
5142 /* XXX need to update DEF_GLOBAL for other flags too;
5143 perhaps only DEF_FREE_GLOBAL */
5144 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005145 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005146 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005147 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005148 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005149 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005150 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005151 Py_DECREF(o);
5152 return -1;
5153 }
5154 Py_DECREF(o);
5155 }
5156 return 0;
5157}
5158
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005159#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005160
Tim Peters08a898f2001-06-28 01:52:22 +00005161/* Look for a yield stmt under n. Return 1 if found, else 0.
5162 This hack is used to look inside "if 0:" blocks (which are normally
5163 ignored) in case those are the only places a yield occurs (so that this
5164 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005165static int
5166look_for_yield(node *n)
5167{
5168 int i;
5169
5170 for (i = 0; i < NCH(n); ++i) {
5171 node *kid = CHILD(n, i);
5172
5173 switch (TYPE(kid)) {
5174
5175 case classdef:
5176 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005177 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005178 /* Stuff in nested functions and classes can't make
5179 the parent a generator. */
5180 return 0;
5181
5182 case yield_stmt:
5183 return 1;
5184
5185 default:
5186 if (look_for_yield(kid))
5187 return 1;
5188 }
5189 }
5190 return 0;
5191}
5192
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005193static void
5194symtable_node(struct symtable *st, node *n)
5195{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005196 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005197
5198 loop:
5199 switch (TYPE(n)) {
5200 case funcdef: {
5201 char *func_name = STR(CHILD(n, 1));
5202 symtable_add_def(st, func_name, DEF_LOCAL);
5203 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005204 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005205 symtable_funcdef(st, n);
5206 symtable_exit_scope(st);
5207 break;
5208 }
5209 case lambdef:
5210 if (NCH(n) == 4)
5211 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005212 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005213 symtable_funcdef(st, n);
5214 symtable_exit_scope(st);
5215 break;
5216 case classdef: {
5217 char *tmp, *class_name = STR(CHILD(n, 1));
5218 symtable_add_def(st, class_name, DEF_LOCAL);
5219 if (TYPE(CHILD(n, 2)) == LPAR) {
5220 node *bases = CHILD(n, 3);
5221 int i;
5222 for (i = 0; i < NCH(bases); i += 2) {
5223 symtable_node(st, CHILD(bases, i));
5224 }
5225 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005226 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005227 tmp = st->st_private;
5228 st->st_private = class_name;
5229 symtable_node(st, CHILD(n, NCH(n) - 1));
5230 st->st_private = tmp;
5231 symtable_exit_scope(st);
5232 break;
5233 }
5234 case if_stmt:
5235 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005236 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5237 if (st->st_cur->ste_generator == 0)
5238 st->st_cur->ste_generator =
5239 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005240 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005241 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005242 symtable_node(st, CHILD(n, i + 1));
5243 symtable_node(st, CHILD(n, i + 3));
5244 }
5245 if (i + 2 < NCH(n))
5246 symtable_node(st, CHILD(n, i + 2));
5247 break;
5248 case global_stmt:
5249 symtable_global(st, n);
5250 break;
5251 case import_stmt:
5252 symtable_import(st, n);
5253 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005254 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005255 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005256 symtable_node(st, CHILD(n, 1));
5257 if (NCH(n) > 2)
5258 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005259 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005260 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005261 st->st_cur->ste_opt_lineno = n->n_lineno;
5262 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005263 if (NCH(n) > 4)
5264 symtable_node(st, CHILD(n, 5));
5265 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005266
5267 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005268 case assert_stmt:
5269 if (Py_OptimizeFlag)
5270 return;
5271 if (NCH(n) == 2) {
5272 n = CHILD(n, 1);
5273 goto loop;
5274 } else {
5275 symtable_node(st, CHILD(n, 1));
5276 n = CHILD(n, 3);
5277 goto loop;
5278 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005279 case except_clause:
5280 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005281 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005282 if (NCH(n) > 1) {
5283 n = CHILD(n, 1);
5284 goto loop;
5285 }
5286 break;
5287 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005288 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005289 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005290 case yield_stmt:
5291 st->st_cur->ste_generator = 1;
5292 n = CHILD(n, 1);
5293 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005294 case expr_stmt:
5295 if (NCH(n) == 1)
5296 n = CHILD(n, 0);
5297 else {
5298 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005299 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005300 symtable_node(st, CHILD(n, 2));
5301 break;
5302 } else {
5303 int i;
5304 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005305 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005306 n = CHILD(n, NCH(n) - 1);
5307 }
5308 }
5309 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005310 case list_iter:
5311 n = CHILD(n, 0);
5312 if (TYPE(n) == list_for) {
5313 st->st_tmpname++;
5314 symtable_list_comprehension(st, n);
5315 st->st_tmpname--;
5316 } else {
5317 REQ(n, list_if);
5318 symtable_node(st, CHILD(n, 1));
5319 if (NCH(n) == 3) {
5320 n = CHILD(n, 2);
5321 goto loop;
5322 }
5323 }
5324 break;
5325 case for_stmt:
5326 symtable_assign(st, CHILD(n, 1), 0);
5327 for (i = 3; i < NCH(n); ++i)
5328 if (TYPE(CHILD(n, i)) >= single_input)
5329 symtable_node(st, CHILD(n, i));
5330 break;
5331 /* The remaining cases fall through to default except in
5332 special circumstances. This requires the individual cases
5333 to be coded with great care, even though they look like
5334 rather innocuous. Each case must double-check TYPE(n).
5335 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005336 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005337 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005338 n = CHILD(n, 2);
5339 goto loop;
5340 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005341 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005342 case listmaker:
5343 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00005344 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005345 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00005346 symtable_node(st, CHILD(n, 0));
5347 st->st_tmpname--;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005348 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005349 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005350 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005351 case atom:
5352 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5353 symtable_add_use(st, STR(CHILD(n, 0)));
5354 break;
5355 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005356 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005357 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005358 /* Walk over every non-token child with a special case
5359 for one child.
5360 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005361 if (NCH(n) == 1) {
5362 n = CHILD(n, 0);
5363 goto loop;
5364 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005365 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005366 if (TYPE(CHILD(n, i)) >= single_input)
5367 symtable_node(st, CHILD(n, i));
5368 }
5369}
5370
5371static void
5372symtable_funcdef(struct symtable *st, node *n)
5373{
5374 node *body;
5375
5376 if (TYPE(n) == lambdef) {
5377 if (NCH(n) == 4)
5378 symtable_params(st, CHILD(n, 1));
5379 } else
5380 symtable_params(st, CHILD(n, 2));
5381 body = CHILD(n, NCH(n) - 1);
5382 symtable_node(st, body);
5383}
5384
5385/* The next two functions parse the argument tuple.
5386 symtable_default_arg() checks for names in the default arguments,
5387 which are references in the defining scope. symtable_params()
5388 parses the parameter names, which are defined in the function's
5389 body.
5390
5391 varargslist:
5392 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5393 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5394*/
5395
5396static void
5397symtable_default_args(struct symtable *st, node *n)
5398{
5399 node *c;
5400 int i;
5401
5402 if (TYPE(n) == parameters) {
5403 n = CHILD(n, 1);
5404 if (TYPE(n) == RPAR)
5405 return;
5406 }
5407 REQ(n, varargslist);
5408 for (i = 0; i < NCH(n); i += 2) {
5409 c = CHILD(n, i);
5410 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5411 break;
5412 }
5413 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5414 symtable_node(st, CHILD(n, i));
5415 }
5416}
5417
5418static void
5419symtable_params(struct symtable *st, node *n)
5420{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005421 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005422 node *c = NULL;
5423
5424 if (TYPE(n) == parameters) {
5425 n = CHILD(n, 1);
5426 if (TYPE(n) == RPAR)
5427 return;
5428 }
5429 REQ(n, varargslist);
5430 for (i = 0; i < NCH(n); i += 2) {
5431 c = CHILD(n, i);
5432 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5433 ext = 1;
5434 break;
5435 }
5436 if (TYPE(c) == test) {
5437 continue;
5438 }
5439 if (TYPE(CHILD(c, 0)) == NAME)
5440 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
5441 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005442 char nbuf[30];
5443 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005444 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005445 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005446 }
5447 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005448 if (ext) {
5449 c = CHILD(n, i);
5450 if (TYPE(c) == STAR) {
5451 i++;
5452 symtable_add_def(st, STR(CHILD(n, i)),
5453 DEF_PARAM | DEF_STAR);
5454 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005455 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005456 c = NULL;
5457 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005458 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005459 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005460 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005461 i++;
5462 symtable_add_def(st, STR(CHILD(n, i)),
5463 DEF_PARAM | DEF_DOUBLESTAR);
5464 }
5465 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005466 if (complex >= 0) {
5467 int j;
5468 for (j = 0; j <= complex; j++) {
5469 c = CHILD(n, j);
5470 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005471 c = CHILD(n, ++j);
5472 else if (TYPE(c) == EQUAL)
5473 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005474 if (TYPE(CHILD(c, 0)) == LPAR)
5475 symtable_params_fplist(st, CHILD(c, 1));
5476 }
5477 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005478}
5479
5480static void
5481symtable_params_fplist(struct symtable *st, node *n)
5482{
5483 int i;
5484 node *c;
5485
5486 REQ(n, fplist);
5487 for (i = 0; i < NCH(n); i += 2) {
5488 c = CHILD(n, i);
5489 REQ(c, fpdef);
5490 if (NCH(c) == 1)
5491 symtable_add_def(st, STR(CHILD(c, 0)),
5492 DEF_PARAM | DEF_INTUPLE);
5493 else
5494 symtable_params_fplist(st, CHILD(c, 1));
5495 }
5496
5497}
5498
5499static void
5500symtable_global(struct symtable *st, node *n)
5501{
5502 int i;
5503
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005504 /* XXX It might be helpful to warn about module-level global
5505 statements, but it's hard to tell the difference between
5506 module-level and a string passed to exec.
5507 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005508
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005509 for (i = 1; i < NCH(n); i += 2) {
5510 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005511 int flags;
5512
5513 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005514 if (flags < 0)
5515 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005516 if (flags && flags != DEF_GLOBAL) {
5517 char buf[500];
5518 if (flags & DEF_PARAM) {
5519 PyErr_Format(PyExc_SyntaxError,
5520 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005521 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005522 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005523 st->st_cur->ste_lineno);
5524 st->st_errors++;
5525 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005526 }
5527 else {
5528 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005529 PyOS_snprintf(buf, sizeof(buf),
5530 GLOBAL_AFTER_ASSIGN,
5531 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005532 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005533 PyOS_snprintf(buf, sizeof(buf),
5534 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005535 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005536 }
5537 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005538 symtable_add_def(st, name, DEF_GLOBAL);
5539 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005540}
5541
5542static void
5543symtable_list_comprehension(struct symtable *st, node *n)
5544{
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005545 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005546
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005547 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005548 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005549 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005550 symtable_node(st, CHILD(n, 3));
5551 if (NCH(n) == 5)
5552 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005553}
5554
5555static void
5556symtable_import(struct symtable *st, node *n)
5557{
5558 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005559 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005560 | 'from' dotted_name 'import'
5561 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005562 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005563 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005564 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005565 node *dotname = CHILD(n, 1);
5566 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5567 /* check for bogus imports */
5568 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5569 PyErr_SetString(PyExc_SyntaxError,
5570 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005571 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005572 n->n_lineno);
5573 st->st_errors++;
5574 return;
5575 }
5576 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005577 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005578 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005579 if (symtable_warn(st,
5580 "import * only allowed at module level") < 0)
5581 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005582 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005583 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005584 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005585 } else {
5586 for (i = 3; i < NCH(n); i += 2) {
5587 node *c = CHILD(n, i);
5588 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005589 symtable_assign(st, CHILD(c, 2),
5590 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005591 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005592 symtable_assign(st, CHILD(c, 0),
5593 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005594 }
5595 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005596 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005597 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005598 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005599 }
5600 }
5601}
5602
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005603/* The third argument to symatble_assign() is a flag to be passed to
5604 symtable_add_def() if it is eventually called. The flag is useful
5605 to specify the particular type of assignment that should be
5606 recorded, e.g. an assignment caused by import.
5607 */
5608
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005609static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005610symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005611{
5612 node *tmp;
5613 int i;
5614
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005615 loop:
5616 switch (TYPE(n)) {
5617 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005618 /* invalid assignment, e.g. lambda x:x=2. The next
5619 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005620 return;
5621 case power:
5622 if (NCH(n) > 2) {
5623 for (i = 2; i < NCH(n); ++i)
5624 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5625 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005626 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005627 if (NCH(n) > 1) {
5628 symtable_node(st, CHILD(n, 0));
5629 symtable_node(st, CHILD(n, 1));
5630 } else {
5631 n = CHILD(n, 0);
5632 goto loop;
5633 }
5634 return;
5635 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005636 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5637 /* XXX This is an error, but the next pass
5638 will catch it. */
5639 return;
5640 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005641 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005642 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005643 }
5644 return;
5645 case exprlist:
5646 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00005647 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005648 if (NCH(n) == 1) {
5649 n = CHILD(n, 0);
5650 goto loop;
5651 }
5652 else {
5653 int i;
5654 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005655 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005656 return;
5657 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005658 case atom:
5659 tmp = CHILD(n, 0);
5660 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5661 n = CHILD(n, 1);
5662 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005663 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00005664 if (strcmp(STR(tmp), "__debug__") == 0) {
5665 PyErr_SetString(PyExc_SyntaxError,
5666 ASSIGN_DEBUG);
5667 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton86424e32001-12-04 02:41:46 +00005668 n->n_lineno);
Jeremy Hylton778e2652001-11-09 19:50:08 +00005669 st->st_errors++;
5670 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005671 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005672 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005673 return;
5674 case dotted_as_name:
5675 if (NCH(n) == 3)
5676 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005677 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005678 else
5679 symtable_add_def(st,
5680 STR(CHILD(CHILD(n,
5681 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005682 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005683 return;
5684 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005685 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005686 return;
5687 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005688 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005689 return;
5690 default:
5691 if (NCH(n) == 0)
5692 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005693 if (NCH(n) == 1) {
5694 n = CHILD(n, 0);
5695 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005696 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005697 /* Should only occur for errors like x + 1 = 1,
5698 which will be caught in the next pass. */
5699 for (i = 0; i < NCH(n); ++i)
5700 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005701 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005702 }
5703}