blob: 512b5a339dbb394f78230ddf3dd88a9e44eb9b8b [file] [log] [blame]
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001/* Compile an expression node to intermediate code */
2
Guido van Rossum3f5da241990-12-20 15:06:42 +00003/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004 XXX add __doc__ attribute == co_doc to code object attributes?
5 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +00006 XXX Generate simple jump for break/return outside 'try...finally'
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00007 XXX Allow 'continue' inside finally clause of try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +00008 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +00009 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000010*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011
Guido van Rossum79f25d91997-04-29 20:08:16 +000012#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000013
Guido van Rossum10dc2e81990-11-18 17:27:39 +000014#include "node.h"
15#include "token.h"
16#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000017#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000018#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000019#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000020#include "structmember.h"
21
22#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000023
Guido van Rossumb05a5c71997-05-07 17:46:13 +000024/* Three symbols from graminit.h are also defined in Python.h, with
25 Py_ prefixes to their names. Python.h can't include graminit.h
26 (which defines too many confusing symbols), but we can check here
27 that they haven't changed (which is very unlikely, but possible). */
28#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000029 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000030#endif
31#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000032 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000033#endif
34#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000035 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000036#endif
37
Guido van Rossum8e793d91997-03-03 19:13:14 +000038int Py_OptimizeFlag = 0;
39
Guido van Rossum8861b741996-07-30 16:49:37 +000040#define OP_DELETE 0
41#define OP_ASSIGN 1
42#define OP_APPLY 2
43
Jeremy Hyltone36f7782001-01-19 03:21:30 +000044#define VAR_LOAD 0
45#define VAR_STORE 1
46#define VAR_DELETE 2
47
Jeremy Hylton64949cb2001-01-25 20:06:59 +000048#define DEL_CLOSURE_ERROR \
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000049"can not delete variable '%.400s' referenced in nested scope"
50
51#define DUPLICATE_ARGUMENT \
52"duplicate argument '%s' in function definition"
53
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000054#define ILLEGAL_DYNAMIC_SCOPE \
55"%.100s: exec or 'import *' makes names ambiguous in nested scope"
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000056
Jeremy Hylton29906ee2001-02-27 04:23:34 +000057#define GLOBAL_AFTER_ASSIGN \
58"name '%.400s' is assigned to before global declaration"
59
60#define GLOBAL_AFTER_USE \
61"name '%.400s' is used prior to global declaration"
62
63#define LOCAL_GLOBAL \
Neal Norwitz2a47c0f2002-01-29 00:53:41 +000064"name '%.400s' is a function parameter and declared global"
Jeremy Hylton29906ee2001-02-27 04:23:34 +000065
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +000066#define LATE_FUTURE \
67"from __future__ imports must occur at the beginning of the file"
68
Jeremy Hylton897b8212001-03-23 14:08:38 +000069#define ASSIGN_DEBUG \
70"can not assign to __debug__"
71
Jeremy Hyltone36f7782001-01-19 03:21:30 +000072#define MANGLE_LEN 256
73
Guido van Rossum79f25d91997-04-29 20:08:16 +000074#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000075
Guido van Rossum6f799372001-09-20 20:46:19 +000076static PyMemberDef code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000077 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
78 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000079 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000080 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000081 {"co_code", T_OBJECT, OFF(co_code), READONLY},
82 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
83 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000084 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000085 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
86 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000087 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000088 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000089 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
90 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000091 {NULL} /* Sentinel */
92};
93
Guido van Rossumbea18cc2002-06-14 20:41:17 +000094PyDoc_STRVAR(code_doc,
95"code(argcount, nlocals, stacksize, flags, codestring, constants, names,\n\
96 varnames, filename, name, firstlineno, lnotab[, freevars[, cellvars]])\n\
97\n\
98Create a code object. Not for the faint of heart.");
99
100static PyObject *
101code_new(PyTypeObject *type, PyObject *args, PyObject *kw)
102{
103 int argcount;
104 int nlocals;
105 int stacksize;
106 int flags;
107 PyObject *code;
108 PyObject *consts;
109 PyObject *names;
110 PyObject *varnames;
111 PyObject *freevars = NULL;
112 PyObject *cellvars = NULL;
113 PyObject *filename;
114 PyObject *name;
115 int firstlineno;
116 PyObject *lnotab;
117
118 if (!PyArg_ParseTuple(args, "iiiiSO!O!O!SSiS|O!O!:code",
119 &argcount, &nlocals, &stacksize, &flags,
120 &code,
121 &PyTuple_Type, &consts,
122 &PyTuple_Type, &names,
123 &PyTuple_Type, &varnames,
124 &filename, &name,
125 &firstlineno, &lnotab,
126 &PyTuple_Type, &freevars,
127 &PyTuple_Type, &cellvars))
128 return NULL;
129
130 if (freevars == NULL || cellvars == NULL) {
131 PyObject *empty = PyTuple_New(0);
132 if (empty == NULL)
133 return NULL;
134 if (freevars == NULL) {
135 freevars = empty;
136 Py_INCREF(freevars);
137 }
138 if (cellvars == NULL) {
139 cellvars = empty;
140 Py_INCREF(cellvars);
141 }
142 Py_DECREF(empty);
143 }
144
145 if (!PyObject_CheckReadBuffer(code)) {
146 PyErr_SetString(PyExc_TypeError,
147 "bytecode object must be a single-segment read-only buffer");
148 return NULL;
149 }
150
151 return (PyObject *)PyCode_New(argcount, nlocals, stacksize, flags,
152 code, consts, names, varnames,
153 freevars, cellvars, filename, name,
154 firstlineno, lnotab);
155}
156
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000157static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000158code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000159{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000160 Py_XDECREF(co->co_code);
161 Py_XDECREF(co->co_consts);
162 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000163 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000164 Py_XDECREF(co->co_freevars);
165 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000166 Py_XDECREF(co->co_filename);
167 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000168 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000169 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000170}
171
Guido van Rossum79f25d91997-04-29 20:08:16 +0000172static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000173code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000174{
175 char buf[500];
176 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000177 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000178 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000179
Guido van Rossuma396a882000-04-07 01:21:36 +0000180 if (co->co_firstlineno != 0)
181 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000182 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000183 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000184 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000185 name = PyString_AS_STRING(co->co_name);
Barry Warsaw8f6d8682001-11-28 21:10:39 +0000186 PyOS_snprintf(buf, sizeof(buf),
187 "<code object %.100s at %p, file \"%.300s\", line %d>",
188 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000189 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000190}
191
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000192static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000193code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000194{
195 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000196 cmp = PyObject_Compare(co->co_name, cp->co_name);
197 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000198 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000199 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000200 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000201 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000202 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000203 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000204 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000205 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000206 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000207 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000208 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000209 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000210 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000211 if (cmp) return cmp;
212 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
213 if (cmp) return cmp;
214 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000215 return cmp;
216}
217
218static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000219code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000220{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000221 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000222 h0 = PyObject_Hash(co->co_name);
223 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000224 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000225 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000227 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000228 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000229 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000230 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000231 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000232 h5 = PyObject_Hash(co->co_freevars);
233 if (h5 == -1) return -1;
234 h6 = PyObject_Hash(co->co_cellvars);
235 if (h6 == -1) return -1;
236 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000237 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000238 if (h == -1) h = -2;
239 return h;
240}
241
Jeremy Hylton78891072001-03-01 06:09:34 +0000242/* XXX code objects need to participate in GC? */
243
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244PyTypeObject PyCode_Type = {
245 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000246 0,
247 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000248 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000249 0,
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000250 (destructor)code_dealloc, /* tp_dealloc */
251 0, /* tp_print */
252 0, /* tp_getattr */
253 0, /* tp_setattr */
254 (cmpfunc)code_compare, /* tp_compare */
255 (reprfunc)code_repr, /* tp_repr */
256 0, /* tp_as_number */
257 0, /* tp_as_sequence */
258 0, /* tp_as_mapping */
259 (hashfunc)code_hash, /* tp_hash */
260 0, /* tp_call */
261 0, /* tp_str */
262 PyObject_GenericGetAttr, /* tp_getattro */
263 0, /* tp_setattro */
264 0, /* tp_as_buffer */
265 Py_TPFLAGS_DEFAULT, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000266 code_doc, /* tp_doc */
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000267 0, /* tp_traverse */
268 0, /* tp_clear */
269 0, /* tp_richcompare */
270 0, /* tp_weaklistoffset */
271 0, /* tp_iter */
272 0, /* tp_iternext */
273 0, /* tp_methods */
274 code_memberlist, /* tp_members */
275 0, /* tp_getset */
276 0, /* tp_base */
277 0, /* tp_dict */
278 0, /* tp_descr_get */
279 0, /* tp_descr_set */
280 0, /* tp_dictoffset */
281 0, /* tp_init */
282 0, /* tp_alloc */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000283 code_new, /* tp_new */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000284};
285
Guido van Rossum644a12b1997-04-09 19:24:53 +0000286#define NAME_CHARS \
287 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
288
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000289/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
290
291static int
292all_name_chars(unsigned char *s)
293{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000294 static char ok_name_char[256];
295 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000296
Guido van Rossumcd90c202001-02-09 15:06:42 +0000297 if (ok_name_char[*name_chars] == 0) {
298 unsigned char *p;
299 for (p = name_chars; *p; p++)
300 ok_name_char[*p] = 1;
301 }
302 while (*s) {
303 if (ok_name_char[*s++] == 0)
304 return 0;
305 }
306 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000307}
308
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000309static int
310intern_strings(PyObject *tuple)
311{
312 int i;
313
314 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
315 PyObject *v = PyTuple_GET_ITEM(tuple, i);
316 if (v == NULL || !PyString_Check(v)) {
317 Py_FatalError("non-string found in code slot");
318 PyErr_BadInternalCall();
319 return -1;
320 }
321 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
322 }
323 return 0;
324}
325
Guido van Rossum79f25d91997-04-29 20:08:16 +0000326PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000327PyCode_New(int argcount, int nlocals, int stacksize, int flags,
328 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000329 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
330 PyObject *filename, PyObject *name, int firstlineno,
331 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000332{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000333 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000334 int i;
335 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000336 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000337 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000338 consts == NULL || !PyTuple_Check(consts) ||
339 names == NULL || !PyTuple_Check(names) ||
340 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000341 freevars == NULL || !PyTuple_Check(freevars) ||
342 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000343 name == NULL || !PyString_Check(name) ||
344 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000345 lnotab == NULL || !PyString_Check(lnotab) ||
346 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000347 PyErr_BadInternalCall();
348 return NULL;
349 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000350 intern_strings(names);
351 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000352 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000353 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000354 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000355 for (i = PyTuple_Size(consts); --i >= 0; ) {
356 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000357 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000358 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000359 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000360 continue;
361 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000362 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000363 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000364 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000365 co->co_argcount = argcount;
366 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000367 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000368 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000369 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000370 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000371 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000372 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000373 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000374 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000375 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000376 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000377 Py_INCREF(freevars);
378 co->co_freevars = freevars;
379 Py_INCREF(cellvars);
380 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000381 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000382 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000383 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000384 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000385 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000386 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000387 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000388 }
389 return co;
390}
391
392
393/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000394
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000395/* The compiler uses two passes to generate bytecodes. The first pass
396 builds the symbol table. The second pass generates the bytecode.
397
398 The first pass uses a single symtable struct. The second pass uses
399 a compiling struct for each code block. The compiling structs
400 share a reference to the symtable.
401
402 The two passes communicate via symtable_load_symbols() and via
403 is_local() and is_global(). The former initializes several slots
404 in the compiling struct: c_varnames, c_locals, c_nlocals,
405 c_argcount, c_globals, and c_flags.
406*/
407
Tim Peters2a7f3842001-06-09 09:26:21 +0000408/* All about c_lnotab.
409
410c_lnotab is an array of unsigned bytes disguised as a Python string. In -O
411mode, SET_LINENO opcodes aren't generated, and bytecode offsets are mapped
412to source code line #s (when needed for tracebacks) via c_lnotab instead.
413The array is conceptually a list of
414 (bytecode offset increment, line number increment)
415pairs. The details are important and delicate, best illustrated by example:
416
417 byte code offset source code line number
418 0 1
419 6 2
420 50 7
421 350 307
422 361 308
423
424The first trick is that these numbers aren't stored, only the increments
425from one row to the next (this doesn't really work, but it's a start):
426
427 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
428
429The second trick is that an unsigned byte can't hold negative values, or
430values larger than 255, so (a) there's a deep assumption that byte code
431offsets and their corresponding line #s both increase monotonically, and (b)
432if at least one column jumps by more than 255 from one row to the next, more
433than one pair is written to the table. In case #b, there's no way to know
434from looking at the table later how many were written. That's the delicate
435part. A user of c_lnotab desiring to find the source line number
436corresponding to a bytecode address A should do something like this
437
438 lineno = addr = 0
439 for addr_incr, line_incr in c_lnotab:
440 addr += addr_incr
441 if addr > A:
442 return lineno
443 lineno += line_incr
444
445In order for this to work, when the addr field increments by more than 255,
446the line # increment in each pair generated must be 0 until the remaining addr
447increment is < 256. So, in the example above, com_set_lineno should not (as
448was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
449255, 0, 45, 255, 0, 45.
450*/
451
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000452struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000453 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000454 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000455 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000456 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000457 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000458 PyObject *c_globals; /* dictionary (value=None) */
459 PyObject *c_locals; /* dictionary (value=localID) */
460 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000461 PyObject *c_freevars; /* dictionary (value=None) */
462 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000463 int c_nlocals; /* index of next local */
464 int c_argcount; /* number of top-level arguments */
465 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000466 int c_nexti; /* index into c_code */
467 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000468 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000469 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000470 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000471 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000472 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000473 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000474 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000475 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000476 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000477 int c_stacklevel; /* Current stack level */
478 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000479 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000480 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000481 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000482 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000483 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000484 int c_nested; /* Is block nested funcdef or lamdef? */
485 int c_closure; /* Is nested w/freevars? */
486 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000487 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000488 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000489};
490
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000491static int
492is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000493{
494 if ((v & (USE | DEF_FREE))
495 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
496 return 1;
497 if (v & DEF_FREE_CLASS)
498 return 1;
499 return 0;
500}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000501
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000502static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000503com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000504{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000505 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
506
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000507 if (c == NULL) {
508 /* Error occurred via symtable call to
509 is_constant_false */
510 PyErr_SetString(exc, msg);
511 return;
512 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000513 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000514 if (c->c_lineno < 1 || c->c_interactive) {
515 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000516 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000517 return;
518 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000519 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000520 if (v == NULL)
521 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000522
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000523 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000524 if (line == NULL) {
525 Py_INCREF(Py_None);
526 line = Py_None;
527 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000528 if (exc == PyExc_SyntaxError) {
529 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
530 Py_None, line);
531 if (t == NULL)
532 goto exit;
533 w = Py_BuildValue("(OO)", v, t);
534 if (w == NULL)
535 goto exit;
536 PyErr_SetObject(exc, w);
537 } else {
538 /* Make sure additional exceptions are printed with
539 file and line, also. */
540 PyErr_SetObject(exc, v);
541 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
542 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000543 exit:
544 Py_XDECREF(t);
545 Py_XDECREF(v);
546 Py_XDECREF(w);
547 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000548}
549
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000550/* Interface to the block stack */
551
552static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000553block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000554{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000555 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000556 com_error(c, PyExc_SystemError,
557 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000558 }
559 else {
560 c->c_block[c->c_nblocks++] = type;
561 }
562}
563
564static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000565block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000566{
567 if (c->c_nblocks > 0)
568 c->c_nblocks--;
569 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000570 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000571 }
572}
573
Guido van Rossum681d79a1995-07-18 14:51:37 +0000574/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000575
Tim Petersdbd9ba62000-07-09 03:09:57 +0000576static int com_init(struct compiling *, char *);
577static void com_free(struct compiling *);
578static void com_push(struct compiling *, int);
579static void com_pop(struct compiling *, int);
580static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000581static void com_node(struct compiling *, node *);
582static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000583static void com_addbyte(struct compiling *, int);
584static void com_addint(struct compiling *, int);
585static void com_addoparg(struct compiling *, int, int);
586static void com_addfwref(struct compiling *, int, int *);
587static void com_backpatch(struct compiling *, int);
588static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
589static int com_addconst(struct compiling *, PyObject *);
590static int com_addname(struct compiling *, PyObject *);
591static void com_addopname(struct compiling *, int, node *);
592static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000593static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000594static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000595static void com_assign(struct compiling *, node *, int, node *);
596static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000597static PyCodeObject *icompile(node *, struct compiling *);
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000598static PyCodeObject *jcompile(node *, char *, struct compiling *,
599 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000600static PyObject *parsestrplus(struct compiling*, node *);
601static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000602static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000603
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000604static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000605
606/* symtable operations */
607static int symtable_build(struct compiling *, node *);
608static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000609static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000610static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000611static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000612static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000613static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000614
615static void symtable_node(struct symtable *, node *);
616static void symtable_funcdef(struct symtable *, node *);
617static void symtable_default_args(struct symtable *, node *);
618static void symtable_params(struct symtable *, node *);
619static void symtable_params_fplist(struct symtable *, node *n);
620static void symtable_global(struct symtable *, node *);
621static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000622static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000623static void symtable_list_comprehension(struct symtable *, node *);
624
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000625static int symtable_update_free_vars(struct symtable *);
626static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
627static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
628
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000629/* helper */
630static void
631do_pad(int pad)
632{
633 int i;
634 for (i = 0; i < pad; ++i)
635 fprintf(stderr, " ");
636}
637
638static void
639dump(node *n, int pad, int depth)
640{
641 int i;
642 if (depth == 0)
643 return;
644 do_pad(pad);
645 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
646 if (depth > 0)
647 depth--;
648 for (i = 0; i < NCH(n); ++i)
649 dump(CHILD(n, i), pad + 1, depth);
650}
651
652#define DUMP(N) dump(N, 0, -1)
653
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000654static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000655com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000656{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000657 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000658 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
659 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000660 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000661 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000662 goto fail;
663 if ((c->c_const_dict = PyDict_New()) == NULL)
664 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000665 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000666 goto fail;
667 if ((c->c_name_dict = PyDict_New()) == NULL)
668 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000669 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000670 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000671 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
672 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000673 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000674 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000675 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000676 c->c_freevars = NULL;
677 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000678 c->c_nlocals = 0;
679 c->c_argcount = 0;
680 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000681 c->c_nexti = 0;
682 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000683 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000684 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000685 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000686 c->c_begin = 0;
687 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000688 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000689 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000690 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000691 c->c_stacklevel = 0;
692 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000693 c->c_firstlineno = 0;
694 c->c_last_addr = 0;
695 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000696 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000697 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000698 c->c_nested = 0;
699 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000700 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000701 return 1;
702
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000703 fail:
704 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000705 return 0;
706}
707
708static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000709com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000710{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000711 Py_XDECREF(c->c_code);
712 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000713 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000714 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000715 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000716 Py_XDECREF(c->c_globals);
717 Py_XDECREF(c->c_locals);
718 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000719 Py_XDECREF(c->c_freevars);
720 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000721 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000722 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +0000723 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000724}
725
726static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000727com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000728{
729 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000730 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +0000731 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000732 /*
733 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
734 c->c_filename, c->c_name, c->c_lineno,
735 c->c_nexti, c->c_stacklevel, n);
736 */
737 }
Guido van Rossum8b993a91997-01-17 21:04:03 +0000738}
739
740static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000741com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000742{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000743 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000744 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000745 else
746 c->c_stacklevel -= n;
747}
748
749static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000750com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000751{
752 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000753 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000754 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000755 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000756}
757
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000758static int
759com_check_size(PyObject **s, int offset)
760{
761 int len = PyString_GET_SIZE(*s);
762 if (offset >= len)
763 return _PyString_Resize(s, len * 2);
764 return 0;
765}
766
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000767static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000768com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000769{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000770 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000771 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +0000772 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000773 if (com_check_size(&c->c_code, c->c_nexti)) {
774 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000775 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000776 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000777 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000778}
779
780static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000781com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000782{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000783 com_addbyte(c, x & 0xff);
784 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000785}
786
787static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000788com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000789{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000790 char *p;
791 if (c->c_lnotab == NULL)
792 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000793 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
794 c->c_errors++;
795 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000796 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000797 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000798 *p++ = addr;
799 *p++ = line;
800 c->c_lnotab_next += 2;
801}
802
803static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000804com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000805{
806 c->c_lineno = lineno;
807 if (c->c_firstlineno == 0) {
808 c->c_firstlineno = c->c_last_line = lineno;
809 }
810 else {
811 int incr_addr = c->c_nexti - c->c_last_addr;
812 int incr_line = lineno - c->c_last_line;
Tim Peters2a7f3842001-06-09 09:26:21 +0000813 while (incr_addr > 255) {
814 com_add_lnotab(c, 255, 0);
815 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000816 }
Tim Peters2a7f3842001-06-09 09:26:21 +0000817 while (incr_line > 255) {
818 com_add_lnotab(c, incr_addr, 255);
819 incr_line -=255;
820 incr_addr = 0;
821 }
822 if (incr_addr > 0 || incr_line > 0)
823 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000824 c->c_last_addr = c->c_nexti;
825 c->c_last_line = lineno;
826 }
827}
828
829static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000830com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000831{
Fred Drakeef8ace32000-08-24 00:32:09 +0000832 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000833 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000834 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000835 if (Py_OptimizeFlag)
836 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000837 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000838 if (extended_arg){
839 com_addbyte(c, EXTENDED_ARG);
840 com_addint(c, extended_arg);
841 arg &= 0xffff;
842 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000843 com_addbyte(c, op);
844 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000845}
846
847static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000848com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000849{
850 /* Compile a forward reference for backpatching */
851 int here;
852 int anchor;
853 com_addbyte(c, op);
854 here = c->c_nexti;
855 anchor = *p_anchor;
856 *p_anchor = here;
857 com_addint(c, anchor == 0 ? 0 : here - anchor);
858}
859
860static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000861com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000862{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000863 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000864 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000865 int dist;
866 int prev;
867 for (;;) {
868 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000869 prev = code[anchor] + (code[anchor+1] << 8);
870 dist = target - (anchor+2);
871 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000872 dist >>= 8;
873 code[anchor+1] = dist;
874 dist >>= 8;
875 if (dist) {
876 com_error(c, PyExc_SystemError,
877 "com_backpatch: offset too large");
878 break;
879 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000880 if (!prev)
881 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000882 anchor -= prev;
883 }
884}
885
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000886/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000887
888static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000889com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000890{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000891 PyObject *w, *t, *np=NULL;
892 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000893
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000894 t = Py_BuildValue("(OO)", v, v->ob_type);
895 if (t == NULL)
896 goto fail;
897 w = PyDict_GetItem(dict, t);
898 if (w != NULL) {
899 n = PyInt_AsLong(w);
900 } else {
901 n = PyList_Size(list);
902 np = PyInt_FromLong(n);
903 if (np == NULL)
904 goto fail;
905 if (PyList_Append(list, v) != 0)
906 goto fail;
907 if (PyDict_SetItem(dict, t, np) != 0)
908 goto fail;
909 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000910 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000911 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000912 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000913 fail:
914 Py_XDECREF(np);
915 Py_XDECREF(t);
916 c->c_errors++;
917 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000918}
919
920static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000921com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000922{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000923 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000924}
925
926static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000927com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000928{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000929 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000930}
931
Raymond Hettinger0ae0c072002-06-20 22:23:15 +0000932int
933_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000934{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000935 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000936 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000937 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000938 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
939 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000940 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000941 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000942 return 0; /* Don't mangle __extremely_long_names */
943 if (name[nlen-1] == '_' && name[nlen-2] == '_')
944 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000945 /* Strip leading underscores from class name */
946 while (*p == '_')
947 p++;
948 if (*p == '\0')
949 return 0; /* Don't mangle if class is just underscores */
950 plen = strlen(p);
951 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000952 plen = maxlen-nlen-2; /* Truncate class name if too long */
953 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000954 buffer[0] = '_';
955 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000956 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000957 return 1;
958}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000959
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000960static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000961com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000962{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000963 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000964 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000965 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000966
Raymond Hettinger0ae0c072002-06-20 22:23:15 +0000967 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000968 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000969 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000970 c->c_errors++;
971 i = 255;
972 }
973 else {
974 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000975 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000976 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000977 com_addoparg(c, op, i);
978}
979
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000980#define NAME_LOCAL 0
981#define NAME_GLOBAL 1
982#define NAME_DEFAULT 2
983#define NAME_CLOSURE 3
984
985static int
986com_lookup_arg(PyObject *dict, PyObject *name)
987{
988 PyObject *v = PyDict_GetItem(dict, name);
989 if (v == NULL)
990 return -1;
991 else
992 return PyInt_AS_LONG(v);
993}
994
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000995static void
996com_addop_varname(struct compiling *c, int kind, char *name)
997{
998 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000999 int i, reftype;
1000 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001001 int op = STOP_CODE;
1002 char buffer[MANGLE_LEN];
1003
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001004 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001005 name = buffer;
1006 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1007 c->c_errors++;
1008 i = 255;
1009 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001010 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001011
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001012 reftype = get_ref_type(c, name);
1013 switch (reftype) {
1014 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001015 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001016 scope = NAME_LOCAL;
1017 break;
1018 case GLOBAL_EXPLICIT:
1019 scope = NAME_GLOBAL;
1020 break;
1021 case GLOBAL_IMPLICIT:
1022 if (c->c_flags & CO_OPTIMIZED)
1023 scope = NAME_GLOBAL;
1024 break;
1025 case FREE:
1026 case CELL:
1027 scope = NAME_CLOSURE;
1028 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001029 }
1030
1031 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001032 if (scope == NAME_LOCAL)
1033 i = com_lookup_arg(c->c_locals, v);
1034 else if (reftype == FREE)
1035 i = com_lookup_arg(c->c_freevars, v);
1036 else if (reftype == CELL)
1037 i = com_lookup_arg(c->c_cellvars, v);
1038 if (i == -1) {
1039 c->c_errors++; /* XXX no exception set */
1040 i = 255;
1041 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001042 }
1043 Py_DECREF(v);
1044
1045 switch (kind) {
1046 case VAR_LOAD:
1047 switch (scope) {
1048 case NAME_LOCAL:
1049 op = LOAD_FAST;
1050 break;
1051 case NAME_GLOBAL:
1052 op = LOAD_GLOBAL;
1053 break;
1054 case NAME_DEFAULT:
1055 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001056 break;
1057 case NAME_CLOSURE:
1058 op = LOAD_DEREF;
1059 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001060 }
1061 break;
1062 case VAR_STORE:
1063 switch (scope) {
1064 case NAME_LOCAL:
1065 op = STORE_FAST;
1066 break;
1067 case NAME_GLOBAL:
1068 op = STORE_GLOBAL;
1069 break;
1070 case NAME_DEFAULT:
1071 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001072 break;
1073 case NAME_CLOSURE:
1074 op = STORE_DEREF;
1075 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001076 }
1077 break;
1078 case VAR_DELETE:
1079 switch (scope) {
1080 case NAME_LOCAL:
1081 op = DELETE_FAST;
1082 break;
1083 case NAME_GLOBAL:
1084 op = DELETE_GLOBAL;
1085 break;
1086 case NAME_DEFAULT:
1087 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001088 break;
1089 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001090 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001091 PyOS_snprintf(buf, sizeof(buf),
1092 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001093 com_error(c, PyExc_SyntaxError, buf);
1094 i = 255;
1095 break;
1096 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001097 }
1098 break;
1099 }
1100done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001101 com_addoparg(c, op, i);
1102}
1103
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001104static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001105com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001106{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001107 char *name;
1108 char buffer[1000];
1109 /* XXX it is possible to write this code without the 1000
1110 chars on the total length of dotted names, I just can't be
1111 bothered right now */
1112 if (TYPE(n) == STAR)
1113 name = "*";
1114 else if (TYPE(n) == dotted_name) {
1115 char *p = buffer;
1116 int i;
1117 name = buffer;
1118 for (i = 0; i < NCH(n); i += 2) {
1119 char *s = STR(CHILD(n, i));
1120 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001121 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001122 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001123 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001124 break;
1125 }
1126 if (p != buffer)
1127 *p++ = '.';
1128 strcpy(p, s);
1129 p = strchr(p, '\0');
1130 }
1131 }
1132 else {
1133 REQ(n, NAME);
1134 name = STR(n);
1135 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001136 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001137}
1138
Guido van Rossum79f25d91997-04-29 20:08:16 +00001139static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001140parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001141{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001142 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001143 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001144 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001145#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +00001146 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +00001147 int imflag;
1148#endif
1149
Guido van Rossum282914b1991-04-04 10:42:56 +00001150 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001151 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001152#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001153 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001154#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001155 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001156 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001157 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001158 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001159 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001160 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001161 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001162 if (errno != 0)
1163 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001164 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001165 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001166 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001167#ifndef WITHOUT_COMPLEX
1168 if (imflag) {
1169 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001170 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001171 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001172 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001173 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001174 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001175 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001176#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001177 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001178 PyFPE_START_PROTECT("atof", return 0)
1179 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001180 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001181 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001182 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001183}
1184
Guido van Rossum79f25d91997-04-29 20:08:16 +00001185static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001186decode_utf8(char **sPtr, char *end, char* encoding)
1187{
1188 PyObject *u, *v;
1189 char *s, *t;
1190 t = s = *sPtr;
1191 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1192 while (s < end && (*s & 0x80)) s++;
1193 *sPtr = s;
1194 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1195 if (u == NULL)
1196 return NULL;
1197 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1198 Py_DECREF(u);
1199 return v;
1200}
1201
1202static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001203parsestr(struct compiling *com, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001204{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001205 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001206 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001207 char *buf;
1208 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001209 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001210 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001211 int first = *s;
1212 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001213 int rawmode = 0;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001214 char* encoding = ((com == NULL) ? NULL : com->c_encoding);
1215 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001216 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001217
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001218 if (isalpha(quote) || quote == '_') {
1219 if (quote == 'u' || quote == 'U') {
1220 quote = *++s;
1221 unicode = 1;
1222 }
1223 if (quote == 'r' || quote == 'R') {
1224 quote = *++s;
1225 rawmode = 1;
1226 }
1227 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001228 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001229 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001230 return NULL;
1231 }
1232 s++;
1233 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001234 if (len > INT_MAX) {
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001235 com_error(com, PyExc_OverflowError,
1236 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001237 return NULL;
1238 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001239 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001240 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001241 return NULL;
1242 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001243 if (len >= 4 && s[0] == quote && s[1] == quote) {
1244 s += 2;
1245 len -= 2;
1246 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001247 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001248 return NULL;
1249 }
1250 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001251#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001252 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001253 PyObject *u, *w;
1254 if (encoding == NULL) {
1255 buf = s;
1256 u = NULL;
1257 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1258 buf = s;
1259 u = NULL;
1260 } else {
1261 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1262 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1263 if (u == NULL)
1264 return NULL;
1265 p = buf = PyString_AsString(u);
1266 end = s + len;
1267 while (s < end) {
1268 if (*s == '\\') {
1269 *p++ = *s++;
1270 if (*s & 0x80) {
1271 strcpy(p, "u005c");
1272 p += 5;
1273 }
1274 }
1275 if (*s & 0x80) { /* XXX inefficient */
1276 char *r;
1277 int rn, i;
1278 w = decode_utf8(&s, end, "utf-16-be");
1279 if (w == NULL) {
1280 Py_DECREF(u);
1281 return NULL;
1282 }
1283 r = PyString_AsString(w);
1284 rn = PyString_Size(w);
1285 assert(rn % 2 == 0);
1286 for (i = 0; i < rn; i += 2) {
1287 sprintf(p, "\\u%02x%02x",
1288 r[i + 0] & 0xFF,
1289 r[i + 1] & 0xFF);
1290 p += 6;
1291 }
1292 Py_DECREF(w);
1293 } else {
1294 *p++ = *s++;
1295 }
1296 }
1297 len = p - buf;
1298 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001299 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001300 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001301 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001302 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1303 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001304 if (v == NULL)
1305 PyErr_SyntaxLocation(com->c_filename, com->c_lineno);
1306 return v;
1307
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001308 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001309#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001310 need_encoding = (encoding != NULL &&
1311 strcmp(encoding, "utf-8") != 0 &&
1312 strcmp(encoding, "iso-8859-1") != 0);
1313 if (rawmode || strchr(s, '\\') == NULL) {
1314 if (need_encoding) {
1315 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1316 if (u == NULL)
1317 return NULL;
1318 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1319 Py_DECREF(u);
1320 return v;
1321 } else {
1322 return PyString_FromStringAndSize(s, len);
1323 }
1324 }
1325 v = PyString_FromStringAndSize((char *)NULL, /* XXX 4 is enough? */
1326 need_encoding ? len * 4 : len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001327 if (v == NULL)
1328 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001329 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001330 end = s + len;
1331 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001332 if (*s != '\\') {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001333 ORDINAL:
1334 if (need_encoding && (*s & 0x80)) {
1335 char *r;
1336 int rn;
1337 PyObject* w = decode_utf8(&s, end, encoding);
1338 if (w == NULL)
1339 return NULL;
1340 r = PyString_AsString(w);
1341 rn = PyString_Size(w);
1342 memcpy(p, r, rn);
1343 p += rn;
1344 Py_DECREF(w);
1345 } else {
1346 *p++ = *s++;
1347 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001348 continue;
1349 }
1350 s++;
1351 switch (*s++) {
1352 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001353 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001354 case '\\': *p++ = '\\'; break;
1355 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001356 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001357 case 'b': *p++ = '\b'; break;
1358 case 'f': *p++ = '\014'; break; /* FF */
1359 case 't': *p++ = '\t'; break;
1360 case 'n': *p++ = '\n'; break;
1361 case 'r': *p++ = '\r'; break;
1362 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001363 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1364 case '0': case '1': case '2': case '3':
1365 case '4': case '5': case '6': case '7':
1366 c = s[-1] - '0';
1367 if ('0' <= *s && *s <= '7') {
1368 c = (c<<3) + *s++ - '0';
1369 if ('0' <= *s && *s <= '7')
1370 c = (c<<3) + *s++ - '0';
1371 }
1372 *p++ = c;
1373 break;
1374 case 'x':
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001375 if (isxdigit(Py_CHARMASK(s[0]))
1376 && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +00001377 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001378 c = Py_CHARMASK(*s);
1379 s++;
1380 if (isdigit(c))
1381 x = c - '0';
1382 else if (islower(c))
1383 x = 10 + c - 'a';
1384 else
1385 x = 10 + c - 'A';
1386 x = x << 4;
1387 c = Py_CHARMASK(*s);
1388 s++;
1389 if (isdigit(c))
1390 x += c - '0';
1391 else if (islower(c))
1392 x += 10 + c - 'a';
1393 else
1394 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +00001395 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001396 break;
1397 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001398 Py_DECREF(v);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001399 com_error(com, PyExc_ValueError,
1400 "invalid \\x escape");
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001401 return NULL;
Guido van Rossum05459c52002-05-28 18:47:29 +00001402#ifndef Py_USING_UNICODE
1403 case 'u':
1404 case 'U':
1405 case 'N':
1406 if (unicode) {
1407 Py_DECREF(v);
1408 com_error(com, PyExc_ValueError,
1409 "Unicode escapes not legal "
1410 "when Unicode disabled");
1411 return NULL;
1412 }
1413#endif
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001414 default:
1415 *p++ = '\\';
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001416 s--;
1417 goto ORDINAL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001418 }
1419 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001420 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001421 return v;
1422}
1423
Guido van Rossum79f25d91997-04-29 20:08:16 +00001424static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001425parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001426{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001427 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001428 int i;
1429 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001430 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001431 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001432 for (i = 1; i < NCH(n); i++) {
1433 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001434 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001435 if (s == NULL)
1436 goto onError;
1437 if (PyString_Check(v) && PyString_Check(s)) {
1438 PyString_ConcatAndDel(&v, s);
1439 if (v == NULL)
1440 goto onError;
1441 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001442#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001443 else {
1444 PyObject *temp;
1445 temp = PyUnicode_Concat(v, s);
1446 Py_DECREF(s);
1447 if (temp == NULL)
1448 goto onError;
1449 Py_DECREF(v);
1450 v = temp;
1451 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001452#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001453 }
1454 }
1455 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001456
1457 onError:
1458 Py_XDECREF(v);
1459 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001460}
1461
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001462static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001463com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001464{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001465 int anchor = 0;
1466 int save_begin = c->c_begin;
1467
1468 /* list_iter: for v in expr [list_iter] */
1469 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001470 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001471 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001472 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001473 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001474 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001475 c->c_loops++;
1476 com_list_iter(c, n, e, t);
1477 c->c_loops--;
1478 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1479 c->c_begin = save_begin;
1480 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001481 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001482}
1483
1484static void
1485com_list_if(struct compiling *c, node *n, node *e, char *t)
1486{
1487 int anchor = 0;
1488 int a = 0;
1489 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001490 com_node(c, CHILD(n, 1));
1491 com_addfwref(c, JUMP_IF_FALSE, &a);
1492 com_addbyte(c, POP_TOP);
1493 com_pop(c, 1);
1494 com_list_iter(c, n, e, t);
1495 com_addfwref(c, JUMP_FORWARD, &anchor);
1496 com_backpatch(c, a);
1497 /* We jump here with an extra entry which we now pop */
1498 com_addbyte(c, POP_TOP);
1499 com_backpatch(c, anchor);
1500}
1501
1502static void
1503com_list_iter(struct compiling *c,
1504 node *p, /* parent of list_iter node */
1505 node *e, /* element expression node */
1506 char *t /* name of result list temp local */)
1507{
1508 /* list_iter is the last child in a listmaker, list_for, or list_if */
1509 node *n = CHILD(p, NCH(p)-1);
1510 if (TYPE(n) == list_iter) {
1511 n = CHILD(n, 0);
1512 switch (TYPE(n)) {
1513 case list_for:
1514 com_list_for(c, n, e, t);
1515 break;
1516 case list_if:
1517 com_list_if(c, n, e, t);
1518 break;
1519 default:
1520 com_error(c, PyExc_SystemError,
1521 "invalid list_iter node type");
1522 }
1523 }
1524 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001525 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001526 com_push(c, 1);
1527 com_node(c, e);
1528 com_addoparg(c, CALL_FUNCTION, 1);
1529 com_addbyte(c, POP_TOP);
1530 com_pop(c, 2);
1531 }
1532}
1533
1534static void
1535com_list_comprehension(struct compiling *c, node *n)
1536{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001537 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001538 char tmpname[30];
1539 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001540 com_addoparg(c, BUILD_LIST, 0);
1541 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1542 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001543 com_addop_name(c, LOAD_ATTR, "append");
1544 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001545 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001546 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001547 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001548 --c->c_tmpname;
1549}
1550
1551static void
1552com_listmaker(struct compiling *c, node *n)
1553{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001554 /* listmaker: test ( list_for | (',' test)* [','] ) */
1555 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001556 com_list_comprehension(c, n);
1557 else {
1558 int len = 0;
1559 int i;
1560 for (i = 0; i < NCH(n); i += 2, len++)
1561 com_node(c, CHILD(n, i));
1562 com_addoparg(c, BUILD_LIST, len);
1563 com_pop(c, len-1);
1564 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001565}
1566
1567static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001568com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001569{
1570 int i;
1571 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1572 for (i = 0; i+2 < NCH(n); i += 4) {
1573 /* We must arrange things just right for STORE_SUBSCR.
1574 It wants the stack to look like (value) (dict) (key) */
1575 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001576 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001577 com_node(c, CHILD(n, i+2)); /* value */
1578 com_addbyte(c, ROT_TWO);
1579 com_node(c, CHILD(n, i)); /* key */
1580 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001581 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001582 }
1583}
1584
1585static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001586com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001587{
1588 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001589 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001590 int i;
1591 REQ(n, atom);
1592 ch = CHILD(n, 0);
1593 switch (TYPE(ch)) {
1594 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001595 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001596 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001597 com_push(c, 1);
1598 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001599 else
1600 com_node(c, CHILD(n, 1));
1601 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001602 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001603 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001604 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001605 com_push(c, 1);
1606 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001607 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001608 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001609 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001610 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001611 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001612 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001613 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001614 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001615 break;
1616 case BACKQUOTE:
1617 com_node(c, CHILD(n, 1));
1618 com_addbyte(c, UNARY_CONVERT);
1619 break;
1620 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001621 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001622 i = 255;
1623 }
1624 else {
1625 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001626 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001627 }
1628 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001629 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001630 break;
1631 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001632 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001633 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001634 c->c_errors++;
1635 i = 255;
1636 }
1637 else {
1638 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001639 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001640 }
1641 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001642 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001643 break;
1644 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001645 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001646 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001647 break;
1648 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001649 com_error(c, PyExc_SystemError,
1650 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001651 }
1652}
1653
1654static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001655com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001656{
1657 if (NCH(n) == 1) {
1658 com_addbyte(c, op);
1659 }
1660 else if (NCH(n) == 2) {
1661 if (TYPE(CHILD(n, 0)) != COLON) {
1662 com_node(c, CHILD(n, 0));
1663 com_addbyte(c, op+1);
1664 }
1665 else {
1666 com_node(c, CHILD(n, 1));
1667 com_addbyte(c, op+2);
1668 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001669 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001670 }
1671 else {
1672 com_node(c, CHILD(n, 0));
1673 com_node(c, CHILD(n, 2));
1674 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001675 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001676 }
1677}
1678
Guido van Rossum635abd21997-01-06 22:56:52 +00001679static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001680com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1681{
1682 if (NCH(n) == 1) {
1683 com_addbyte(c, DUP_TOP);
1684 com_push(c, 1);
1685 com_addbyte(c, SLICE);
1686 com_node(c, augn);
1687 com_addbyte(c, opcode);
1688 com_pop(c, 1);
1689 com_addbyte(c, ROT_TWO);
1690 com_addbyte(c, STORE_SLICE);
1691 com_pop(c, 2);
1692 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1693 com_node(c, CHILD(n, 0));
1694 com_addoparg(c, DUP_TOPX, 2);
1695 com_push(c, 2);
1696 com_addbyte(c, SLICE+1);
1697 com_pop(c, 1);
1698 com_node(c, augn);
1699 com_addbyte(c, opcode);
1700 com_pop(c, 1);
1701 com_addbyte(c, ROT_THREE);
1702 com_addbyte(c, STORE_SLICE+1);
1703 com_pop(c, 3);
1704 } else if (NCH(n) == 2) {
1705 com_node(c, CHILD(n, 1));
1706 com_addoparg(c, DUP_TOPX, 2);
1707 com_push(c, 2);
1708 com_addbyte(c, SLICE+2);
1709 com_pop(c, 1);
1710 com_node(c, augn);
1711 com_addbyte(c, opcode);
1712 com_pop(c, 1);
1713 com_addbyte(c, ROT_THREE);
1714 com_addbyte(c, STORE_SLICE+2);
1715 com_pop(c, 3);
1716 } else {
1717 com_node(c, CHILD(n, 0));
1718 com_node(c, CHILD(n, 2));
1719 com_addoparg(c, DUP_TOPX, 3);
1720 com_push(c, 3);
1721 com_addbyte(c, SLICE+3);
1722 com_pop(c, 2);
1723 com_node(c, augn);
1724 com_addbyte(c, opcode);
1725 com_pop(c, 1);
1726 com_addbyte(c, ROT_FOUR);
1727 com_addbyte(c, STORE_SLICE+3);
1728 com_pop(c, 4);
1729 }
1730}
1731
1732static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001733com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001734{
1735 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001736 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001737 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001738 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001739 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001740 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001741 }
1742 else {
1743 com_node(c, CHILD(n, 0));
1744 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001745 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001746 }
1747 m = n;
1748 do {
1749 m = CHILD(m, 0);
1750 } while (NCH(m) == 1);
1751 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001752 /* f(lambda x: x[0] = 3) ends up getting parsed with
1753 * LHS test = lambda x: x[0], and RHS test = 3.
1754 * SF bug 132313 points out that complaining about a keyword
1755 * then is very confusing.
1756 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001757 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001758 TYPE(m) == lambdef ?
1759 "lambda cannot contain assignment" :
1760 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001761 }
1762 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001763 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001764 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001765 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001766 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001767 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001768 else if (*pkeywords == NULL) {
1769 c->c_errors++;
1770 Py_DECREF(v);
1771 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001772 if (PyDict_GetItem(*pkeywords, v) != NULL)
1773 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001774 "duplicate keyword argument");
1775 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001776 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001777 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001778 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001779 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001780 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001781 }
1782 }
1783 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001784}
1785
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001786static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001787com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001788{
1789 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001790 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001791 }
1792 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001793 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001794 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001795 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001796 int star_flag = 0;
1797 int starstar_flag = 0;
1798 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001799 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001800 na = 0;
1801 nk = 0;
1802 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001803 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001804 if (TYPE(ch) == STAR ||
1805 TYPE(ch) == DOUBLESTAR)
1806 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001807 if (ch->n_lineno != lineno) {
1808 lineno = ch->n_lineno;
1809 com_addoparg(c, SET_LINENO, lineno);
1810 }
1811 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001812 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001813 na++;
1814 else
1815 nk++;
1816 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001817 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001818 while (i < NCH(n)) {
1819 node *tok = CHILD(n, i);
1820 node *ch = CHILD(n, i+1);
1821 i += 3;
1822 switch (TYPE(tok)) {
1823 case STAR: star_flag = 1; break;
1824 case DOUBLESTAR: starstar_flag = 1; break;
1825 }
1826 com_node(c, ch);
1827 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001828 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001829 com_error(c, PyExc_SyntaxError,
1830 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001831 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001832 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001833 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001834 star_flag + (starstar_flag << 1);
1835 else
1836 opcode = CALL_FUNCTION;
1837 com_addoparg(c, opcode, na | (nk << 8));
1838 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001839 }
1840}
1841
1842static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001843com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001844{
1845 com_addopname(c, LOAD_ATTR, n);
1846}
1847
1848static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001849com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001850{
1851 int i=0;
1852 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001853 node *ch;
1854
1855 /* first argument */
1856 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001857 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001858 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001859 i++;
1860 }
1861 else {
1862 com_node(c, CHILD(n,i));
1863 i++;
1864 REQ(CHILD(n,i),COLON);
1865 i++;
1866 }
1867 /* second argument */
1868 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1869 com_node(c, CHILD(n,i));
1870 i++;
1871 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001872 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001873 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001874 com_push(c, 1);
1875 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001876 /* remaining arguments */
1877 for (; i < NCH(n); i++) {
1878 ns++;
1879 ch=CHILD(n,i);
1880 REQ(ch, sliceop);
1881 if (NCH(ch) == 1) {
1882 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001883 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001884 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001885 }
1886 else
1887 com_node(c, CHILD(ch,1));
1888 }
1889 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001890 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001891}
1892
1893static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001894com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001895{
1896 node *ch;
1897 REQ(n, subscript);
1898 ch = CHILD(n,0);
1899 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001900 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001901 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001902 com_push(c, 1);
1903 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001904 else {
1905 /* check for slice */
1906 if ((TYPE(ch) == COLON || NCH(n) > 1))
1907 com_sliceobj(c, n);
1908 else {
1909 REQ(ch, test);
1910 com_node(c, ch);
1911 }
1912 }
1913}
1914
1915static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001916com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001917{
1918 int i, op;
1919 REQ(n, subscriptlist);
1920 /* Check to make backward compatible slice behavior for '[i:j]' */
1921 if (NCH(n) == 1) {
1922 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001923 /* 'Basic' slice, should have exactly one colon. */
1924 if ((TYPE(CHILD(sub, 0)) == COLON
1925 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1926 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1927 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001928 switch (assigning) {
1929 case OP_DELETE:
1930 op = DELETE_SLICE;
1931 break;
1932 case OP_ASSIGN:
1933 op = STORE_SLICE;
1934 break;
1935 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001936 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001937 break;
1938 default:
1939 com_augassign_slice(c, sub, assigning, augn);
1940 return;
1941 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001942 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001943 if (op == STORE_SLICE)
1944 com_pop(c, 2);
1945 else if (op == DELETE_SLICE)
1946 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001947 return;
1948 }
1949 }
1950 /* Else normal subscriptlist. Compile each subscript. */
1951 for (i = 0; i < NCH(n); i += 2)
1952 com_subscript(c, CHILD(n, i));
1953 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001954 if (NCH(n) > 1) {
1955 i = (NCH(n)+1) / 2;
1956 com_addoparg(c, BUILD_TUPLE, i);
1957 com_pop(c, i-1);
1958 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001959 switch (assigning) {
1960 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001961 op = DELETE_SUBSCR;
1962 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001963 break;
1964 default:
1965 case OP_ASSIGN:
1966 op = STORE_SUBSCR;
1967 i = 3;
1968 break;
1969 case OP_APPLY:
1970 op = BINARY_SUBSCR;
1971 i = 1;
1972 break;
1973 }
1974 if (assigning > OP_APPLY) {
1975 com_addoparg(c, DUP_TOPX, 2);
1976 com_push(c, 2);
1977 com_addbyte(c, BINARY_SUBSCR);
1978 com_pop(c, 1);
1979 com_node(c, augn);
1980 com_addbyte(c, assigning);
1981 com_pop(c, 1);
1982 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001983 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001984 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001985 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001986}
1987
1988static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001989com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001990{
1991 REQ(n, trailer);
1992 switch (TYPE(CHILD(n, 0))) {
1993 case LPAR:
1994 com_call_function(c, CHILD(n, 1));
1995 break;
1996 case DOT:
1997 com_select_member(c, CHILD(n, 1));
1998 break;
1999 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002000 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002001 break;
2002 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002003 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002004 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002005 }
2006}
2007
2008static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002009com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002010{
2011 int i;
2012 REQ(n, power);
2013 com_atom(c, CHILD(n, 0));
2014 for (i = 1; i < NCH(n); i++) {
2015 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2016 com_factor(c, CHILD(n, i+1));
2017 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002018 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002019 break;
2020 }
2021 else
2022 com_apply_trailer(c, CHILD(n, i));
2023 }
2024}
2025
2026static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002027com_invert_constant(struct compiling *c, node *n)
2028{
2029 /* Compute the inverse of int and longs and use them directly,
2030 but be prepared to generate code for all other
2031 possibilities (invalid numbers, floats, complex).
2032 */
2033 PyObject *num, *inv = NULL;
2034 int i;
2035
2036 REQ(n, NUMBER);
2037 num = parsenumber(c, STR(n));
2038 if (num == NULL)
2039 i = 255;
2040 else {
2041 inv = PyNumber_Invert(num);
2042 if (inv == NULL) {
2043 PyErr_Clear();
2044 i = com_addconst(c, num);
2045 } else {
2046 i = com_addconst(c, inv);
2047 Py_DECREF(inv);
2048 }
2049 Py_DECREF(num);
2050 }
2051 com_addoparg(c, LOAD_CONST, i);
2052 com_push(c, 1);
2053 if (num != NULL && inv == NULL)
2054 com_addbyte(c, UNARY_INVERT);
2055}
2056
Tim Peters51e26512001-09-07 08:45:55 +00002057static int
2058is_float_zero(const char *p)
2059{
2060 int found_radix_point = 0;
2061 int ch;
2062 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2063 switch (ch) {
2064 case '0':
2065 /* no reason to believe it's not 0 -- continue */
2066 break;
2067
2068 case 'e': case 'E': case 'j': case 'J':
2069 /* If this was a hex constant, we already would have
2070 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2071 must be an exponent marker, and we haven't yet
2072 seen a non-zero digit, and it doesn't matter what
2073 the exponent is then. For 'j' or 'J' similarly,
2074 except that this is an imaginary 0 then. */
2075 return 1;
2076
2077 case '.':
2078 found_radix_point = 1;
2079 break;
2080
2081 default:
2082 return 0;
2083 }
2084 }
2085 return found_radix_point;
2086}
2087
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002088static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002089com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002090{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002091 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002092 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002093 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002094 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002095 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002096 approriate value as a constant. If the value is negative,
2097 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002098 negative in the 0th position -- unless we're doing unary minus
2099 of a floating zero! In that case the sign is significant, but
2100 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002101 */
2102 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002103 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002104 && TYPE((pfactor = CHILD(n, 1))) == factor
2105 && NCH(pfactor) == 1
2106 && TYPE((ppower = CHILD(pfactor, 0))) == power
2107 && NCH(ppower) == 1
2108 && TYPE((patom = CHILD(ppower, 0))) == atom
2109 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
2110 && !(childtype == MINUS && is_float_zero(STR(pnum)))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002111 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002112 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002113 return;
2114 }
2115 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002116 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002117 if (s == NULL) {
2118 com_error(c, PyExc_MemoryError, "");
2119 com_addbyte(c, 255);
2120 return;
2121 }
2122 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002123 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002124 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002125 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002126 }
Tim Peters51e26512001-09-07 08:45:55 +00002127 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002128 }
2129 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002130 com_factor(c, CHILD(n, 1));
2131 com_addbyte(c, UNARY_POSITIVE);
2132 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002133 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002134 com_factor(c, CHILD(n, 1));
2135 com_addbyte(c, UNARY_NEGATIVE);
2136 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002137 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002138 com_factor(c, CHILD(n, 1));
2139 com_addbyte(c, UNARY_INVERT);
2140 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002141 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002142 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002143 }
2144}
2145
2146static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002147com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002148{
2149 int i;
2150 int op;
2151 REQ(n, term);
2152 com_factor(c, CHILD(n, 0));
2153 for (i = 2; i < NCH(n); i += 2) {
2154 com_factor(c, CHILD(n, i));
2155 switch (TYPE(CHILD(n, i-1))) {
2156 case STAR:
2157 op = BINARY_MULTIPLY;
2158 break;
2159 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002160 if (c->c_flags & CO_FUTURE_DIVISION)
2161 op = BINARY_TRUE_DIVIDE;
2162 else
2163 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002164 break;
2165 case PERCENT:
2166 op = BINARY_MODULO;
2167 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002168 case DOUBLESLASH:
2169 op = BINARY_FLOOR_DIVIDE;
2170 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002171 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002172 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002173 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002174 op = 255;
2175 }
2176 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002177 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002178 }
2179}
2180
2181static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002182com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002183{
2184 int i;
2185 int op;
2186 REQ(n, arith_expr);
2187 com_term(c, CHILD(n, 0));
2188 for (i = 2; i < NCH(n); i += 2) {
2189 com_term(c, CHILD(n, i));
2190 switch (TYPE(CHILD(n, i-1))) {
2191 case PLUS:
2192 op = BINARY_ADD;
2193 break;
2194 case MINUS:
2195 op = BINARY_SUBTRACT;
2196 break;
2197 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002198 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002199 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002200 op = 255;
2201 }
2202 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002203 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002204 }
2205}
2206
2207static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002208com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002209{
2210 int i;
2211 int op;
2212 REQ(n, shift_expr);
2213 com_arith_expr(c, CHILD(n, 0));
2214 for (i = 2; i < NCH(n); i += 2) {
2215 com_arith_expr(c, CHILD(n, i));
2216 switch (TYPE(CHILD(n, i-1))) {
2217 case LEFTSHIFT:
2218 op = BINARY_LSHIFT;
2219 break;
2220 case RIGHTSHIFT:
2221 op = BINARY_RSHIFT;
2222 break;
2223 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002224 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002225 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002226 op = 255;
2227 }
2228 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002229 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002230 }
2231}
2232
2233static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002234com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002235{
2236 int i;
2237 int op;
2238 REQ(n, and_expr);
2239 com_shift_expr(c, CHILD(n, 0));
2240 for (i = 2; i < NCH(n); i += 2) {
2241 com_shift_expr(c, CHILD(n, i));
2242 if (TYPE(CHILD(n, i-1)) == AMPER) {
2243 op = BINARY_AND;
2244 }
2245 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002246 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002247 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002248 op = 255;
2249 }
2250 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002251 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002252 }
2253}
2254
2255static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002256com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002257{
2258 int i;
2259 int op;
2260 REQ(n, xor_expr);
2261 com_and_expr(c, CHILD(n, 0));
2262 for (i = 2; i < NCH(n); i += 2) {
2263 com_and_expr(c, CHILD(n, i));
2264 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2265 op = BINARY_XOR;
2266 }
2267 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002268 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002269 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002270 op = 255;
2271 }
2272 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002273 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002274 }
2275}
2276
2277static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002278com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002279{
2280 int i;
2281 int op;
2282 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002283 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002284 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002285 com_xor_expr(c, CHILD(n, i));
2286 if (TYPE(CHILD(n, i-1)) == VBAR) {
2287 op = BINARY_OR;
2288 }
2289 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002290 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002291 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002292 op = 255;
2293 }
2294 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002295 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002296 }
2297}
2298
2299static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002300cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002301{
2302 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00002303 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002304 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2305 if (NCH(n) == 1) {
2306 n = CHILD(n, 0);
2307 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002308 case LESS: return PyCmp_LT;
2309 case GREATER: return PyCmp_GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002310 case EQEQUAL: /* == */
Martin v. Löwis7198a522002-01-01 19:59:11 +00002311 case EQUAL: return PyCmp_EQ;
2312 case LESSEQUAL: return PyCmp_LE;
2313 case GREATEREQUAL: return PyCmp_GE;
2314 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2315 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2316 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002317 }
2318 }
2319 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002320 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002321 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002322 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002323 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002324 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002325 }
2326 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002327 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002328}
2329
2330static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002331com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002332{
2333 int i;
2334 enum cmp_op op;
2335 int anchor;
2336 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2337 com_expr(c, CHILD(n, 0));
2338 if (NCH(n) == 1)
2339 return;
2340
2341 /****************************************************************
2342 The following code is generated for all but the last
2343 comparison in a chain:
2344
2345 label: on stack: opcode: jump to:
2346
2347 a <code to load b>
2348 a, b DUP_TOP
2349 a, b, b ROT_THREE
2350 b, a, b COMPARE_OP
2351 b, 0-or-1 JUMP_IF_FALSE L1
2352 b, 1 POP_TOP
2353 b
2354
2355 We are now ready to repeat this sequence for the next
2356 comparison in the chain.
2357
2358 For the last we generate:
2359
2360 b <code to load c>
2361 b, c COMPARE_OP
2362 0-or-1
2363
2364 If there were any jumps to L1 (i.e., there was more than one
2365 comparison), we generate:
2366
2367 0-or-1 JUMP_FORWARD L2
2368 L1: b, 0 ROT_TWO
2369 0, b POP_TOP
2370 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002371 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002372 ****************************************************************/
2373
2374 anchor = 0;
2375
2376 for (i = 2; i < NCH(n); i += 2) {
2377 com_expr(c, CHILD(n, i));
2378 if (i+2 < NCH(n)) {
2379 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002380 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002381 com_addbyte(c, ROT_THREE);
2382 }
2383 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002384 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002385 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002386 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002387 }
2388 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002389 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002390 if (i+2 < NCH(n)) {
2391 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2392 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002393 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002394 }
2395 }
2396
2397 if (anchor) {
2398 int anchor2 = 0;
2399 com_addfwref(c, JUMP_FORWARD, &anchor2);
2400 com_backpatch(c, anchor);
2401 com_addbyte(c, ROT_TWO);
2402 com_addbyte(c, POP_TOP);
2403 com_backpatch(c, anchor2);
2404 }
2405}
2406
2407static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002408com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002409{
2410 REQ(n, not_test); /* 'not' not_test | comparison */
2411 if (NCH(n) == 1) {
2412 com_comparison(c, CHILD(n, 0));
2413 }
2414 else {
2415 com_not_test(c, CHILD(n, 1));
2416 com_addbyte(c, UNARY_NOT);
2417 }
2418}
2419
2420static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002421com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002422{
2423 int i;
2424 int anchor;
2425 REQ(n, and_test); /* not_test ('and' not_test)* */
2426 anchor = 0;
2427 i = 0;
2428 for (;;) {
2429 com_not_test(c, CHILD(n, i));
2430 if ((i += 2) >= NCH(n))
2431 break;
2432 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2433 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002434 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002435 }
2436 if (anchor)
2437 com_backpatch(c, anchor);
2438}
2439
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002440static int
2441com_make_closure(struct compiling *c, PyCodeObject *co)
2442{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002443 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002444 if (free == 0)
2445 return 0;
2446 for (i = 0; i < free; ++i) {
2447 /* Bypass com_addop_varname because it will generate
2448 LOAD_DEREF but LOAD_CLOSURE is needed.
2449 */
2450 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2451 int arg, reftype;
2452
2453 /* Special case: If a class contains a method with a
2454 free variable that has the same name as a method,
2455 the name will be considered free *and* local in the
2456 class. It should be handled by the closure, as
2457 well as by the normal name loookup logic.
2458 */
2459 reftype = get_ref_type(c, PyString_AS_STRING(name));
2460 if (reftype == CELL)
2461 arg = com_lookup_arg(c->c_cellvars, name);
2462 else /* (reftype == FREE) */
2463 arg = com_lookup_arg(c->c_freevars, name);
2464 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002465 fprintf(stderr, "lookup %s in %s %d %d\n"
2466 "freevars of %s: %s\n",
2467 PyObject_REPR(name),
2468 c->c_name,
2469 reftype, arg,
2470 PyString_AS_STRING(co->co_name),
2471 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002472 Py_FatalError("com_make_closure()");
2473 }
2474 com_addoparg(c, LOAD_CLOSURE, arg);
2475
2476 }
2477 com_push(c, free);
2478 return 1;
2479}
2480
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002481static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002482com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002483{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002484 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002485 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002486 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002487 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002488 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002489 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2490 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002491 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002492 if (co == NULL) {
2493 c->c_errors++;
2494 return;
2495 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002496 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002497 i = com_addconst(c, (PyObject *)co);
2498 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002499 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002500 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002501 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002502 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002503 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002504 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002505 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002506 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002507 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002508 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002509 else {
2510 int anchor = 0;
2511 int i = 0;
2512 for (;;) {
2513 com_and_test(c, CHILD(n, i));
2514 if ((i += 2) >= NCH(n))
2515 break;
2516 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2517 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002518 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002519 }
2520 if (anchor)
2521 com_backpatch(c, anchor);
2522 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002523}
2524
2525static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002526com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002527{
2528 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002529 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002530 com_node(c, CHILD(n, 0));
2531 }
2532 else {
2533 int i;
2534 int len;
2535 len = (NCH(n) + 1) / 2;
2536 for (i = 0; i < NCH(n); i += 2)
2537 com_node(c, CHILD(n, i));
2538 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002539 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002540 }
2541}
2542
2543
2544/* Begin of assignment compilation */
2545
Thomas Wouters434d0822000-08-24 20:11:32 +00002546
2547static void
2548com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2549{
2550 com_addbyte(c, DUP_TOP);
2551 com_push(c, 1);
2552 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002553 com_node(c, augn);
2554 com_addbyte(c, opcode);
2555 com_pop(c, 1);
2556 com_addbyte(c, ROT_TWO);
2557 com_addopname(c, STORE_ATTR, n);
2558 com_pop(c, 2);
2559}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002560
2561static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002562com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002563{
2564 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002565 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002566}
2567
2568static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002569com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002570{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002571 REQ(n, trailer);
2572 switch (TYPE(CHILD(n, 0))) {
2573 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002574 if (assigning == OP_DELETE)
2575 com_error(c, PyExc_SyntaxError,
2576 "can't delete function call");
2577 else
2578 com_error(c, PyExc_SyntaxError,
2579 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002580 break;
2581 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002582 if (assigning > OP_APPLY)
2583 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2584 else
2585 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002586 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002587 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002588 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002589 break;
2590 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002591 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002592 }
2593}
2594
2595static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002596com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002597{
2598 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002599 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002600 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002601 if (assigning) {
2602 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002603 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002604 com_push(c, i-1);
2605 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002606 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002607 com_assign(c, CHILD(n, i), assigning, NULL);
2608}
2609
2610static void
2611com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2612{
2613 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002614 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002615 com_push(c, 1);
2616 com_node(c, augn);
2617 com_addbyte(c, opcode);
2618 com_pop(c, 1);
2619 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002620}
2621
2622static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002623com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002624{
2625 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002626 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002627 if (assigning)
2628 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002629}
2630
2631static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002632com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002633{
2634 /* Loop to avoid trivial recursion */
2635 for (;;) {
2636 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002637
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002638 case exprlist:
2639 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002640 case testlist1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002641 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002642 if (assigning > OP_APPLY) {
2643 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002644 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002645 return;
2646 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002647 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002648 return;
2649 }
2650 n = CHILD(n, 0);
2651 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002652
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002653 case test:
2654 case and_test:
2655 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002656 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002657 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002658 case xor_expr:
2659 case and_expr:
2660 case shift_expr:
2661 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002662 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002663 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002664 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002665 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002666 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002667 return;
2668 }
2669 n = CHILD(n, 0);
2670 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002671
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002672 case power: /* atom trailer* ('**' power)*
2673 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002674 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002675 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002676 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002677 return;
2678 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002679 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002680 int i;
2681 com_node(c, CHILD(n, 0));
2682 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002683 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002684 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002685 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002686 return;
2687 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002688 com_apply_trailer(c, CHILD(n, i));
2689 } /* NB i is still alive */
2690 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002691 CHILD(n, i), assigning, augn);
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
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002697 case atom:
2698 switch (TYPE(CHILD(n, 0))) {
2699 case LPAR:
2700 n = CHILD(n, 1);
2701 if (TYPE(n) == RPAR) {
2702 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002703 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002704 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002705 return;
2706 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002707 if (assigning > OP_APPLY) {
2708 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002709 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002710 return;
2711 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002712 break;
2713 case LSQB:
2714 n = CHILD(n, 1);
2715 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002716 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002717 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002718 return;
2719 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002720 if (assigning > OP_APPLY) {
2721 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002722 "augmented assign to list not possible");
2723 return;
2724 }
2725 if (NCH(n) > 1
2726 && TYPE(CHILD(n, 1)) == list_for) {
2727 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002728 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002729 return;
2730 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002731 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002732 return;
2733 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002734 if (assigning > OP_APPLY)
2735 com_augassign_name(c, CHILD(n, 0),
2736 assigning, augn);
2737 else
2738 com_assign_name(c, CHILD(n, 0),
2739 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002740 return;
2741 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002742 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002743 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002744 return;
2745 }
2746 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002747
2748 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002749 com_error(c, PyExc_SyntaxError,
2750 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002751 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002752
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002753 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002754 com_error(c, PyExc_SystemError,
2755 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002756 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002757
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002758 }
2759 }
2760}
Guido van Rossum7c531111997-03-11 18:42:21 +00002761
Thomas Wouters434d0822000-08-24 20:11:32 +00002762static void
2763com_augassign(struct compiling *c, node *n)
2764{
2765 int opcode;
2766
2767 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2768 case '+': opcode = INPLACE_ADD; break;
2769 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002770 case '/':
2771 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
2772 opcode = INPLACE_FLOOR_DIVIDE;
2773 else if (c->c_flags & CO_FUTURE_DIVISION)
2774 opcode = INPLACE_TRUE_DIVIDE;
2775 else
2776 opcode = INPLACE_DIVIDE;
2777 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00002778 case '%': opcode = INPLACE_MODULO; break;
2779 case '<': opcode = INPLACE_LSHIFT; break;
2780 case '>': opcode = INPLACE_RSHIFT; break;
2781 case '&': opcode = INPLACE_AND; break;
2782 case '^': opcode = INPLACE_XOR; break;
2783 case '|': opcode = INPLACE_OR; break;
2784 case '*':
2785 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2786 opcode = INPLACE_POWER;
2787 else
2788 opcode = INPLACE_MULTIPLY;
2789 break;
2790 default:
2791 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2792 return;
2793 }
2794 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2795}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002796
2797static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002798com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002799{
Thomas Wouters434d0822000-08-24 20:11:32 +00002800 REQ(n, expr_stmt);
2801 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002802 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002803 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002804 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002805 if (NCH(n) == 1) {
2806 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002807 if (c->c_interactive)
2808 com_addbyte(c, PRINT_EXPR);
2809 else
2810 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002811 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002812 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002813 else if (TYPE(CHILD(n,1)) == augassign)
2814 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002815 else {
2816 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002817 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002818 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002819 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002820 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002821 com_push(c, 1);
2822 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002823 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002824 }
2825 }
2826}
2827
2828static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002829com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002830{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002831 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002832 int i;
2833 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002834 if (Py_OptimizeFlag)
2835 return;
2836 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00002837
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002838 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00002839 raise AssertionError [, <message>]
2840
2841 where <message> is the second test, if present.
2842 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002843 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002844 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002845 com_addbyte(c, POP_TOP);
2846 com_pop(c, 1);
2847 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002848 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002849 com_push(c, 1);
2850 i = NCH(n)/2; /* Either 2 or 4 */
2851 if (i > 1)
2852 com_node(c, CHILD(n, 3));
2853 com_addoparg(c, RAISE_VARARGS, i);
2854 com_pop(c, i);
2855 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002856 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002857 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002858 com_addbyte(c, POP_TOP);
2859}
2860
2861static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002862com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002863{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002864 int i = 1;
2865 node* stream = NULL;
2866
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002867 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002868
2869 /* are we using the extended print form? */
2870 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2871 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002872 com_node(c, stream);
2873 /* stack: [...] => [... stream] */
2874 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002875 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2876 i = 4;
2877 else
2878 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002879 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002880 for (; i < NCH(n); i += 2) {
2881 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002882 com_addbyte(c, DUP_TOP);
2883 /* stack: [stream] => [stream stream] */
2884 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002885 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002886 /* stack: [stream stream] => [stream stream obj] */
2887 com_addbyte(c, ROT_TWO);
2888 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002889 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002890 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002891 com_pop(c, 2);
2892 }
2893 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002894 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002895 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002896 com_addbyte(c, PRINT_ITEM);
2897 com_pop(c, 1);
2898 }
2899 }
2900 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002901 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002902 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002903 /* must pop the extra stream object off the stack */
2904 com_addbyte(c, POP_TOP);
2905 /* stack: [... stream] => [...] */
2906 com_pop(c, 1);
2907 }
2908 }
2909 else {
2910 if (stream != NULL) {
2911 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002912 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002913 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002914 com_pop(c, 1);
2915 }
2916 else
2917 com_addbyte(c, PRINT_NEWLINE);
2918 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002919}
2920
2921static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002922com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002923{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002924 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002925 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002926 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002927 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002928 if (c->c_flags & CO_GENERATOR) {
2929 if (NCH(n) > 1) {
2930 com_error(c, PyExc_SyntaxError,
2931 "'return' with argument inside generator");
2932 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002933 }
2934 if (NCH(n) < 2) {
2935 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002936 com_push(c, 1);
2937 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002938 else
2939 com_node(c, CHILD(n, 1));
2940 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00002941 com_pop(c, 1);
2942}
2943
2944static void
2945com_yield_stmt(struct compiling *c, node *n)
2946{
Tim Peters95c80f82001-06-23 02:07:08 +00002947 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00002948 REQ(n, yield_stmt); /* 'yield' testlist */
2949 if (!c->c_infunction) {
2950 com_error(c, PyExc_SyntaxError, "'yield' outside function");
2951 }
Tim Peters95c80f82001-06-23 02:07:08 +00002952
2953 for (i = 0; i < c->c_nblocks; ++i) {
2954 if (c->c_block[i] == SETUP_FINALLY) {
2955 com_error(c, PyExc_SyntaxError,
2956 "'yield' not allowed in a 'try' block "
2957 "with a 'finally' clause");
2958 return;
2959 }
2960 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002961 com_node(c, CHILD(n, 1));
2962 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002963 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002964}
2965
2966static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002967com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002968{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002969 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002970 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2971 if (NCH(n) > 1) {
2972 com_node(c, CHILD(n, 1));
2973 if (NCH(n) > 3) {
2974 com_node(c, CHILD(n, 3));
2975 if (NCH(n) > 5)
2976 com_node(c, CHILD(n, 5));
2977 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002978 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002979 i = NCH(n)/2;
2980 com_addoparg(c, RAISE_VARARGS, i);
2981 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002982}
2983
2984static void
Thomas Wouters52152252000-08-17 22:55:00 +00002985com_from_import(struct compiling *c, node *n)
2986{
2987 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2988 com_push(c, 1);
2989 if (NCH(n) > 1) {
2990 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2991 com_error(c, PyExc_SyntaxError, "invalid syntax");
2992 return;
2993 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002994 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002995 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002996 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002997 com_pop(c, 1);
2998}
2999
3000static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003001com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003002{
3003 int i;
3004 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003005 /* 'import' dotted_name (',' dotted_name)* |
3006 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003007 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00003008 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003009 /* 'from' dotted_name 'import' ... */
3010 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003011
3012 if (TYPE(CHILD(n, 3)) == STAR) {
3013 tup = Py_BuildValue("(s)", "*");
3014 } else {
3015 tup = PyTuple_New((NCH(n) - 2)/2);
3016 for (i = 3; i < NCH(n); i += 2) {
3017 PyTuple_SET_ITEM(tup, (i-3)/2,
3018 PyString_FromString(STR(
Jeremy Hylton4419ac12001-02-28 22:54:51 +00003019 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003020 }
3021 }
3022 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003023 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003024 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003025 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00003026 if (TYPE(CHILD(n, 3)) == STAR)
3027 com_addbyte(c, IMPORT_STAR);
3028 else {
3029 for (i = 3; i < NCH(n); i += 2)
3030 com_from_import(c, CHILD(n, i));
3031 com_addbyte(c, POP_TOP);
3032 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003033 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003034 }
3035 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003036 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003037 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003038 node *subn = CHILD(n, i);
3039 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003040 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003041 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003042 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003043 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003044 int j;
3045 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003046 com_error(c, PyExc_SyntaxError,
3047 "invalid syntax");
3048 return;
3049 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003050 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3051 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003052 CHILD(CHILD(subn, 0),
3053 j));
3054 com_addop_varname(c, VAR_STORE,
3055 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003056 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003057 com_addop_varname(c, VAR_STORE,
3058 STR(CHILD(CHILD(subn, 0),
3059 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003060 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003061 }
3062 }
3063}
3064
3065static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003066com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003067{
3068 REQ(n, exec_stmt);
3069 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3070 com_node(c, CHILD(n, 1));
3071 if (NCH(n) >= 4)
3072 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003073 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003074 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003075 com_push(c, 1);
3076 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003077 if (NCH(n) >= 6)
3078 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003079 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003080 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003081 com_push(c, 1);
3082 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003083 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003084 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003085}
3086
Guido van Rossum7c531111997-03-11 18:42:21 +00003087static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003088is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003089{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003090 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003091 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003092 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003093
3094 /* Label to avoid tail recursion */
3095 next:
3096 switch (TYPE(n)) {
3097
3098 case suite:
3099 if (NCH(n) == 1) {
3100 n = CHILD(n, 0);
3101 goto next;
3102 }
3103 /* Fall through */
3104 case file_input:
3105 for (i = 0; i < NCH(n); i++) {
3106 node *ch = CHILD(n, i);
3107 if (TYPE(ch) == stmt) {
3108 n = ch;
3109 goto next;
3110 }
3111 }
3112 break;
3113
3114 case stmt:
3115 case simple_stmt:
3116 case small_stmt:
3117 n = CHILD(n, 0);
3118 goto next;
3119
3120 case expr_stmt:
3121 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003122 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003123 case test:
3124 case and_test:
3125 case not_test:
3126 case comparison:
3127 case expr:
3128 case xor_expr:
3129 case and_expr:
3130 case shift_expr:
3131 case arith_expr:
3132 case term:
3133 case factor:
3134 case power:
3135 case atom:
3136 if (NCH(n) == 1) {
3137 n = CHILD(n, 0);
3138 goto next;
3139 }
3140 break;
3141
3142 case NAME:
3143 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3144 return 1;
3145 break;
3146
3147 case NUMBER:
3148 v = parsenumber(c, STR(n));
3149 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003150 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003151 break;
3152 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003153 i = PyObject_IsTrue(v);
3154 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003155 return i == 0;
3156
3157 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003158 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003159 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003160 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003161 break;
3162 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003163 i = PyObject_IsTrue(v);
3164 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003165 return i == 0;
3166
3167 }
3168 return 0;
3169}
3170
Tim Peters08a898f2001-06-28 01:52:22 +00003171
3172/* Look under n for a return stmt with an expression.
3173 * This hack is used to find illegal returns under "if 0:" blocks in
3174 * functions already known to be generators (as determined by the symtable
3175 * pass).
3176 * Return the offending return node if found, else NULL.
3177 */
3178static node *
3179look_for_offending_return(node *n)
3180{
3181 int i;
3182
3183 for (i = 0; i < NCH(n); ++i) {
3184 node *kid = CHILD(n, i);
3185
3186 switch (TYPE(kid)) {
3187 case classdef:
3188 case funcdef:
3189 case lambdef:
3190 /* Stuff in nested functions & classes doesn't
3191 affect the code block we started in. */
3192 return NULL;
3193
3194 case return_stmt:
3195 if (NCH(kid) > 1)
3196 return kid;
3197 break;
3198
3199 default: {
3200 node *bad = look_for_offending_return(kid);
3201 if (bad != NULL)
3202 return bad;
3203 }
3204 }
3205 }
3206
3207 return NULL;
3208}
3209
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003210static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003211com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003212{
3213 int i;
3214 int anchor = 0;
3215 REQ(n, if_stmt);
3216 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3217 for (i = 0; i+3 < NCH(n); i+=4) {
3218 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003219 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003220 if (is_constant_false(c, ch)) {
3221 /* We're going to skip this block. However, if this
3222 is a generator, we have to check the dead code
3223 anyway to make sure there aren't any return stmts
3224 with expressions, in the same scope. */
3225 if (c->c_flags & CO_GENERATOR) {
3226 node *p = look_for_offending_return(n);
3227 if (p != NULL) {
3228 int savelineno = c->c_lineno;
3229 c->c_lineno = p->n_lineno;
3230 com_error(c, PyExc_SyntaxError,
3231 "'return' with argument "
3232 "inside generator");
3233 c->c_lineno = savelineno;
3234 }
3235 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003236 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003237 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003238 if (i > 0)
3239 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003240 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003241 com_addfwref(c, JUMP_IF_FALSE, &a);
3242 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003243 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003244 com_node(c, CHILD(n, i+3));
3245 com_addfwref(c, JUMP_FORWARD, &anchor);
3246 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003247 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003248 com_addbyte(c, POP_TOP);
3249 }
3250 if (i+2 < NCH(n))
3251 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003252 if (anchor)
3253 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003254}
3255
3256static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003257com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003258{
3259 int break_anchor = 0;
3260 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003261 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003262 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3263 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003264 block_push(c, SETUP_LOOP);
3265 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003266 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003267 com_node(c, CHILD(n, 1));
3268 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3269 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003270 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003271 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003272 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003273 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003274 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3275 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003276 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003277 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003278 com_addbyte(c, POP_TOP);
3279 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003280 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003281 if (NCH(n) > 4)
3282 com_node(c, CHILD(n, 6));
3283 com_backpatch(c, break_anchor);
3284}
3285
3286static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003287com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003288{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003289 int break_anchor = 0;
3290 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003291 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003292 REQ(n, for_stmt);
3293 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3294 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003295 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003296 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003297 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003298 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003299 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003300 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003301 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003302 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003303 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003304 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003305 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003306 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3307 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003308 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003309 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003310 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003311 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003312 if (NCH(n) > 8)
3313 com_node(c, CHILD(n, 8));
3314 com_backpatch(c, break_anchor);
3315}
3316
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003317/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003318
3319 SETUP_FINALLY L
3320 <code for S>
3321 POP_BLOCK
3322 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003323 L: <code for Sf>
3324 END_FINALLY
3325
3326 The special instructions use the block stack. Each block
3327 stack entry contains the instruction that created it (here
3328 SETUP_FINALLY), the level of the value stack at the time the
3329 block stack entry was created, and a label (here L).
3330
3331 SETUP_FINALLY:
3332 Pushes the current value stack level and the label
3333 onto the block stack.
3334 POP_BLOCK:
3335 Pops en entry from the block stack, and pops the value
3336 stack until its level is the same as indicated on the
3337 block stack. (The label is ignored.)
3338 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003339 Pops a variable number of entries from the *value* stack
3340 and re-raises the exception they specify. The number of
3341 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003342
3343 The block stack is unwound when an exception is raised:
3344 when a SETUP_FINALLY entry is found, the exception is pushed
3345 onto the value stack (and the exception condition is cleared),
3346 and the interpreter jumps to the label gotten from the block
3347 stack.
3348
3349 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003350 (The contents of the value stack is shown in [], with the top
3351 at the right; 'tb' is trace-back info, 'val' the exception's
3352 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003353
3354 Value stack Label Instruction Argument
3355 [] SETUP_EXCEPT L1
3356 [] <code for S>
3357 [] POP_BLOCK
3358 [] JUMP_FORWARD L0
3359
Guido van Rossum3f5da241990-12-20 15:06:42 +00003360 [tb, val, exc] L1: DUP )
3361 [tb, val, exc, exc] <evaluate E1> )
3362 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3363 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3364 [tb, val, exc, 1] POP )
3365 [tb, val, exc] POP
3366 [tb, val] <assign to V1> (or POP if no V1)
3367 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003368 [] <code for S1>
3369 JUMP_FORWARD L0
3370
Guido van Rossum3f5da241990-12-20 15:06:42 +00003371 [tb, val, exc, 0] L2: POP
3372 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003373 .............................etc.......................
3374
Guido van Rossum3f5da241990-12-20 15:06:42 +00003375 [tb, val, exc, 0] Ln+1: POP
3376 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003377
3378 [] L0: <next statement>
3379
3380 Of course, parts are not generated if Vi or Ei is not present.
3381*/
3382
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003383static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003384com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003385{
3386 int except_anchor = 0;
3387 int end_anchor = 0;
3388 int else_anchor = 0;
3389 int i;
3390 node *ch;
3391
3392 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3393 block_push(c, SETUP_EXCEPT);
3394 com_node(c, CHILD(n, 2));
3395 com_addbyte(c, POP_BLOCK);
3396 block_pop(c, SETUP_EXCEPT);
3397 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3398 com_backpatch(c, except_anchor);
3399 for (i = 3;
3400 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3401 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003402 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003403 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003404 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003405 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003406 break;
3407 }
3408 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003409 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003410 com_addoparg(c, SET_LINENO, ch->n_lineno);
3411 if (NCH(ch) > 1) {
3412 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003413 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003414 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003415 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003416 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003417 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3418 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003419 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003420 }
3421 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003422 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003423 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003424 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003425 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003426 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003427 com_pop(c, 1);
3428 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003429 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003430 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003431 com_node(c, CHILD(n, i+2));
3432 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3433 if (except_anchor) {
3434 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003435 /* We come in with [tb, val, exc, 0] on the
3436 stack; one pop and it's the same as
3437 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003438 com_addbyte(c, POP_TOP);
3439 }
3440 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003441 /* We actually come in here with [tb, val, exc] but the
3442 END_FINALLY will zap those and jump around.
3443 The c_stacklevel does not reflect them so we need not pop
3444 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003445 com_addbyte(c, END_FINALLY);
3446 com_backpatch(c, else_anchor);
3447 if (i < NCH(n))
3448 com_node(c, CHILD(n, i+2));
3449 com_backpatch(c, end_anchor);
3450}
3451
3452static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003453com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003454{
3455 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003456 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003457
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003458 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3459 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003460 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003461 com_addbyte(c, POP_BLOCK);
3462 block_pop(c, SETUP_FINALLY);
3463 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003464 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003465 /* While the generated code pushes only one item,
3466 the try-finally handling can enter here with
3467 up to three items. OK, here are the details:
3468 3 for an exception, 2 for RETURN, 1 for BREAK. */
3469 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003470 com_backpatch(c, finally_anchor);
3471 ch = CHILD(n, NCH(n)-1);
3472 com_addoparg(c, SET_LINENO, ch->n_lineno);
3473 com_node(c, ch);
3474 com_addbyte(c, END_FINALLY);
3475 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003476 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003477}
3478
3479static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003480com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003481{
3482 REQ(n, try_stmt);
3483 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3484 | 'try' ':' suite 'finally' ':' suite */
3485 if (TYPE(CHILD(n, 3)) != except_clause)
3486 com_try_finally(c, n);
3487 else
3488 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003489}
3490
Guido van Rossum8b993a91997-01-17 21:04:03 +00003491static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003492get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003493{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003494 int i;
3495
Guido van Rossum8b993a91997-01-17 21:04:03 +00003496 /* Label to avoid tail recursion */
3497 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003498 switch (TYPE(n)) {
3499
3500 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003501 if (NCH(n) == 1) {
3502 n = CHILD(n, 0);
3503 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003504 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003505 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003506 case file_input:
3507 for (i = 0; i < NCH(n); i++) {
3508 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003509 if (TYPE(ch) == stmt) {
3510 n = ch;
3511 goto next;
3512 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003513 }
3514 break;
3515
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003516 case stmt:
3517 case simple_stmt:
3518 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003519 n = CHILD(n, 0);
3520 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003521
3522 case expr_stmt:
3523 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003524 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003525 case test:
3526 case and_test:
3527 case not_test:
3528 case comparison:
3529 case expr:
3530 case xor_expr:
3531 case and_expr:
3532 case shift_expr:
3533 case arith_expr:
3534 case term:
3535 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003536 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003537 if (NCH(n) == 1) {
3538 n = CHILD(n, 0);
3539 goto next;
3540 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003541 break;
3542
3543 case atom:
3544 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003545 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003546 break;
3547
3548 }
3549 return NULL;
3550}
3551
Guido van Rossum79f25d91997-04-29 20:08:16 +00003552static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003553get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003554{
Guido van Rossum541563e1999-01-28 15:08:09 +00003555 /* Don't generate doc-strings if run with -OO */
3556 if (Py_OptimizeFlag > 1)
3557 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003558 n = get_rawdocstring(n);
3559 if (n == NULL)
3560 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003561 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003562}
3563
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003564static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003565com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003566{
3567 REQ(n, suite);
3568 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3569 if (NCH(n) == 1) {
3570 com_node(c, CHILD(n, 0));
3571 }
3572 else {
3573 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003574 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003575 node *ch = CHILD(n, i);
3576 if (TYPE(ch) == stmt)
3577 com_node(c, ch);
3578 }
3579 }
3580}
3581
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003582/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003583static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003584com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003585{
3586 int i = c->c_nblocks;
3587 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3588 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3589 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003590 else if (i <= 0) {
3591 /* at the outer level */
3592 com_error(c, PyExc_SyntaxError,
3593 "'continue' not properly in loop");
3594 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003595 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003596 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003597 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003598 if (c->c_block[j] == SETUP_LOOP)
3599 break;
3600 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003601 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003602 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003603 for (; i > j; --i) {
3604 if (c->c_block[i] == SETUP_EXCEPT ||
3605 c->c_block[i] == SETUP_FINALLY) {
3606 com_addoparg(c, CONTINUE_LOOP,
3607 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003608 return;
3609 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003610 if (c->c_block[i] == END_FINALLY) {
3611 com_error(c, PyExc_SyntaxError,
3612 "'continue' not supported inside 'finally' clause");
3613 return;
3614 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003615 }
3616 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003617 com_error(c, PyExc_SyntaxError,
3618 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003619 }
3620 /* XXX Could allow it inside a 'finally' clause
3621 XXX if we could pop the exception still on the stack */
3622}
3623
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003624static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003625com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003626{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003627 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003628 if (TYPE(n) == lambdef) {
3629 /* lambdef: 'lambda' [varargslist] ':' test */
3630 n = CHILD(n, 1);
3631 }
3632 else {
3633 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3634 n = CHILD(n, 2);
3635 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3636 n = CHILD(n, 1);
3637 }
3638 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003639 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003640 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003641 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003642 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3643 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003644 nargs = 0;
3645 ndefs = 0;
3646 for (i = 0; i < nch; i++) {
3647 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003648 if (TYPE(CHILD(n, i)) == STAR ||
3649 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003650 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003651 nargs++;
3652 i++;
3653 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003654 t = RPAR; /* Anything except EQUAL or COMMA */
3655 else
3656 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003657 if (t == EQUAL) {
3658 i++;
3659 ndefs++;
3660 com_node(c, CHILD(n, i));
3661 i++;
3662 if (i >= nch)
3663 break;
3664 t = TYPE(CHILD(n, i));
3665 }
3666 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003667 /* Treat "(a=1, b)" as an error */
3668 if (ndefs)
3669 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003670 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003671 }
3672 if (t != COMMA)
3673 break;
3674 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003675 return ndefs;
3676}
3677
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003678static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003679com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003680{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003681 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003682 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003683 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003684 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003685 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3686 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003687 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003688 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003689 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003690 c->c_errors++;
3691 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003692 int closure = com_make_closure(c, (PyCodeObject *)co);
3693 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003694 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003695 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003696 if (closure)
3697 com_addoparg(c, MAKE_CLOSURE, ndefs);
3698 else
3699 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003700 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003701 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003702 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003703 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003704 }
3705}
3706
3707static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003708com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003709{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003710 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003711 REQ(n, testlist);
3712 /* testlist: test (',' test)* [','] */
3713 for (i = 0; i < NCH(n); i += 2)
3714 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003715 i = (NCH(n)+1) / 2;
3716 com_addoparg(c, BUILD_TUPLE, i);
3717 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003718}
3719
3720static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003721com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003722{
Guido van Rossum25831651993-05-19 14:50:45 +00003723 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003724 PyObject *v;
3725 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003726 char *name;
3727
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003728 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003729 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003730 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003731 c->c_errors++;
3732 return;
3733 }
3734 /* Push the class name on the stack */
3735 i = com_addconst(c, v);
3736 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003737 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003738 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003739 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003740 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003741 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003742 com_push(c, 1);
3743 }
Guido van Rossum25831651993-05-19 14:50:45 +00003744 else
3745 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003746 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003747 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003748 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003749 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003750 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003751 c->c_errors++;
3752 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003753 int closure = com_make_closure(c, co);
3754 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003755 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003756 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003757 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003758 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003759 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003760 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003761 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003762 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003763 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003764 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003765 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003766 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003767 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003768 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003769}
3770
3771static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003772com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003773{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003774 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003775 if (c->c_errors)
3776 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003777 switch (TYPE(n)) {
3778
3779 /* Definition nodes */
3780
3781 case funcdef:
3782 com_funcdef(c, n);
3783 break;
3784 case classdef:
3785 com_classdef(c, n);
3786 break;
3787
3788 /* Trivial parse tree nodes */
3789
3790 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003791 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003792 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003793 n = CHILD(n, 0);
3794 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003795
3796 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003797 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3798 com_addoparg(c, SET_LINENO, n->n_lineno);
3799 {
3800 int i;
3801 for (i = 0; i < NCH(n)-1; i += 2)
3802 com_node(c, CHILD(n, i));
3803 }
3804 break;
3805
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003806 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003807 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003808 n = CHILD(n, 0);
3809 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003810
3811 /* Statement nodes */
3812
3813 case expr_stmt:
3814 com_expr_stmt(c, n);
3815 break;
3816 case print_stmt:
3817 com_print_stmt(c, n);
3818 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003819 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003820 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003821 break;
3822 case pass_stmt:
3823 break;
3824 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003825 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003826 com_error(c, PyExc_SyntaxError,
3827 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003828 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003829 com_addbyte(c, BREAK_LOOP);
3830 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003831 case continue_stmt:
3832 com_continue_stmt(c, n);
3833 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003834 case return_stmt:
3835 com_return_stmt(c, n);
3836 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003837 case yield_stmt:
3838 com_yield_stmt(c, n);
3839 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003840 case raise_stmt:
3841 com_raise_stmt(c, n);
3842 break;
3843 case import_stmt:
3844 com_import_stmt(c, n);
3845 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003846 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003847 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003848 case exec_stmt:
3849 com_exec_stmt(c, n);
3850 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003851 case assert_stmt:
3852 com_assert_stmt(c, n);
3853 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003854 case if_stmt:
3855 com_if_stmt(c, n);
3856 break;
3857 case while_stmt:
3858 com_while_stmt(c, n);
3859 break;
3860 case for_stmt:
3861 com_for_stmt(c, n);
3862 break;
3863 case try_stmt:
3864 com_try_stmt(c, n);
3865 break;
3866 case suite:
3867 com_suite(c, n);
3868 break;
3869
3870 /* Expression nodes */
3871
3872 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003873 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00003874 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003875 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003876 break;
3877 case test:
3878 com_test(c, n);
3879 break;
3880 case and_test:
3881 com_and_test(c, n);
3882 break;
3883 case not_test:
3884 com_not_test(c, n);
3885 break;
3886 case comparison:
3887 com_comparison(c, n);
3888 break;
3889 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003890 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003891 break;
3892 case expr:
3893 com_expr(c, n);
3894 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003895 case xor_expr:
3896 com_xor_expr(c, n);
3897 break;
3898 case and_expr:
3899 com_and_expr(c, n);
3900 break;
3901 case shift_expr:
3902 com_shift_expr(c, n);
3903 break;
3904 case arith_expr:
3905 com_arith_expr(c, n);
3906 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003907 case term:
3908 com_term(c, n);
3909 break;
3910 case factor:
3911 com_factor(c, n);
3912 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003913 case power:
3914 com_power(c, n);
3915 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003916 case atom:
3917 com_atom(c, n);
3918 break;
3919
3920 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003921 com_error(c, PyExc_SystemError,
3922 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003923 }
3924}
3925
Tim Petersdbd9ba62000-07-09 03:09:57 +00003926static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003927
3928static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003929com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003930{
3931 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3932 if (TYPE(CHILD(n, 0)) == LPAR)
3933 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003934 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003935 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003936 com_pop(c, 1);
3937 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003938}
3939
3940static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003941com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003942{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003943 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003944 if (NCH(n) == 1) {
3945 com_fpdef(c, CHILD(n, 0));
3946 }
3947 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003948 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003949 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003950 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003951 for (i = 0; i < NCH(n); i += 2)
3952 com_fpdef(c, CHILD(n, i));
3953 }
3954}
3955
3956static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003957com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003958{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003959 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003960 int complex = 0;
Barry Warsaw8f6d8682001-11-28 21:10:39 +00003961 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003962 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003963 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003964 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003965 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003966 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003967 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003968 node *ch = CHILD(n, i);
3969 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003970 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003971 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003972 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3973 fp = CHILD(ch, 0);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00003974 if (TYPE(fp) != NAME) {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00003975 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003976 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003977 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003978 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003979 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003980 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003981 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003982 ch = CHILD(n, i);
3983 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003984 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003985 else
3986 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003987 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003988 if (complex) {
3989 /* Generate code for complex arguments only after
3990 having counted the simple arguments */
3991 int ilocal = 0;
3992 for (i = 0; i < nch; i++) {
3993 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 Rossum681d79a1995-07-18 14:51:37 +00003996 break;
3997 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3998 fp = CHILD(ch, 0);
3999 if (TYPE(fp) != NAME) {
4000 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004001 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004002 com_fpdef(c, ch);
4003 }
4004 ilocal++;
4005 if (++i >= nch)
4006 break;
4007 ch = CHILD(n, i);
4008 if (TYPE(ch) == EQUAL)
4009 i += 2;
4010 else
4011 REQ(ch, COMMA);
4012 }
4013 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004014}
4015
4016static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004017com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004018{
4019 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004020 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004021 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004022 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004023 if (doc != NULL) {
4024 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004025 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004026 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004027 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004028 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004029 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004030 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004031 for (i = 0; i < NCH(n); i++) {
4032 node *ch = CHILD(n, i);
4033 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4034 com_node(c, ch);
4035 }
4036}
4037
4038/* Top-level compile-node interface */
4039
4040static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004041compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004042{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004043 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004044 node *ch;
4045 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00004046 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004047 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004048 if (doc != NULL) {
4049 (void) 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 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004052 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004053 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004054 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
4055 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004056 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004057 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004058 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004059 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004060 c->c_infunction = 0;
Tim Petersad1a18b2001-06-23 06:19:16 +00004061 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4062 com_push(c, 1);
4063 com_addbyte(c, RETURN_VALUE);
4064 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004065}
4066
4067static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004068compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004069{
Guido van Rossum590baa41993-11-30 13:40:46 +00004070 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004071 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004072 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004073
4074 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004075 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004076 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004077 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004078 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004079 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004080 else
4081 ch = CHILD(n, 2);
4082 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004083 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004084 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004085}
4086
4087static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004088compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004089{
4090 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004091 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004092 REQ(n, classdef);
4093 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4094 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004095 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004096 /* Initialize local __module__ from global __name__ */
4097 com_addop_name(c, LOAD_GLOBAL, "__name__");
4098 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004099 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004100 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004101 if (doc != NULL) {
4102 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004103 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004104 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004105 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004106 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004107 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004108 }
4109 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004110 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004111 com_node(c, ch);
4112 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004113 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004114 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004115 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004116}
4117
4118static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004119compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004120{
Guido van Rossum3f5da241990-12-20 15:06:42 +00004121 com_addoparg(c, SET_LINENO, n->n_lineno);
4122
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004123 switch (TYPE(n)) {
4124
Guido van Rossum4c417781991-01-21 16:09:22 +00004125 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004126 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004127 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004128 n = CHILD(n, 0);
4129 if (TYPE(n) != NEWLINE)
4130 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004131 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004132 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004133 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004134 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004135 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004136 break;
4137
Guido van Rossum4c417781991-01-21 16:09:22 +00004138 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004139 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004140 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004141 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004142 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004143 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004144 break;
4145
Guido van Rossum590baa41993-11-30 13:40:46 +00004146 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004147 com_node(c, CHILD(n, 0));
4148 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004149 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004150 break;
4151
Guido van Rossum590baa41993-11-30 13:40:46 +00004152 case lambdef: /* anonymous function definition */
4153 compile_lambdef(c, n);
4154 break;
4155
Guido van Rossum4c417781991-01-21 16:09:22 +00004156 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004157 compile_funcdef(c, n);
4158 break;
4159
Guido van Rossum4c417781991-01-21 16:09:22 +00004160 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004161 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004162 break;
4163
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004164 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004165 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004166 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004167 }
4168}
4169
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004170static PyObject *
4171dict_keys_inorder(PyObject *dict, int offset)
4172{
4173 PyObject *tuple, *k, *v;
4174 int i, pos = 0, size = PyDict_Size(dict);
4175
4176 tuple = PyTuple_New(size);
4177 if (tuple == NULL)
4178 return NULL;
4179 while (PyDict_Next(dict, &pos, &k, &v)) {
4180 i = PyInt_AS_LONG(v);
4181 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004182 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004183 PyTuple_SET_ITEM(tuple, i - offset, k);
4184 }
4185 return tuple;
4186}
4187
Guido van Rossum79f25d91997-04-29 20:08:16 +00004188PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004189PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004190{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004191 return PyNode_CompileFlags(n, filename, NULL);
4192}
4193
4194PyCodeObject *
4195PyNode_CompileFlags(node *n, char *filename, PyCompilerFlags *flags)
4196{
4197 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004198}
4199
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004200struct symtable *
4201PyNode_CompileSymtable(node *n, char *filename)
4202{
4203 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004204 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004205
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004206 ff = PyNode_Future(n, filename);
4207 if (ff == NULL)
4208 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004209
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004210 st = symtable_init();
Tim Peters8c5e4152001-11-04 19:26:58 +00004211 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004212 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004213 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004214 }
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004215 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004216 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004217 if (st->st_errors > 0)
4218 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004219 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004220 if (st->st_errors > 0)
4221 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004222
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004223 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004224 fail:
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004225 PyObject_FREE((void *)ff);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004226 st->st_future = NULL;
4227 PySymtable_Free(st);
4228 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004229}
4230
Guido van Rossum79f25d91997-04-29 20:08:16 +00004231static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004232icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004233{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004234 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004235}
4236
Guido van Rossum79f25d91997-04-29 20:08:16 +00004237static PyCodeObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004238jcompile(node *n, char *filename, struct compiling *base,
4239 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004240{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004241 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004242 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004243 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004244 return NULL;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004245 if (TYPE(n) == encoding_decl) {
4246 sc.c_encoding = STR(n);
4247 n = CHILD(n, 0);
4248 } else {
4249 sc.c_encoding = NULL;
4250 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004251 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004252 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004253 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004254 /* c_symtable still points to parent's symbols */
4255 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004256 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004257 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004258 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004259 if (base->c_encoding != NULL) {
4260 assert(sc.c_encoding == NULL);
4261 sc.c_encoding = base->c_encoding;
4262 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004263 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004264 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004265 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004266 if (sc.c_future == NULL) {
4267 com_free(&sc);
4268 return NULL;
4269 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004270 if (flags) {
4271 int merged = sc.c_future->ff_features |
4272 flags->cf_flags;
4273 sc.c_future->ff_features = merged;
4274 flags->cf_flags = merged;
4275 }
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004276 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004277 com_free(&sc);
4278 return NULL;
4279 }
4280 }
4281 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004282 if (symtable_load_symbols(&sc) < 0) {
4283 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004284 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004285 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004286 compile_node(&sc, n);
4287 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004288 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004289 PyObject *consts, *names, *varnames, *filename, *name,
4290 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004291 consts = PyList_AsTuple(sc.c_consts);
4292 names = PyList_AsTuple(sc.c_names);
4293 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004294 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4295 freevars = dict_keys_inorder(sc.c_freevars,
4296 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004297 filename = PyString_InternFromString(sc.c_filename);
4298 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004299 if (!PyErr_Occurred())
4300 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004301 sc.c_nlocals,
4302 sc.c_maxstacklevel,
4303 sc.c_flags,
4304 sc.c_code,
4305 consts,
4306 names,
4307 varnames,
4308 freevars,
4309 cellvars,
4310 filename,
4311 name,
4312 sc.c_firstlineno,
4313 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004314 Py_XDECREF(consts);
4315 Py_XDECREF(names);
4316 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004317 Py_XDECREF(freevars);
4318 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004319 Py_XDECREF(filename);
4320 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004321 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004322 else if (!PyErr_Occurred()) {
4323 /* This could happen if someone called PyErr_Clear() after an
4324 error was reported above. That's not supposed to happen,
4325 but I just plugged one case and I'm not sure there can't be
4326 others. In that case, raise SystemError so that at least
4327 it gets reported instead dumping core. */
4328 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4329 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004330 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004331 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004332 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004333 sc.c_symtable = NULL;
4334 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004335 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004336 return co;
4337}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004338
4339int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004340PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004341{
4342 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004343 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004344 int line = co->co_firstlineno;
4345 int addr = 0;
4346 while (--size >= 0) {
4347 addr += *p++;
4348 if (addr > addrq)
4349 break;
4350 line += *p++;
4351 }
4352 return line;
4353}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004354
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004355/* The test for LOCAL must come before the test for FREE in order to
4356 handle classes where name is both local and free. The local var is
4357 a method and the free var is a free var referenced within a method.
4358*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004359
4360static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004361get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004362{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004363 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004364 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004365
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004366 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4367 return CELL;
4368 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4369 return LOCAL;
4370 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4371 return FREE;
4372 v = PyDict_GetItemString(c->c_globals, name);
4373 if (v) {
4374 if (v == Py_None)
4375 return GLOBAL_EXPLICIT;
4376 else {
4377 return GLOBAL_IMPLICIT;
4378 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004379 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004380 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004381 "unknown scope for %.100s in %.100s(%s) "
4382 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4383 name, c->c_name,
4384 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4385 c->c_filename,
4386 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4387 PyObject_REPR(c->c_locals),
4388 PyObject_REPR(c->c_globals)
4389 );
4390
4391 Py_FatalError(buf);
4392 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004393}
4394
Guido van Rossum207fda62001-03-02 03:30:41 +00004395/* Helper functions to issue warnings */
4396
4397static int
4398issue_warning(char *msg, char *filename, int lineno)
4399{
4400 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4401 lineno, NULL, NULL) < 0) {
4402 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4403 PyErr_SetString(PyExc_SyntaxError, msg);
4404 PyErr_SyntaxLocation(filename, lineno);
4405 }
4406 return -1;
4407 }
4408 return 0;
4409}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004410
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004411static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004412symtable_warn(struct symtable *st, char *msg)
4413{
Guido van Rossum207fda62001-03-02 03:30:41 +00004414 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004415 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004416 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004417 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004418 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004419}
4420
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004421/* Helper function for setting lineno and filename */
4422
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004423static int
4424symtable_build(struct compiling *c, node *n)
4425{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004426 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004427 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004428 c->c_symtable->st_future = c->c_future;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004429 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004430 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4431 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004432 return -1;
4433 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004434 if (c->c_symtable->st_errors > 0)
4435 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004436 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004437 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004438 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004439 return 0;
4440}
4441
4442static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004443symtable_init_compiling_symbols(struct compiling *c)
4444{
4445 PyObject *varnames;
4446
4447 varnames = c->c_symtable->st_cur->ste_varnames;
4448 if (varnames == NULL) {
4449 varnames = PyList_New(0);
4450 if (varnames == NULL)
4451 return -1;
4452 c->c_symtable->st_cur->ste_varnames = varnames;
4453 Py_INCREF(varnames);
4454 } else
4455 Py_INCREF(varnames);
4456 c->c_varnames = varnames;
4457
4458 c->c_globals = PyDict_New();
4459 if (c->c_globals == NULL)
4460 return -1;
4461 c->c_freevars = PyDict_New();
4462 if (c->c_freevars == NULL)
4463 return -1;
4464 c->c_cellvars = PyDict_New();
4465 if (c->c_cellvars == NULL)
4466 return -1;
4467 return 0;
4468}
4469
4470struct symbol_info {
4471 int si_nlocals;
4472 int si_ncells;
4473 int si_nfrees;
4474 int si_nimplicit;
4475};
4476
4477static void
4478symtable_init_info(struct symbol_info *si)
4479{
4480 si->si_nlocals = 0;
4481 si->si_ncells = 0;
4482 si->si_nfrees = 0;
4483 si->si_nimplicit = 0;
4484}
4485
4486static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004487symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004488 struct symbol_info *si)
4489{
4490 PyObject *dict, *v;
4491
4492 /* Seperate logic for DEF_FREE. If it occurs in a function,
4493 it indicates a local that we must allocate storage for (a
4494 cell var). If it occurs in a class, then the class has a
4495 method and a free variable with the same name.
4496 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004497 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004498 /* If it isn't declared locally, it can't be a cell. */
4499 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4500 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004501 v = PyInt_FromLong(si->si_ncells++);
4502 dict = c->c_cellvars;
4503 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004504 /* If it is free anyway, then there is no need to do
4505 anything here.
4506 */
4507 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004508 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004509 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004510 v = PyInt_FromLong(si->si_nfrees++);
4511 dict = c->c_freevars;
4512 }
4513 if (v == NULL)
4514 return -1;
4515 if (PyDict_SetItem(dict, name, v) < 0) {
4516 Py_DECREF(v);
4517 return -1;
4518 }
4519 Py_DECREF(v);
4520 return 0;
4521}
4522
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004523/* If a variable is a cell and an argument, make sure that appears in
4524 co_cellvars before any variable to its right in varnames.
4525*/
4526
4527
4528static int
4529symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4530 PyObject *varnames, int flags)
4531{
4532 PyObject *v, *w, *d, *list = NULL;
4533 int i, pos;
4534
4535 if (flags & CO_VARARGS)
4536 argcount++;
4537 if (flags & CO_VARKEYWORDS)
4538 argcount++;
4539 for (i = argcount; --i >= 0; ) {
4540 v = PyList_GET_ITEM(varnames, i);
4541 if (PyDict_GetItem(*cellvars, v)) {
4542 if (list == NULL) {
4543 list = PyList_New(1);
4544 if (list == NULL)
4545 return -1;
4546 PyList_SET_ITEM(list, 0, v);
4547 Py_INCREF(v);
4548 } else
4549 PyList_Insert(list, 0, v);
4550 }
4551 }
4552 if (list == NULL || PyList_GET_SIZE(list) == 0)
4553 return 0;
4554 /* There are cellvars that are also arguments. Create a dict
4555 to replace cellvars and put the args at the front.
4556 */
4557 d = PyDict_New();
4558 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4559 v = PyInt_FromLong(i);
4560 if (v == NULL)
4561 goto fail;
4562 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4563 goto fail;
4564 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4565 goto fail;
4566 }
4567 pos = 0;
4568 i = PyList_GET_SIZE(list);
4569 Py_DECREF(list);
4570 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4571 w = PyInt_FromLong(i++); /* don't care about the old key */
4572 if (PyDict_SetItem(d, v, w) < 0) {
4573 Py_DECREF(w);
4574 goto fail;
4575 }
4576 Py_DECREF(w);
4577 }
4578 Py_DECREF(*cellvars);
4579 *cellvars = d;
4580 return 1;
4581 fail:
4582 Py_DECREF(d);
4583 return -1;
4584}
4585
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004586static int
4587symtable_freevar_offsets(PyObject *freevars, int offset)
4588{
4589 PyObject *name, *v;
4590 int pos;
4591
4592 /* The cell vars are the first elements of the closure,
4593 followed by the free vars. Update the offsets in
4594 c_freevars to account for number of cellvars. */
4595 pos = 0;
4596 while (PyDict_Next(freevars, &pos, &name, &v)) {
4597 int i = PyInt_AS_LONG(v) + offset;
4598 PyObject *o = PyInt_FromLong(i);
4599 if (o == NULL)
4600 return -1;
4601 if (PyDict_SetItem(freevars, name, o) < 0) {
4602 Py_DECREF(o);
4603 return -1;
4604 }
4605 Py_DECREF(o);
4606 }
4607 return 0;
4608}
4609
4610static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004611symtable_check_unoptimized(struct compiling *c,
4612 PySymtableEntryObject *ste,
4613 struct symbol_info *si)
4614{
4615 char buf[300];
4616
4617 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4618 || (ste->ste_nested && si->si_nimplicit)))
4619 return 0;
4620
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004621#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4622
4623#define ILLEGAL_IS "is a nested function"
4624
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004625#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004626"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004627
4628#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004629"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004630
4631#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00004632"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004633"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004634
4635 /* XXX perhaps the linenos for these opt-breaking statements
4636 should be stored so the exception can point to them. */
4637
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004638 if (ste->ste_child_free) {
4639 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004640 PyOS_snprintf(buf, sizeof(buf),
4641 ILLEGAL_IMPORT_STAR,
4642 PyString_AS_STRING(ste->ste_name),
4643 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004644 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004645 PyOS_snprintf(buf, sizeof(buf),
4646 ILLEGAL_BARE_EXEC,
4647 PyString_AS_STRING(ste->ste_name),
4648 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004649 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004650 PyOS_snprintf(buf, sizeof(buf),
4651 ILLEGAL_EXEC_AND_IMPORT_STAR,
4652 PyString_AS_STRING(ste->ste_name),
4653 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004654 }
4655 } else {
4656 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004657 PyOS_snprintf(buf, sizeof(buf),
4658 ILLEGAL_IMPORT_STAR,
4659 PyString_AS_STRING(ste->ste_name),
4660 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004661 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004662 PyOS_snprintf(buf, sizeof(buf),
4663 ILLEGAL_BARE_EXEC,
4664 PyString_AS_STRING(ste->ste_name),
4665 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004666 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004667 PyOS_snprintf(buf, sizeof(buf),
4668 ILLEGAL_EXEC_AND_IMPORT_STAR,
4669 PyString_AS_STRING(ste->ste_name),
4670 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004671 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004672 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004673
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004674 PyErr_SetString(PyExc_SyntaxError, buf);
4675 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4676 ste->ste_opt_lineno);
4677 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004678}
4679
4680static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004681symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4682 struct symbol_info *si)
4683{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004684 if (c->c_future)
4685 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004686 if (ste->ste_generator)
4687 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004688 if (ste->ste_type != TYPE_MODULE)
4689 c->c_flags |= CO_NEWLOCALS;
4690 if (ste->ste_type == TYPE_FUNCTION) {
4691 c->c_nlocals = si->si_nlocals;
4692 if (ste->ste_optimized == 0)
4693 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004694 else if (ste->ste_optimized != OPT_EXEC)
4695 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004696 }
4697 return 0;
4698}
4699
4700static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004701symtable_load_symbols(struct compiling *c)
4702{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004703 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004704 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004705 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004706 PyObject *name, *varnames, *v;
4707 int i, flags, pos;
4708 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004709
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004710 if (implicit == NULL) {
4711 implicit = PyInt_FromLong(1);
4712 if (implicit == NULL)
4713 return -1;
4714 }
4715 v = NULL;
4716
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004717 if (symtable_init_compiling_symbols(c) < 0)
4718 goto fail;
4719 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004720 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004721 si.si_nlocals = PyList_GET_SIZE(varnames);
4722 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004723
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004724 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004725 v = PyInt_FromLong(i);
4726 if (PyDict_SetItem(c->c_locals,
4727 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004728 goto fail;
4729 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004730 }
4731
4732 /* XXX The cases below define the rules for whether a name is
4733 local or global. The logic could probably be clearer. */
4734 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004735 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4736 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004737
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004738 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004739 /* undo the original DEF_FREE */
4740 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004741
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004742 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004743 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004744 2. Free variables in methods that are also class
4745 variables or declared global.
4746 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004747 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004748 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004749
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004750 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004751 c->c_argcount--;
4752 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004753 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004754 c->c_argcount--;
4755 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004756 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004757 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004758 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004759 if (flags & DEF_PARAM) {
4760 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004761 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004762 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004763 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004764 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004765 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004766 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004767 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4768 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004769 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004770 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004771 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4772 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004773 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004774 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004775 if (v == NULL)
4776 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004777 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004778 goto fail;
4779 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004780 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004781 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004782 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004783 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004784 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004785 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004786 if (v == NULL)
4787 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004788 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004789 goto fail;
4790 Py_DECREF(v);
4791 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004792 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004793 if (PyDict_SetItem(c->c_globals, name,
4794 implicit) < 0)
4795 goto fail;
4796 if (st->st_nscopes != 1) {
4797 v = PyInt_FromLong(flags);
4798 if (PyDict_SetItem(st->st_global,
4799 name, v))
4800 goto fail;
4801 Py_DECREF(v);
4802 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004803 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004804 }
4805 }
4806
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004807 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4808
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004809 if (si.si_ncells > 1) { /* one cell is always in order */
4810 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4811 c->c_varnames, c->c_flags) < 0)
4812 return -1;
4813 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004814 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4815 return -1;
4816 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004817 fail:
4818 /* is this always the right thing to do? */
4819 Py_XDECREF(v);
4820 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004821}
4822
4823static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004824symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004825{
4826 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004827
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004828 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004829 if (st == NULL)
4830 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004831 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00004832
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004833 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004834 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004835 goto fail;
4836 if ((st->st_symbols = PyDict_New()) == NULL)
4837 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004838 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004839 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004840 st->st_errors = 0;
4841 st->st_tmpname = 0;
4842 st->st_private = NULL;
4843 return st;
4844 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004845 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004846 return NULL;
4847}
4848
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004849void
4850PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004851{
4852 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004853 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004854 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004855 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004856}
4857
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004858/* When the compiler exits a scope, it must should update the scope's
4859 free variable information with the list of free variables in its
4860 children.
4861
4862 Variables that are free in children and defined in the current
4863 scope are cellvars.
4864
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004865 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004866 false), free variables in children that are not defined here are
4867 implicit globals.
4868
4869*/
4870
4871static int
4872symtable_update_free_vars(struct symtable *st)
4873{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004874 int i, j, def;
4875 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004876 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004877
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004878 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004879 def = DEF_FREE_CLASS;
4880 else
4881 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004882 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004883 int pos = 0;
4884
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004885 if (list)
4886 PyList_SetSlice(list, 0,
4887 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004888 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004889 PyList_GET_ITEM(ste->ste_children, i);
4890 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004891 int flags = PyInt_AS_LONG(o);
4892 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004893 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004894 if (list == NULL) {
4895 list = PyList_New(0);
4896 if (list == NULL)
4897 return -1;
4898 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004899 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004900 if (PyList_Append(list, name) < 0) {
4901 Py_DECREF(list);
4902 return -1;
4903 }
4904 }
4905 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004906 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004907 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004908 v = PyDict_GetItem(ste->ste_symbols, name);
4909 /* If a name N is declared global in scope A and
4910 referenced in scope B contained (perhaps
4911 indirectly) in A and there are no scopes
4912 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004913 is global in B. Unless A is a class scope,
4914 because class scopes are not considered for
4915 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004916 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004917 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004918 int flags = PyInt_AS_LONG(v);
4919 if (flags & DEF_GLOBAL) {
4920 symtable_undo_free(st, child->ste_id,
4921 name);
4922 continue;
4923 }
4924 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004925 if (ste->ste_nested) {
4926 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004927 name, def) < 0) {
4928 Py_DECREF(list);
4929 return -1;
4930 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004931 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004932 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004933 name) < 0) {
4934 Py_DECREF(list);
4935 return -1;
4936 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004937 }
4938 }
4939 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004940
4941 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004942 return 0;
4943}
4944
4945/* If the current scope is a non-nested class or if name is not
4946 defined in the current, non-nested scope, then it is an implicit
4947 global in all nested scopes.
4948*/
4949
4950static int
4951symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4952{
4953 PyObject *o;
4954 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004955 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004956
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004957 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004958 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004959 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004960 if (o == NULL)
4961 return symtable_undo_free(st, child, name);
4962 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004963
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004964 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004965 return symtable_undo_free(st, child, name);
4966 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004967 return symtable_add_def_o(st, ste->ste_symbols,
4968 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004969}
4970
4971static int
4972symtable_undo_free(struct symtable *st, PyObject *id,
4973 PyObject *name)
4974{
4975 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004976 PyObject *info;
4977 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004978
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004979 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4980 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004981 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00004982
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004983 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004984 if (info == NULL)
4985 return 0;
4986 v = PyInt_AS_LONG(info);
4987 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004988 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004989 DEF_FREE_GLOBAL) < 0)
4990 return -1;
4991 } else
4992 /* If the name is defined here or declared global,
4993 then the recursion stops. */
4994 return 0;
4995
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004996 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4997 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004998 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004999 PyList_GET_ITEM(ste->ste_children, i);
5000 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005001 if (x < 0)
5002 return x;
5003 }
5004 return 0;
5005}
5006
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005007/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5008 This reference is released when the scope is exited, via the DECREF
5009 in symtable_exit_scope().
5010*/
5011
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005012static int
5013symtable_exit_scope(struct symtable *st)
5014{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005015 int end;
5016
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005017 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005018 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005019 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005020 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005021 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5022 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005023 if (PySequence_DelItem(st->st_stack, end) < 0)
5024 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005025 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005026}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005027
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005028static void
5029symtable_enter_scope(struct symtable *st, char *name, int type,
5030 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005031{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005032 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005033
5034 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005035 prev = st->st_cur;
5036 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
5037 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005038 st->st_errors++;
5039 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005040 }
5041 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005042 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005043 PySymtableEntry_New(st, name, type, lineno);
5044 if (strcmp(name, TOP) == 0)
5045 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005046 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005047 if (PyList_Append(prev->ste_children,
5048 (PyObject *)st->st_cur) < 0)
5049 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005050 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005051}
5052
5053static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005054symtable_lookup(struct symtable *st, char *name)
5055{
5056 char buffer[MANGLE_LEN];
5057 PyObject *v;
5058 int flags;
5059
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005060 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005061 name = buffer;
5062 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5063 if (v == NULL) {
5064 if (PyErr_Occurred())
5065 return -1;
5066 else
5067 return 0;
5068 }
5069
5070 flags = PyInt_AS_LONG(v);
5071 return flags;
5072}
5073
5074static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005075symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005076{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005077 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005078 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005079 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005080
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005081 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005082 name = buffer;
5083 if ((s = PyString_InternFromString(name)) == NULL)
5084 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005085 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5086 Py_DECREF(s);
5087 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005088}
5089
5090/* Must only be called with mangled names */
5091
5092static int
5093symtable_add_def_o(struct symtable *st, PyObject *dict,
5094 PyObject *name, int flag)
5095{
5096 PyObject *o;
5097 int val;
5098
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005099 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005100 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005101 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005102 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005103 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005104 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005105 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005106 return -1;
5107 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005108 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005109 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005110 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005111 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005112 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005113 Py_DECREF(o);
5114 return -1;
5115 }
5116 Py_DECREF(o);
5117
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005118 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005119 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005120 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005121 } else if (flag & DEF_GLOBAL) {
5122 /* XXX need to update DEF_GLOBAL for other flags too;
5123 perhaps only DEF_FREE_GLOBAL */
5124 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005125 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005126 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005127 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005128 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005129 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005130 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005131 Py_DECREF(o);
5132 return -1;
5133 }
5134 Py_DECREF(o);
5135 }
5136 return 0;
5137}
5138
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005139#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005140
Tim Peters08a898f2001-06-28 01:52:22 +00005141/* Look for a yield stmt under n. Return 1 if found, else 0.
5142 This hack is used to look inside "if 0:" blocks (which are normally
5143 ignored) in case those are the only places a yield occurs (so that this
5144 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005145static int
5146look_for_yield(node *n)
5147{
5148 int i;
5149
5150 for (i = 0; i < NCH(n); ++i) {
5151 node *kid = CHILD(n, i);
5152
5153 switch (TYPE(kid)) {
5154
5155 case classdef:
5156 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005157 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005158 /* Stuff in nested functions and classes can't make
5159 the parent a generator. */
5160 return 0;
5161
5162 case yield_stmt:
5163 return 1;
5164
5165 default:
5166 if (look_for_yield(kid))
5167 return 1;
5168 }
5169 }
5170 return 0;
5171}
5172
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005173static void
5174symtable_node(struct symtable *st, node *n)
5175{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005176 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005177
5178 loop:
5179 switch (TYPE(n)) {
5180 case funcdef: {
5181 char *func_name = STR(CHILD(n, 1));
5182 symtable_add_def(st, func_name, DEF_LOCAL);
5183 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005184 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005185 symtable_funcdef(st, n);
5186 symtable_exit_scope(st);
5187 break;
5188 }
5189 case lambdef:
5190 if (NCH(n) == 4)
5191 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005192 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005193 symtable_funcdef(st, n);
5194 symtable_exit_scope(st);
5195 break;
5196 case classdef: {
5197 char *tmp, *class_name = STR(CHILD(n, 1));
5198 symtable_add_def(st, class_name, DEF_LOCAL);
5199 if (TYPE(CHILD(n, 2)) == LPAR) {
5200 node *bases = CHILD(n, 3);
5201 int i;
5202 for (i = 0; i < NCH(bases); i += 2) {
5203 symtable_node(st, CHILD(bases, i));
5204 }
5205 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005206 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005207 tmp = st->st_private;
5208 st->st_private = class_name;
5209 symtable_node(st, CHILD(n, NCH(n) - 1));
5210 st->st_private = tmp;
5211 symtable_exit_scope(st);
5212 break;
5213 }
5214 case if_stmt:
5215 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005216 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5217 if (st->st_cur->ste_generator == 0)
5218 st->st_cur->ste_generator =
5219 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005220 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005221 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005222 symtable_node(st, CHILD(n, i + 1));
5223 symtable_node(st, CHILD(n, i + 3));
5224 }
5225 if (i + 2 < NCH(n))
5226 symtable_node(st, CHILD(n, i + 2));
5227 break;
5228 case global_stmt:
5229 symtable_global(st, n);
5230 break;
5231 case import_stmt:
5232 symtable_import(st, n);
5233 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005234 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005235 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005236 symtable_node(st, CHILD(n, 1));
5237 if (NCH(n) > 2)
5238 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005239 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005240 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005241 st->st_cur->ste_opt_lineno = n->n_lineno;
5242 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005243 if (NCH(n) > 4)
5244 symtable_node(st, CHILD(n, 5));
5245 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005246
5247 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005248 case assert_stmt:
5249 if (Py_OptimizeFlag)
5250 return;
5251 if (NCH(n) == 2) {
5252 n = CHILD(n, 1);
5253 goto loop;
5254 } else {
5255 symtable_node(st, CHILD(n, 1));
5256 n = CHILD(n, 3);
5257 goto loop;
5258 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005259 case except_clause:
5260 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005261 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005262 if (NCH(n) > 1) {
5263 n = CHILD(n, 1);
5264 goto loop;
5265 }
5266 break;
5267 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005268 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005269 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005270 case yield_stmt:
5271 st->st_cur->ste_generator = 1;
5272 n = CHILD(n, 1);
5273 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005274 case expr_stmt:
5275 if (NCH(n) == 1)
5276 n = CHILD(n, 0);
5277 else {
5278 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005279 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005280 symtable_node(st, CHILD(n, 2));
5281 break;
5282 } else {
5283 int i;
5284 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005285 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005286 n = CHILD(n, NCH(n) - 1);
5287 }
5288 }
5289 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005290 case list_iter:
5291 n = CHILD(n, 0);
5292 if (TYPE(n) == list_for) {
5293 st->st_tmpname++;
5294 symtable_list_comprehension(st, n);
5295 st->st_tmpname--;
5296 } else {
5297 REQ(n, list_if);
5298 symtable_node(st, CHILD(n, 1));
5299 if (NCH(n) == 3) {
5300 n = CHILD(n, 2);
5301 goto loop;
5302 }
5303 }
5304 break;
5305 case for_stmt:
5306 symtable_assign(st, CHILD(n, 1), 0);
5307 for (i = 3; i < NCH(n); ++i)
5308 if (TYPE(CHILD(n, i)) >= single_input)
5309 symtable_node(st, CHILD(n, i));
5310 break;
5311 /* The remaining cases fall through to default except in
5312 special circumstances. This requires the individual cases
5313 to be coded with great care, even though they look like
5314 rather innocuous. Each case must double-check TYPE(n).
5315 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005316 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005317 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005318 n = CHILD(n, 2);
5319 goto loop;
5320 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005321 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005322 case listmaker:
5323 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00005324 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005325 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00005326 symtable_node(st, CHILD(n, 0));
5327 st->st_tmpname--;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005328 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005329 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005330 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005331 case atom:
5332 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5333 symtable_add_use(st, STR(CHILD(n, 0)));
5334 break;
5335 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005336 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005337 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005338 /* Walk over every non-token child with a special case
5339 for one child.
5340 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005341 if (NCH(n) == 1) {
5342 n = CHILD(n, 0);
5343 goto loop;
5344 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005345 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005346 if (TYPE(CHILD(n, i)) >= single_input)
5347 symtable_node(st, CHILD(n, i));
5348 }
5349}
5350
5351static void
5352symtable_funcdef(struct symtable *st, node *n)
5353{
5354 node *body;
5355
5356 if (TYPE(n) == lambdef) {
5357 if (NCH(n) == 4)
5358 symtable_params(st, CHILD(n, 1));
5359 } else
5360 symtable_params(st, CHILD(n, 2));
5361 body = CHILD(n, NCH(n) - 1);
5362 symtable_node(st, body);
5363}
5364
5365/* The next two functions parse the argument tuple.
5366 symtable_default_arg() checks for names in the default arguments,
5367 which are references in the defining scope. symtable_params()
5368 parses the parameter names, which are defined in the function's
5369 body.
5370
5371 varargslist:
5372 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5373 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5374*/
5375
5376static void
5377symtable_default_args(struct symtable *st, node *n)
5378{
5379 node *c;
5380 int i;
5381
5382 if (TYPE(n) == parameters) {
5383 n = CHILD(n, 1);
5384 if (TYPE(n) == RPAR)
5385 return;
5386 }
5387 REQ(n, varargslist);
5388 for (i = 0; i < NCH(n); i += 2) {
5389 c = CHILD(n, i);
5390 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5391 break;
5392 }
5393 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5394 symtable_node(st, CHILD(n, i));
5395 }
5396}
5397
5398static void
5399symtable_params(struct symtable *st, node *n)
5400{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005401 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005402 node *c = NULL;
5403
5404 if (TYPE(n) == parameters) {
5405 n = CHILD(n, 1);
5406 if (TYPE(n) == RPAR)
5407 return;
5408 }
5409 REQ(n, varargslist);
5410 for (i = 0; i < NCH(n); i += 2) {
5411 c = CHILD(n, i);
5412 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5413 ext = 1;
5414 break;
5415 }
5416 if (TYPE(c) == test) {
5417 continue;
5418 }
5419 if (TYPE(CHILD(c, 0)) == NAME)
5420 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
5421 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005422 char nbuf[30];
5423 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005424 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005425 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005426 }
5427 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005428 if (ext) {
5429 c = CHILD(n, i);
5430 if (TYPE(c) == STAR) {
5431 i++;
5432 symtable_add_def(st, STR(CHILD(n, i)),
5433 DEF_PARAM | DEF_STAR);
5434 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005435 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005436 c = NULL;
5437 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005438 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005439 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005440 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005441 i++;
5442 symtable_add_def(st, STR(CHILD(n, i)),
5443 DEF_PARAM | DEF_DOUBLESTAR);
5444 }
5445 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005446 if (complex >= 0) {
5447 int j;
5448 for (j = 0; j <= complex; j++) {
5449 c = CHILD(n, j);
5450 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005451 c = CHILD(n, ++j);
5452 else if (TYPE(c) == EQUAL)
5453 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005454 if (TYPE(CHILD(c, 0)) == LPAR)
5455 symtable_params_fplist(st, CHILD(c, 1));
5456 }
5457 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005458}
5459
5460static void
5461symtable_params_fplist(struct symtable *st, node *n)
5462{
5463 int i;
5464 node *c;
5465
5466 REQ(n, fplist);
5467 for (i = 0; i < NCH(n); i += 2) {
5468 c = CHILD(n, i);
5469 REQ(c, fpdef);
5470 if (NCH(c) == 1)
5471 symtable_add_def(st, STR(CHILD(c, 0)),
5472 DEF_PARAM | DEF_INTUPLE);
5473 else
5474 symtable_params_fplist(st, CHILD(c, 1));
5475 }
5476
5477}
5478
5479static void
5480symtable_global(struct symtable *st, node *n)
5481{
5482 int i;
5483
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005484 /* XXX It might be helpful to warn about module-level global
5485 statements, but it's hard to tell the difference between
5486 module-level and a string passed to exec.
5487 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005488
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005489 for (i = 1; i < NCH(n); i += 2) {
5490 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005491 int flags;
5492
5493 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005494 if (flags < 0)
5495 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005496 if (flags && flags != DEF_GLOBAL) {
5497 char buf[500];
5498 if (flags & DEF_PARAM) {
5499 PyErr_Format(PyExc_SyntaxError,
5500 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005501 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005502 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005503 st->st_cur->ste_lineno);
5504 st->st_errors++;
5505 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005506 }
5507 else {
5508 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005509 PyOS_snprintf(buf, sizeof(buf),
5510 GLOBAL_AFTER_ASSIGN,
5511 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005512 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005513 PyOS_snprintf(buf, sizeof(buf),
5514 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005515 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005516 }
5517 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005518 symtable_add_def(st, name, DEF_GLOBAL);
5519 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005520}
5521
5522static void
5523symtable_list_comprehension(struct symtable *st, node *n)
5524{
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005525 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005526
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005527 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005528 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005529 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005530 symtable_node(st, CHILD(n, 3));
5531 if (NCH(n) == 5)
5532 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005533}
5534
5535static void
5536symtable_import(struct symtable *st, node *n)
5537{
5538 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005539 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005540 | 'from' dotted_name 'import'
5541 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005542 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005543 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005544 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005545 node *dotname = CHILD(n, 1);
5546 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5547 /* check for bogus imports */
5548 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5549 PyErr_SetString(PyExc_SyntaxError,
5550 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005551 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005552 n->n_lineno);
5553 st->st_errors++;
5554 return;
5555 }
5556 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005557 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005558 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005559 if (symtable_warn(st,
5560 "import * only allowed at module level") < 0)
5561 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005562 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005563 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005564 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005565 } else {
5566 for (i = 3; i < NCH(n); i += 2) {
5567 node *c = CHILD(n, i);
5568 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005569 symtable_assign(st, CHILD(c, 2),
5570 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005571 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005572 symtable_assign(st, CHILD(c, 0),
5573 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005574 }
5575 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005576 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005577 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005578 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005579 }
5580 }
5581}
5582
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005583/* The third argument to symatble_assign() is a flag to be passed to
5584 symtable_add_def() if it is eventually called. The flag is useful
5585 to specify the particular type of assignment that should be
5586 recorded, e.g. an assignment caused by import.
5587 */
5588
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005589static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005590symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005591{
5592 node *tmp;
5593 int i;
5594
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005595 loop:
5596 switch (TYPE(n)) {
5597 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005598 /* invalid assignment, e.g. lambda x:x=2. The next
5599 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005600 return;
5601 case power:
5602 if (NCH(n) > 2) {
5603 for (i = 2; i < NCH(n); ++i)
5604 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5605 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005606 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005607 if (NCH(n) > 1) {
5608 symtable_node(st, CHILD(n, 0));
5609 symtable_node(st, CHILD(n, 1));
5610 } else {
5611 n = CHILD(n, 0);
5612 goto loop;
5613 }
5614 return;
5615 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005616 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5617 /* XXX This is an error, but the next pass
5618 will catch it. */
5619 return;
5620 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005621 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005622 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005623 }
5624 return;
5625 case exprlist:
5626 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00005627 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005628 if (NCH(n) == 1) {
5629 n = CHILD(n, 0);
5630 goto loop;
5631 }
5632 else {
5633 int i;
5634 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005635 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005636 return;
5637 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005638 case atom:
5639 tmp = CHILD(n, 0);
5640 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5641 n = CHILD(n, 1);
5642 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005643 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00005644 if (strcmp(STR(tmp), "__debug__") == 0) {
5645 PyErr_SetString(PyExc_SyntaxError,
5646 ASSIGN_DEBUG);
5647 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton86424e32001-12-04 02:41:46 +00005648 n->n_lineno);
Jeremy Hylton778e2652001-11-09 19:50:08 +00005649 st->st_errors++;
5650 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005651 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005652 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005653 return;
5654 case dotted_as_name:
5655 if (NCH(n) == 3)
5656 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005657 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005658 else
5659 symtable_add_def(st,
5660 STR(CHILD(CHILD(n,
5661 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005662 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005663 return;
5664 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005665 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005666 return;
5667 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005668 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005669 return;
5670 default:
5671 if (NCH(n) == 0)
5672 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005673 if (NCH(n) == 1) {
5674 n = CHILD(n, 0);
5675 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005676 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005677 /* Should only occur for errors like x + 1 = 1,
5678 which will be caught in the next pass. */
5679 for (i = 0; i < NCH(n); ++i)
5680 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005681 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005682 }
5683}