blob: b160f7361255aad67f0402579bded9ebfca671ab [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) {
Guido van Rossum715eca92002-08-12 21:54:46 +00001160 if (PyErr_WarnExplicit(
1161 PyExc_DeprecationWarning,
1162 "hex/oct constants > sys.maxint "
1163 "will return positive values "
1164 "in Python 2.4 and up",
1165 co->c_filename,
1166 co->c_lineno,
1167 NULL,
1168 NULL) < 0)
Guido van Rossum078151d2002-08-11 04:24:12 +00001169 return NULL;
Guido van Rossum3cb8e542002-08-11 14:06:15 +00001170 errno = 0; /* Might be changed by PyErr_Warn() */
Guido van Rossum078151d2002-08-11 04:24:12 +00001171 }
1172 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001173 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001174 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001175 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001176 if (errno != 0)
1177 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001178 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001179 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001180 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001181#ifndef WITHOUT_COMPLEX
1182 if (imflag) {
1183 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001184 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001185 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001186 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001187 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001188 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001189 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001190#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001191 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001192 PyFPE_START_PROTECT("atof", return 0)
1193 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001194 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001195 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001196 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001197}
1198
Guido van Rossum79f25d91997-04-29 20:08:16 +00001199static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001200decode_utf8(char **sPtr, char *end, char* encoding)
1201{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001202#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001203 Py_FatalError("decode_utf8 should not be called in this build.");
1204 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001205#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001206 PyObject *u, *v;
1207 char *s, *t;
1208 t = s = *sPtr;
1209 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1210 while (s < end && (*s & 0x80)) s++;
1211 *sPtr = s;
1212 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1213 if (u == NULL)
1214 return NULL;
1215 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1216 Py_DECREF(u);
1217 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001218#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001219}
1220
1221static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001222parsestr(struct compiling *com, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001223{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001224 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001225 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001226 char *buf;
1227 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001228 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001229 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001230 int first = *s;
1231 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001232 int rawmode = 0;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001233 char* encoding = ((com == NULL) ? NULL : com->c_encoding);
1234 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001235 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001236
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001237 if (isalpha(quote) || quote == '_') {
1238 if (quote == 'u' || quote == 'U') {
1239 quote = *++s;
1240 unicode = 1;
1241 }
1242 if (quote == 'r' || quote == 'R') {
1243 quote = *++s;
1244 rawmode = 1;
1245 }
1246 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001247 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001248 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001249 return NULL;
1250 }
1251 s++;
1252 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001253 if (len > INT_MAX) {
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001254 com_error(com, PyExc_OverflowError,
1255 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001256 return NULL;
1257 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001258 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001259 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001260 return NULL;
1261 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001262 if (len >= 4 && s[0] == quote && s[1] == quote) {
1263 s += 2;
1264 len -= 2;
1265 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001266 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001267 return NULL;
1268 }
1269 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001270#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001271 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001272 PyObject *u, *w;
1273 if (encoding == NULL) {
1274 buf = s;
1275 u = NULL;
1276 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1277 buf = s;
1278 u = NULL;
1279 } else {
1280 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1281 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1282 if (u == NULL)
1283 return NULL;
1284 p = buf = PyString_AsString(u);
1285 end = s + len;
1286 while (s < end) {
1287 if (*s == '\\') {
1288 *p++ = *s++;
1289 if (*s & 0x80) {
1290 strcpy(p, "u005c");
1291 p += 5;
1292 }
1293 }
1294 if (*s & 0x80) { /* XXX inefficient */
1295 char *r;
1296 int rn, i;
1297 w = decode_utf8(&s, end, "utf-16-be");
1298 if (w == NULL) {
1299 Py_DECREF(u);
1300 return NULL;
1301 }
1302 r = PyString_AsString(w);
1303 rn = PyString_Size(w);
1304 assert(rn % 2 == 0);
1305 for (i = 0; i < rn; i += 2) {
1306 sprintf(p, "\\u%02x%02x",
1307 r[i + 0] & 0xFF,
1308 r[i + 1] & 0xFF);
1309 p += 6;
1310 }
1311 Py_DECREF(w);
1312 } else {
1313 *p++ = *s++;
1314 }
1315 }
1316 len = p - buf;
1317 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001318 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001319 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001320 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001321 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1322 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001323 if (v == NULL)
1324 PyErr_SyntaxLocation(com->c_filename, com->c_lineno);
1325 return v;
1326
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001327 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001328#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001329 need_encoding = (encoding != NULL &&
1330 strcmp(encoding, "utf-8") != 0 &&
1331 strcmp(encoding, "iso-8859-1") != 0);
1332 if (rawmode || strchr(s, '\\') == NULL) {
1333 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001334#ifndef Py_USING_UNICODE
1335 /* This should not happen - we never see any other
1336 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001337 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001338#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001339 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1340 if (u == NULL)
1341 return NULL;
1342 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1343 Py_DECREF(u);
1344 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001345#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001346 } else {
1347 return PyString_FromStringAndSize(s, len);
1348 }
1349 }
1350 v = PyString_FromStringAndSize((char *)NULL, /* XXX 4 is enough? */
1351 need_encoding ? len * 4 : len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001352 if (v == NULL)
1353 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001354 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001355 end = s + len;
1356 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001357 if (*s != '\\') {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001358 ORDINAL:
1359 if (need_encoding && (*s & 0x80)) {
1360 char *r;
1361 int rn;
1362 PyObject* w = decode_utf8(&s, end, encoding);
1363 if (w == NULL)
1364 return NULL;
1365 r = PyString_AsString(w);
1366 rn = PyString_Size(w);
1367 memcpy(p, r, rn);
1368 p += rn;
1369 Py_DECREF(w);
1370 } else {
1371 *p++ = *s++;
1372 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001373 continue;
1374 }
1375 s++;
1376 switch (*s++) {
1377 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001378 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001379 case '\\': *p++ = '\\'; break;
1380 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001381 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001382 case 'b': *p++ = '\b'; break;
1383 case 'f': *p++ = '\014'; break; /* FF */
1384 case 't': *p++ = '\t'; break;
1385 case 'n': *p++ = '\n'; break;
1386 case 'r': *p++ = '\r'; break;
1387 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001388 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1389 case '0': case '1': case '2': case '3':
1390 case '4': case '5': case '6': case '7':
1391 c = s[-1] - '0';
1392 if ('0' <= *s && *s <= '7') {
1393 c = (c<<3) + *s++ - '0';
1394 if ('0' <= *s && *s <= '7')
1395 c = (c<<3) + *s++ - '0';
1396 }
1397 *p++ = c;
1398 break;
1399 case 'x':
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001400 if (isxdigit(Py_CHARMASK(s[0]))
1401 && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +00001402 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001403 c = Py_CHARMASK(*s);
1404 s++;
1405 if (isdigit(c))
1406 x = c - '0';
1407 else if (islower(c))
1408 x = 10 + c - 'a';
1409 else
1410 x = 10 + c - 'A';
1411 x = x << 4;
1412 c = Py_CHARMASK(*s);
1413 s++;
1414 if (isdigit(c))
1415 x += c - '0';
1416 else if (islower(c))
1417 x += 10 + c - 'a';
1418 else
1419 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +00001420 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001421 break;
1422 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001423 Py_DECREF(v);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001424 com_error(com, PyExc_ValueError,
1425 "invalid \\x escape");
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001426 return NULL;
Guido van Rossum05459c52002-05-28 18:47:29 +00001427#ifndef Py_USING_UNICODE
1428 case 'u':
1429 case 'U':
1430 case 'N':
1431 if (unicode) {
1432 Py_DECREF(v);
1433 com_error(com, PyExc_ValueError,
1434 "Unicode escapes not legal "
1435 "when Unicode disabled");
1436 return NULL;
1437 }
1438#endif
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001439 default:
1440 *p++ = '\\';
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001441 s--;
1442 goto ORDINAL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001443 }
1444 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001445 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001446 return v;
1447}
1448
Guido van Rossum79f25d91997-04-29 20:08:16 +00001449static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001450parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001451{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001452 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001453 int i;
1454 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001455 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001456 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001457 for (i = 1; i < NCH(n); i++) {
1458 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001459 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001460 if (s == NULL)
1461 goto onError;
1462 if (PyString_Check(v) && PyString_Check(s)) {
1463 PyString_ConcatAndDel(&v, s);
1464 if (v == NULL)
1465 goto onError;
1466 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001467#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001468 else {
1469 PyObject *temp;
1470 temp = PyUnicode_Concat(v, s);
1471 Py_DECREF(s);
1472 if (temp == NULL)
1473 goto onError;
1474 Py_DECREF(v);
1475 v = temp;
1476 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001477#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001478 }
1479 }
1480 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001481
1482 onError:
1483 Py_XDECREF(v);
1484 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001485}
1486
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001487static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001488com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001489{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001490 int anchor = 0;
1491 int save_begin = c->c_begin;
1492
1493 /* list_iter: for v in expr [list_iter] */
1494 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001495 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001496 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001497 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001498 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001499 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001500 c->c_loops++;
1501 com_list_iter(c, n, e, t);
1502 c->c_loops--;
1503 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1504 c->c_begin = save_begin;
1505 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001506 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001507}
1508
1509static void
1510com_list_if(struct compiling *c, node *n, node *e, char *t)
1511{
1512 int anchor = 0;
1513 int a = 0;
1514 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001515 com_node(c, CHILD(n, 1));
1516 com_addfwref(c, JUMP_IF_FALSE, &a);
1517 com_addbyte(c, POP_TOP);
1518 com_pop(c, 1);
1519 com_list_iter(c, n, e, t);
1520 com_addfwref(c, JUMP_FORWARD, &anchor);
1521 com_backpatch(c, a);
1522 /* We jump here with an extra entry which we now pop */
1523 com_addbyte(c, POP_TOP);
1524 com_backpatch(c, anchor);
1525}
1526
1527static void
1528com_list_iter(struct compiling *c,
1529 node *p, /* parent of list_iter node */
1530 node *e, /* element expression node */
1531 char *t /* name of result list temp local */)
1532{
1533 /* list_iter is the last child in a listmaker, list_for, or list_if */
1534 node *n = CHILD(p, NCH(p)-1);
1535 if (TYPE(n) == list_iter) {
1536 n = CHILD(n, 0);
1537 switch (TYPE(n)) {
1538 case list_for:
1539 com_list_for(c, n, e, t);
1540 break;
1541 case list_if:
1542 com_list_if(c, n, e, t);
1543 break;
1544 default:
1545 com_error(c, PyExc_SystemError,
1546 "invalid list_iter node type");
1547 }
1548 }
1549 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001550 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001551 com_push(c, 1);
1552 com_node(c, e);
1553 com_addoparg(c, CALL_FUNCTION, 1);
1554 com_addbyte(c, POP_TOP);
1555 com_pop(c, 2);
1556 }
1557}
1558
1559static void
1560com_list_comprehension(struct compiling *c, node *n)
1561{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001562 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001563 char tmpname[30];
1564 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001565 com_addoparg(c, BUILD_LIST, 0);
1566 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1567 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001568 com_addop_name(c, LOAD_ATTR, "append");
1569 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001570 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001571 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001572 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001573 --c->c_tmpname;
1574}
1575
1576static void
1577com_listmaker(struct compiling *c, node *n)
1578{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001579 /* listmaker: test ( list_for | (',' test)* [','] ) */
1580 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001581 com_list_comprehension(c, n);
1582 else {
1583 int len = 0;
1584 int i;
1585 for (i = 0; i < NCH(n); i += 2, len++)
1586 com_node(c, CHILD(n, i));
1587 com_addoparg(c, BUILD_LIST, len);
1588 com_pop(c, len-1);
1589 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001590}
1591
1592static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001593com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001594{
1595 int i;
1596 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1597 for (i = 0; i+2 < NCH(n); i += 4) {
1598 /* We must arrange things just right for STORE_SUBSCR.
1599 It wants the stack to look like (value) (dict) (key) */
1600 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001601 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001602 com_node(c, CHILD(n, i+2)); /* value */
1603 com_addbyte(c, ROT_TWO);
1604 com_node(c, CHILD(n, i)); /* key */
1605 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001606 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001607 }
1608}
1609
1610static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001611com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001612{
1613 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001614 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001615 int i;
1616 REQ(n, atom);
1617 ch = CHILD(n, 0);
1618 switch (TYPE(ch)) {
1619 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001620 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001621 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001622 com_push(c, 1);
1623 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001624 else
1625 com_node(c, CHILD(n, 1));
1626 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001627 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001628 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001629 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001630 com_push(c, 1);
1631 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001632 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001633 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001634 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001635 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001636 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001637 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001638 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001639 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001640 break;
1641 case BACKQUOTE:
1642 com_node(c, CHILD(n, 1));
1643 com_addbyte(c, UNARY_CONVERT);
1644 break;
1645 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001646 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001647 i = 255;
1648 }
1649 else {
1650 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001651 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001652 }
1653 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001654 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001655 break;
1656 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001657 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001658 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001659 c->c_errors++;
1660 i = 255;
1661 }
1662 else {
1663 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001664 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001665 }
1666 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001667 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001668 break;
1669 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001670 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001671 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001672 break;
1673 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001674 com_error(c, PyExc_SystemError,
1675 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001676 }
1677}
1678
1679static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001680com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001681{
1682 if (NCH(n) == 1) {
1683 com_addbyte(c, op);
1684 }
1685 else if (NCH(n) == 2) {
1686 if (TYPE(CHILD(n, 0)) != COLON) {
1687 com_node(c, CHILD(n, 0));
1688 com_addbyte(c, op+1);
1689 }
1690 else {
1691 com_node(c, CHILD(n, 1));
1692 com_addbyte(c, op+2);
1693 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001694 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001695 }
1696 else {
1697 com_node(c, CHILD(n, 0));
1698 com_node(c, CHILD(n, 2));
1699 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001700 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001701 }
1702}
1703
Guido van Rossum635abd21997-01-06 22:56:52 +00001704static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001705com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1706{
1707 if (NCH(n) == 1) {
1708 com_addbyte(c, DUP_TOP);
1709 com_push(c, 1);
1710 com_addbyte(c, SLICE);
1711 com_node(c, augn);
1712 com_addbyte(c, opcode);
1713 com_pop(c, 1);
1714 com_addbyte(c, ROT_TWO);
1715 com_addbyte(c, STORE_SLICE);
1716 com_pop(c, 2);
1717 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1718 com_node(c, CHILD(n, 0));
1719 com_addoparg(c, DUP_TOPX, 2);
1720 com_push(c, 2);
1721 com_addbyte(c, SLICE+1);
1722 com_pop(c, 1);
1723 com_node(c, augn);
1724 com_addbyte(c, opcode);
1725 com_pop(c, 1);
1726 com_addbyte(c, ROT_THREE);
1727 com_addbyte(c, STORE_SLICE+1);
1728 com_pop(c, 3);
1729 } else if (NCH(n) == 2) {
1730 com_node(c, CHILD(n, 1));
1731 com_addoparg(c, DUP_TOPX, 2);
1732 com_push(c, 2);
1733 com_addbyte(c, SLICE+2);
1734 com_pop(c, 1);
1735 com_node(c, augn);
1736 com_addbyte(c, opcode);
1737 com_pop(c, 1);
1738 com_addbyte(c, ROT_THREE);
1739 com_addbyte(c, STORE_SLICE+2);
1740 com_pop(c, 3);
1741 } else {
1742 com_node(c, CHILD(n, 0));
1743 com_node(c, CHILD(n, 2));
1744 com_addoparg(c, DUP_TOPX, 3);
1745 com_push(c, 3);
1746 com_addbyte(c, SLICE+3);
1747 com_pop(c, 2);
1748 com_node(c, augn);
1749 com_addbyte(c, opcode);
1750 com_pop(c, 1);
1751 com_addbyte(c, ROT_FOUR);
1752 com_addbyte(c, STORE_SLICE+3);
1753 com_pop(c, 4);
1754 }
1755}
1756
1757static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001758com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001759{
1760 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001761 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001762 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001763 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001764 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001765 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001766 }
1767 else {
1768 com_node(c, CHILD(n, 0));
1769 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001770 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001771 }
1772 m = n;
1773 do {
1774 m = CHILD(m, 0);
1775 } while (NCH(m) == 1);
1776 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001777 /* f(lambda x: x[0] = 3) ends up getting parsed with
1778 * LHS test = lambda x: x[0], and RHS test = 3.
1779 * SF bug 132313 points out that complaining about a keyword
1780 * then is very confusing.
1781 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001782 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001783 TYPE(m) == lambdef ?
1784 "lambda cannot contain assignment" :
1785 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001786 }
1787 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001788 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001789 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001790 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001791 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001792 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001793 else if (*pkeywords == NULL) {
1794 c->c_errors++;
1795 Py_DECREF(v);
1796 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001797 if (PyDict_GetItem(*pkeywords, v) != NULL)
1798 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001799 "duplicate keyword argument");
1800 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001801 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001802 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001803 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001804 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001805 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001806 }
1807 }
1808 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001809}
1810
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001811static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001812com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001813{
1814 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001815 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001816 }
1817 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001818 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001819 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001820 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001821 int star_flag = 0;
1822 int starstar_flag = 0;
1823 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001824 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001825 na = 0;
1826 nk = 0;
1827 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001828 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001829 if (TYPE(ch) == STAR ||
1830 TYPE(ch) == DOUBLESTAR)
1831 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001832 if (ch->n_lineno != lineno) {
1833 lineno = ch->n_lineno;
1834 com_addoparg(c, SET_LINENO, lineno);
1835 }
1836 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001837 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001838 na++;
1839 else
1840 nk++;
1841 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001842 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001843 while (i < NCH(n)) {
1844 node *tok = CHILD(n, i);
1845 node *ch = CHILD(n, i+1);
1846 i += 3;
1847 switch (TYPE(tok)) {
1848 case STAR: star_flag = 1; break;
1849 case DOUBLESTAR: starstar_flag = 1; break;
1850 }
1851 com_node(c, ch);
1852 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001853 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001854 com_error(c, PyExc_SyntaxError,
1855 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001856 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001857 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001858 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001859 star_flag + (starstar_flag << 1);
1860 else
1861 opcode = CALL_FUNCTION;
1862 com_addoparg(c, opcode, na | (nk << 8));
1863 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001864 }
1865}
1866
1867static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001868com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001869{
1870 com_addopname(c, LOAD_ATTR, n);
1871}
1872
1873static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001874com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001875{
1876 int i=0;
1877 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001878 node *ch;
1879
1880 /* first argument */
1881 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001882 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001883 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001884 i++;
1885 }
1886 else {
1887 com_node(c, CHILD(n,i));
1888 i++;
1889 REQ(CHILD(n,i),COLON);
1890 i++;
1891 }
1892 /* second argument */
1893 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1894 com_node(c, CHILD(n,i));
1895 i++;
1896 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001897 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001898 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001899 com_push(c, 1);
1900 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001901 /* remaining arguments */
1902 for (; i < NCH(n); i++) {
1903 ns++;
1904 ch=CHILD(n,i);
1905 REQ(ch, sliceop);
1906 if (NCH(ch) == 1) {
1907 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001908 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001909 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001910 }
1911 else
1912 com_node(c, CHILD(ch,1));
1913 }
1914 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001915 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001916}
1917
1918static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001919com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001920{
1921 node *ch;
1922 REQ(n, subscript);
1923 ch = CHILD(n,0);
1924 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001925 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001926 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001927 com_push(c, 1);
1928 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001929 else {
1930 /* check for slice */
1931 if ((TYPE(ch) == COLON || NCH(n) > 1))
1932 com_sliceobj(c, n);
1933 else {
1934 REQ(ch, test);
1935 com_node(c, ch);
1936 }
1937 }
1938}
1939
1940static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001941com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001942{
1943 int i, op;
1944 REQ(n, subscriptlist);
1945 /* Check to make backward compatible slice behavior for '[i:j]' */
1946 if (NCH(n) == 1) {
1947 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001948 /* 'Basic' slice, should have exactly one colon. */
1949 if ((TYPE(CHILD(sub, 0)) == COLON
1950 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1951 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1952 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001953 switch (assigning) {
1954 case OP_DELETE:
1955 op = DELETE_SLICE;
1956 break;
1957 case OP_ASSIGN:
1958 op = STORE_SLICE;
1959 break;
1960 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001961 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001962 break;
1963 default:
1964 com_augassign_slice(c, sub, assigning, augn);
1965 return;
1966 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001967 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001968 if (op == STORE_SLICE)
1969 com_pop(c, 2);
1970 else if (op == DELETE_SLICE)
1971 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001972 return;
1973 }
1974 }
1975 /* Else normal subscriptlist. Compile each subscript. */
1976 for (i = 0; i < NCH(n); i += 2)
1977 com_subscript(c, CHILD(n, i));
1978 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001979 if (NCH(n) > 1) {
1980 i = (NCH(n)+1) / 2;
1981 com_addoparg(c, BUILD_TUPLE, i);
1982 com_pop(c, i-1);
1983 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001984 switch (assigning) {
1985 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001986 op = DELETE_SUBSCR;
1987 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001988 break;
1989 default:
1990 case OP_ASSIGN:
1991 op = STORE_SUBSCR;
1992 i = 3;
1993 break;
1994 case OP_APPLY:
1995 op = BINARY_SUBSCR;
1996 i = 1;
1997 break;
1998 }
1999 if (assigning > OP_APPLY) {
2000 com_addoparg(c, DUP_TOPX, 2);
2001 com_push(c, 2);
2002 com_addbyte(c, BINARY_SUBSCR);
2003 com_pop(c, 1);
2004 com_node(c, augn);
2005 com_addbyte(c, assigning);
2006 com_pop(c, 1);
2007 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002008 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002009 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002010 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002011}
2012
2013static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002014com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002015{
2016 REQ(n, trailer);
2017 switch (TYPE(CHILD(n, 0))) {
2018 case LPAR:
2019 com_call_function(c, CHILD(n, 1));
2020 break;
2021 case DOT:
2022 com_select_member(c, CHILD(n, 1));
2023 break;
2024 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002025 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002026 break;
2027 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002028 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002029 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002030 }
2031}
2032
2033static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002034com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002035{
2036 int i;
2037 REQ(n, power);
2038 com_atom(c, CHILD(n, 0));
2039 for (i = 1; i < NCH(n); i++) {
2040 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2041 com_factor(c, CHILD(n, i+1));
2042 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002043 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002044 break;
2045 }
2046 else
2047 com_apply_trailer(c, CHILD(n, i));
2048 }
2049}
2050
2051static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002052com_invert_constant(struct compiling *c, node *n)
2053{
2054 /* Compute the inverse of int and longs and use them directly,
2055 but be prepared to generate code for all other
2056 possibilities (invalid numbers, floats, complex).
2057 */
2058 PyObject *num, *inv = NULL;
2059 int i;
2060
2061 REQ(n, NUMBER);
2062 num = parsenumber(c, STR(n));
2063 if (num == NULL)
2064 i = 255;
2065 else {
2066 inv = PyNumber_Invert(num);
2067 if (inv == NULL) {
2068 PyErr_Clear();
2069 i = com_addconst(c, num);
2070 } else {
2071 i = com_addconst(c, inv);
2072 Py_DECREF(inv);
2073 }
2074 Py_DECREF(num);
2075 }
2076 com_addoparg(c, LOAD_CONST, i);
2077 com_push(c, 1);
2078 if (num != NULL && inv == NULL)
2079 com_addbyte(c, UNARY_INVERT);
2080}
2081
Tim Peters51e26512001-09-07 08:45:55 +00002082static int
2083is_float_zero(const char *p)
2084{
2085 int found_radix_point = 0;
2086 int ch;
2087 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2088 switch (ch) {
2089 case '0':
2090 /* no reason to believe it's not 0 -- continue */
2091 break;
2092
2093 case 'e': case 'E': case 'j': case 'J':
2094 /* If this was a hex constant, we already would have
2095 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2096 must be an exponent marker, and we haven't yet
2097 seen a non-zero digit, and it doesn't matter what
2098 the exponent is then. For 'j' or 'J' similarly,
2099 except that this is an imaginary 0 then. */
2100 return 1;
2101
2102 case '.':
2103 found_radix_point = 1;
2104 break;
2105
2106 default:
2107 return 0;
2108 }
2109 }
2110 return found_radix_point;
2111}
2112
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002113static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002114com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002115{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002116 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002117 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002118 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002119 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002120 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002121 approriate value as a constant. If the value is negative,
2122 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002123 negative in the 0th position -- unless we're doing unary minus
2124 of a floating zero! In that case the sign is significant, but
2125 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002126 */
2127 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002128 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002129 && TYPE((pfactor = CHILD(n, 1))) == factor
2130 && NCH(pfactor) == 1
2131 && TYPE((ppower = CHILD(pfactor, 0))) == power
2132 && NCH(ppower) == 1
2133 && TYPE((patom = CHILD(ppower, 0))) == atom
2134 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
2135 && !(childtype == MINUS && is_float_zero(STR(pnum)))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002136 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002137 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002138 return;
2139 }
2140 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002141 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002142 if (s == NULL) {
2143 com_error(c, PyExc_MemoryError, "");
2144 com_addbyte(c, 255);
2145 return;
2146 }
2147 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002148 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002149 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002150 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002151 }
Tim Peters51e26512001-09-07 08:45:55 +00002152 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002153 }
2154 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002155 com_factor(c, CHILD(n, 1));
2156 com_addbyte(c, UNARY_POSITIVE);
2157 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002158 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002159 com_factor(c, CHILD(n, 1));
2160 com_addbyte(c, UNARY_NEGATIVE);
2161 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002162 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002163 com_factor(c, CHILD(n, 1));
2164 com_addbyte(c, UNARY_INVERT);
2165 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002166 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002167 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002168 }
2169}
2170
2171static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002172com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002173{
2174 int i;
2175 int op;
2176 REQ(n, term);
2177 com_factor(c, CHILD(n, 0));
2178 for (i = 2; i < NCH(n); i += 2) {
2179 com_factor(c, CHILD(n, i));
2180 switch (TYPE(CHILD(n, i-1))) {
2181 case STAR:
2182 op = BINARY_MULTIPLY;
2183 break;
2184 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002185 if (c->c_flags & CO_FUTURE_DIVISION)
2186 op = BINARY_TRUE_DIVIDE;
2187 else
2188 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002189 break;
2190 case PERCENT:
2191 op = BINARY_MODULO;
2192 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002193 case DOUBLESLASH:
2194 op = BINARY_FLOOR_DIVIDE;
2195 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002196 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002197 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002198 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002199 op = 255;
2200 }
2201 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002202 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002203 }
2204}
2205
2206static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002207com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002208{
2209 int i;
2210 int op;
2211 REQ(n, arith_expr);
2212 com_term(c, CHILD(n, 0));
2213 for (i = 2; i < NCH(n); i += 2) {
2214 com_term(c, CHILD(n, i));
2215 switch (TYPE(CHILD(n, i-1))) {
2216 case PLUS:
2217 op = BINARY_ADD;
2218 break;
2219 case MINUS:
2220 op = BINARY_SUBTRACT;
2221 break;
2222 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002223 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002224 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002225 op = 255;
2226 }
2227 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002228 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002229 }
2230}
2231
2232static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002233com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002234{
2235 int i;
2236 int op;
2237 REQ(n, shift_expr);
2238 com_arith_expr(c, CHILD(n, 0));
2239 for (i = 2; i < NCH(n); i += 2) {
2240 com_arith_expr(c, CHILD(n, i));
2241 switch (TYPE(CHILD(n, i-1))) {
2242 case LEFTSHIFT:
2243 op = BINARY_LSHIFT;
2244 break;
2245 case RIGHTSHIFT:
2246 op = BINARY_RSHIFT;
2247 break;
2248 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002249 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002250 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002251 op = 255;
2252 }
2253 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002254 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002255 }
2256}
2257
2258static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002259com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002260{
2261 int i;
2262 int op;
2263 REQ(n, and_expr);
2264 com_shift_expr(c, CHILD(n, 0));
2265 for (i = 2; i < NCH(n); i += 2) {
2266 com_shift_expr(c, CHILD(n, i));
2267 if (TYPE(CHILD(n, i-1)) == AMPER) {
2268 op = BINARY_AND;
2269 }
2270 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002271 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002272 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002273 op = 255;
2274 }
2275 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002276 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002277 }
2278}
2279
2280static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002281com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002282{
2283 int i;
2284 int op;
2285 REQ(n, xor_expr);
2286 com_and_expr(c, CHILD(n, 0));
2287 for (i = 2; i < NCH(n); i += 2) {
2288 com_and_expr(c, CHILD(n, i));
2289 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2290 op = BINARY_XOR;
2291 }
2292 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002293 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002294 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002295 op = 255;
2296 }
2297 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002298 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002299 }
2300}
2301
2302static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002303com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002304{
2305 int i;
2306 int op;
2307 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002308 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002309 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002310 com_xor_expr(c, CHILD(n, i));
2311 if (TYPE(CHILD(n, i-1)) == VBAR) {
2312 op = BINARY_OR;
2313 }
2314 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002315 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002316 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002317 op = 255;
2318 }
2319 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002320 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002321 }
2322}
2323
2324static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002325cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002326{
2327 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00002328 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002329 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2330 if (NCH(n) == 1) {
2331 n = CHILD(n, 0);
2332 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002333 case LESS: return PyCmp_LT;
2334 case GREATER: return PyCmp_GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002335 case EQEQUAL: /* == */
Martin v. Löwis7198a522002-01-01 19:59:11 +00002336 case EQUAL: return PyCmp_EQ;
2337 case LESSEQUAL: return PyCmp_LE;
2338 case GREATEREQUAL: return PyCmp_GE;
2339 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2340 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2341 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002342 }
2343 }
2344 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002345 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002346 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002347 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002348 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002349 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002350 }
2351 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002352 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002353}
2354
2355static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002356com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002357{
2358 int i;
2359 enum cmp_op op;
2360 int anchor;
2361 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2362 com_expr(c, CHILD(n, 0));
2363 if (NCH(n) == 1)
2364 return;
2365
2366 /****************************************************************
2367 The following code is generated for all but the last
2368 comparison in a chain:
2369
2370 label: on stack: opcode: jump to:
2371
2372 a <code to load b>
2373 a, b DUP_TOP
2374 a, b, b ROT_THREE
2375 b, a, b COMPARE_OP
2376 b, 0-or-1 JUMP_IF_FALSE L1
2377 b, 1 POP_TOP
2378 b
2379
2380 We are now ready to repeat this sequence for the next
2381 comparison in the chain.
2382
2383 For the last we generate:
2384
2385 b <code to load c>
2386 b, c COMPARE_OP
2387 0-or-1
2388
2389 If there were any jumps to L1 (i.e., there was more than one
2390 comparison), we generate:
2391
2392 0-or-1 JUMP_FORWARD L2
2393 L1: b, 0 ROT_TWO
2394 0, b POP_TOP
2395 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002396 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002397 ****************************************************************/
2398
2399 anchor = 0;
2400
2401 for (i = 2; i < NCH(n); i += 2) {
2402 com_expr(c, CHILD(n, i));
2403 if (i+2 < NCH(n)) {
2404 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002405 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002406 com_addbyte(c, ROT_THREE);
2407 }
2408 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002409 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002410 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002411 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002412 }
2413 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002414 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002415 if (i+2 < NCH(n)) {
2416 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2417 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002418 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002419 }
2420 }
2421
2422 if (anchor) {
2423 int anchor2 = 0;
2424 com_addfwref(c, JUMP_FORWARD, &anchor2);
2425 com_backpatch(c, anchor);
2426 com_addbyte(c, ROT_TWO);
2427 com_addbyte(c, POP_TOP);
2428 com_backpatch(c, anchor2);
2429 }
2430}
2431
2432static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002433com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002434{
2435 REQ(n, not_test); /* 'not' not_test | comparison */
2436 if (NCH(n) == 1) {
2437 com_comparison(c, CHILD(n, 0));
2438 }
2439 else {
2440 com_not_test(c, CHILD(n, 1));
2441 com_addbyte(c, UNARY_NOT);
2442 }
2443}
2444
2445static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002446com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002447{
2448 int i;
2449 int anchor;
2450 REQ(n, and_test); /* not_test ('and' not_test)* */
2451 anchor = 0;
2452 i = 0;
2453 for (;;) {
2454 com_not_test(c, CHILD(n, i));
2455 if ((i += 2) >= NCH(n))
2456 break;
2457 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2458 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002459 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002460 }
2461 if (anchor)
2462 com_backpatch(c, anchor);
2463}
2464
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002465static int
2466com_make_closure(struct compiling *c, PyCodeObject *co)
2467{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002468 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002469 if (free == 0)
2470 return 0;
2471 for (i = 0; i < free; ++i) {
2472 /* Bypass com_addop_varname because it will generate
2473 LOAD_DEREF but LOAD_CLOSURE is needed.
2474 */
2475 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2476 int arg, reftype;
2477
2478 /* Special case: If a class contains a method with a
2479 free variable that has the same name as a method,
2480 the name will be considered free *and* local in the
2481 class. It should be handled by the closure, as
2482 well as by the normal name loookup logic.
2483 */
2484 reftype = get_ref_type(c, PyString_AS_STRING(name));
2485 if (reftype == CELL)
2486 arg = com_lookup_arg(c->c_cellvars, name);
2487 else /* (reftype == FREE) */
2488 arg = com_lookup_arg(c->c_freevars, name);
2489 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002490 fprintf(stderr, "lookup %s in %s %d %d\n"
2491 "freevars of %s: %s\n",
2492 PyObject_REPR(name),
2493 c->c_name,
2494 reftype, arg,
2495 PyString_AS_STRING(co->co_name),
2496 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002497 Py_FatalError("com_make_closure()");
2498 }
2499 com_addoparg(c, LOAD_CLOSURE, arg);
2500
2501 }
2502 com_push(c, free);
2503 return 1;
2504}
2505
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002506static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002507com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002508{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002509 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002510 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002511 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002512 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002513 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002514 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2515 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002516 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002517 if (co == NULL) {
2518 c->c_errors++;
2519 return;
2520 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002521 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002522 i = com_addconst(c, (PyObject *)co);
2523 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002524 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002525 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002526 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002527 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002528 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002529 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002530 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002531 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002532 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002533 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002534 else {
2535 int anchor = 0;
2536 int i = 0;
2537 for (;;) {
2538 com_and_test(c, CHILD(n, i));
2539 if ((i += 2) >= NCH(n))
2540 break;
2541 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2542 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002543 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002544 }
2545 if (anchor)
2546 com_backpatch(c, anchor);
2547 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002548}
2549
2550static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002551com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002552{
2553 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002554 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002555 com_node(c, CHILD(n, 0));
2556 }
2557 else {
2558 int i;
2559 int len;
2560 len = (NCH(n) + 1) / 2;
2561 for (i = 0; i < NCH(n); i += 2)
2562 com_node(c, CHILD(n, i));
2563 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002564 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002565 }
2566}
2567
2568
2569/* Begin of assignment compilation */
2570
Thomas Wouters434d0822000-08-24 20:11:32 +00002571
2572static void
2573com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2574{
2575 com_addbyte(c, DUP_TOP);
2576 com_push(c, 1);
2577 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002578 com_node(c, augn);
2579 com_addbyte(c, opcode);
2580 com_pop(c, 1);
2581 com_addbyte(c, ROT_TWO);
2582 com_addopname(c, STORE_ATTR, n);
2583 com_pop(c, 2);
2584}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002585
2586static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002587com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002588{
2589 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002590 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002591}
2592
2593static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002594com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002595{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002596 REQ(n, trailer);
2597 switch (TYPE(CHILD(n, 0))) {
2598 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002599 if (assigning == OP_DELETE)
2600 com_error(c, PyExc_SyntaxError,
2601 "can't delete function call");
2602 else
2603 com_error(c, PyExc_SyntaxError,
2604 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002605 break;
2606 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002607 if (assigning > OP_APPLY)
2608 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2609 else
2610 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002611 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002612 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002613 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002614 break;
2615 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002616 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002617 }
2618}
2619
2620static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002621com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002622{
2623 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002624 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002625 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002626 if (assigning) {
2627 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002628 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002629 com_push(c, i-1);
2630 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002631 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002632 com_assign(c, CHILD(n, i), assigning, NULL);
2633}
2634
2635static void
2636com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2637{
2638 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002639 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002640 com_push(c, 1);
2641 com_node(c, augn);
2642 com_addbyte(c, opcode);
2643 com_pop(c, 1);
2644 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002645}
2646
2647static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002648com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002649{
2650 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002651 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002652 if (assigning)
2653 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002654}
2655
2656static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002657com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002658{
2659 /* Loop to avoid trivial recursion */
2660 for (;;) {
2661 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002662
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002663 case exprlist:
2664 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002665 case testlist1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002666 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002667 if (assigning > OP_APPLY) {
2668 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002669 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002670 return;
2671 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002672 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002673 return;
2674 }
2675 n = CHILD(n, 0);
2676 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002677
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002678 case test:
2679 case and_test:
2680 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002681 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002682 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002683 case xor_expr:
2684 case and_expr:
2685 case shift_expr:
2686 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002687 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002688 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002689 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002690 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002691 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002692 return;
2693 }
2694 n = CHILD(n, 0);
2695 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002696
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002697 case power: /* atom trailer* ('**' power)*
2698 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002699 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002700 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002701 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002702 return;
2703 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002704 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002705 int i;
2706 com_node(c, CHILD(n, 0));
2707 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002708 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002709 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002710 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002711 return;
2712 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002713 com_apply_trailer(c, CHILD(n, i));
2714 } /* NB i is still alive */
2715 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002716 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002717 return;
2718 }
2719 n = CHILD(n, 0);
2720 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002721
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002722 case atom:
2723 switch (TYPE(CHILD(n, 0))) {
2724 case LPAR:
2725 n = CHILD(n, 1);
2726 if (TYPE(n) == RPAR) {
2727 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002728 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002729 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002730 return;
2731 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002732 if (assigning > OP_APPLY) {
2733 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002734 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002735 return;
2736 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002737 break;
2738 case LSQB:
2739 n = CHILD(n, 1);
2740 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002741 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002742 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002743 return;
2744 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002745 if (assigning > OP_APPLY) {
2746 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002747 "augmented assign to list not possible");
2748 return;
2749 }
2750 if (NCH(n) > 1
2751 && TYPE(CHILD(n, 1)) == list_for) {
2752 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002753 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002754 return;
2755 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002756 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002757 return;
2758 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002759 if (assigning > OP_APPLY)
2760 com_augassign_name(c, CHILD(n, 0),
2761 assigning, augn);
2762 else
2763 com_assign_name(c, CHILD(n, 0),
2764 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002765 return;
2766 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002767 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002768 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002769 return;
2770 }
2771 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002772
2773 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002774 com_error(c, PyExc_SyntaxError,
2775 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002776 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002777
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002778 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002779 com_error(c, PyExc_SystemError,
2780 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002781 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002782
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002783 }
2784 }
2785}
Guido van Rossum7c531111997-03-11 18:42:21 +00002786
Thomas Wouters434d0822000-08-24 20:11:32 +00002787static void
2788com_augassign(struct compiling *c, node *n)
2789{
2790 int opcode;
2791
2792 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2793 case '+': opcode = INPLACE_ADD; break;
2794 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002795 case '/':
2796 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
2797 opcode = INPLACE_FLOOR_DIVIDE;
2798 else if (c->c_flags & CO_FUTURE_DIVISION)
2799 opcode = INPLACE_TRUE_DIVIDE;
2800 else
2801 opcode = INPLACE_DIVIDE;
2802 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00002803 case '%': opcode = INPLACE_MODULO; break;
2804 case '<': opcode = INPLACE_LSHIFT; break;
2805 case '>': opcode = INPLACE_RSHIFT; break;
2806 case '&': opcode = INPLACE_AND; break;
2807 case '^': opcode = INPLACE_XOR; break;
2808 case '|': opcode = INPLACE_OR; break;
2809 case '*':
2810 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2811 opcode = INPLACE_POWER;
2812 else
2813 opcode = INPLACE_MULTIPLY;
2814 break;
2815 default:
2816 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2817 return;
2818 }
2819 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2820}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002821
2822static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002823com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002824{
Thomas Wouters434d0822000-08-24 20:11:32 +00002825 REQ(n, expr_stmt);
2826 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002827 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002828 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002829 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002830 if (NCH(n) == 1) {
2831 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002832 if (c->c_interactive)
2833 com_addbyte(c, PRINT_EXPR);
2834 else
2835 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002836 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002837 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002838 else if (TYPE(CHILD(n,1)) == augassign)
2839 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002840 else {
2841 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002842 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002843 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002844 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002845 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002846 com_push(c, 1);
2847 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002848 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002849 }
2850 }
2851}
2852
2853static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002854com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002855{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002856 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002857 int i;
2858 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002859 if (Py_OptimizeFlag)
2860 return;
2861 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00002862
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002863 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00002864 raise AssertionError [, <message>]
2865
2866 where <message> is the second test, if present.
2867 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002868 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002869 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002870 com_addbyte(c, POP_TOP);
2871 com_pop(c, 1);
2872 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002873 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002874 com_push(c, 1);
2875 i = NCH(n)/2; /* Either 2 or 4 */
2876 if (i > 1)
2877 com_node(c, CHILD(n, 3));
2878 com_addoparg(c, RAISE_VARARGS, i);
2879 com_pop(c, i);
2880 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002881 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002882 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002883 com_addbyte(c, POP_TOP);
2884}
2885
2886static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002887com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002888{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002889 int i = 1;
2890 node* stream = NULL;
2891
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002892 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002893
2894 /* are we using the extended print form? */
2895 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2896 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002897 com_node(c, stream);
2898 /* stack: [...] => [... stream] */
2899 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002900 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2901 i = 4;
2902 else
2903 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002904 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002905 for (; i < NCH(n); i += 2) {
2906 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002907 com_addbyte(c, DUP_TOP);
2908 /* stack: [stream] => [stream stream] */
2909 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002910 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002911 /* stack: [stream stream] => [stream stream obj] */
2912 com_addbyte(c, ROT_TWO);
2913 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002914 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002915 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002916 com_pop(c, 2);
2917 }
2918 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002919 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002920 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002921 com_addbyte(c, PRINT_ITEM);
2922 com_pop(c, 1);
2923 }
2924 }
2925 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002926 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002927 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002928 /* must pop the extra stream object off the stack */
2929 com_addbyte(c, POP_TOP);
2930 /* stack: [... stream] => [...] */
2931 com_pop(c, 1);
2932 }
2933 }
2934 else {
2935 if (stream != NULL) {
2936 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002937 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002938 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002939 com_pop(c, 1);
2940 }
2941 else
2942 com_addbyte(c, PRINT_NEWLINE);
2943 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002944}
2945
2946static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002947com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002948{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002949 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002950 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002951 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002952 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002953 if (c->c_flags & CO_GENERATOR) {
2954 if (NCH(n) > 1) {
2955 com_error(c, PyExc_SyntaxError,
2956 "'return' with argument inside generator");
2957 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002958 }
2959 if (NCH(n) < 2) {
2960 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002961 com_push(c, 1);
2962 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002963 else
2964 com_node(c, CHILD(n, 1));
2965 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00002966 com_pop(c, 1);
2967}
2968
2969static void
2970com_yield_stmt(struct compiling *c, node *n)
2971{
Tim Peters95c80f82001-06-23 02:07:08 +00002972 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00002973 REQ(n, yield_stmt); /* 'yield' testlist */
2974 if (!c->c_infunction) {
2975 com_error(c, PyExc_SyntaxError, "'yield' outside function");
2976 }
Tim Peters95c80f82001-06-23 02:07:08 +00002977
2978 for (i = 0; i < c->c_nblocks; ++i) {
2979 if (c->c_block[i] == SETUP_FINALLY) {
2980 com_error(c, PyExc_SyntaxError,
2981 "'yield' not allowed in a 'try' block "
2982 "with a 'finally' clause");
2983 return;
2984 }
2985 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002986 com_node(c, CHILD(n, 1));
2987 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002988 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002989}
2990
2991static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002992com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002993{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002994 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002995 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2996 if (NCH(n) > 1) {
2997 com_node(c, CHILD(n, 1));
2998 if (NCH(n) > 3) {
2999 com_node(c, CHILD(n, 3));
3000 if (NCH(n) > 5)
3001 com_node(c, CHILD(n, 5));
3002 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003003 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003004 i = NCH(n)/2;
3005 com_addoparg(c, RAISE_VARARGS, i);
3006 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003007}
3008
3009static void
Thomas Wouters52152252000-08-17 22:55:00 +00003010com_from_import(struct compiling *c, node *n)
3011{
3012 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3013 com_push(c, 1);
3014 if (NCH(n) > 1) {
3015 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3016 com_error(c, PyExc_SyntaxError, "invalid syntax");
3017 return;
3018 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003019 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003020 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003021 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003022 com_pop(c, 1);
3023}
3024
3025static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003026com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003027{
3028 int i;
3029 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003030 /* 'import' dotted_name (',' dotted_name)* |
3031 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003032 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00003033 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003034 /* 'from' dotted_name 'import' ... */
3035 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003036
3037 if (TYPE(CHILD(n, 3)) == STAR) {
3038 tup = Py_BuildValue("(s)", "*");
3039 } else {
3040 tup = PyTuple_New((NCH(n) - 2)/2);
3041 for (i = 3; i < NCH(n); i += 2) {
3042 PyTuple_SET_ITEM(tup, (i-3)/2,
3043 PyString_FromString(STR(
Jeremy Hylton4419ac12001-02-28 22:54:51 +00003044 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003045 }
3046 }
3047 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003048 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003049 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003050 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00003051 if (TYPE(CHILD(n, 3)) == STAR)
3052 com_addbyte(c, IMPORT_STAR);
3053 else {
3054 for (i = 3; i < NCH(n); i += 2)
3055 com_from_import(c, CHILD(n, i));
3056 com_addbyte(c, POP_TOP);
3057 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003058 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003059 }
3060 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003061 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003062 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003063 node *subn = CHILD(n, i);
3064 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003065 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003066 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003067 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003068 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003069 int j;
3070 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003071 com_error(c, PyExc_SyntaxError,
3072 "invalid syntax");
3073 return;
3074 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003075 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3076 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003077 CHILD(CHILD(subn, 0),
3078 j));
3079 com_addop_varname(c, VAR_STORE,
3080 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003081 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003082 com_addop_varname(c, VAR_STORE,
3083 STR(CHILD(CHILD(subn, 0),
3084 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003085 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003086 }
3087 }
3088}
3089
3090static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003091com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003092{
3093 REQ(n, exec_stmt);
3094 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3095 com_node(c, CHILD(n, 1));
3096 if (NCH(n) >= 4)
3097 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003098 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003099 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003100 com_push(c, 1);
3101 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003102 if (NCH(n) >= 6)
3103 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003104 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003105 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003106 com_push(c, 1);
3107 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003108 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003109 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003110}
3111
Guido van Rossum7c531111997-03-11 18:42:21 +00003112static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003113is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003114{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003115 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003116 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003117 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003118
3119 /* Label to avoid tail recursion */
3120 next:
3121 switch (TYPE(n)) {
3122
3123 case suite:
3124 if (NCH(n) == 1) {
3125 n = CHILD(n, 0);
3126 goto next;
3127 }
3128 /* Fall through */
3129 case file_input:
3130 for (i = 0; i < NCH(n); i++) {
3131 node *ch = CHILD(n, i);
3132 if (TYPE(ch) == stmt) {
3133 n = ch;
3134 goto next;
3135 }
3136 }
3137 break;
3138
3139 case stmt:
3140 case simple_stmt:
3141 case small_stmt:
3142 n = CHILD(n, 0);
3143 goto next;
3144
3145 case expr_stmt:
3146 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003147 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003148 case test:
3149 case and_test:
3150 case not_test:
3151 case comparison:
3152 case expr:
3153 case xor_expr:
3154 case and_expr:
3155 case shift_expr:
3156 case arith_expr:
3157 case term:
3158 case factor:
3159 case power:
3160 case atom:
3161 if (NCH(n) == 1) {
3162 n = CHILD(n, 0);
3163 goto next;
3164 }
3165 break;
3166
3167 case NAME:
3168 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3169 return 1;
3170 break;
3171
3172 case NUMBER:
3173 v = parsenumber(c, STR(n));
3174 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003175 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003176 break;
3177 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003178 i = PyObject_IsTrue(v);
3179 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003180 return i == 0;
3181
3182 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003183 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003184 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003185 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003186 break;
3187 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003188 i = PyObject_IsTrue(v);
3189 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003190 return i == 0;
3191
3192 }
3193 return 0;
3194}
3195
Tim Peters08a898f2001-06-28 01:52:22 +00003196
3197/* Look under n for a return stmt with an expression.
3198 * This hack is used to find illegal returns under "if 0:" blocks in
3199 * functions already known to be generators (as determined by the symtable
3200 * pass).
3201 * Return the offending return node if found, else NULL.
3202 */
3203static node *
3204look_for_offending_return(node *n)
3205{
3206 int i;
3207
3208 for (i = 0; i < NCH(n); ++i) {
3209 node *kid = CHILD(n, i);
3210
3211 switch (TYPE(kid)) {
3212 case classdef:
3213 case funcdef:
3214 case lambdef:
3215 /* Stuff in nested functions & classes doesn't
3216 affect the code block we started in. */
3217 return NULL;
3218
3219 case return_stmt:
3220 if (NCH(kid) > 1)
3221 return kid;
3222 break;
3223
3224 default: {
3225 node *bad = look_for_offending_return(kid);
3226 if (bad != NULL)
3227 return bad;
3228 }
3229 }
3230 }
3231
3232 return NULL;
3233}
3234
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003235static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003236com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003237{
3238 int i;
3239 int anchor = 0;
3240 REQ(n, if_stmt);
3241 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3242 for (i = 0; i+3 < NCH(n); i+=4) {
3243 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003244 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003245 if (is_constant_false(c, ch)) {
3246 /* We're going to skip this block. However, if this
3247 is a generator, we have to check the dead code
3248 anyway to make sure there aren't any return stmts
3249 with expressions, in the same scope. */
3250 if (c->c_flags & CO_GENERATOR) {
3251 node *p = look_for_offending_return(n);
3252 if (p != NULL) {
3253 int savelineno = c->c_lineno;
3254 c->c_lineno = p->n_lineno;
3255 com_error(c, PyExc_SyntaxError,
3256 "'return' with argument "
3257 "inside generator");
3258 c->c_lineno = savelineno;
3259 }
3260 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003261 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003262 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003263 if (i > 0)
3264 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003265 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003266 com_addfwref(c, JUMP_IF_FALSE, &a);
3267 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003268 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003269 com_node(c, CHILD(n, i+3));
3270 com_addfwref(c, JUMP_FORWARD, &anchor);
3271 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003272 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003273 com_addbyte(c, POP_TOP);
3274 }
3275 if (i+2 < NCH(n))
3276 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003277 if (anchor)
3278 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003279}
3280
3281static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003282com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003283{
3284 int break_anchor = 0;
3285 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003286 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003287 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3288 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003289 block_push(c, SETUP_LOOP);
3290 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003291 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003292 com_node(c, CHILD(n, 1));
3293 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3294 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003295 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003296 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003297 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003298 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003299 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3300 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003301 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003302 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003303 com_addbyte(c, POP_TOP);
3304 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003305 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003306 if (NCH(n) > 4)
3307 com_node(c, CHILD(n, 6));
3308 com_backpatch(c, break_anchor);
3309}
3310
3311static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003312com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003313{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003314 int break_anchor = 0;
3315 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003316 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003317 REQ(n, for_stmt);
3318 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3319 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003320 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003321 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003322 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003323 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003324 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003325 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003326 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003327 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003328 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003329 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003330 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003331 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3332 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003333 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003334 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003335 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003336 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003337 if (NCH(n) > 8)
3338 com_node(c, CHILD(n, 8));
3339 com_backpatch(c, break_anchor);
3340}
3341
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003342/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003343
3344 SETUP_FINALLY L
3345 <code for S>
3346 POP_BLOCK
3347 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003348 L: <code for Sf>
3349 END_FINALLY
3350
3351 The special instructions use the block stack. Each block
3352 stack entry contains the instruction that created it (here
3353 SETUP_FINALLY), the level of the value stack at the time the
3354 block stack entry was created, and a label (here L).
3355
3356 SETUP_FINALLY:
3357 Pushes the current value stack level and the label
3358 onto the block stack.
3359 POP_BLOCK:
3360 Pops en entry from the block stack, and pops the value
3361 stack until its level is the same as indicated on the
3362 block stack. (The label is ignored.)
3363 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003364 Pops a variable number of entries from the *value* stack
3365 and re-raises the exception they specify. The number of
3366 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003367
3368 The block stack is unwound when an exception is raised:
3369 when a SETUP_FINALLY entry is found, the exception is pushed
3370 onto the value stack (and the exception condition is cleared),
3371 and the interpreter jumps to the label gotten from the block
3372 stack.
3373
3374 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003375 (The contents of the value stack is shown in [], with the top
3376 at the right; 'tb' is trace-back info, 'val' the exception's
3377 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003378
3379 Value stack Label Instruction Argument
3380 [] SETUP_EXCEPT L1
3381 [] <code for S>
3382 [] POP_BLOCK
3383 [] JUMP_FORWARD L0
3384
Guido van Rossum3f5da241990-12-20 15:06:42 +00003385 [tb, val, exc] L1: DUP )
3386 [tb, val, exc, exc] <evaluate E1> )
3387 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3388 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3389 [tb, val, exc, 1] POP )
3390 [tb, val, exc] POP
3391 [tb, val] <assign to V1> (or POP if no V1)
3392 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003393 [] <code for S1>
3394 JUMP_FORWARD L0
3395
Guido van Rossum3f5da241990-12-20 15:06:42 +00003396 [tb, val, exc, 0] L2: POP
3397 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003398 .............................etc.......................
3399
Guido van Rossum3f5da241990-12-20 15:06:42 +00003400 [tb, val, exc, 0] Ln+1: POP
3401 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003402
3403 [] L0: <next statement>
3404
3405 Of course, parts are not generated if Vi or Ei is not present.
3406*/
3407
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003408static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003409com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003410{
3411 int except_anchor = 0;
3412 int end_anchor = 0;
3413 int else_anchor = 0;
3414 int i;
3415 node *ch;
3416
3417 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3418 block_push(c, SETUP_EXCEPT);
3419 com_node(c, CHILD(n, 2));
3420 com_addbyte(c, POP_BLOCK);
3421 block_pop(c, SETUP_EXCEPT);
3422 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3423 com_backpatch(c, except_anchor);
3424 for (i = 3;
3425 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3426 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003427 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003428 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003429 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003430 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003431 break;
3432 }
3433 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003434 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003435 com_addoparg(c, SET_LINENO, ch->n_lineno);
3436 if (NCH(ch) > 1) {
3437 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003438 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003439 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003440 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003441 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003442 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3443 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003444 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003445 }
3446 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003447 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003448 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003449 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003450 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003451 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003452 com_pop(c, 1);
3453 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003454 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003455 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003456 com_node(c, CHILD(n, i+2));
3457 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3458 if (except_anchor) {
3459 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003460 /* We come in with [tb, val, exc, 0] on the
3461 stack; one pop and it's the same as
3462 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003463 com_addbyte(c, POP_TOP);
3464 }
3465 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003466 /* We actually come in here with [tb, val, exc] but the
3467 END_FINALLY will zap those and jump around.
3468 The c_stacklevel does not reflect them so we need not pop
3469 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003470 com_addbyte(c, END_FINALLY);
3471 com_backpatch(c, else_anchor);
3472 if (i < NCH(n))
3473 com_node(c, CHILD(n, i+2));
3474 com_backpatch(c, end_anchor);
3475}
3476
3477static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003478com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003479{
3480 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003481 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003482
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003483 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3484 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003485 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003486 com_addbyte(c, POP_BLOCK);
3487 block_pop(c, SETUP_FINALLY);
3488 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003489 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003490 /* While the generated code pushes only one item,
3491 the try-finally handling can enter here with
3492 up to three items. OK, here are the details:
3493 3 for an exception, 2 for RETURN, 1 for BREAK. */
3494 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003495 com_backpatch(c, finally_anchor);
3496 ch = CHILD(n, NCH(n)-1);
3497 com_addoparg(c, SET_LINENO, ch->n_lineno);
3498 com_node(c, ch);
3499 com_addbyte(c, END_FINALLY);
3500 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003501 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003502}
3503
3504static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003505com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003506{
3507 REQ(n, try_stmt);
3508 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3509 | 'try' ':' suite 'finally' ':' suite */
3510 if (TYPE(CHILD(n, 3)) != except_clause)
3511 com_try_finally(c, n);
3512 else
3513 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003514}
3515
Guido van Rossum8b993a91997-01-17 21:04:03 +00003516static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003517get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003518{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003519 int i;
3520
Guido van Rossum8b993a91997-01-17 21:04:03 +00003521 /* Label to avoid tail recursion */
3522 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003523 switch (TYPE(n)) {
3524
3525 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003526 if (NCH(n) == 1) {
3527 n = CHILD(n, 0);
3528 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003529 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003530 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003531 case file_input:
3532 for (i = 0; i < NCH(n); i++) {
3533 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003534 if (TYPE(ch) == stmt) {
3535 n = ch;
3536 goto next;
3537 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003538 }
3539 break;
3540
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003541 case stmt:
3542 case simple_stmt:
3543 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003544 n = CHILD(n, 0);
3545 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003546
3547 case expr_stmt:
3548 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003549 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003550 case test:
3551 case and_test:
3552 case not_test:
3553 case comparison:
3554 case expr:
3555 case xor_expr:
3556 case and_expr:
3557 case shift_expr:
3558 case arith_expr:
3559 case term:
3560 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003561 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003562 if (NCH(n) == 1) {
3563 n = CHILD(n, 0);
3564 goto next;
3565 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003566 break;
3567
3568 case atom:
3569 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003570 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003571 break;
3572
3573 }
3574 return NULL;
3575}
3576
Guido van Rossum79f25d91997-04-29 20:08:16 +00003577static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003578get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003579{
Guido van Rossum541563e1999-01-28 15:08:09 +00003580 /* Don't generate doc-strings if run with -OO */
3581 if (Py_OptimizeFlag > 1)
3582 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003583 n = get_rawdocstring(n);
3584 if (n == NULL)
3585 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003586 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003587}
3588
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003589static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003590com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003591{
3592 REQ(n, suite);
3593 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3594 if (NCH(n) == 1) {
3595 com_node(c, CHILD(n, 0));
3596 }
3597 else {
3598 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003599 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003600 node *ch = CHILD(n, i);
3601 if (TYPE(ch) == stmt)
3602 com_node(c, ch);
3603 }
3604 }
3605}
3606
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003607/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003608static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003609com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003610{
3611 int i = c->c_nblocks;
3612 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3613 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3614 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003615 else if (i <= 0) {
3616 /* at the outer level */
3617 com_error(c, PyExc_SyntaxError,
3618 "'continue' not properly in loop");
3619 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003620 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003621 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003622 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003623 if (c->c_block[j] == SETUP_LOOP)
3624 break;
3625 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003626 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003627 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003628 for (; i > j; --i) {
3629 if (c->c_block[i] == SETUP_EXCEPT ||
3630 c->c_block[i] == SETUP_FINALLY) {
3631 com_addoparg(c, CONTINUE_LOOP,
3632 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003633 return;
3634 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003635 if (c->c_block[i] == END_FINALLY) {
3636 com_error(c, PyExc_SyntaxError,
3637 "'continue' not supported inside 'finally' clause");
3638 return;
3639 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003640 }
3641 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003642 com_error(c, PyExc_SyntaxError,
3643 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003644 }
3645 /* XXX Could allow it inside a 'finally' clause
3646 XXX if we could pop the exception still on the stack */
3647}
3648
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003649static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003650com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003651{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003652 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003653 if (TYPE(n) == lambdef) {
3654 /* lambdef: 'lambda' [varargslist] ':' test */
3655 n = CHILD(n, 1);
3656 }
3657 else {
3658 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3659 n = CHILD(n, 2);
3660 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3661 n = CHILD(n, 1);
3662 }
3663 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003664 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003665 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003666 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003667 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3668 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003669 nargs = 0;
3670 ndefs = 0;
3671 for (i = 0; i < nch; i++) {
3672 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003673 if (TYPE(CHILD(n, i)) == STAR ||
3674 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003675 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003676 nargs++;
3677 i++;
3678 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003679 t = RPAR; /* Anything except EQUAL or COMMA */
3680 else
3681 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003682 if (t == EQUAL) {
3683 i++;
3684 ndefs++;
3685 com_node(c, CHILD(n, i));
3686 i++;
3687 if (i >= nch)
3688 break;
3689 t = TYPE(CHILD(n, i));
3690 }
3691 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003692 /* Treat "(a=1, b)" as an error */
3693 if (ndefs)
3694 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003695 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003696 }
3697 if (t != COMMA)
3698 break;
3699 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003700 return ndefs;
3701}
3702
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003703static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003704com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003705{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003706 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003707 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003708 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003709 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003710 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3711 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003712 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003713 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003714 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003715 c->c_errors++;
3716 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003717 int closure = com_make_closure(c, (PyCodeObject *)co);
3718 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003719 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003720 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003721 if (closure)
3722 com_addoparg(c, MAKE_CLOSURE, ndefs);
3723 else
3724 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003725 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003726 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003727 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003728 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003729 }
3730}
3731
3732static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003733com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003734{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003735 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003736 REQ(n, testlist);
3737 /* testlist: test (',' test)* [','] */
3738 for (i = 0; i < NCH(n); i += 2)
3739 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003740 i = (NCH(n)+1) / 2;
3741 com_addoparg(c, BUILD_TUPLE, i);
3742 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003743}
3744
3745static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003746com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003747{
Guido van Rossum25831651993-05-19 14:50:45 +00003748 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003749 PyObject *v;
3750 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003751 char *name;
3752
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003753 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003754 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003755 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003756 c->c_errors++;
3757 return;
3758 }
3759 /* Push the class name on the stack */
3760 i = com_addconst(c, v);
3761 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003762 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003763 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003764 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003765 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003766 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003767 com_push(c, 1);
3768 }
Guido van Rossum25831651993-05-19 14:50:45 +00003769 else
3770 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003771 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003772 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003773 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003774 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003775 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003776 c->c_errors++;
3777 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003778 int closure = com_make_closure(c, co);
3779 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003780 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003781 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003782 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003783 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003784 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003785 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003786 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003787 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003788 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003789 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003790 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003791 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003792 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003793 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003794}
3795
3796static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003797com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003798{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003799 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003800 if (c->c_errors)
3801 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003802 switch (TYPE(n)) {
3803
3804 /* Definition nodes */
3805
3806 case funcdef:
3807 com_funcdef(c, n);
3808 break;
3809 case classdef:
3810 com_classdef(c, n);
3811 break;
3812
3813 /* Trivial parse tree nodes */
3814
3815 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003816 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003817 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003818 n = CHILD(n, 0);
3819 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003820
3821 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003822 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3823 com_addoparg(c, SET_LINENO, n->n_lineno);
3824 {
3825 int i;
3826 for (i = 0; i < NCH(n)-1; i += 2)
3827 com_node(c, CHILD(n, i));
3828 }
3829 break;
3830
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003831 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003832 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003833 n = CHILD(n, 0);
3834 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003835
3836 /* Statement nodes */
3837
3838 case expr_stmt:
3839 com_expr_stmt(c, n);
3840 break;
3841 case print_stmt:
3842 com_print_stmt(c, n);
3843 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003844 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003845 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003846 break;
3847 case pass_stmt:
3848 break;
3849 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003850 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003851 com_error(c, PyExc_SyntaxError,
3852 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003853 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003854 com_addbyte(c, BREAK_LOOP);
3855 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003856 case continue_stmt:
3857 com_continue_stmt(c, n);
3858 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003859 case return_stmt:
3860 com_return_stmt(c, n);
3861 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003862 case yield_stmt:
3863 com_yield_stmt(c, n);
3864 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003865 case raise_stmt:
3866 com_raise_stmt(c, n);
3867 break;
3868 case import_stmt:
3869 com_import_stmt(c, n);
3870 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003871 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003872 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003873 case exec_stmt:
3874 com_exec_stmt(c, n);
3875 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003876 case assert_stmt:
3877 com_assert_stmt(c, n);
3878 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003879 case if_stmt:
3880 com_if_stmt(c, n);
3881 break;
3882 case while_stmt:
3883 com_while_stmt(c, n);
3884 break;
3885 case for_stmt:
3886 com_for_stmt(c, n);
3887 break;
3888 case try_stmt:
3889 com_try_stmt(c, n);
3890 break;
3891 case suite:
3892 com_suite(c, n);
3893 break;
3894
3895 /* Expression nodes */
3896
3897 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003898 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00003899 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003900 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003901 break;
3902 case test:
3903 com_test(c, n);
3904 break;
3905 case and_test:
3906 com_and_test(c, n);
3907 break;
3908 case not_test:
3909 com_not_test(c, n);
3910 break;
3911 case comparison:
3912 com_comparison(c, n);
3913 break;
3914 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003915 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003916 break;
3917 case expr:
3918 com_expr(c, n);
3919 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003920 case xor_expr:
3921 com_xor_expr(c, n);
3922 break;
3923 case and_expr:
3924 com_and_expr(c, n);
3925 break;
3926 case shift_expr:
3927 com_shift_expr(c, n);
3928 break;
3929 case arith_expr:
3930 com_arith_expr(c, n);
3931 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003932 case term:
3933 com_term(c, n);
3934 break;
3935 case factor:
3936 com_factor(c, n);
3937 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003938 case power:
3939 com_power(c, n);
3940 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003941 case atom:
3942 com_atom(c, n);
3943 break;
3944
3945 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003946 com_error(c, PyExc_SystemError,
3947 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003948 }
3949}
3950
Tim Petersdbd9ba62000-07-09 03:09:57 +00003951static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003952
3953static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003954com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003955{
3956 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3957 if (TYPE(CHILD(n, 0)) == LPAR)
3958 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003959 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003960 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003961 com_pop(c, 1);
3962 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003963}
3964
3965static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003966com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003967{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003968 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003969 if (NCH(n) == 1) {
3970 com_fpdef(c, CHILD(n, 0));
3971 }
3972 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003973 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003974 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003975 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003976 for (i = 0; i < NCH(n); i += 2)
3977 com_fpdef(c, CHILD(n, i));
3978 }
3979}
3980
3981static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003982com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003983{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003984 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003985 int complex = 0;
Barry Warsaw8f6d8682001-11-28 21:10:39 +00003986 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003987 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003988 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003989 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003990 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003991 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003992 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003993 node *ch = CHILD(n, i);
3994 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003995 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003996 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003997 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3998 fp = CHILD(ch, 0);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00003999 if (TYPE(fp) != NAME) {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004000 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00004001 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00004002 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004003 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004004 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004005 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004006 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004007 ch = CHILD(n, i);
4008 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004009 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004010 else
4011 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004012 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004013 if (complex) {
4014 /* Generate code for complex arguments only after
4015 having counted the simple arguments */
4016 int ilocal = 0;
4017 for (i = 0; i < nch; i++) {
4018 node *ch = CHILD(n, i);
4019 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004020 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004021 break;
4022 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4023 fp = CHILD(ch, 0);
4024 if (TYPE(fp) != NAME) {
4025 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004026 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004027 com_fpdef(c, ch);
4028 }
4029 ilocal++;
4030 if (++i >= nch)
4031 break;
4032 ch = CHILD(n, i);
4033 if (TYPE(ch) == EQUAL)
4034 i += 2;
4035 else
4036 REQ(ch, COMMA);
4037 }
4038 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004039}
4040
4041static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004042com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004043{
4044 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004045 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004046 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004047 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004048 if (doc != NULL) {
4049 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004050 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004051 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004052 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004053 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004054 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004055 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004056 for (i = 0; i < NCH(n); i++) {
4057 node *ch = CHILD(n, i);
4058 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4059 com_node(c, ch);
4060 }
4061}
4062
4063/* Top-level compile-node interface */
4064
4065static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004066compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004067{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004068 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004069 node *ch;
4070 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00004071 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004072 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004073 if (doc != NULL) {
4074 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004075 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004076 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004077 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004078 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004079 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
4080 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004081 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004082 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004083 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004084 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004085 c->c_infunction = 0;
Tim Petersad1a18b2001-06-23 06:19:16 +00004086 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4087 com_push(c, 1);
4088 com_addbyte(c, RETURN_VALUE);
4089 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004090}
4091
4092static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004093compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004094{
Guido van Rossum590baa41993-11-30 13:40:46 +00004095 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004096 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004097 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004098
4099 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004100 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004101 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004102 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004103 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004104 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004105 else
4106 ch = CHILD(n, 2);
4107 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004108 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004109 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004110}
4111
4112static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004113compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004114{
4115 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004116 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004117 REQ(n, classdef);
4118 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4119 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004120 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004121 /* Initialize local __module__ from global __name__ */
4122 com_addop_name(c, LOAD_GLOBAL, "__name__");
4123 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004124 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004125 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004126 if (doc != NULL) {
4127 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004128 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004129 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004130 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004131 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004132 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004133 }
4134 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004135 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004136 com_node(c, ch);
4137 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004138 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004139 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004140 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004141}
4142
4143static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004144compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004145{
Guido van Rossum3f5da241990-12-20 15:06:42 +00004146 com_addoparg(c, SET_LINENO, n->n_lineno);
4147
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004148 switch (TYPE(n)) {
4149
Guido van Rossum4c417781991-01-21 16:09:22 +00004150 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004151 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004152 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004153 n = CHILD(n, 0);
4154 if (TYPE(n) != NEWLINE)
4155 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004156 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004157 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004158 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004159 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004160 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004161 break;
4162
Guido van Rossum4c417781991-01-21 16:09:22 +00004163 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004164 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004165 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004166 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004167 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004168 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004169 break;
4170
Guido van Rossum590baa41993-11-30 13:40:46 +00004171 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004172 com_node(c, CHILD(n, 0));
4173 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004174 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004175 break;
4176
Guido van Rossum590baa41993-11-30 13:40:46 +00004177 case lambdef: /* anonymous function definition */
4178 compile_lambdef(c, n);
4179 break;
4180
Guido van Rossum4c417781991-01-21 16:09:22 +00004181 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004182 compile_funcdef(c, n);
4183 break;
4184
Guido van Rossum4c417781991-01-21 16:09:22 +00004185 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004186 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004187 break;
4188
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004189 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004190 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004191 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004192 }
4193}
4194
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004195static PyObject *
4196dict_keys_inorder(PyObject *dict, int offset)
4197{
4198 PyObject *tuple, *k, *v;
4199 int i, pos = 0, size = PyDict_Size(dict);
4200
4201 tuple = PyTuple_New(size);
4202 if (tuple == NULL)
4203 return NULL;
4204 while (PyDict_Next(dict, &pos, &k, &v)) {
4205 i = PyInt_AS_LONG(v);
4206 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004207 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004208 PyTuple_SET_ITEM(tuple, i - offset, k);
4209 }
4210 return tuple;
4211}
4212
Guido van Rossum79f25d91997-04-29 20:08:16 +00004213PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004214PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004215{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004216 return PyNode_CompileFlags(n, filename, NULL);
4217}
4218
4219PyCodeObject *
4220PyNode_CompileFlags(node *n, char *filename, PyCompilerFlags *flags)
4221{
4222 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004223}
4224
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004225struct symtable *
4226PyNode_CompileSymtable(node *n, char *filename)
4227{
4228 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004229 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004230
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004231 ff = PyNode_Future(n, filename);
4232 if (ff == NULL)
4233 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004234
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004235 st = symtable_init();
Tim Peters8c5e4152001-11-04 19:26:58 +00004236 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004237 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004238 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004239 }
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004240 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004241 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004242 if (st->st_errors > 0)
4243 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004244 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004245 if (st->st_errors > 0)
4246 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004247
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004248 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004249 fail:
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004250 PyObject_FREE((void *)ff);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004251 st->st_future = NULL;
4252 PySymtable_Free(st);
4253 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004254}
4255
Guido van Rossum79f25d91997-04-29 20:08:16 +00004256static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004257icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004258{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004259 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004260}
4261
Guido van Rossum79f25d91997-04-29 20:08:16 +00004262static PyCodeObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004263jcompile(node *n, char *filename, struct compiling *base,
4264 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004265{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004266 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004267 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004268 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004269 return NULL;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004270 if (TYPE(n) == encoding_decl) {
4271 sc.c_encoding = STR(n);
4272 n = CHILD(n, 0);
4273 } else {
4274 sc.c_encoding = NULL;
4275 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004276 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004277 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004278 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004279 /* c_symtable still points to parent's symbols */
4280 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004281 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004282 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004283 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004284 if (base->c_encoding != NULL) {
4285 assert(sc.c_encoding == NULL);
4286 sc.c_encoding = base->c_encoding;
4287 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004288 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004289 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004290 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004291 if (sc.c_future == NULL) {
4292 com_free(&sc);
4293 return NULL;
4294 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004295 if (flags) {
4296 int merged = sc.c_future->ff_features |
4297 flags->cf_flags;
4298 sc.c_future->ff_features = merged;
4299 flags->cf_flags = merged;
4300 }
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004301 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004302 com_free(&sc);
4303 return NULL;
4304 }
4305 }
4306 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004307 if (symtable_load_symbols(&sc) < 0) {
4308 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004309 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004310 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004311 compile_node(&sc, n);
4312 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004313 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004314 PyObject *consts, *names, *varnames, *filename, *name,
4315 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004316 consts = PyList_AsTuple(sc.c_consts);
4317 names = PyList_AsTuple(sc.c_names);
4318 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004319 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4320 freevars = dict_keys_inorder(sc.c_freevars,
4321 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004322 filename = PyString_InternFromString(sc.c_filename);
4323 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004324 if (!PyErr_Occurred())
4325 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004326 sc.c_nlocals,
4327 sc.c_maxstacklevel,
4328 sc.c_flags,
4329 sc.c_code,
4330 consts,
4331 names,
4332 varnames,
4333 freevars,
4334 cellvars,
4335 filename,
4336 name,
4337 sc.c_firstlineno,
4338 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004339 Py_XDECREF(consts);
4340 Py_XDECREF(names);
4341 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004342 Py_XDECREF(freevars);
4343 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004344 Py_XDECREF(filename);
4345 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004346 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004347 else if (!PyErr_Occurred()) {
4348 /* This could happen if someone called PyErr_Clear() after an
4349 error was reported above. That's not supposed to happen,
4350 but I just plugged one case and I'm not sure there can't be
4351 others. In that case, raise SystemError so that at least
4352 it gets reported instead dumping core. */
4353 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4354 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004355 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004356 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004357 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004358 sc.c_symtable = NULL;
4359 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004360 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004361 return co;
4362}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004363
4364int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004365PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004366{
4367 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004368 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004369 int line = co->co_firstlineno;
4370 int addr = 0;
4371 while (--size >= 0) {
4372 addr += *p++;
4373 if (addr > addrq)
4374 break;
4375 line += *p++;
4376 }
4377 return line;
4378}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004379
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004380/* The test for LOCAL must come before the test for FREE in order to
4381 handle classes where name is both local and free. The local var is
4382 a method and the free var is a free var referenced within a method.
4383*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004384
4385static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004386get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004387{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004388 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004389 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004390
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004391 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4392 return CELL;
4393 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4394 return LOCAL;
4395 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4396 return FREE;
4397 v = PyDict_GetItemString(c->c_globals, name);
4398 if (v) {
4399 if (v == Py_None)
4400 return GLOBAL_EXPLICIT;
4401 else {
4402 return GLOBAL_IMPLICIT;
4403 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004404 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004405 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004406 "unknown scope for %.100s in %.100s(%s) "
4407 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4408 name, c->c_name,
4409 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4410 c->c_filename,
4411 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4412 PyObject_REPR(c->c_locals),
4413 PyObject_REPR(c->c_globals)
4414 );
4415
4416 Py_FatalError(buf);
4417 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004418}
4419
Guido van Rossum207fda62001-03-02 03:30:41 +00004420/* Helper functions to issue warnings */
4421
4422static int
4423issue_warning(char *msg, char *filename, int lineno)
4424{
4425 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4426 lineno, NULL, NULL) < 0) {
4427 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4428 PyErr_SetString(PyExc_SyntaxError, msg);
4429 PyErr_SyntaxLocation(filename, lineno);
4430 }
4431 return -1;
4432 }
4433 return 0;
4434}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004435
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004436static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004437symtable_warn(struct symtable *st, char *msg)
4438{
Guido van Rossum207fda62001-03-02 03:30:41 +00004439 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004440 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004441 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004442 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004443 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004444}
4445
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004446/* Helper function for setting lineno and filename */
4447
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004448static int
4449symtable_build(struct compiling *c, node *n)
4450{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004451 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004452 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004453 c->c_symtable->st_future = c->c_future;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004454 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004455 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4456 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004457 return -1;
4458 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004459 if (c->c_symtable->st_errors > 0)
4460 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004461 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004462 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004463 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004464 return 0;
4465}
4466
4467static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004468symtable_init_compiling_symbols(struct compiling *c)
4469{
4470 PyObject *varnames;
4471
4472 varnames = c->c_symtable->st_cur->ste_varnames;
4473 if (varnames == NULL) {
4474 varnames = PyList_New(0);
4475 if (varnames == NULL)
4476 return -1;
4477 c->c_symtable->st_cur->ste_varnames = varnames;
4478 Py_INCREF(varnames);
4479 } else
4480 Py_INCREF(varnames);
4481 c->c_varnames = varnames;
4482
4483 c->c_globals = PyDict_New();
4484 if (c->c_globals == NULL)
4485 return -1;
4486 c->c_freevars = PyDict_New();
4487 if (c->c_freevars == NULL)
4488 return -1;
4489 c->c_cellvars = PyDict_New();
4490 if (c->c_cellvars == NULL)
4491 return -1;
4492 return 0;
4493}
4494
4495struct symbol_info {
4496 int si_nlocals;
4497 int si_ncells;
4498 int si_nfrees;
4499 int si_nimplicit;
4500};
4501
4502static void
4503symtable_init_info(struct symbol_info *si)
4504{
4505 si->si_nlocals = 0;
4506 si->si_ncells = 0;
4507 si->si_nfrees = 0;
4508 si->si_nimplicit = 0;
4509}
4510
4511static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004512symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004513 struct symbol_info *si)
4514{
4515 PyObject *dict, *v;
4516
4517 /* Seperate logic for DEF_FREE. If it occurs in a function,
4518 it indicates a local that we must allocate storage for (a
4519 cell var). If it occurs in a class, then the class has a
4520 method and a free variable with the same name.
4521 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004522 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004523 /* If it isn't declared locally, it can't be a cell. */
4524 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4525 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004526 v = PyInt_FromLong(si->si_ncells++);
4527 dict = c->c_cellvars;
4528 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004529 /* If it is free anyway, then there is no need to do
4530 anything here.
4531 */
4532 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004533 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004534 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004535 v = PyInt_FromLong(si->si_nfrees++);
4536 dict = c->c_freevars;
4537 }
4538 if (v == NULL)
4539 return -1;
4540 if (PyDict_SetItem(dict, name, v) < 0) {
4541 Py_DECREF(v);
4542 return -1;
4543 }
4544 Py_DECREF(v);
4545 return 0;
4546}
4547
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004548/* If a variable is a cell and an argument, make sure that appears in
4549 co_cellvars before any variable to its right in varnames.
4550*/
4551
4552
4553static int
4554symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4555 PyObject *varnames, int flags)
4556{
4557 PyObject *v, *w, *d, *list = NULL;
4558 int i, pos;
4559
4560 if (flags & CO_VARARGS)
4561 argcount++;
4562 if (flags & CO_VARKEYWORDS)
4563 argcount++;
4564 for (i = argcount; --i >= 0; ) {
4565 v = PyList_GET_ITEM(varnames, i);
4566 if (PyDict_GetItem(*cellvars, v)) {
4567 if (list == NULL) {
4568 list = PyList_New(1);
4569 if (list == NULL)
4570 return -1;
4571 PyList_SET_ITEM(list, 0, v);
4572 Py_INCREF(v);
4573 } else
4574 PyList_Insert(list, 0, v);
4575 }
4576 }
4577 if (list == NULL || PyList_GET_SIZE(list) == 0)
4578 return 0;
4579 /* There are cellvars that are also arguments. Create a dict
4580 to replace cellvars and put the args at the front.
4581 */
4582 d = PyDict_New();
4583 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4584 v = PyInt_FromLong(i);
4585 if (v == NULL)
4586 goto fail;
4587 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4588 goto fail;
4589 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4590 goto fail;
4591 }
4592 pos = 0;
4593 i = PyList_GET_SIZE(list);
4594 Py_DECREF(list);
4595 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4596 w = PyInt_FromLong(i++); /* don't care about the old key */
4597 if (PyDict_SetItem(d, v, w) < 0) {
4598 Py_DECREF(w);
4599 goto fail;
4600 }
4601 Py_DECREF(w);
4602 }
4603 Py_DECREF(*cellvars);
4604 *cellvars = d;
4605 return 1;
4606 fail:
4607 Py_DECREF(d);
4608 return -1;
4609}
4610
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004611static int
4612symtable_freevar_offsets(PyObject *freevars, int offset)
4613{
4614 PyObject *name, *v;
4615 int pos;
4616
4617 /* The cell vars are the first elements of the closure,
4618 followed by the free vars. Update the offsets in
4619 c_freevars to account for number of cellvars. */
4620 pos = 0;
4621 while (PyDict_Next(freevars, &pos, &name, &v)) {
4622 int i = PyInt_AS_LONG(v) + offset;
4623 PyObject *o = PyInt_FromLong(i);
4624 if (o == NULL)
4625 return -1;
4626 if (PyDict_SetItem(freevars, name, o) < 0) {
4627 Py_DECREF(o);
4628 return -1;
4629 }
4630 Py_DECREF(o);
4631 }
4632 return 0;
4633}
4634
4635static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004636symtable_check_unoptimized(struct compiling *c,
4637 PySymtableEntryObject *ste,
4638 struct symbol_info *si)
4639{
4640 char buf[300];
4641
4642 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4643 || (ste->ste_nested && si->si_nimplicit)))
4644 return 0;
4645
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004646#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4647
4648#define ILLEGAL_IS "is a nested function"
4649
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004650#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004651"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004652
4653#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004654"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004655
4656#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00004657"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004658"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004659
4660 /* XXX perhaps the linenos for these opt-breaking statements
4661 should be stored so the exception can point to them. */
4662
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004663 if (ste->ste_child_free) {
4664 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004665 PyOS_snprintf(buf, sizeof(buf),
4666 ILLEGAL_IMPORT_STAR,
4667 PyString_AS_STRING(ste->ste_name),
4668 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004669 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004670 PyOS_snprintf(buf, sizeof(buf),
4671 ILLEGAL_BARE_EXEC,
4672 PyString_AS_STRING(ste->ste_name),
4673 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004674 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004675 PyOS_snprintf(buf, sizeof(buf),
4676 ILLEGAL_EXEC_AND_IMPORT_STAR,
4677 PyString_AS_STRING(ste->ste_name),
4678 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004679 }
4680 } else {
4681 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004682 PyOS_snprintf(buf, sizeof(buf),
4683 ILLEGAL_IMPORT_STAR,
4684 PyString_AS_STRING(ste->ste_name),
4685 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004686 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004687 PyOS_snprintf(buf, sizeof(buf),
4688 ILLEGAL_BARE_EXEC,
4689 PyString_AS_STRING(ste->ste_name),
4690 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004691 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004692 PyOS_snprintf(buf, sizeof(buf),
4693 ILLEGAL_EXEC_AND_IMPORT_STAR,
4694 PyString_AS_STRING(ste->ste_name),
4695 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004696 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004697 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004698
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004699 PyErr_SetString(PyExc_SyntaxError, buf);
4700 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4701 ste->ste_opt_lineno);
4702 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004703}
4704
4705static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004706symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4707 struct symbol_info *si)
4708{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004709 if (c->c_future)
4710 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004711 if (ste->ste_generator)
4712 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004713 if (ste->ste_type != TYPE_MODULE)
4714 c->c_flags |= CO_NEWLOCALS;
4715 if (ste->ste_type == TYPE_FUNCTION) {
4716 c->c_nlocals = si->si_nlocals;
4717 if (ste->ste_optimized == 0)
4718 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004719 else if (ste->ste_optimized != OPT_EXEC)
4720 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004721 }
4722 return 0;
4723}
4724
4725static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004726symtable_load_symbols(struct compiling *c)
4727{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004728 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004729 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004730 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004731 PyObject *name, *varnames, *v;
4732 int i, flags, pos;
4733 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004734
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004735 if (implicit == NULL) {
4736 implicit = PyInt_FromLong(1);
4737 if (implicit == NULL)
4738 return -1;
4739 }
4740 v = NULL;
4741
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004742 if (symtable_init_compiling_symbols(c) < 0)
4743 goto fail;
4744 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004745 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004746 si.si_nlocals = PyList_GET_SIZE(varnames);
4747 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004748
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004749 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004750 v = PyInt_FromLong(i);
4751 if (PyDict_SetItem(c->c_locals,
4752 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004753 goto fail;
4754 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004755 }
4756
4757 /* XXX The cases below define the rules for whether a name is
4758 local or global. The logic could probably be clearer. */
4759 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004760 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4761 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004762
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004763 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004764 /* undo the original DEF_FREE */
4765 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004766
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004767 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004768 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004769 2. Free variables in methods that are also class
4770 variables or declared global.
4771 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004772 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004773 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004774
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004775 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004776 c->c_argcount--;
4777 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004778 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004779 c->c_argcount--;
4780 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004781 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004782 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004783 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004784 if (flags & DEF_PARAM) {
4785 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004786 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004787 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004788 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004789 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004790 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004791 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004792 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4793 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004794 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004795 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004796 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4797 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004798 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004799 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004800 if (v == NULL)
4801 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004802 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004803 goto fail;
4804 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004805 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004806 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004807 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004808 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004809 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004810 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004811 if (v == NULL)
4812 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004813 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004814 goto fail;
4815 Py_DECREF(v);
4816 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004817 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004818 if (PyDict_SetItem(c->c_globals, name,
4819 implicit) < 0)
4820 goto fail;
4821 if (st->st_nscopes != 1) {
4822 v = PyInt_FromLong(flags);
4823 if (PyDict_SetItem(st->st_global,
4824 name, v))
4825 goto fail;
4826 Py_DECREF(v);
4827 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004828 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004829 }
4830 }
4831
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004832 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4833
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004834 if (si.si_ncells > 1) { /* one cell is always in order */
4835 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4836 c->c_varnames, c->c_flags) < 0)
4837 return -1;
4838 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004839 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4840 return -1;
4841 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004842 fail:
4843 /* is this always the right thing to do? */
4844 Py_XDECREF(v);
4845 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004846}
4847
4848static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004849symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004850{
4851 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004852
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004853 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004854 if (st == NULL)
4855 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004856 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00004857
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004858 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004859 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004860 goto fail;
4861 if ((st->st_symbols = PyDict_New()) == NULL)
4862 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004863 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004864 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004865 st->st_errors = 0;
4866 st->st_tmpname = 0;
4867 st->st_private = NULL;
4868 return st;
4869 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004870 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004871 return NULL;
4872}
4873
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004874void
4875PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004876{
4877 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004878 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004879 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004880 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004881}
4882
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004883/* When the compiler exits a scope, it must should update the scope's
4884 free variable information with the list of free variables in its
4885 children.
4886
4887 Variables that are free in children and defined in the current
4888 scope are cellvars.
4889
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004890 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004891 false), free variables in children that are not defined here are
4892 implicit globals.
4893
4894*/
4895
4896static int
4897symtable_update_free_vars(struct symtable *st)
4898{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004899 int i, j, def;
4900 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004901 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004902
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004903 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004904 def = DEF_FREE_CLASS;
4905 else
4906 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004907 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004908 int pos = 0;
4909
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004910 if (list)
4911 PyList_SetSlice(list, 0,
4912 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004913 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004914 PyList_GET_ITEM(ste->ste_children, i);
4915 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004916 int flags = PyInt_AS_LONG(o);
4917 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004918 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004919 if (list == NULL) {
4920 list = PyList_New(0);
4921 if (list == NULL)
4922 return -1;
4923 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004924 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004925 if (PyList_Append(list, name) < 0) {
4926 Py_DECREF(list);
4927 return -1;
4928 }
4929 }
4930 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004931 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004932 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004933 v = PyDict_GetItem(ste->ste_symbols, name);
4934 /* If a name N is declared global in scope A and
4935 referenced in scope B contained (perhaps
4936 indirectly) in A and there are no scopes
4937 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004938 is global in B. Unless A is a class scope,
4939 because class scopes are not considered for
4940 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004941 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004942 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004943 int flags = PyInt_AS_LONG(v);
4944 if (flags & DEF_GLOBAL) {
4945 symtable_undo_free(st, child->ste_id,
4946 name);
4947 continue;
4948 }
4949 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004950 if (ste->ste_nested) {
4951 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004952 name, def) < 0) {
4953 Py_DECREF(list);
4954 return -1;
4955 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004956 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004957 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004958 name) < 0) {
4959 Py_DECREF(list);
4960 return -1;
4961 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004962 }
4963 }
4964 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004965
4966 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004967 return 0;
4968}
4969
4970/* If the current scope is a non-nested class or if name is not
4971 defined in the current, non-nested scope, then it is an implicit
4972 global in all nested scopes.
4973*/
4974
4975static int
4976symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4977{
4978 PyObject *o;
4979 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004980 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004981
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004982 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004983 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004984 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004985 if (o == NULL)
4986 return symtable_undo_free(st, child, name);
4987 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004988
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004989 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004990 return symtable_undo_free(st, child, name);
4991 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004992 return symtable_add_def_o(st, ste->ste_symbols,
4993 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004994}
4995
4996static int
4997symtable_undo_free(struct symtable *st, PyObject *id,
4998 PyObject *name)
4999{
5000 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005001 PyObject *info;
5002 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005003
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005004 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5005 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005006 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005007
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005008 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005009 if (info == NULL)
5010 return 0;
5011 v = PyInt_AS_LONG(info);
5012 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005013 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005014 DEF_FREE_GLOBAL) < 0)
5015 return -1;
5016 } else
5017 /* If the name is defined here or declared global,
5018 then the recursion stops. */
5019 return 0;
5020
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005021 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5022 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005023 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005024 PyList_GET_ITEM(ste->ste_children, i);
5025 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005026 if (x < 0)
5027 return x;
5028 }
5029 return 0;
5030}
5031
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005032/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5033 This reference is released when the scope is exited, via the DECREF
5034 in symtable_exit_scope().
5035*/
5036
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005037static int
5038symtable_exit_scope(struct symtable *st)
5039{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005040 int end;
5041
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005042 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005043 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005044 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005045 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005046 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5047 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005048 if (PySequence_DelItem(st->st_stack, end) < 0)
5049 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005050 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005051}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005052
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005053static void
5054symtable_enter_scope(struct symtable *st, char *name, int type,
5055 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005056{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005057 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005058
5059 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005060 prev = st->st_cur;
5061 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
5062 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005063 st->st_errors++;
5064 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005065 }
5066 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005067 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005068 PySymtableEntry_New(st, name, type, lineno);
5069 if (strcmp(name, TOP) == 0)
5070 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005071 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005072 if (PyList_Append(prev->ste_children,
5073 (PyObject *)st->st_cur) < 0)
5074 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005075 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005076}
5077
5078static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005079symtable_lookup(struct symtable *st, char *name)
5080{
5081 char buffer[MANGLE_LEN];
5082 PyObject *v;
5083 int flags;
5084
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005085 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005086 name = buffer;
5087 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5088 if (v == NULL) {
5089 if (PyErr_Occurred())
5090 return -1;
5091 else
5092 return 0;
5093 }
5094
5095 flags = PyInt_AS_LONG(v);
5096 return flags;
5097}
5098
5099static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005100symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005101{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005102 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005103 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005104 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005105
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005106 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005107 name = buffer;
5108 if ((s = PyString_InternFromString(name)) == NULL)
5109 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005110 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5111 Py_DECREF(s);
5112 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005113}
5114
5115/* Must only be called with mangled names */
5116
5117static int
5118symtable_add_def_o(struct symtable *st, PyObject *dict,
5119 PyObject *name, int flag)
5120{
5121 PyObject *o;
5122 int val;
5123
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005124 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005125 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005126 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005127 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005128 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005129 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005130 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005131 return -1;
5132 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005133 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005134 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005135 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005136 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005137 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005138 Py_DECREF(o);
5139 return -1;
5140 }
5141 Py_DECREF(o);
5142
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005143 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005144 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005145 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005146 } else if (flag & DEF_GLOBAL) {
5147 /* XXX need to update DEF_GLOBAL for other flags too;
5148 perhaps only DEF_FREE_GLOBAL */
5149 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005150 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005151 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005152 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005153 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005154 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005155 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005156 Py_DECREF(o);
5157 return -1;
5158 }
5159 Py_DECREF(o);
5160 }
5161 return 0;
5162}
5163
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005164#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005165
Tim Peters08a898f2001-06-28 01:52:22 +00005166/* Look for a yield stmt under n. Return 1 if found, else 0.
5167 This hack is used to look inside "if 0:" blocks (which are normally
5168 ignored) in case those are the only places a yield occurs (so that this
5169 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005170static int
5171look_for_yield(node *n)
5172{
5173 int i;
5174
5175 for (i = 0; i < NCH(n); ++i) {
5176 node *kid = CHILD(n, i);
5177
5178 switch (TYPE(kid)) {
5179
5180 case classdef:
5181 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005182 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005183 /* Stuff in nested functions and classes can't make
5184 the parent a generator. */
5185 return 0;
5186
5187 case yield_stmt:
5188 return 1;
5189
5190 default:
5191 if (look_for_yield(kid))
5192 return 1;
5193 }
5194 }
5195 return 0;
5196}
5197
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005198static void
5199symtable_node(struct symtable *st, node *n)
5200{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005201 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005202
5203 loop:
5204 switch (TYPE(n)) {
5205 case funcdef: {
5206 char *func_name = STR(CHILD(n, 1));
5207 symtable_add_def(st, func_name, DEF_LOCAL);
5208 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005209 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005210 symtable_funcdef(st, n);
5211 symtable_exit_scope(st);
5212 break;
5213 }
5214 case lambdef:
5215 if (NCH(n) == 4)
5216 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005217 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005218 symtable_funcdef(st, n);
5219 symtable_exit_scope(st);
5220 break;
5221 case classdef: {
5222 char *tmp, *class_name = STR(CHILD(n, 1));
5223 symtable_add_def(st, class_name, DEF_LOCAL);
5224 if (TYPE(CHILD(n, 2)) == LPAR) {
5225 node *bases = CHILD(n, 3);
5226 int i;
5227 for (i = 0; i < NCH(bases); i += 2) {
5228 symtable_node(st, CHILD(bases, i));
5229 }
5230 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005231 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005232 tmp = st->st_private;
5233 st->st_private = class_name;
5234 symtable_node(st, CHILD(n, NCH(n) - 1));
5235 st->st_private = tmp;
5236 symtable_exit_scope(st);
5237 break;
5238 }
5239 case if_stmt:
5240 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005241 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5242 if (st->st_cur->ste_generator == 0)
5243 st->st_cur->ste_generator =
5244 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005245 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005246 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005247 symtable_node(st, CHILD(n, i + 1));
5248 symtable_node(st, CHILD(n, i + 3));
5249 }
5250 if (i + 2 < NCH(n))
5251 symtable_node(st, CHILD(n, i + 2));
5252 break;
5253 case global_stmt:
5254 symtable_global(st, n);
5255 break;
5256 case import_stmt:
5257 symtable_import(st, n);
5258 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005259 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005260 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005261 symtable_node(st, CHILD(n, 1));
5262 if (NCH(n) > 2)
5263 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005264 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005265 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005266 st->st_cur->ste_opt_lineno = n->n_lineno;
5267 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005268 if (NCH(n) > 4)
5269 symtable_node(st, CHILD(n, 5));
5270 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005271
5272 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005273 case assert_stmt:
5274 if (Py_OptimizeFlag)
5275 return;
5276 if (NCH(n) == 2) {
5277 n = CHILD(n, 1);
5278 goto loop;
5279 } else {
5280 symtable_node(st, CHILD(n, 1));
5281 n = CHILD(n, 3);
5282 goto loop;
5283 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005284 case except_clause:
5285 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005286 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005287 if (NCH(n) > 1) {
5288 n = CHILD(n, 1);
5289 goto loop;
5290 }
5291 break;
5292 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005293 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005294 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005295 case yield_stmt:
5296 st->st_cur->ste_generator = 1;
5297 n = CHILD(n, 1);
5298 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005299 case expr_stmt:
5300 if (NCH(n) == 1)
5301 n = CHILD(n, 0);
5302 else {
5303 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005304 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005305 symtable_node(st, CHILD(n, 2));
5306 break;
5307 } else {
5308 int i;
5309 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005310 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005311 n = CHILD(n, NCH(n) - 1);
5312 }
5313 }
5314 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005315 case list_iter:
5316 n = CHILD(n, 0);
5317 if (TYPE(n) == list_for) {
5318 st->st_tmpname++;
5319 symtable_list_comprehension(st, n);
5320 st->st_tmpname--;
5321 } else {
5322 REQ(n, list_if);
5323 symtable_node(st, CHILD(n, 1));
5324 if (NCH(n) == 3) {
5325 n = CHILD(n, 2);
5326 goto loop;
5327 }
5328 }
5329 break;
5330 case for_stmt:
5331 symtable_assign(st, CHILD(n, 1), 0);
5332 for (i = 3; i < NCH(n); ++i)
5333 if (TYPE(CHILD(n, i)) >= single_input)
5334 symtable_node(st, CHILD(n, i));
5335 break;
5336 /* The remaining cases fall through to default except in
5337 special circumstances. This requires the individual cases
5338 to be coded with great care, even though they look like
5339 rather innocuous. Each case must double-check TYPE(n).
5340 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005341 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005342 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005343 n = CHILD(n, 2);
5344 goto loop;
5345 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005346 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005347 case listmaker:
5348 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00005349 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005350 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00005351 symtable_node(st, CHILD(n, 0));
5352 st->st_tmpname--;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005353 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005354 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005355 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005356 case atom:
5357 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5358 symtable_add_use(st, STR(CHILD(n, 0)));
5359 break;
5360 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005361 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005362 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005363 /* Walk over every non-token child with a special case
5364 for one child.
5365 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005366 if (NCH(n) == 1) {
5367 n = CHILD(n, 0);
5368 goto loop;
5369 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005370 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005371 if (TYPE(CHILD(n, i)) >= single_input)
5372 symtable_node(st, CHILD(n, i));
5373 }
5374}
5375
5376static void
5377symtable_funcdef(struct symtable *st, node *n)
5378{
5379 node *body;
5380
5381 if (TYPE(n) == lambdef) {
5382 if (NCH(n) == 4)
5383 symtable_params(st, CHILD(n, 1));
5384 } else
5385 symtable_params(st, CHILD(n, 2));
5386 body = CHILD(n, NCH(n) - 1);
5387 symtable_node(st, body);
5388}
5389
5390/* The next two functions parse the argument tuple.
5391 symtable_default_arg() checks for names in the default arguments,
5392 which are references in the defining scope. symtable_params()
5393 parses the parameter names, which are defined in the function's
5394 body.
5395
5396 varargslist:
5397 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5398 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5399*/
5400
5401static void
5402symtable_default_args(struct symtable *st, node *n)
5403{
5404 node *c;
5405 int i;
5406
5407 if (TYPE(n) == parameters) {
5408 n = CHILD(n, 1);
5409 if (TYPE(n) == RPAR)
5410 return;
5411 }
5412 REQ(n, varargslist);
5413 for (i = 0; i < NCH(n); i += 2) {
5414 c = CHILD(n, i);
5415 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5416 break;
5417 }
5418 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5419 symtable_node(st, CHILD(n, i));
5420 }
5421}
5422
5423static void
5424symtable_params(struct symtable *st, node *n)
5425{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005426 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005427 node *c = NULL;
5428
5429 if (TYPE(n) == parameters) {
5430 n = CHILD(n, 1);
5431 if (TYPE(n) == RPAR)
5432 return;
5433 }
5434 REQ(n, varargslist);
5435 for (i = 0; i < NCH(n); i += 2) {
5436 c = CHILD(n, i);
5437 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5438 ext = 1;
5439 break;
5440 }
5441 if (TYPE(c) == test) {
5442 continue;
5443 }
5444 if (TYPE(CHILD(c, 0)) == NAME)
5445 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
5446 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005447 char nbuf[30];
5448 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005449 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005450 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005451 }
5452 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005453 if (ext) {
5454 c = CHILD(n, i);
5455 if (TYPE(c) == STAR) {
5456 i++;
5457 symtable_add_def(st, STR(CHILD(n, i)),
5458 DEF_PARAM | DEF_STAR);
5459 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005460 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005461 c = NULL;
5462 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005463 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005464 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005465 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005466 i++;
5467 symtable_add_def(st, STR(CHILD(n, i)),
5468 DEF_PARAM | DEF_DOUBLESTAR);
5469 }
5470 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005471 if (complex >= 0) {
5472 int j;
5473 for (j = 0; j <= complex; j++) {
5474 c = CHILD(n, j);
5475 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005476 c = CHILD(n, ++j);
5477 else if (TYPE(c) == EQUAL)
5478 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005479 if (TYPE(CHILD(c, 0)) == LPAR)
5480 symtable_params_fplist(st, CHILD(c, 1));
5481 }
5482 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005483}
5484
5485static void
5486symtable_params_fplist(struct symtable *st, node *n)
5487{
5488 int i;
5489 node *c;
5490
5491 REQ(n, fplist);
5492 for (i = 0; i < NCH(n); i += 2) {
5493 c = CHILD(n, i);
5494 REQ(c, fpdef);
5495 if (NCH(c) == 1)
5496 symtable_add_def(st, STR(CHILD(c, 0)),
5497 DEF_PARAM | DEF_INTUPLE);
5498 else
5499 symtable_params_fplist(st, CHILD(c, 1));
5500 }
5501
5502}
5503
5504static void
5505symtable_global(struct symtable *st, node *n)
5506{
5507 int i;
5508
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005509 /* XXX It might be helpful to warn about module-level global
5510 statements, but it's hard to tell the difference between
5511 module-level and a string passed to exec.
5512 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005513
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005514 for (i = 1; i < NCH(n); i += 2) {
5515 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005516 int flags;
5517
5518 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005519 if (flags < 0)
5520 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005521 if (flags && flags != DEF_GLOBAL) {
5522 char buf[500];
5523 if (flags & DEF_PARAM) {
5524 PyErr_Format(PyExc_SyntaxError,
5525 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005526 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005527 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005528 st->st_cur->ste_lineno);
5529 st->st_errors++;
5530 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005531 }
5532 else {
5533 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005534 PyOS_snprintf(buf, sizeof(buf),
5535 GLOBAL_AFTER_ASSIGN,
5536 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005537 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005538 PyOS_snprintf(buf, sizeof(buf),
5539 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005540 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005541 }
5542 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005543 symtable_add_def(st, name, DEF_GLOBAL);
5544 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005545}
5546
5547static void
5548symtable_list_comprehension(struct symtable *st, node *n)
5549{
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005550 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005551
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005552 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005553 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005554 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005555 symtable_node(st, CHILD(n, 3));
5556 if (NCH(n) == 5)
5557 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005558}
5559
5560static void
5561symtable_import(struct symtable *st, node *n)
5562{
5563 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005564 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005565 | 'from' dotted_name 'import'
5566 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005567 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005568 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005569 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005570 node *dotname = CHILD(n, 1);
5571 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5572 /* check for bogus imports */
5573 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5574 PyErr_SetString(PyExc_SyntaxError,
5575 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005576 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005577 n->n_lineno);
5578 st->st_errors++;
5579 return;
5580 }
5581 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005582 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005583 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005584 if (symtable_warn(st,
5585 "import * only allowed at module level") < 0)
5586 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005587 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005588 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005589 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005590 } else {
5591 for (i = 3; i < NCH(n); i += 2) {
5592 node *c = CHILD(n, i);
5593 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005594 symtable_assign(st, CHILD(c, 2),
5595 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005596 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005597 symtable_assign(st, CHILD(c, 0),
5598 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005599 }
5600 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005601 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005602 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005603 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005604 }
5605 }
5606}
5607
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005608/* The third argument to symatble_assign() is a flag to be passed to
5609 symtable_add_def() if it is eventually called. The flag is useful
5610 to specify the particular type of assignment that should be
5611 recorded, e.g. an assignment caused by import.
5612 */
5613
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005614static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005615symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005616{
5617 node *tmp;
5618 int i;
5619
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005620 loop:
5621 switch (TYPE(n)) {
5622 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005623 /* invalid assignment, e.g. lambda x:x=2. The next
5624 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005625 return;
5626 case power:
5627 if (NCH(n) > 2) {
5628 for (i = 2; i < NCH(n); ++i)
5629 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5630 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005631 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005632 if (NCH(n) > 1) {
5633 symtable_node(st, CHILD(n, 0));
5634 symtable_node(st, CHILD(n, 1));
5635 } else {
5636 n = CHILD(n, 0);
5637 goto loop;
5638 }
5639 return;
5640 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005641 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5642 /* XXX This is an error, but the next pass
5643 will catch it. */
5644 return;
5645 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005646 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005647 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005648 }
5649 return;
5650 case exprlist:
5651 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00005652 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005653 if (NCH(n) == 1) {
5654 n = CHILD(n, 0);
5655 goto loop;
5656 }
5657 else {
5658 int i;
5659 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005660 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005661 return;
5662 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005663 case atom:
5664 tmp = CHILD(n, 0);
5665 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5666 n = CHILD(n, 1);
5667 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005668 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00005669 if (strcmp(STR(tmp), "__debug__") == 0) {
5670 PyErr_SetString(PyExc_SyntaxError,
5671 ASSIGN_DEBUG);
5672 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton86424e32001-12-04 02:41:46 +00005673 n->n_lineno);
Jeremy Hylton778e2652001-11-09 19:50:08 +00005674 st->st_errors++;
5675 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005676 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005677 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005678 return;
5679 case dotted_as_name:
5680 if (NCH(n) == 3)
5681 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005682 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005683 else
5684 symtable_add_def(st,
5685 STR(CHILD(CHILD(n,
5686 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005687 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005688 return;
5689 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005690 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005691 return;
5692 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005693 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005694 return;
5695 default:
5696 if (NCH(n) == 0)
5697 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005698 if (NCH(n) == 1) {
5699 n = CHILD(n, 0);
5700 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005701 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005702 /* Should only occur for errors like x + 1 = 1,
5703 which will be caught in the next pass. */
5704 for (i = 0; i < NCH(n); ++i)
5705 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005706 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005707 }
5708}