blob: d1655e954fcb39563973efcd45c99eca67171188 [file] [log] [blame]
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001/* Compile an expression node to intermediate code */
2
Guido van Rossum3f5da241990-12-20 15:06:42 +00003/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004 XXX add __doc__ attribute == co_doc to code object attributes?
5 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +00006 XXX Generate simple jump for break/return outside 'try...finally'
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00007 XXX Allow 'continue' inside finally clause of try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +00008 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +00009 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000010*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011
Guido van Rossum79f25d91997-04-29 20:08:16 +000012#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000013
Guido van Rossum10dc2e81990-11-18 17:27:39 +000014#include "node.h"
15#include "token.h"
16#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000017#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000018#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000019#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000020#include "structmember.h"
21
22#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000023
Guido van Rossumb05a5c71997-05-07 17:46:13 +000024/* Three symbols from graminit.h are also defined in Python.h, with
25 Py_ prefixes to their names. Python.h can't include graminit.h
26 (which defines too many confusing symbols), but we can check here
27 that they haven't changed (which is very unlikely, but possible). */
28#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000029 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000030#endif
31#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000032 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000033#endif
34#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000035 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000036#endif
37
Guido van Rossum8e793d91997-03-03 19:13:14 +000038int Py_OptimizeFlag = 0;
39
Guido van Rossum8861b741996-07-30 16:49:37 +000040#define OP_DELETE 0
41#define OP_ASSIGN 1
42#define OP_APPLY 2
43
Jeremy Hyltone36f7782001-01-19 03:21:30 +000044#define VAR_LOAD 0
45#define VAR_STORE 1
46#define VAR_DELETE 2
47
Jeremy Hylton64949cb2001-01-25 20:06:59 +000048#define DEL_CLOSURE_ERROR \
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000049"can not delete variable '%.400s' referenced in nested scope"
50
51#define DUPLICATE_ARGUMENT \
52"duplicate argument '%s' in function definition"
53
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000054#define ILLEGAL_DYNAMIC_SCOPE \
55"%.100s: exec or 'import *' makes names ambiguous in nested scope"
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000056
Jeremy Hylton29906ee2001-02-27 04:23:34 +000057#define GLOBAL_AFTER_ASSIGN \
58"name '%.400s' is assigned to before global declaration"
59
60#define GLOBAL_AFTER_USE \
61"name '%.400s' is used prior to global declaration"
62
63#define LOCAL_GLOBAL \
Neal Norwitz2a47c0f2002-01-29 00:53:41 +000064"name '%.400s' is a function parameter and declared global"
Jeremy Hylton29906ee2001-02-27 04:23:34 +000065
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +000066#define LATE_FUTURE \
67"from __future__ imports must occur at the beginning of the file"
68
Jeremy Hylton897b8212001-03-23 14:08:38 +000069#define ASSIGN_DEBUG \
70"can not assign to __debug__"
71
Jeremy Hyltone36f7782001-01-19 03:21:30 +000072#define MANGLE_LEN 256
73
Guido van Rossum79f25d91997-04-29 20:08:16 +000074#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000075
Guido van Rossum6f799372001-09-20 20:46:19 +000076static PyMemberDef code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000077 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
78 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000079 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000080 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000081 {"co_code", T_OBJECT, OFF(co_code), READONLY},
82 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
83 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000084 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000085 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
86 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000087 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000088 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000089 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
90 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000091 {NULL} /* Sentinel */
92};
93
Guido van Rossumbea18cc2002-06-14 20:41:17 +000094PyDoc_STRVAR(code_doc,
95"code(argcount, nlocals, stacksize, flags, codestring, constants, names,\n\
96 varnames, filename, name, firstlineno, lnotab[, freevars[, cellvars]])\n\
97\n\
98Create a code object. Not for the faint of heart.");
99
100static PyObject *
101code_new(PyTypeObject *type, PyObject *args, PyObject *kw)
102{
103 int argcount;
104 int nlocals;
105 int stacksize;
106 int flags;
107 PyObject *code;
108 PyObject *consts;
109 PyObject *names;
110 PyObject *varnames;
111 PyObject *freevars = NULL;
112 PyObject *cellvars = NULL;
113 PyObject *filename;
114 PyObject *name;
115 int firstlineno;
116 PyObject *lnotab;
117
118 if (!PyArg_ParseTuple(args, "iiiiSO!O!O!SSiS|O!O!:code",
119 &argcount, &nlocals, &stacksize, &flags,
120 &code,
121 &PyTuple_Type, &consts,
122 &PyTuple_Type, &names,
123 &PyTuple_Type, &varnames,
124 &filename, &name,
125 &firstlineno, &lnotab,
126 &PyTuple_Type, &freevars,
127 &PyTuple_Type, &cellvars))
128 return NULL;
129
130 if (freevars == NULL || cellvars == NULL) {
131 PyObject *empty = PyTuple_New(0);
132 if (empty == NULL)
133 return NULL;
134 if (freevars == NULL) {
135 freevars = empty;
136 Py_INCREF(freevars);
137 }
138 if (cellvars == NULL) {
139 cellvars = empty;
140 Py_INCREF(cellvars);
141 }
142 Py_DECREF(empty);
143 }
144
145 if (!PyObject_CheckReadBuffer(code)) {
146 PyErr_SetString(PyExc_TypeError,
147 "bytecode object must be a single-segment read-only buffer");
148 return NULL;
149 }
150
151 return (PyObject *)PyCode_New(argcount, nlocals, stacksize, flags,
152 code, consts, names, varnames,
153 freevars, cellvars, filename, name,
154 firstlineno, lnotab);
155}
156
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000157static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000158code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000159{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000160 Py_XDECREF(co->co_code);
161 Py_XDECREF(co->co_consts);
162 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000163 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000164 Py_XDECREF(co->co_freevars);
165 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000166 Py_XDECREF(co->co_filename);
167 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000168 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000169 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000170}
171
Guido van Rossum79f25d91997-04-29 20:08:16 +0000172static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000173code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000174{
175 char buf[500];
176 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000177 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000178 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000179
Guido van Rossuma396a882000-04-07 01:21:36 +0000180 if (co->co_firstlineno != 0)
181 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000182 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000183 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000184 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000185 name = PyString_AS_STRING(co->co_name);
Barry Warsaw8f6d8682001-11-28 21:10:39 +0000186 PyOS_snprintf(buf, sizeof(buf),
187 "<code object %.100s at %p, file \"%.300s\", line %d>",
188 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000189 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000190}
191
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000192static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000193code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000194{
195 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000196 cmp = PyObject_Compare(co->co_name, cp->co_name);
197 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000198 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000199 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000200 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000201 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000202 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000203 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000204 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000205 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000206 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000207 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000208 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000209 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000210 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000211 if (cmp) return cmp;
212 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
213 if (cmp) return cmp;
214 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000215 return cmp;
216}
217
218static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000219code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000220{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000221 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000222 h0 = PyObject_Hash(co->co_name);
223 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000224 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000225 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000227 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000228 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000229 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000230 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000231 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000232 h5 = PyObject_Hash(co->co_freevars);
233 if (h5 == -1) return -1;
234 h6 = PyObject_Hash(co->co_cellvars);
235 if (h6 == -1) return -1;
236 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000237 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000238 if (h == -1) h = -2;
239 return h;
240}
241
Jeremy Hylton78891072001-03-01 06:09:34 +0000242/* XXX code objects need to participate in GC? */
243
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244PyTypeObject PyCode_Type = {
245 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000246 0,
247 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000248 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000249 0,
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000250 (destructor)code_dealloc, /* tp_dealloc */
251 0, /* tp_print */
252 0, /* tp_getattr */
253 0, /* tp_setattr */
254 (cmpfunc)code_compare, /* tp_compare */
255 (reprfunc)code_repr, /* tp_repr */
256 0, /* tp_as_number */
257 0, /* tp_as_sequence */
258 0, /* tp_as_mapping */
259 (hashfunc)code_hash, /* tp_hash */
260 0, /* tp_call */
261 0, /* tp_str */
262 PyObject_GenericGetAttr, /* tp_getattro */
263 0, /* tp_setattro */
264 0, /* tp_as_buffer */
265 Py_TPFLAGS_DEFAULT, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000266 code_doc, /* tp_doc */
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000267 0, /* tp_traverse */
268 0, /* tp_clear */
269 0, /* tp_richcompare */
270 0, /* tp_weaklistoffset */
271 0, /* tp_iter */
272 0, /* tp_iternext */
273 0, /* tp_methods */
274 code_memberlist, /* tp_members */
275 0, /* tp_getset */
276 0, /* tp_base */
277 0, /* tp_dict */
278 0, /* tp_descr_get */
279 0, /* tp_descr_set */
280 0, /* tp_dictoffset */
281 0, /* tp_init */
282 0, /* tp_alloc */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000283 code_new, /* tp_new */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000284};
285
Guido van Rossum644a12b1997-04-09 19:24:53 +0000286#define NAME_CHARS \
287 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
288
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000289/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
290
291static int
292all_name_chars(unsigned char *s)
293{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000294 static char ok_name_char[256];
295 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000296
Guido van Rossumcd90c202001-02-09 15:06:42 +0000297 if (ok_name_char[*name_chars] == 0) {
298 unsigned char *p;
299 for (p = name_chars; *p; p++)
300 ok_name_char[*p] = 1;
301 }
302 while (*s) {
303 if (ok_name_char[*s++] == 0)
304 return 0;
305 }
306 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000307}
308
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000309static int
310intern_strings(PyObject *tuple)
311{
312 int i;
313
314 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
315 PyObject *v = PyTuple_GET_ITEM(tuple, i);
316 if (v == NULL || !PyString_Check(v)) {
317 Py_FatalError("non-string found in code slot");
318 PyErr_BadInternalCall();
319 return -1;
320 }
321 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
322 }
323 return 0;
324}
325
Guido van Rossum79f25d91997-04-29 20:08:16 +0000326PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000327PyCode_New(int argcount, int nlocals, int stacksize, int flags,
328 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000329 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
330 PyObject *filename, PyObject *name, int firstlineno,
331 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000332{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000333 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000334 int i;
335 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000336 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000337 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000338 consts == NULL || !PyTuple_Check(consts) ||
339 names == NULL || !PyTuple_Check(names) ||
340 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000341 freevars == NULL || !PyTuple_Check(freevars) ||
342 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000343 name == NULL || !PyString_Check(name) ||
344 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000345 lnotab == NULL || !PyString_Check(lnotab) ||
346 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000347 PyErr_BadInternalCall();
348 return NULL;
349 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000350 intern_strings(names);
351 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000352 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000353 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000354 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000355 for (i = PyTuple_Size(consts); --i >= 0; ) {
356 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000357 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000358 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000359 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000360 continue;
361 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000362 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000363 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000364 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000365 co->co_argcount = argcount;
366 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000367 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000368 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000369 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000370 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000371 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000372 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000373 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000374 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000375 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000376 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000377 Py_INCREF(freevars);
378 co->co_freevars = freevars;
379 Py_INCREF(cellvars);
380 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000381 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000382 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000383 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000384 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000385 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000386 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000387 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000388 }
389 return co;
390}
391
392
393/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000394
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000395/* The compiler uses two passes to generate bytecodes. The first pass
396 builds the symbol table. The second pass generates the bytecode.
397
398 The first pass uses a single symtable struct. The second pass uses
399 a compiling struct for each code block. The compiling structs
400 share a reference to the symtable.
401
402 The two passes communicate via symtable_load_symbols() and via
403 is_local() and is_global(). The former initializes several slots
404 in the compiling struct: c_varnames, c_locals, c_nlocals,
405 c_argcount, c_globals, and c_flags.
406*/
407
Tim Peters2a7f3842001-06-09 09:26:21 +0000408/* All about c_lnotab.
409
410c_lnotab is an array of unsigned bytes disguised as a Python string. In -O
411mode, SET_LINENO opcodes aren't generated, and bytecode offsets are mapped
412to source code line #s (when needed for tracebacks) via c_lnotab instead.
413The array is conceptually a list of
414 (bytecode offset increment, line number increment)
415pairs. The details are important and delicate, best illustrated by example:
416
417 byte code offset source code line number
418 0 1
419 6 2
420 50 7
421 350 307
422 361 308
423
424The first trick is that these numbers aren't stored, only the increments
425from one row to the next (this doesn't really work, but it's a start):
426
427 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
428
429The second trick is that an unsigned byte can't hold negative values, or
430values larger than 255, so (a) there's a deep assumption that byte code
431offsets and their corresponding line #s both increase monotonically, and (b)
432if at least one column jumps by more than 255 from one row to the next, more
433than one pair is written to the table. In case #b, there's no way to know
434from looking at the table later how many were written. That's the delicate
435part. A user of c_lnotab desiring to find the source line number
436corresponding to a bytecode address A should do something like this
437
438 lineno = addr = 0
439 for addr_incr, line_incr in c_lnotab:
440 addr += addr_incr
441 if addr > A:
442 return lineno
443 lineno += line_incr
444
445In order for this to work, when the addr field increments by more than 255,
446the line # increment in each pair generated must be 0 until the remaining addr
447increment is < 256. So, in the example above, com_set_lineno should not (as
448was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
449255, 0, 45, 255, 0, 45.
450*/
451
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000452struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000453 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000454 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000455 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000456 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000457 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000458 PyObject *c_globals; /* dictionary (value=None) */
459 PyObject *c_locals; /* dictionary (value=localID) */
460 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000461 PyObject *c_freevars; /* dictionary (value=None) */
462 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000463 int c_nlocals; /* index of next local */
464 int c_argcount; /* number of top-level arguments */
465 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000466 int c_nexti; /* index into c_code */
467 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000468 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000469 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000470 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000471 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000472 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000473 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000474 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000475 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000476 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000477 int c_stacklevel; /* Current stack level */
478 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000479 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000480 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000481 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000482 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000483 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000484 int c_nested; /* Is block nested funcdef or lamdef? */
485 int c_closure; /* Is nested w/freevars? */
486 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000487 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000488 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000489};
490
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000491static int
492is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000493{
494 if ((v & (USE | DEF_FREE))
495 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
496 return 1;
497 if (v & DEF_FREE_CLASS)
498 return 1;
499 return 0;
500}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000501
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000502static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000503com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000504{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000505 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
506
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000507 if (c == NULL) {
508 /* Error occurred via symtable call to
509 is_constant_false */
510 PyErr_SetString(exc, msg);
511 return;
512 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000513 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000514 if (c->c_lineno < 1 || c->c_interactive) {
515 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000516 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000517 return;
518 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000519 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000520 if (v == NULL)
521 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000522
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000523 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000524 if (line == NULL) {
525 Py_INCREF(Py_None);
526 line = Py_None;
527 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000528 if (exc == PyExc_SyntaxError) {
529 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
530 Py_None, line);
531 if (t == NULL)
532 goto exit;
533 w = Py_BuildValue("(OO)", v, t);
534 if (w == NULL)
535 goto exit;
536 PyErr_SetObject(exc, w);
537 } else {
538 /* Make sure additional exceptions are printed with
539 file and line, also. */
540 PyErr_SetObject(exc, v);
541 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
542 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000543 exit:
544 Py_XDECREF(t);
545 Py_XDECREF(v);
546 Py_XDECREF(w);
547 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000548}
549
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000550/* Interface to the block stack */
551
552static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000553block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000554{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000555 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000556 com_error(c, PyExc_SystemError,
557 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000558 }
559 else {
560 c->c_block[c->c_nblocks++] = type;
561 }
562}
563
564static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000565block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000566{
567 if (c->c_nblocks > 0)
568 c->c_nblocks--;
569 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000570 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000571 }
572}
573
Guido van Rossum681d79a1995-07-18 14:51:37 +0000574/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000575
Tim Petersdbd9ba62000-07-09 03:09:57 +0000576static int com_init(struct compiling *, char *);
577static void com_free(struct compiling *);
578static void com_push(struct compiling *, int);
579static void com_pop(struct compiling *, int);
580static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000581static void com_node(struct compiling *, node *);
582static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000583static void com_addbyte(struct compiling *, int);
584static void com_addint(struct compiling *, int);
585static void com_addoparg(struct compiling *, int, int);
586static void com_addfwref(struct compiling *, int, int *);
587static void com_backpatch(struct compiling *, int);
588static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
589static int com_addconst(struct compiling *, PyObject *);
590static int com_addname(struct compiling *, PyObject *);
591static void com_addopname(struct compiling *, int, node *);
592static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000593static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000594static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000595static void com_assign(struct compiling *, node *, int, node *);
596static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000597static PyCodeObject *icompile(node *, struct compiling *);
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000598static PyCodeObject *jcompile(node *, char *, struct compiling *,
599 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000600static PyObject *parsestrplus(struct compiling*, node *);
601static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000602static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000603
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000604static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000605
606/* symtable operations */
607static int symtable_build(struct compiling *, node *);
608static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000609static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000610static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000611static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000612static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000613static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000614
615static void symtable_node(struct symtable *, node *);
616static void symtable_funcdef(struct symtable *, node *);
617static void symtable_default_args(struct symtable *, node *);
618static void symtable_params(struct symtable *, node *);
619static void symtable_params_fplist(struct symtable *, node *n);
620static void symtable_global(struct symtable *, node *);
621static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000622static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000623static void symtable_list_comprehension(struct symtable *, node *);
624
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000625static int symtable_update_free_vars(struct symtable *);
626static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
627static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
628
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000629/* helper */
630static void
631do_pad(int pad)
632{
633 int i;
634 for (i = 0; i < pad; ++i)
635 fprintf(stderr, " ");
636}
637
638static void
639dump(node *n, int pad, int depth)
640{
641 int i;
642 if (depth == 0)
643 return;
644 do_pad(pad);
645 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
646 if (depth > 0)
647 depth--;
648 for (i = 0; i < NCH(n); ++i)
649 dump(CHILD(n, i), pad + 1, depth);
650}
651
652#define DUMP(N) dump(N, 0, -1)
653
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000654static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000655com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000656{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000657 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000658 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
659 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000660 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000661 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000662 goto fail;
663 if ((c->c_const_dict = PyDict_New()) == NULL)
664 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000665 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000666 goto fail;
667 if ((c->c_name_dict = PyDict_New()) == NULL)
668 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000669 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000670 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000671 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
672 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000673 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000674 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000675 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000676 c->c_freevars = NULL;
677 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000678 c->c_nlocals = 0;
679 c->c_argcount = 0;
680 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000681 c->c_nexti = 0;
682 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000683 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000684 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000685 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000686 c->c_begin = 0;
687 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000688 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000689 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000690 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000691 c->c_stacklevel = 0;
692 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000693 c->c_firstlineno = 0;
694 c->c_last_addr = 0;
695 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000696 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000697 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000698 c->c_nested = 0;
699 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000700 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000701 return 1;
702
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000703 fail:
704 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000705 return 0;
706}
707
708static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000709com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000710{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000711 Py_XDECREF(c->c_code);
712 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000713 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000714 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000715 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000716 Py_XDECREF(c->c_globals);
717 Py_XDECREF(c->c_locals);
718 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000719 Py_XDECREF(c->c_freevars);
720 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000721 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000722 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +0000723 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000724}
725
726static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000727com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000728{
729 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000730 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +0000731 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000732 /*
733 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
734 c->c_filename, c->c_name, c->c_lineno,
735 c->c_nexti, c->c_stacklevel, n);
736 */
737 }
Guido van Rossum8b993a91997-01-17 21:04:03 +0000738}
739
740static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000741com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000742{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000743 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000744 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000745 else
746 c->c_stacklevel -= n;
747}
748
749static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000750com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000751{
752 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000753 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000754 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000755 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000756}
757
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000758static int
759com_check_size(PyObject **s, int offset)
760{
761 int len = PyString_GET_SIZE(*s);
762 if (offset >= len)
763 return _PyString_Resize(s, len * 2);
764 return 0;
765}
766
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000767static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000768com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000769{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000770 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000771 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +0000772 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000773 if (com_check_size(&c->c_code, c->c_nexti)) {
774 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000775 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000776 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000777 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000778}
779
780static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000781com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000782{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000783 com_addbyte(c, x & 0xff);
784 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000785}
786
787static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000788com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000789{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000790 char *p;
791 if (c->c_lnotab == NULL)
792 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000793 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
794 c->c_errors++;
795 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000796 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000797 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000798 *p++ = addr;
799 *p++ = line;
800 c->c_lnotab_next += 2;
801}
802
803static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000804com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000805{
806 c->c_lineno = lineno;
807 if (c->c_firstlineno == 0) {
808 c->c_firstlineno = c->c_last_line = lineno;
809 }
810 else {
811 int incr_addr = c->c_nexti - c->c_last_addr;
812 int incr_line = lineno - c->c_last_line;
Tim Peters2a7f3842001-06-09 09:26:21 +0000813 while (incr_addr > 255) {
814 com_add_lnotab(c, 255, 0);
815 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000816 }
Tim Peters2a7f3842001-06-09 09:26:21 +0000817 while (incr_line > 255) {
818 com_add_lnotab(c, incr_addr, 255);
819 incr_line -=255;
820 incr_addr = 0;
821 }
822 if (incr_addr > 0 || incr_line > 0)
823 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000824 c->c_last_addr = c->c_nexti;
825 c->c_last_line = lineno;
826 }
827}
828
829static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000830com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000831{
Fred Drakeef8ace32000-08-24 00:32:09 +0000832 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000833 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000834 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000835 if (Py_OptimizeFlag)
836 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000837 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000838 if (extended_arg){
839 com_addbyte(c, EXTENDED_ARG);
840 com_addint(c, extended_arg);
841 arg &= 0xffff;
842 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000843 com_addbyte(c, op);
844 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000845}
846
847static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000848com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000849{
850 /* Compile a forward reference for backpatching */
851 int here;
852 int anchor;
853 com_addbyte(c, op);
854 here = c->c_nexti;
855 anchor = *p_anchor;
856 *p_anchor = here;
857 com_addint(c, anchor == 0 ? 0 : here - anchor);
858}
859
860static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000861com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000862{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000863 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000864 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000865 int dist;
866 int prev;
867 for (;;) {
868 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000869 prev = code[anchor] + (code[anchor+1] << 8);
870 dist = target - (anchor+2);
871 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000872 dist >>= 8;
873 code[anchor+1] = dist;
874 dist >>= 8;
875 if (dist) {
876 com_error(c, PyExc_SystemError,
877 "com_backpatch: offset too large");
878 break;
879 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000880 if (!prev)
881 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000882 anchor -= prev;
883 }
884}
885
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000886/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000887
888static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000889com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000890{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000891 PyObject *w, *t, *np=NULL;
892 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000893
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000894 t = Py_BuildValue("(OO)", v, v->ob_type);
895 if (t == NULL)
896 goto fail;
897 w = PyDict_GetItem(dict, t);
898 if (w != NULL) {
899 n = PyInt_AsLong(w);
900 } else {
901 n = PyList_Size(list);
902 np = PyInt_FromLong(n);
903 if (np == NULL)
904 goto fail;
905 if (PyList_Append(list, v) != 0)
906 goto fail;
907 if (PyDict_SetItem(dict, t, np) != 0)
908 goto fail;
909 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000910 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000911 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000912 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000913 fail:
914 Py_XDECREF(np);
915 Py_XDECREF(t);
916 c->c_errors++;
917 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000918}
919
920static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000921com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000922{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000923 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000924}
925
926static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000927com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000928{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000929 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000930}
931
Raymond Hettinger0ae0c072002-06-20 22:23:15 +0000932int
933_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000934{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000935 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000936 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000937 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000938 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
939 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000940 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000941 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000942 return 0; /* Don't mangle __extremely_long_names */
943 if (name[nlen-1] == '_' && name[nlen-2] == '_')
944 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000945 /* Strip leading underscores from class name */
946 while (*p == '_')
947 p++;
948 if (*p == '\0')
949 return 0; /* Don't mangle if class is just underscores */
950 plen = strlen(p);
951 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000952 plen = maxlen-nlen-2; /* Truncate class name if too long */
953 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000954 buffer[0] = '_';
955 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000956 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000957 return 1;
958}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000959
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000960static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000961com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000962{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000963 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000964 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000965 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000966
Raymond Hettinger0ae0c072002-06-20 22:23:15 +0000967 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000968 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000969 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000970 c->c_errors++;
971 i = 255;
972 }
973 else {
974 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000975 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000976 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000977 com_addoparg(c, op, i);
978}
979
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000980#define NAME_LOCAL 0
981#define NAME_GLOBAL 1
982#define NAME_DEFAULT 2
983#define NAME_CLOSURE 3
984
985static int
986com_lookup_arg(PyObject *dict, PyObject *name)
987{
988 PyObject *v = PyDict_GetItem(dict, name);
989 if (v == NULL)
990 return -1;
991 else
992 return PyInt_AS_LONG(v);
993}
994
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000995static void
996com_addop_varname(struct compiling *c, int kind, char *name)
997{
998 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000999 int i, reftype;
1000 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001001 int op = STOP_CODE;
1002 char buffer[MANGLE_LEN];
1003
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001004 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001005 name = buffer;
1006 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1007 c->c_errors++;
1008 i = 255;
1009 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001010 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001011
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001012 reftype = get_ref_type(c, name);
1013 switch (reftype) {
1014 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001015 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001016 scope = NAME_LOCAL;
1017 break;
1018 case GLOBAL_EXPLICIT:
1019 scope = NAME_GLOBAL;
1020 break;
1021 case GLOBAL_IMPLICIT:
1022 if (c->c_flags & CO_OPTIMIZED)
1023 scope = NAME_GLOBAL;
1024 break;
1025 case FREE:
1026 case CELL:
1027 scope = NAME_CLOSURE;
1028 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001029 }
1030
1031 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001032 if (scope == NAME_LOCAL)
1033 i = com_lookup_arg(c->c_locals, v);
1034 else if (reftype == FREE)
1035 i = com_lookup_arg(c->c_freevars, v);
1036 else if (reftype == CELL)
1037 i = com_lookup_arg(c->c_cellvars, v);
1038 if (i == -1) {
1039 c->c_errors++; /* XXX no exception set */
1040 i = 255;
1041 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001042 }
1043 Py_DECREF(v);
1044
1045 switch (kind) {
1046 case VAR_LOAD:
1047 switch (scope) {
1048 case NAME_LOCAL:
1049 op = LOAD_FAST;
1050 break;
1051 case NAME_GLOBAL:
1052 op = LOAD_GLOBAL;
1053 break;
1054 case NAME_DEFAULT:
1055 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001056 break;
1057 case NAME_CLOSURE:
1058 op = LOAD_DEREF;
1059 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001060 }
1061 break;
1062 case VAR_STORE:
1063 switch (scope) {
1064 case NAME_LOCAL:
1065 op = STORE_FAST;
1066 break;
1067 case NAME_GLOBAL:
1068 op = STORE_GLOBAL;
1069 break;
1070 case NAME_DEFAULT:
1071 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001072 break;
1073 case NAME_CLOSURE:
1074 op = STORE_DEREF;
1075 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001076 }
1077 break;
1078 case VAR_DELETE:
1079 switch (scope) {
1080 case NAME_LOCAL:
1081 op = DELETE_FAST;
1082 break;
1083 case NAME_GLOBAL:
1084 op = DELETE_GLOBAL;
1085 break;
1086 case NAME_DEFAULT:
1087 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001088 break;
1089 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001090 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001091 PyOS_snprintf(buf, sizeof(buf),
1092 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001093 com_error(c, PyExc_SyntaxError, buf);
1094 i = 255;
1095 break;
1096 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001097 }
1098 break;
1099 }
1100done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001101 com_addoparg(c, op, i);
1102}
1103
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001104static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001105com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001106{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001107 char *name;
1108 char buffer[1000];
1109 /* XXX it is possible to write this code without the 1000
1110 chars on the total length of dotted names, I just can't be
1111 bothered right now */
1112 if (TYPE(n) == STAR)
1113 name = "*";
1114 else if (TYPE(n) == dotted_name) {
1115 char *p = buffer;
1116 int i;
1117 name = buffer;
1118 for (i = 0; i < NCH(n); i += 2) {
1119 char *s = STR(CHILD(n, i));
1120 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001121 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001122 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001123 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001124 break;
1125 }
1126 if (p != buffer)
1127 *p++ = '.';
1128 strcpy(p, s);
1129 p = strchr(p, '\0');
1130 }
1131 }
1132 else {
1133 REQ(n, NAME);
1134 name = STR(n);
1135 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001136 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001137}
1138
Guido van Rossum79f25d91997-04-29 20:08:16 +00001139static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001140parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001141{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001142 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001143 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001144 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001145#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +00001146 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +00001147 int imflag;
1148#endif
1149
Guido van Rossum282914b1991-04-04 10:42:56 +00001150 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001151 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001152#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001153 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001154#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001155 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001156 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001157 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001158 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001159 if (x < 0 && errno == 0) {
Guido van Rossum715eca92002-08-12 21:54:46 +00001160 if (PyErr_WarnExplicit(
1161 PyExc_DeprecationWarning,
1162 "hex/oct constants > sys.maxint "
1163 "will return positive values "
1164 "in Python 2.4 and up",
1165 co->c_filename,
1166 co->c_lineno,
1167 NULL,
1168 NULL) < 0)
Guido van Rossum078151d2002-08-11 04:24:12 +00001169 return NULL;
Guido van Rossum3cb8e542002-08-11 14:06:15 +00001170 errno = 0; /* Might be changed by PyErr_Warn() */
Guido van Rossum078151d2002-08-11 04:24:12 +00001171 }
1172 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001173 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001174 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001175 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001176 if (errno != 0)
1177 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001178 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001179 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001180 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001181#ifndef WITHOUT_COMPLEX
1182 if (imflag) {
1183 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001184 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001185 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001186 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001187 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001188 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001189 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001190#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001191 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001192 PyFPE_START_PROTECT("atof", return 0)
1193 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001194 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001195 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001196 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001197}
1198
Guido van Rossum79f25d91997-04-29 20:08:16 +00001199static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001200decode_utf8(char **sPtr, char *end, char* encoding)
1201{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001202#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001203 Py_FatalError("decode_utf8 should not be called in this build.");
1204 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001205#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001206 PyObject *u, *v;
1207 char *s, *t;
1208 t = s = *sPtr;
1209 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1210 while (s < end && (*s & 0x80)) s++;
1211 *sPtr = s;
1212 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1213 if (u == NULL)
1214 return NULL;
1215 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1216 Py_DECREF(u);
1217 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001218#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001219}
1220
1221static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001222parsestr(struct compiling *com, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001223{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001224 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001225 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001226 char *buf;
1227 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001228 char *end;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001229 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001230 int rawmode = 0;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001231 char* encoding = ((com == NULL) ? NULL : com->c_encoding);
1232 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001233 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001234
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001235 if (isalpha(quote) || quote == '_') {
1236 if (quote == 'u' || quote == 'U') {
1237 quote = *++s;
1238 unicode = 1;
1239 }
1240 if (quote == 'r' || quote == 'R') {
1241 quote = *++s;
1242 rawmode = 1;
1243 }
1244 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001245 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001246 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001247 return NULL;
1248 }
1249 s++;
1250 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001251 if (len > INT_MAX) {
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001252 com_error(com, PyExc_OverflowError,
1253 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001254 return NULL;
1255 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001256 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001257 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001258 return NULL;
1259 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001260 if (len >= 4 && s[0] == quote && s[1] == quote) {
1261 s += 2;
1262 len -= 2;
1263 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001264 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001265 return NULL;
1266 }
1267 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001268#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001269 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001270 PyObject *u, *w;
1271 if (encoding == NULL) {
1272 buf = s;
1273 u = NULL;
1274 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1275 buf = s;
1276 u = NULL;
1277 } else {
1278 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1279 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1280 if (u == NULL)
1281 return NULL;
1282 p = buf = PyString_AsString(u);
1283 end = s + len;
1284 while (s < end) {
1285 if (*s == '\\') {
1286 *p++ = *s++;
1287 if (*s & 0x80) {
1288 strcpy(p, "u005c");
1289 p += 5;
1290 }
1291 }
1292 if (*s & 0x80) { /* XXX inefficient */
1293 char *r;
1294 int rn, i;
1295 w = decode_utf8(&s, end, "utf-16-be");
1296 if (w == NULL) {
1297 Py_DECREF(u);
1298 return NULL;
1299 }
1300 r = PyString_AsString(w);
1301 rn = PyString_Size(w);
1302 assert(rn % 2 == 0);
1303 for (i = 0; i < rn; i += 2) {
1304 sprintf(p, "\\u%02x%02x",
1305 r[i + 0] & 0xFF,
1306 r[i + 1] & 0xFF);
1307 p += 6;
1308 }
1309 Py_DECREF(w);
1310 } else {
1311 *p++ = *s++;
1312 }
1313 }
1314 len = p - buf;
1315 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001316 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001317 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001318 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001319 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1320 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001321 if (v == NULL)
1322 PyErr_SyntaxLocation(com->c_filename, com->c_lineno);
1323 return v;
1324
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001325 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001326#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001327 need_encoding = (encoding != NULL &&
1328 strcmp(encoding, "utf-8") != 0 &&
1329 strcmp(encoding, "iso-8859-1") != 0);
1330 if (rawmode || strchr(s, '\\') == NULL) {
1331 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001332#ifndef Py_USING_UNICODE
1333 /* This should not happen - we never see any other
1334 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001335 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001336#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001337 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1338 if (u == NULL)
1339 return NULL;
1340 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1341 Py_DECREF(u);
1342 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001343#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001344 } else {
1345 return PyString_FromStringAndSize(s, len);
1346 }
1347 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001348
1349 v = PyString_DecodeEscape(s, len, NULL, unicode,
1350 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001351 if (v == NULL)
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001352 PyErr_SyntaxLocation(com->c_filename, com->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001353 return v;
1354}
1355
Guido van Rossum79f25d91997-04-29 20:08:16 +00001356static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001357parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001358{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001359 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001360 int i;
1361 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001362 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001363 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001364 for (i = 1; i < NCH(n); i++) {
1365 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001366 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001367 if (s == NULL)
1368 goto onError;
1369 if (PyString_Check(v) && PyString_Check(s)) {
1370 PyString_ConcatAndDel(&v, s);
1371 if (v == NULL)
1372 goto onError;
1373 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001374#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001375 else {
1376 PyObject *temp;
1377 temp = PyUnicode_Concat(v, s);
1378 Py_DECREF(s);
1379 if (temp == NULL)
1380 goto onError;
1381 Py_DECREF(v);
1382 v = temp;
1383 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001384#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001385 }
1386 }
1387 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001388
1389 onError:
1390 Py_XDECREF(v);
1391 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001392}
1393
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001394static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001395com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001396{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001397 int anchor = 0;
1398 int save_begin = c->c_begin;
1399
1400 /* list_iter: for v in expr [list_iter] */
1401 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001402 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001403 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001404 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001405 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001406 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001407 c->c_loops++;
1408 com_list_iter(c, n, e, t);
1409 c->c_loops--;
1410 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1411 c->c_begin = save_begin;
1412 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001413 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001414}
1415
1416static void
1417com_list_if(struct compiling *c, node *n, node *e, char *t)
1418{
1419 int anchor = 0;
1420 int a = 0;
1421 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001422 com_node(c, CHILD(n, 1));
1423 com_addfwref(c, JUMP_IF_FALSE, &a);
1424 com_addbyte(c, POP_TOP);
1425 com_pop(c, 1);
1426 com_list_iter(c, n, e, t);
1427 com_addfwref(c, JUMP_FORWARD, &anchor);
1428 com_backpatch(c, a);
1429 /* We jump here with an extra entry which we now pop */
1430 com_addbyte(c, POP_TOP);
1431 com_backpatch(c, anchor);
1432}
1433
1434static void
1435com_list_iter(struct compiling *c,
1436 node *p, /* parent of list_iter node */
1437 node *e, /* element expression node */
1438 char *t /* name of result list temp local */)
1439{
1440 /* list_iter is the last child in a listmaker, list_for, or list_if */
1441 node *n = CHILD(p, NCH(p)-1);
1442 if (TYPE(n) == list_iter) {
1443 n = CHILD(n, 0);
1444 switch (TYPE(n)) {
1445 case list_for:
1446 com_list_for(c, n, e, t);
1447 break;
1448 case list_if:
1449 com_list_if(c, n, e, t);
1450 break;
1451 default:
1452 com_error(c, PyExc_SystemError,
1453 "invalid list_iter node type");
1454 }
1455 }
1456 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001457 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001458 com_push(c, 1);
1459 com_node(c, e);
1460 com_addoparg(c, CALL_FUNCTION, 1);
1461 com_addbyte(c, POP_TOP);
1462 com_pop(c, 2);
1463 }
1464}
1465
1466static void
1467com_list_comprehension(struct compiling *c, node *n)
1468{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001469 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001470 char tmpname[30];
1471 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001472 com_addoparg(c, BUILD_LIST, 0);
1473 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1474 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001475 com_addop_name(c, LOAD_ATTR, "append");
1476 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001477 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001478 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001479 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001480 --c->c_tmpname;
1481}
1482
1483static void
1484com_listmaker(struct compiling *c, node *n)
1485{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001486 /* listmaker: test ( list_for | (',' test)* [','] ) */
1487 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001488 com_list_comprehension(c, n);
1489 else {
1490 int len = 0;
1491 int i;
1492 for (i = 0; i < NCH(n); i += 2, len++)
1493 com_node(c, CHILD(n, i));
1494 com_addoparg(c, BUILD_LIST, len);
1495 com_pop(c, len-1);
1496 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001497}
1498
1499static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001500com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001501{
1502 int i;
1503 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1504 for (i = 0; i+2 < NCH(n); i += 4) {
1505 /* We must arrange things just right for STORE_SUBSCR.
1506 It wants the stack to look like (value) (dict) (key) */
1507 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001508 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001509 com_node(c, CHILD(n, i+2)); /* value */
1510 com_addbyte(c, ROT_TWO);
1511 com_node(c, CHILD(n, i)); /* key */
1512 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001513 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001514 }
1515}
1516
1517static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001518com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001519{
1520 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001521 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001522 int i;
1523 REQ(n, atom);
1524 ch = CHILD(n, 0);
1525 switch (TYPE(ch)) {
1526 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001527 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001528 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001529 com_push(c, 1);
1530 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001531 else
1532 com_node(c, CHILD(n, 1));
1533 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001534 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001535 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001536 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001537 com_push(c, 1);
1538 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001539 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001540 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001541 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001542 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001543 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001544 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001545 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001546 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001547 break;
1548 case BACKQUOTE:
1549 com_node(c, CHILD(n, 1));
1550 com_addbyte(c, UNARY_CONVERT);
1551 break;
1552 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001553 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001554 i = 255;
1555 }
1556 else {
1557 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001558 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001559 }
1560 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001561 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001562 break;
1563 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001564 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001565 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001566 c->c_errors++;
1567 i = 255;
1568 }
1569 else {
1570 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001571 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001572 }
1573 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001574 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001575 break;
1576 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001577 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001578 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001579 break;
1580 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001581 com_error(c, PyExc_SystemError,
1582 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001583 }
1584}
1585
1586static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001587com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001588{
1589 if (NCH(n) == 1) {
1590 com_addbyte(c, op);
1591 }
1592 else if (NCH(n) == 2) {
1593 if (TYPE(CHILD(n, 0)) != COLON) {
1594 com_node(c, CHILD(n, 0));
1595 com_addbyte(c, op+1);
1596 }
1597 else {
1598 com_node(c, CHILD(n, 1));
1599 com_addbyte(c, op+2);
1600 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001601 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001602 }
1603 else {
1604 com_node(c, CHILD(n, 0));
1605 com_node(c, CHILD(n, 2));
1606 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001607 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001608 }
1609}
1610
Guido van Rossum635abd21997-01-06 22:56:52 +00001611static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001612com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1613{
1614 if (NCH(n) == 1) {
1615 com_addbyte(c, DUP_TOP);
1616 com_push(c, 1);
1617 com_addbyte(c, SLICE);
1618 com_node(c, augn);
1619 com_addbyte(c, opcode);
1620 com_pop(c, 1);
1621 com_addbyte(c, ROT_TWO);
1622 com_addbyte(c, STORE_SLICE);
1623 com_pop(c, 2);
1624 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1625 com_node(c, CHILD(n, 0));
1626 com_addoparg(c, DUP_TOPX, 2);
1627 com_push(c, 2);
1628 com_addbyte(c, SLICE+1);
1629 com_pop(c, 1);
1630 com_node(c, augn);
1631 com_addbyte(c, opcode);
1632 com_pop(c, 1);
1633 com_addbyte(c, ROT_THREE);
1634 com_addbyte(c, STORE_SLICE+1);
1635 com_pop(c, 3);
1636 } else if (NCH(n) == 2) {
1637 com_node(c, CHILD(n, 1));
1638 com_addoparg(c, DUP_TOPX, 2);
1639 com_push(c, 2);
1640 com_addbyte(c, SLICE+2);
1641 com_pop(c, 1);
1642 com_node(c, augn);
1643 com_addbyte(c, opcode);
1644 com_pop(c, 1);
1645 com_addbyte(c, ROT_THREE);
1646 com_addbyte(c, STORE_SLICE+2);
1647 com_pop(c, 3);
1648 } else {
1649 com_node(c, CHILD(n, 0));
1650 com_node(c, CHILD(n, 2));
1651 com_addoparg(c, DUP_TOPX, 3);
1652 com_push(c, 3);
1653 com_addbyte(c, SLICE+3);
1654 com_pop(c, 2);
1655 com_node(c, augn);
1656 com_addbyte(c, opcode);
1657 com_pop(c, 1);
1658 com_addbyte(c, ROT_FOUR);
1659 com_addbyte(c, STORE_SLICE+3);
1660 com_pop(c, 4);
1661 }
1662}
1663
1664static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001665com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001666{
1667 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001668 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001669 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001670 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001671 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001672 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001673 }
1674 else {
1675 com_node(c, CHILD(n, 0));
1676 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001677 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001678 }
1679 m = n;
1680 do {
1681 m = CHILD(m, 0);
1682 } while (NCH(m) == 1);
1683 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001684 /* f(lambda x: x[0] = 3) ends up getting parsed with
1685 * LHS test = lambda x: x[0], and RHS test = 3.
1686 * SF bug 132313 points out that complaining about a keyword
1687 * then is very confusing.
1688 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001689 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001690 TYPE(m) == lambdef ?
1691 "lambda cannot contain assignment" :
1692 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001693 }
1694 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001695 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001696 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001697 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001698 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001699 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001700 else if (*pkeywords == NULL) {
1701 c->c_errors++;
1702 Py_DECREF(v);
1703 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001704 if (PyDict_GetItem(*pkeywords, v) != NULL)
1705 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001706 "duplicate keyword argument");
1707 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001708 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001709 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001710 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001711 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001712 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001713 }
1714 }
1715 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001716}
1717
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001718static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001719com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001720{
1721 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001722 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001723 }
1724 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001725 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001726 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001727 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001728 int star_flag = 0;
1729 int starstar_flag = 0;
1730 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001731 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001732 na = 0;
1733 nk = 0;
1734 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001735 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001736 if (TYPE(ch) == STAR ||
1737 TYPE(ch) == DOUBLESTAR)
1738 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001739 if (ch->n_lineno != lineno) {
1740 lineno = ch->n_lineno;
1741 com_addoparg(c, SET_LINENO, lineno);
1742 }
1743 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001744 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001745 na++;
1746 else
1747 nk++;
1748 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001749 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001750 while (i < NCH(n)) {
1751 node *tok = CHILD(n, i);
1752 node *ch = CHILD(n, i+1);
1753 i += 3;
1754 switch (TYPE(tok)) {
1755 case STAR: star_flag = 1; break;
1756 case DOUBLESTAR: starstar_flag = 1; break;
1757 }
1758 com_node(c, ch);
1759 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001760 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001761 com_error(c, PyExc_SyntaxError,
1762 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001763 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001764 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001765 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001766 star_flag + (starstar_flag << 1);
1767 else
1768 opcode = CALL_FUNCTION;
1769 com_addoparg(c, opcode, na | (nk << 8));
1770 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001771 }
1772}
1773
1774static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001775com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001776{
1777 com_addopname(c, LOAD_ATTR, n);
1778}
1779
1780static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001781com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001782{
1783 int i=0;
1784 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001785 node *ch;
1786
1787 /* first argument */
1788 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001789 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001790 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001791 i++;
1792 }
1793 else {
1794 com_node(c, CHILD(n,i));
1795 i++;
1796 REQ(CHILD(n,i),COLON);
1797 i++;
1798 }
1799 /* second argument */
1800 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1801 com_node(c, CHILD(n,i));
1802 i++;
1803 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001804 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001805 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001806 com_push(c, 1);
1807 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001808 /* remaining arguments */
1809 for (; i < NCH(n); i++) {
1810 ns++;
1811 ch=CHILD(n,i);
1812 REQ(ch, sliceop);
1813 if (NCH(ch) == 1) {
1814 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001815 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001816 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001817 }
1818 else
1819 com_node(c, CHILD(ch,1));
1820 }
1821 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001822 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001823}
1824
1825static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001826com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001827{
1828 node *ch;
1829 REQ(n, subscript);
1830 ch = CHILD(n,0);
1831 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001832 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001833 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001834 com_push(c, 1);
1835 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001836 else {
1837 /* check for slice */
1838 if ((TYPE(ch) == COLON || NCH(n) > 1))
1839 com_sliceobj(c, n);
1840 else {
1841 REQ(ch, test);
1842 com_node(c, ch);
1843 }
1844 }
1845}
1846
1847static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001848com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001849{
1850 int i, op;
1851 REQ(n, subscriptlist);
1852 /* Check to make backward compatible slice behavior for '[i:j]' */
1853 if (NCH(n) == 1) {
1854 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001855 /* 'Basic' slice, should have exactly one colon. */
1856 if ((TYPE(CHILD(sub, 0)) == COLON
1857 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1858 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1859 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001860 switch (assigning) {
1861 case OP_DELETE:
1862 op = DELETE_SLICE;
1863 break;
1864 case OP_ASSIGN:
1865 op = STORE_SLICE;
1866 break;
1867 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001868 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001869 break;
1870 default:
1871 com_augassign_slice(c, sub, assigning, augn);
1872 return;
1873 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001874 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001875 if (op == STORE_SLICE)
1876 com_pop(c, 2);
1877 else if (op == DELETE_SLICE)
1878 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001879 return;
1880 }
1881 }
1882 /* Else normal subscriptlist. Compile each subscript. */
1883 for (i = 0; i < NCH(n); i += 2)
1884 com_subscript(c, CHILD(n, i));
1885 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001886 if (NCH(n) > 1) {
1887 i = (NCH(n)+1) / 2;
1888 com_addoparg(c, BUILD_TUPLE, i);
1889 com_pop(c, i-1);
1890 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001891 switch (assigning) {
1892 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001893 op = DELETE_SUBSCR;
1894 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001895 break;
1896 default:
1897 case OP_ASSIGN:
1898 op = STORE_SUBSCR;
1899 i = 3;
1900 break;
1901 case OP_APPLY:
1902 op = BINARY_SUBSCR;
1903 i = 1;
1904 break;
1905 }
1906 if (assigning > OP_APPLY) {
1907 com_addoparg(c, DUP_TOPX, 2);
1908 com_push(c, 2);
1909 com_addbyte(c, BINARY_SUBSCR);
1910 com_pop(c, 1);
1911 com_node(c, augn);
1912 com_addbyte(c, assigning);
1913 com_pop(c, 1);
1914 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001915 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001916 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001917 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001918}
1919
1920static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001921com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001922{
1923 REQ(n, trailer);
1924 switch (TYPE(CHILD(n, 0))) {
1925 case LPAR:
1926 com_call_function(c, CHILD(n, 1));
1927 break;
1928 case DOT:
1929 com_select_member(c, CHILD(n, 1));
1930 break;
1931 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001932 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001933 break;
1934 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001935 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001936 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001937 }
1938}
1939
1940static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001941com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001942{
1943 int i;
1944 REQ(n, power);
1945 com_atom(c, CHILD(n, 0));
1946 for (i = 1; i < NCH(n); i++) {
1947 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1948 com_factor(c, CHILD(n, i+1));
1949 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001950 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001951 break;
1952 }
1953 else
1954 com_apply_trailer(c, CHILD(n, i));
1955 }
1956}
1957
1958static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001959com_invert_constant(struct compiling *c, node *n)
1960{
1961 /* Compute the inverse of int and longs and use them directly,
1962 but be prepared to generate code for all other
1963 possibilities (invalid numbers, floats, complex).
1964 */
1965 PyObject *num, *inv = NULL;
1966 int i;
1967
1968 REQ(n, NUMBER);
1969 num = parsenumber(c, STR(n));
1970 if (num == NULL)
1971 i = 255;
1972 else {
1973 inv = PyNumber_Invert(num);
1974 if (inv == NULL) {
1975 PyErr_Clear();
1976 i = com_addconst(c, num);
1977 } else {
1978 i = com_addconst(c, inv);
1979 Py_DECREF(inv);
1980 }
1981 Py_DECREF(num);
1982 }
1983 com_addoparg(c, LOAD_CONST, i);
1984 com_push(c, 1);
1985 if (num != NULL && inv == NULL)
1986 com_addbyte(c, UNARY_INVERT);
1987}
1988
Tim Peters51e26512001-09-07 08:45:55 +00001989static int
1990is_float_zero(const char *p)
1991{
1992 int found_radix_point = 0;
1993 int ch;
1994 while ((ch = Py_CHARMASK(*p++)) != '\0') {
1995 switch (ch) {
1996 case '0':
1997 /* no reason to believe it's not 0 -- continue */
1998 break;
1999
2000 case 'e': case 'E': case 'j': case 'J':
2001 /* If this was a hex constant, we already would have
2002 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2003 must be an exponent marker, and we haven't yet
2004 seen a non-zero digit, and it doesn't matter what
2005 the exponent is then. For 'j' or 'J' similarly,
2006 except that this is an imaginary 0 then. */
2007 return 1;
2008
2009 case '.':
2010 found_radix_point = 1;
2011 break;
2012
2013 default:
2014 return 0;
2015 }
2016 }
2017 return found_radix_point;
2018}
2019
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002020static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002021com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002022{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002023 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002024 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002025 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002026 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002027 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002028 approriate value as a constant. If the value is negative,
2029 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002030 negative in the 0th position -- unless we're doing unary minus
2031 of a floating zero! In that case the sign is significant, but
2032 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002033 */
2034 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002035 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002036 && TYPE((pfactor = CHILD(n, 1))) == factor
2037 && NCH(pfactor) == 1
2038 && TYPE((ppower = CHILD(pfactor, 0))) == power
2039 && NCH(ppower) == 1
2040 && TYPE((patom = CHILD(ppower, 0))) == atom
2041 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
2042 && !(childtype == MINUS && is_float_zero(STR(pnum)))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002043 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002044 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002045 return;
2046 }
2047 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002048 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002049 if (s == NULL) {
2050 com_error(c, PyExc_MemoryError, "");
2051 com_addbyte(c, 255);
2052 return;
2053 }
2054 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002055 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002056 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002057 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002058 }
Tim Peters51e26512001-09-07 08:45:55 +00002059 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002060 }
2061 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002062 com_factor(c, CHILD(n, 1));
2063 com_addbyte(c, UNARY_POSITIVE);
2064 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002065 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002066 com_factor(c, CHILD(n, 1));
2067 com_addbyte(c, UNARY_NEGATIVE);
2068 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002069 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002070 com_factor(c, CHILD(n, 1));
2071 com_addbyte(c, UNARY_INVERT);
2072 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002073 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002074 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002075 }
2076}
2077
2078static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002079com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002080{
2081 int i;
2082 int op;
2083 REQ(n, term);
2084 com_factor(c, CHILD(n, 0));
2085 for (i = 2; i < NCH(n); i += 2) {
2086 com_factor(c, CHILD(n, i));
2087 switch (TYPE(CHILD(n, i-1))) {
2088 case STAR:
2089 op = BINARY_MULTIPLY;
2090 break;
2091 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002092 if (c->c_flags & CO_FUTURE_DIVISION)
2093 op = BINARY_TRUE_DIVIDE;
2094 else
2095 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002096 break;
2097 case PERCENT:
2098 op = BINARY_MODULO;
2099 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002100 case DOUBLESLASH:
2101 op = BINARY_FLOOR_DIVIDE;
2102 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002103 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002104 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002105 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002106 op = 255;
2107 }
2108 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002109 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002110 }
2111}
2112
2113static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002114com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002115{
2116 int i;
2117 int op;
2118 REQ(n, arith_expr);
2119 com_term(c, CHILD(n, 0));
2120 for (i = 2; i < NCH(n); i += 2) {
2121 com_term(c, CHILD(n, i));
2122 switch (TYPE(CHILD(n, i-1))) {
2123 case PLUS:
2124 op = BINARY_ADD;
2125 break;
2126 case MINUS:
2127 op = BINARY_SUBTRACT;
2128 break;
2129 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002130 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002131 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002132 op = 255;
2133 }
2134 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002135 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002136 }
2137}
2138
2139static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002140com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002141{
2142 int i;
2143 int op;
2144 REQ(n, shift_expr);
2145 com_arith_expr(c, CHILD(n, 0));
2146 for (i = 2; i < NCH(n); i += 2) {
2147 com_arith_expr(c, CHILD(n, i));
2148 switch (TYPE(CHILD(n, i-1))) {
2149 case LEFTSHIFT:
2150 op = BINARY_LSHIFT;
2151 break;
2152 case RIGHTSHIFT:
2153 op = BINARY_RSHIFT;
2154 break;
2155 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002156 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002157 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002158 op = 255;
2159 }
2160 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002161 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002162 }
2163}
2164
2165static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002166com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002167{
2168 int i;
2169 int op;
2170 REQ(n, and_expr);
2171 com_shift_expr(c, CHILD(n, 0));
2172 for (i = 2; i < NCH(n); i += 2) {
2173 com_shift_expr(c, CHILD(n, i));
2174 if (TYPE(CHILD(n, i-1)) == AMPER) {
2175 op = BINARY_AND;
2176 }
2177 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002178 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002179 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002180 op = 255;
2181 }
2182 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002183 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002184 }
2185}
2186
2187static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002188com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002189{
2190 int i;
2191 int op;
2192 REQ(n, xor_expr);
2193 com_and_expr(c, CHILD(n, 0));
2194 for (i = 2; i < NCH(n); i += 2) {
2195 com_and_expr(c, CHILD(n, i));
2196 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2197 op = BINARY_XOR;
2198 }
2199 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002200 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002201 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002202 op = 255;
2203 }
2204 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002205 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002206 }
2207}
2208
2209static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002210com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002211{
2212 int i;
2213 int op;
2214 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002215 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002216 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002217 com_xor_expr(c, CHILD(n, i));
2218 if (TYPE(CHILD(n, i-1)) == VBAR) {
2219 op = BINARY_OR;
2220 }
2221 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002222 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002223 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002224 op = 255;
2225 }
2226 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002227 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002228 }
2229}
2230
2231static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002232cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002233{
2234 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00002235 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002236 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2237 if (NCH(n) == 1) {
2238 n = CHILD(n, 0);
2239 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002240 case LESS: return PyCmp_LT;
2241 case GREATER: return PyCmp_GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002242 case EQEQUAL: /* == */
Martin v. Löwis7198a522002-01-01 19:59:11 +00002243 case EQUAL: return PyCmp_EQ;
2244 case LESSEQUAL: return PyCmp_LE;
2245 case GREATEREQUAL: return PyCmp_GE;
2246 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2247 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2248 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002249 }
2250 }
2251 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002252 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002253 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002254 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002255 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002256 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002257 }
2258 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002259 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002260}
2261
2262static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002263com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002264{
2265 int i;
2266 enum cmp_op op;
2267 int anchor;
2268 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2269 com_expr(c, CHILD(n, 0));
2270 if (NCH(n) == 1)
2271 return;
2272
2273 /****************************************************************
2274 The following code is generated for all but the last
2275 comparison in a chain:
2276
2277 label: on stack: opcode: jump to:
2278
2279 a <code to load b>
2280 a, b DUP_TOP
2281 a, b, b ROT_THREE
2282 b, a, b COMPARE_OP
2283 b, 0-or-1 JUMP_IF_FALSE L1
2284 b, 1 POP_TOP
2285 b
2286
2287 We are now ready to repeat this sequence for the next
2288 comparison in the chain.
2289
2290 For the last we generate:
2291
2292 b <code to load c>
2293 b, c COMPARE_OP
2294 0-or-1
2295
2296 If there were any jumps to L1 (i.e., there was more than one
2297 comparison), we generate:
2298
2299 0-or-1 JUMP_FORWARD L2
2300 L1: b, 0 ROT_TWO
2301 0, b POP_TOP
2302 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002303 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002304 ****************************************************************/
2305
2306 anchor = 0;
2307
2308 for (i = 2; i < NCH(n); i += 2) {
2309 com_expr(c, CHILD(n, i));
2310 if (i+2 < NCH(n)) {
2311 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002312 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002313 com_addbyte(c, ROT_THREE);
2314 }
2315 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002316 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002317 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002318 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002319 }
2320 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002321 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002322 if (i+2 < NCH(n)) {
2323 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2324 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002325 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002326 }
2327 }
2328
2329 if (anchor) {
2330 int anchor2 = 0;
2331 com_addfwref(c, JUMP_FORWARD, &anchor2);
2332 com_backpatch(c, anchor);
2333 com_addbyte(c, ROT_TWO);
2334 com_addbyte(c, POP_TOP);
2335 com_backpatch(c, anchor2);
2336 }
2337}
2338
2339static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002340com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002341{
2342 REQ(n, not_test); /* 'not' not_test | comparison */
2343 if (NCH(n) == 1) {
2344 com_comparison(c, CHILD(n, 0));
2345 }
2346 else {
2347 com_not_test(c, CHILD(n, 1));
2348 com_addbyte(c, UNARY_NOT);
2349 }
2350}
2351
2352static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002353com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002354{
2355 int i;
2356 int anchor;
2357 REQ(n, and_test); /* not_test ('and' not_test)* */
2358 anchor = 0;
2359 i = 0;
2360 for (;;) {
2361 com_not_test(c, CHILD(n, i));
2362 if ((i += 2) >= NCH(n))
2363 break;
2364 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2365 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002366 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002367 }
2368 if (anchor)
2369 com_backpatch(c, anchor);
2370}
2371
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002372static int
2373com_make_closure(struct compiling *c, PyCodeObject *co)
2374{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002375 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002376 if (free == 0)
2377 return 0;
2378 for (i = 0; i < free; ++i) {
2379 /* Bypass com_addop_varname because it will generate
2380 LOAD_DEREF but LOAD_CLOSURE is needed.
2381 */
2382 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2383 int arg, reftype;
2384
2385 /* Special case: If a class contains a method with a
2386 free variable that has the same name as a method,
2387 the name will be considered free *and* local in the
2388 class. It should be handled by the closure, as
2389 well as by the normal name loookup logic.
2390 */
2391 reftype = get_ref_type(c, PyString_AS_STRING(name));
2392 if (reftype == CELL)
2393 arg = com_lookup_arg(c->c_cellvars, name);
2394 else /* (reftype == FREE) */
2395 arg = com_lookup_arg(c->c_freevars, name);
2396 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002397 fprintf(stderr, "lookup %s in %s %d %d\n"
2398 "freevars of %s: %s\n",
2399 PyObject_REPR(name),
2400 c->c_name,
2401 reftype, arg,
2402 PyString_AS_STRING(co->co_name),
2403 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002404 Py_FatalError("com_make_closure()");
2405 }
2406 com_addoparg(c, LOAD_CLOSURE, arg);
2407
2408 }
2409 com_push(c, free);
2410 return 1;
2411}
2412
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002413static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002414com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002415{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002416 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002417 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002418 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002419 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002420 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002421 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2422 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002423 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002424 if (co == NULL) {
2425 c->c_errors++;
2426 return;
2427 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002428 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002429 i = com_addconst(c, (PyObject *)co);
2430 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002431 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002432 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002433 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002434 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002435 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002436 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002437 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002438 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002439 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002440 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002441 else {
2442 int anchor = 0;
2443 int i = 0;
2444 for (;;) {
2445 com_and_test(c, CHILD(n, i));
2446 if ((i += 2) >= NCH(n))
2447 break;
2448 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2449 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002450 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002451 }
2452 if (anchor)
2453 com_backpatch(c, anchor);
2454 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002455}
2456
2457static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002458com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002459{
2460 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002461 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002462 com_node(c, CHILD(n, 0));
2463 }
2464 else {
2465 int i;
2466 int len;
2467 len = (NCH(n) + 1) / 2;
2468 for (i = 0; i < NCH(n); i += 2)
2469 com_node(c, CHILD(n, i));
2470 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002471 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002472 }
2473}
2474
2475
2476/* Begin of assignment compilation */
2477
Thomas Wouters434d0822000-08-24 20:11:32 +00002478
2479static void
2480com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2481{
2482 com_addbyte(c, DUP_TOP);
2483 com_push(c, 1);
2484 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002485 com_node(c, augn);
2486 com_addbyte(c, opcode);
2487 com_pop(c, 1);
2488 com_addbyte(c, ROT_TWO);
2489 com_addopname(c, STORE_ATTR, n);
2490 com_pop(c, 2);
2491}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002492
2493static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002494com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002495{
2496 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002497 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002498}
2499
2500static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002501com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002502{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002503 REQ(n, trailer);
2504 switch (TYPE(CHILD(n, 0))) {
2505 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002506 if (assigning == OP_DELETE)
2507 com_error(c, PyExc_SyntaxError,
2508 "can't delete function call");
2509 else
2510 com_error(c, PyExc_SyntaxError,
2511 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002512 break;
2513 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002514 if (assigning > OP_APPLY)
2515 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2516 else
2517 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002518 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002519 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002520 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002521 break;
2522 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002523 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002524 }
2525}
2526
2527static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002528com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002529{
2530 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002531 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002532 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002533 if (assigning) {
2534 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002535 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002536 com_push(c, i-1);
2537 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002538 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002539 com_assign(c, CHILD(n, i), assigning, NULL);
2540}
2541
2542static void
2543com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2544{
2545 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002546 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002547 com_push(c, 1);
2548 com_node(c, augn);
2549 com_addbyte(c, opcode);
2550 com_pop(c, 1);
2551 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002552}
2553
2554static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002555com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002556{
2557 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002558 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002559 if (assigning)
2560 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002561}
2562
2563static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002564com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002565{
2566 /* Loop to avoid trivial recursion */
2567 for (;;) {
2568 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002569
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002570 case exprlist:
2571 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002572 case testlist1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002573 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002574 if (assigning > OP_APPLY) {
2575 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002576 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002577 return;
2578 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002579 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002580 return;
2581 }
2582 n = CHILD(n, 0);
2583 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002584
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002585 case test:
2586 case and_test:
2587 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002588 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002589 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002590 case xor_expr:
2591 case and_expr:
2592 case shift_expr:
2593 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002594 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002595 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002596 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002597 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002598 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002599 return;
2600 }
2601 n = CHILD(n, 0);
2602 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002603
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002604 case power: /* atom trailer* ('**' power)*
2605 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002606 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002607 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002608 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002609 return;
2610 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002611 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002612 int i;
2613 com_node(c, CHILD(n, 0));
2614 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002615 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002616 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002617 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002618 return;
2619 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002620 com_apply_trailer(c, CHILD(n, i));
2621 } /* NB i is still alive */
2622 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002623 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002624 return;
2625 }
2626 n = CHILD(n, 0);
2627 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002628
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002629 case atom:
2630 switch (TYPE(CHILD(n, 0))) {
2631 case LPAR:
2632 n = CHILD(n, 1);
2633 if (TYPE(n) == RPAR) {
2634 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002635 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002636 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002637 return;
2638 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002639 if (assigning > OP_APPLY) {
2640 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002641 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002642 return;
2643 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002644 break;
2645 case LSQB:
2646 n = CHILD(n, 1);
2647 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002648 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002649 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002650 return;
2651 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002652 if (assigning > OP_APPLY) {
2653 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002654 "augmented assign to list not possible");
2655 return;
2656 }
2657 if (NCH(n) > 1
2658 && TYPE(CHILD(n, 1)) == list_for) {
2659 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002660 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002661 return;
2662 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002663 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002664 return;
2665 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002666 if (assigning > OP_APPLY)
2667 com_augassign_name(c, CHILD(n, 0),
2668 assigning, augn);
2669 else
2670 com_assign_name(c, CHILD(n, 0),
2671 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002672 return;
2673 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002674 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002675 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002676 return;
2677 }
2678 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002679
2680 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002681 com_error(c, PyExc_SyntaxError,
2682 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002683 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002684
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002685 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002686 com_error(c, PyExc_SystemError,
2687 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002688 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002689
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002690 }
2691 }
2692}
Guido van Rossum7c531111997-03-11 18:42:21 +00002693
Thomas Wouters434d0822000-08-24 20:11:32 +00002694static void
2695com_augassign(struct compiling *c, node *n)
2696{
2697 int opcode;
2698
2699 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2700 case '+': opcode = INPLACE_ADD; break;
2701 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002702 case '/':
2703 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
2704 opcode = INPLACE_FLOOR_DIVIDE;
2705 else if (c->c_flags & CO_FUTURE_DIVISION)
2706 opcode = INPLACE_TRUE_DIVIDE;
2707 else
2708 opcode = INPLACE_DIVIDE;
2709 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00002710 case '%': opcode = INPLACE_MODULO; break;
2711 case '<': opcode = INPLACE_LSHIFT; break;
2712 case '>': opcode = INPLACE_RSHIFT; break;
2713 case '&': opcode = INPLACE_AND; break;
2714 case '^': opcode = INPLACE_XOR; break;
2715 case '|': opcode = INPLACE_OR; break;
2716 case '*':
2717 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2718 opcode = INPLACE_POWER;
2719 else
2720 opcode = INPLACE_MULTIPLY;
2721 break;
2722 default:
2723 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2724 return;
2725 }
2726 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2727}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002728
2729static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002730com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002731{
Thomas Wouters434d0822000-08-24 20:11:32 +00002732 REQ(n, expr_stmt);
2733 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002734 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002735 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002736 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002737 if (NCH(n) == 1) {
2738 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002739 if (c->c_interactive)
2740 com_addbyte(c, PRINT_EXPR);
2741 else
2742 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002743 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002744 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002745 else if (TYPE(CHILD(n,1)) == augassign)
2746 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002747 else {
2748 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002749 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002750 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002751 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002752 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002753 com_push(c, 1);
2754 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002755 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002756 }
2757 }
2758}
2759
2760static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002761com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002762{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002763 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002764 int i;
2765 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002766 if (Py_OptimizeFlag)
2767 return;
2768 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00002769
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002770 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00002771 raise AssertionError [, <message>]
2772
2773 where <message> is the second test, if present.
2774 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002775 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002776 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002777 com_addbyte(c, POP_TOP);
2778 com_pop(c, 1);
2779 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002780 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002781 com_push(c, 1);
2782 i = NCH(n)/2; /* Either 2 or 4 */
2783 if (i > 1)
2784 com_node(c, CHILD(n, 3));
2785 com_addoparg(c, RAISE_VARARGS, i);
2786 com_pop(c, i);
2787 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002788 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002789 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002790 com_addbyte(c, POP_TOP);
2791}
2792
2793static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002794com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002795{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002796 int i = 1;
2797 node* stream = NULL;
2798
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002799 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002800
2801 /* are we using the extended print form? */
2802 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2803 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002804 com_node(c, stream);
2805 /* stack: [...] => [... stream] */
2806 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002807 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2808 i = 4;
2809 else
2810 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002811 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002812 for (; i < NCH(n); i += 2) {
2813 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002814 com_addbyte(c, DUP_TOP);
2815 /* stack: [stream] => [stream stream] */
2816 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002817 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002818 /* stack: [stream stream] => [stream stream obj] */
2819 com_addbyte(c, ROT_TWO);
2820 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002821 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002822 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002823 com_pop(c, 2);
2824 }
2825 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002826 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002827 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002828 com_addbyte(c, PRINT_ITEM);
2829 com_pop(c, 1);
2830 }
2831 }
2832 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002833 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002834 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002835 /* must pop the extra stream object off the stack */
2836 com_addbyte(c, POP_TOP);
2837 /* stack: [... stream] => [...] */
2838 com_pop(c, 1);
2839 }
2840 }
2841 else {
2842 if (stream != NULL) {
2843 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002844 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002845 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002846 com_pop(c, 1);
2847 }
2848 else
2849 com_addbyte(c, PRINT_NEWLINE);
2850 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002851}
2852
2853static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002854com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002855{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002856 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002857 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002858 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002859 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002860 if (c->c_flags & CO_GENERATOR) {
2861 if (NCH(n) > 1) {
2862 com_error(c, PyExc_SyntaxError,
2863 "'return' with argument inside generator");
2864 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002865 }
2866 if (NCH(n) < 2) {
2867 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002868 com_push(c, 1);
2869 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002870 else
2871 com_node(c, CHILD(n, 1));
2872 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00002873 com_pop(c, 1);
2874}
2875
2876static void
2877com_yield_stmt(struct compiling *c, node *n)
2878{
Tim Peters95c80f82001-06-23 02:07:08 +00002879 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00002880 REQ(n, yield_stmt); /* 'yield' testlist */
2881 if (!c->c_infunction) {
2882 com_error(c, PyExc_SyntaxError, "'yield' outside function");
2883 }
Tim Peters95c80f82001-06-23 02:07:08 +00002884
2885 for (i = 0; i < c->c_nblocks; ++i) {
2886 if (c->c_block[i] == SETUP_FINALLY) {
2887 com_error(c, PyExc_SyntaxError,
2888 "'yield' not allowed in a 'try' block "
2889 "with a 'finally' clause");
2890 return;
2891 }
2892 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002893 com_node(c, CHILD(n, 1));
2894 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002895 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002896}
2897
2898static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002899com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002900{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002901 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002902 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2903 if (NCH(n) > 1) {
2904 com_node(c, CHILD(n, 1));
2905 if (NCH(n) > 3) {
2906 com_node(c, CHILD(n, 3));
2907 if (NCH(n) > 5)
2908 com_node(c, CHILD(n, 5));
2909 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002910 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002911 i = NCH(n)/2;
2912 com_addoparg(c, RAISE_VARARGS, i);
2913 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002914}
2915
2916static void
Thomas Wouters52152252000-08-17 22:55:00 +00002917com_from_import(struct compiling *c, node *n)
2918{
2919 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2920 com_push(c, 1);
2921 if (NCH(n) > 1) {
2922 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2923 com_error(c, PyExc_SyntaxError, "invalid syntax");
2924 return;
2925 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002926 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002927 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002928 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002929 com_pop(c, 1);
2930}
2931
2932static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002933com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002934{
2935 int i;
2936 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002937 /* 'import' dotted_name (',' dotted_name)* |
2938 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002939 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002940 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002941 /* 'from' dotted_name 'import' ... */
2942 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002943
2944 if (TYPE(CHILD(n, 3)) == STAR) {
2945 tup = Py_BuildValue("(s)", "*");
2946 } else {
2947 tup = PyTuple_New((NCH(n) - 2)/2);
2948 for (i = 3; i < NCH(n); i += 2) {
2949 PyTuple_SET_ITEM(tup, (i-3)/2,
2950 PyString_FromString(STR(
Jeremy Hylton4419ac12001-02-28 22:54:51 +00002951 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002952 }
2953 }
2954 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002955 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002956 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002957 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002958 if (TYPE(CHILD(n, 3)) == STAR)
2959 com_addbyte(c, IMPORT_STAR);
2960 else {
2961 for (i = 3; i < NCH(n); i += 2)
2962 com_from_import(c, CHILD(n, i));
2963 com_addbyte(c, POP_TOP);
2964 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002965 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002966 }
2967 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002968 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002969 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002970 node *subn = CHILD(n, i);
2971 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002972 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002973 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002974 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002975 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002976 int j;
2977 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002978 com_error(c, PyExc_SyntaxError,
2979 "invalid syntax");
2980 return;
2981 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002982 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2983 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002984 CHILD(CHILD(subn, 0),
2985 j));
2986 com_addop_varname(c, VAR_STORE,
2987 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002988 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002989 com_addop_varname(c, VAR_STORE,
2990 STR(CHILD(CHILD(subn, 0),
2991 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002992 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002993 }
2994 }
2995}
2996
2997static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002998com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002999{
3000 REQ(n, exec_stmt);
3001 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3002 com_node(c, CHILD(n, 1));
3003 if (NCH(n) >= 4)
3004 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003005 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003006 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003007 com_push(c, 1);
3008 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003009 if (NCH(n) >= 6)
3010 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003011 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003012 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003013 com_push(c, 1);
3014 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003015 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003016 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003017}
3018
Guido van Rossum7c531111997-03-11 18:42:21 +00003019static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003020is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003021{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003022 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003023 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003024 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003025
3026 /* Label to avoid tail recursion */
3027 next:
3028 switch (TYPE(n)) {
3029
3030 case suite:
3031 if (NCH(n) == 1) {
3032 n = CHILD(n, 0);
3033 goto next;
3034 }
3035 /* Fall through */
3036 case file_input:
3037 for (i = 0; i < NCH(n); i++) {
3038 node *ch = CHILD(n, i);
3039 if (TYPE(ch) == stmt) {
3040 n = ch;
3041 goto next;
3042 }
3043 }
3044 break;
3045
3046 case stmt:
3047 case simple_stmt:
3048 case small_stmt:
3049 n = CHILD(n, 0);
3050 goto next;
3051
3052 case expr_stmt:
3053 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003054 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003055 case test:
3056 case and_test:
3057 case not_test:
3058 case comparison:
3059 case expr:
3060 case xor_expr:
3061 case and_expr:
3062 case shift_expr:
3063 case arith_expr:
3064 case term:
3065 case factor:
3066 case power:
3067 case atom:
3068 if (NCH(n) == 1) {
3069 n = CHILD(n, 0);
3070 goto next;
3071 }
3072 break;
3073
3074 case NAME:
3075 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3076 return 1;
3077 break;
3078
3079 case NUMBER:
3080 v = parsenumber(c, STR(n));
3081 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003082 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003083 break;
3084 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003085 i = PyObject_IsTrue(v);
3086 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003087 return i == 0;
3088
3089 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003090 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003091 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003092 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003093 break;
3094 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003095 i = PyObject_IsTrue(v);
3096 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003097 return i == 0;
3098
3099 }
3100 return 0;
3101}
3102
Tim Peters08a898f2001-06-28 01:52:22 +00003103
3104/* Look under n for a return stmt with an expression.
3105 * This hack is used to find illegal returns under "if 0:" blocks in
3106 * functions already known to be generators (as determined by the symtable
3107 * pass).
3108 * Return the offending return node if found, else NULL.
3109 */
3110static node *
3111look_for_offending_return(node *n)
3112{
3113 int i;
3114
3115 for (i = 0; i < NCH(n); ++i) {
3116 node *kid = CHILD(n, i);
3117
3118 switch (TYPE(kid)) {
3119 case classdef:
3120 case funcdef:
3121 case lambdef:
3122 /* Stuff in nested functions & classes doesn't
3123 affect the code block we started in. */
3124 return NULL;
3125
3126 case return_stmt:
3127 if (NCH(kid) > 1)
3128 return kid;
3129 break;
3130
3131 default: {
3132 node *bad = look_for_offending_return(kid);
3133 if (bad != NULL)
3134 return bad;
3135 }
3136 }
3137 }
3138
3139 return NULL;
3140}
3141
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003142static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003143com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003144{
3145 int i;
3146 int anchor = 0;
3147 REQ(n, if_stmt);
3148 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3149 for (i = 0; i+3 < NCH(n); i+=4) {
3150 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003151 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003152 if (is_constant_false(c, ch)) {
3153 /* We're going to skip this block. However, if this
3154 is a generator, we have to check the dead code
3155 anyway to make sure there aren't any return stmts
3156 with expressions, in the same scope. */
3157 if (c->c_flags & CO_GENERATOR) {
3158 node *p = look_for_offending_return(n);
3159 if (p != NULL) {
3160 int savelineno = c->c_lineno;
3161 c->c_lineno = p->n_lineno;
3162 com_error(c, PyExc_SyntaxError,
3163 "'return' with argument "
3164 "inside generator");
3165 c->c_lineno = savelineno;
3166 }
3167 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003168 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003169 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003170 if (i > 0)
3171 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003172 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003173 com_addfwref(c, JUMP_IF_FALSE, &a);
3174 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003175 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003176 com_node(c, CHILD(n, i+3));
3177 com_addfwref(c, JUMP_FORWARD, &anchor);
3178 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003179 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003180 com_addbyte(c, POP_TOP);
3181 }
3182 if (i+2 < NCH(n))
3183 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003184 if (anchor)
3185 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003186}
3187
3188static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003189com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003190{
3191 int break_anchor = 0;
3192 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003193 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003194 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3195 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003196 block_push(c, SETUP_LOOP);
3197 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003198 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003199 com_node(c, CHILD(n, 1));
3200 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3201 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003202 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003203 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003204 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003205 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003206 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3207 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003208 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003209 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003210 com_addbyte(c, POP_TOP);
3211 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003212 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003213 if (NCH(n) > 4)
3214 com_node(c, CHILD(n, 6));
3215 com_backpatch(c, break_anchor);
3216}
3217
3218static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003219com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003220{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003221 int break_anchor = 0;
3222 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003223 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003224 REQ(n, for_stmt);
3225 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3226 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003227 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003228 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003229 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003230 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003231 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003232 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003233 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003234 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003235 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003236 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003237 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003238 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3239 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003240 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003241 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003242 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003243 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003244 if (NCH(n) > 8)
3245 com_node(c, CHILD(n, 8));
3246 com_backpatch(c, break_anchor);
3247}
3248
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003249/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003250
3251 SETUP_FINALLY L
3252 <code for S>
3253 POP_BLOCK
3254 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003255 L: <code for Sf>
3256 END_FINALLY
3257
3258 The special instructions use the block stack. Each block
3259 stack entry contains the instruction that created it (here
3260 SETUP_FINALLY), the level of the value stack at the time the
3261 block stack entry was created, and a label (here L).
3262
3263 SETUP_FINALLY:
3264 Pushes the current value stack level and the label
3265 onto the block stack.
3266 POP_BLOCK:
3267 Pops en entry from the block stack, and pops the value
3268 stack until its level is the same as indicated on the
3269 block stack. (The label is ignored.)
3270 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003271 Pops a variable number of entries from the *value* stack
3272 and re-raises the exception they specify. The number of
3273 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003274
3275 The block stack is unwound when an exception is raised:
3276 when a SETUP_FINALLY entry is found, the exception is pushed
3277 onto the value stack (and the exception condition is cleared),
3278 and the interpreter jumps to the label gotten from the block
3279 stack.
3280
3281 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003282 (The contents of the value stack is shown in [], with the top
3283 at the right; 'tb' is trace-back info, 'val' the exception's
3284 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003285
3286 Value stack Label Instruction Argument
3287 [] SETUP_EXCEPT L1
3288 [] <code for S>
3289 [] POP_BLOCK
3290 [] JUMP_FORWARD L0
3291
Guido van Rossum3f5da241990-12-20 15:06:42 +00003292 [tb, val, exc] L1: DUP )
3293 [tb, val, exc, exc] <evaluate E1> )
3294 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3295 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3296 [tb, val, exc, 1] POP )
3297 [tb, val, exc] POP
3298 [tb, val] <assign to V1> (or POP if no V1)
3299 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003300 [] <code for S1>
3301 JUMP_FORWARD L0
3302
Guido van Rossum3f5da241990-12-20 15:06:42 +00003303 [tb, val, exc, 0] L2: POP
3304 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003305 .............................etc.......................
3306
Guido van Rossum3f5da241990-12-20 15:06:42 +00003307 [tb, val, exc, 0] Ln+1: POP
3308 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003309
3310 [] L0: <next statement>
3311
3312 Of course, parts are not generated if Vi or Ei is not present.
3313*/
3314
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003315static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003316com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003317{
3318 int except_anchor = 0;
3319 int end_anchor = 0;
3320 int else_anchor = 0;
3321 int i;
3322 node *ch;
3323
3324 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3325 block_push(c, SETUP_EXCEPT);
3326 com_node(c, CHILD(n, 2));
3327 com_addbyte(c, POP_BLOCK);
3328 block_pop(c, SETUP_EXCEPT);
3329 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3330 com_backpatch(c, except_anchor);
3331 for (i = 3;
3332 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3333 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003334 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003335 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003336 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003337 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003338 break;
3339 }
3340 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003341 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003342 com_addoparg(c, SET_LINENO, ch->n_lineno);
3343 if (NCH(ch) > 1) {
3344 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003345 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003346 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003347 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003348 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003349 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3350 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003351 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003352 }
3353 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003354 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003355 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003356 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003357 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003358 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003359 com_pop(c, 1);
3360 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003361 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003362 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003363 com_node(c, CHILD(n, i+2));
3364 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3365 if (except_anchor) {
3366 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003367 /* We come in with [tb, val, exc, 0] on the
3368 stack; one pop and it's the same as
3369 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003370 com_addbyte(c, POP_TOP);
3371 }
3372 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003373 /* We actually come in here with [tb, val, exc] but the
3374 END_FINALLY will zap those and jump around.
3375 The c_stacklevel does not reflect them so we need not pop
3376 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003377 com_addbyte(c, END_FINALLY);
3378 com_backpatch(c, else_anchor);
3379 if (i < NCH(n))
3380 com_node(c, CHILD(n, i+2));
3381 com_backpatch(c, end_anchor);
3382}
3383
3384static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003385com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003386{
3387 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003388 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003389
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003390 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3391 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003392 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003393 com_addbyte(c, POP_BLOCK);
3394 block_pop(c, SETUP_FINALLY);
3395 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003396 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003397 /* While the generated code pushes only one item,
3398 the try-finally handling can enter here with
3399 up to three items. OK, here are the details:
3400 3 for an exception, 2 for RETURN, 1 for BREAK. */
3401 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003402 com_backpatch(c, finally_anchor);
3403 ch = CHILD(n, NCH(n)-1);
3404 com_addoparg(c, SET_LINENO, ch->n_lineno);
3405 com_node(c, ch);
3406 com_addbyte(c, END_FINALLY);
3407 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003408 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003409}
3410
3411static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003412com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003413{
3414 REQ(n, try_stmt);
3415 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3416 | 'try' ':' suite 'finally' ':' suite */
3417 if (TYPE(CHILD(n, 3)) != except_clause)
3418 com_try_finally(c, n);
3419 else
3420 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003421}
3422
Guido van Rossum8b993a91997-01-17 21:04:03 +00003423static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003424get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003425{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003426 int i;
3427
Guido van Rossum8b993a91997-01-17 21:04:03 +00003428 /* Label to avoid tail recursion */
3429 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003430 switch (TYPE(n)) {
3431
3432 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003433 if (NCH(n) == 1) {
3434 n = CHILD(n, 0);
3435 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003436 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003437 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003438 case file_input:
3439 for (i = 0; i < NCH(n); i++) {
3440 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003441 if (TYPE(ch) == stmt) {
3442 n = ch;
3443 goto next;
3444 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003445 }
3446 break;
3447
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003448 case stmt:
3449 case simple_stmt:
3450 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003451 n = CHILD(n, 0);
3452 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003453
3454 case expr_stmt:
3455 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003456 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003457 case test:
3458 case and_test:
3459 case not_test:
3460 case comparison:
3461 case expr:
3462 case xor_expr:
3463 case and_expr:
3464 case shift_expr:
3465 case arith_expr:
3466 case term:
3467 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003468 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003469 if (NCH(n) == 1) {
3470 n = CHILD(n, 0);
3471 goto next;
3472 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003473 break;
3474
3475 case atom:
3476 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003477 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003478 break;
3479
3480 }
3481 return NULL;
3482}
3483
Guido van Rossum79f25d91997-04-29 20:08:16 +00003484static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003485get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003486{
Guido van Rossum541563e1999-01-28 15:08:09 +00003487 /* Don't generate doc-strings if run with -OO */
3488 if (Py_OptimizeFlag > 1)
3489 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003490 n = get_rawdocstring(n);
3491 if (n == NULL)
3492 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003493 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003494}
3495
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003496static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003497com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003498{
3499 REQ(n, suite);
3500 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3501 if (NCH(n) == 1) {
3502 com_node(c, CHILD(n, 0));
3503 }
3504 else {
3505 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003506 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003507 node *ch = CHILD(n, i);
3508 if (TYPE(ch) == stmt)
3509 com_node(c, ch);
3510 }
3511 }
3512}
3513
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003514/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003515static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003516com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003517{
3518 int i = c->c_nblocks;
3519 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3520 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3521 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003522 else if (i <= 0) {
3523 /* at the outer level */
3524 com_error(c, PyExc_SyntaxError,
3525 "'continue' not properly in loop");
3526 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003527 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003528 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003529 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003530 if (c->c_block[j] == SETUP_LOOP)
3531 break;
3532 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003533 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003534 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003535 for (; i > j; --i) {
3536 if (c->c_block[i] == SETUP_EXCEPT ||
3537 c->c_block[i] == SETUP_FINALLY) {
3538 com_addoparg(c, CONTINUE_LOOP,
3539 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003540 return;
3541 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003542 if (c->c_block[i] == END_FINALLY) {
3543 com_error(c, PyExc_SyntaxError,
3544 "'continue' not supported inside 'finally' clause");
3545 return;
3546 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003547 }
3548 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003549 com_error(c, PyExc_SyntaxError,
3550 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003551 }
3552 /* XXX Could allow it inside a 'finally' clause
3553 XXX if we could pop the exception still on the stack */
3554}
3555
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003556static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003557com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003558{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003559 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003560 if (TYPE(n) == lambdef) {
3561 /* lambdef: 'lambda' [varargslist] ':' test */
3562 n = CHILD(n, 1);
3563 }
3564 else {
3565 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3566 n = CHILD(n, 2);
3567 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3568 n = CHILD(n, 1);
3569 }
3570 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003571 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003572 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003573 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003574 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3575 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003576 nargs = 0;
3577 ndefs = 0;
3578 for (i = 0; i < nch; i++) {
3579 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003580 if (TYPE(CHILD(n, i)) == STAR ||
3581 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003582 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003583 nargs++;
3584 i++;
3585 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003586 t = RPAR; /* Anything except EQUAL or COMMA */
3587 else
3588 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003589 if (t == EQUAL) {
3590 i++;
3591 ndefs++;
3592 com_node(c, CHILD(n, i));
3593 i++;
3594 if (i >= nch)
3595 break;
3596 t = TYPE(CHILD(n, i));
3597 }
3598 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003599 /* Treat "(a=1, b)" as an error */
3600 if (ndefs)
3601 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003602 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003603 }
3604 if (t != COMMA)
3605 break;
3606 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003607 return ndefs;
3608}
3609
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003610static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003611com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003612{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003613 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003614 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003615 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003616 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003617 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3618 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003619 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003620 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003621 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003622 c->c_errors++;
3623 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003624 int closure = com_make_closure(c, (PyCodeObject *)co);
3625 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003626 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003627 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003628 if (closure)
3629 com_addoparg(c, MAKE_CLOSURE, ndefs);
3630 else
3631 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003632 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003633 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003634 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003635 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003636 }
3637}
3638
3639static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003640com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003641{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003642 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003643 REQ(n, testlist);
3644 /* testlist: test (',' test)* [','] */
3645 for (i = 0; i < NCH(n); i += 2)
3646 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003647 i = (NCH(n)+1) / 2;
3648 com_addoparg(c, BUILD_TUPLE, i);
3649 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003650}
3651
3652static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003653com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003654{
Guido van Rossum25831651993-05-19 14:50:45 +00003655 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003656 PyObject *v;
3657 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003658 char *name;
3659
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003660 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003661 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003662 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003663 c->c_errors++;
3664 return;
3665 }
3666 /* Push the class name on the stack */
3667 i = com_addconst(c, v);
3668 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003669 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003670 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003671 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003672 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003673 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003674 com_push(c, 1);
3675 }
Guido van Rossum25831651993-05-19 14:50:45 +00003676 else
3677 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003678 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003679 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003680 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003681 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003682 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003683 c->c_errors++;
3684 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003685 int closure = com_make_closure(c, co);
3686 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003687 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003688 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003689 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003690 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003691 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003692 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003693 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003694 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003695 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003696 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003697 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003698 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003699 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003700 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003701}
3702
3703static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003704com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003705{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003706 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003707 if (c->c_errors)
3708 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003709 switch (TYPE(n)) {
3710
3711 /* Definition nodes */
3712
3713 case funcdef:
3714 com_funcdef(c, n);
3715 break;
3716 case classdef:
3717 com_classdef(c, n);
3718 break;
3719
3720 /* Trivial parse tree nodes */
3721
3722 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003723 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003724 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003725 n = CHILD(n, 0);
3726 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003727
3728 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003729 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3730 com_addoparg(c, SET_LINENO, n->n_lineno);
3731 {
3732 int i;
3733 for (i = 0; i < NCH(n)-1; i += 2)
3734 com_node(c, CHILD(n, i));
3735 }
3736 break;
3737
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003738 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003739 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003740 n = CHILD(n, 0);
3741 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003742
3743 /* Statement nodes */
3744
3745 case expr_stmt:
3746 com_expr_stmt(c, n);
3747 break;
3748 case print_stmt:
3749 com_print_stmt(c, n);
3750 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003751 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003752 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003753 break;
3754 case pass_stmt:
3755 break;
3756 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003757 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003758 com_error(c, PyExc_SyntaxError,
3759 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003760 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003761 com_addbyte(c, BREAK_LOOP);
3762 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003763 case continue_stmt:
3764 com_continue_stmt(c, n);
3765 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003766 case return_stmt:
3767 com_return_stmt(c, n);
3768 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003769 case yield_stmt:
3770 com_yield_stmt(c, n);
3771 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003772 case raise_stmt:
3773 com_raise_stmt(c, n);
3774 break;
3775 case import_stmt:
3776 com_import_stmt(c, n);
3777 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003778 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003779 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003780 case exec_stmt:
3781 com_exec_stmt(c, n);
3782 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003783 case assert_stmt:
3784 com_assert_stmt(c, n);
3785 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003786 case if_stmt:
3787 com_if_stmt(c, n);
3788 break;
3789 case while_stmt:
3790 com_while_stmt(c, n);
3791 break;
3792 case for_stmt:
3793 com_for_stmt(c, n);
3794 break;
3795 case try_stmt:
3796 com_try_stmt(c, n);
3797 break;
3798 case suite:
3799 com_suite(c, n);
3800 break;
3801
3802 /* Expression nodes */
3803
3804 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003805 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00003806 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003807 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003808 break;
3809 case test:
3810 com_test(c, n);
3811 break;
3812 case and_test:
3813 com_and_test(c, n);
3814 break;
3815 case not_test:
3816 com_not_test(c, n);
3817 break;
3818 case comparison:
3819 com_comparison(c, n);
3820 break;
3821 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003822 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003823 break;
3824 case expr:
3825 com_expr(c, n);
3826 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003827 case xor_expr:
3828 com_xor_expr(c, n);
3829 break;
3830 case and_expr:
3831 com_and_expr(c, n);
3832 break;
3833 case shift_expr:
3834 com_shift_expr(c, n);
3835 break;
3836 case arith_expr:
3837 com_arith_expr(c, n);
3838 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003839 case term:
3840 com_term(c, n);
3841 break;
3842 case factor:
3843 com_factor(c, n);
3844 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003845 case power:
3846 com_power(c, n);
3847 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003848 case atom:
3849 com_atom(c, n);
3850 break;
3851
3852 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003853 com_error(c, PyExc_SystemError,
3854 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003855 }
3856}
3857
Tim Petersdbd9ba62000-07-09 03:09:57 +00003858static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003859
3860static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003861com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003862{
3863 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3864 if (TYPE(CHILD(n, 0)) == LPAR)
3865 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003866 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003867 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003868 com_pop(c, 1);
3869 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003870}
3871
3872static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003873com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003874{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003875 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003876 if (NCH(n) == 1) {
3877 com_fpdef(c, CHILD(n, 0));
3878 }
3879 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003880 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003881 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003882 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003883 for (i = 0; i < NCH(n); i += 2)
3884 com_fpdef(c, CHILD(n, i));
3885 }
3886}
3887
3888static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003889com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003890{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003891 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003892 int complex = 0;
Barry Warsaw8f6d8682001-11-28 21:10:39 +00003893 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003894 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003895 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003896 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003897 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003898 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003899 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003900 node *ch = CHILD(n, i);
3901 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003902 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003903 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003904 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3905 fp = CHILD(ch, 0);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00003906 if (TYPE(fp) != NAME) {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00003907 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003908 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003909 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003910 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003911 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003912 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003913 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003914 ch = CHILD(n, i);
3915 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003916 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003917 else
3918 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003919 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003920 if (complex) {
3921 /* Generate code for complex arguments only after
3922 having counted the simple arguments */
3923 int ilocal = 0;
3924 for (i = 0; i < nch; i++) {
3925 node *ch = CHILD(n, i);
3926 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003927 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003928 break;
3929 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3930 fp = CHILD(ch, 0);
3931 if (TYPE(fp) != NAME) {
3932 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003933 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003934 com_fpdef(c, ch);
3935 }
3936 ilocal++;
3937 if (++i >= nch)
3938 break;
3939 ch = CHILD(n, i);
3940 if (TYPE(ch) == EQUAL)
3941 i += 2;
3942 else
3943 REQ(ch, COMMA);
3944 }
3945 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003946}
3947
3948static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003949com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003950{
3951 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003952 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003953 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003954 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003955 if (doc != NULL) {
3956 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003957 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003958 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003959 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003960 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003961 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003962 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003963 for (i = 0; i < NCH(n); i++) {
3964 node *ch = CHILD(n, i);
3965 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3966 com_node(c, ch);
3967 }
3968}
3969
3970/* Top-level compile-node interface */
3971
3972static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003973compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003974{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003975 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003976 node *ch;
3977 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003978 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003979 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003980 if (doc != NULL) {
3981 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003982 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003983 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003984 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003985 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003986 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3987 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003988 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003989 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003990 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003991 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003992 c->c_infunction = 0;
Tim Petersad1a18b2001-06-23 06:19:16 +00003993 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
3994 com_push(c, 1);
3995 com_addbyte(c, RETURN_VALUE);
3996 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003997}
3998
3999static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004000compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004001{
Guido van Rossum590baa41993-11-30 13:40:46 +00004002 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004003 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004004 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004005
4006 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004007 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004008 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004009 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004010 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004011 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004012 else
4013 ch = CHILD(n, 2);
4014 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004015 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004016 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004017}
4018
4019static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004020compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004021{
4022 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004023 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004024 REQ(n, classdef);
4025 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4026 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004027 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004028 /* Initialize local __module__ from global __name__ */
4029 com_addop_name(c, LOAD_GLOBAL, "__name__");
4030 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004031 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004032 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004033 if (doc != NULL) {
4034 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004035 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004036 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004037 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004038 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004039 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004040 }
4041 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004042 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004043 com_node(c, ch);
4044 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004045 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004046 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004047 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004048}
4049
4050static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004051compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004052{
Guido van Rossum3f5da241990-12-20 15:06:42 +00004053 com_addoparg(c, SET_LINENO, n->n_lineno);
4054
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004055 switch (TYPE(n)) {
4056
Guido van Rossum4c417781991-01-21 16:09:22 +00004057 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004058 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004059 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004060 n = CHILD(n, 0);
4061 if (TYPE(n) != NEWLINE)
4062 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004063 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004064 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004065 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004066 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004067 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004068 break;
4069
Guido van Rossum4c417781991-01-21 16:09:22 +00004070 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004071 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004072 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004073 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004074 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004075 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004076 break;
4077
Guido van Rossum590baa41993-11-30 13:40:46 +00004078 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004079 com_node(c, CHILD(n, 0));
4080 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004081 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004082 break;
4083
Guido van Rossum590baa41993-11-30 13:40:46 +00004084 case lambdef: /* anonymous function definition */
4085 compile_lambdef(c, n);
4086 break;
4087
Guido van Rossum4c417781991-01-21 16:09:22 +00004088 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004089 compile_funcdef(c, n);
4090 break;
4091
Guido van Rossum4c417781991-01-21 16:09:22 +00004092 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004093 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004094 break;
4095
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004096 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004097 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004098 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004099 }
4100}
4101
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004102static PyObject *
4103dict_keys_inorder(PyObject *dict, int offset)
4104{
4105 PyObject *tuple, *k, *v;
4106 int i, pos = 0, size = PyDict_Size(dict);
4107
4108 tuple = PyTuple_New(size);
4109 if (tuple == NULL)
4110 return NULL;
4111 while (PyDict_Next(dict, &pos, &k, &v)) {
4112 i = PyInt_AS_LONG(v);
4113 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004114 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004115 PyTuple_SET_ITEM(tuple, i - offset, k);
4116 }
4117 return tuple;
4118}
4119
Guido van Rossum79f25d91997-04-29 20:08:16 +00004120PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004121PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004122{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004123 return PyNode_CompileFlags(n, filename, NULL);
4124}
4125
4126PyCodeObject *
4127PyNode_CompileFlags(node *n, char *filename, PyCompilerFlags *flags)
4128{
4129 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004130}
4131
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004132struct symtable *
4133PyNode_CompileSymtable(node *n, char *filename)
4134{
4135 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004136 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004137
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004138 ff = PyNode_Future(n, filename);
4139 if (ff == NULL)
4140 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004141
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004142 st = symtable_init();
Tim Peters8c5e4152001-11-04 19:26:58 +00004143 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004144 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004145 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004146 }
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004147 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004148 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004149 if (st->st_errors > 0)
4150 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004151 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004152 if (st->st_errors > 0)
4153 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004154
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004155 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004156 fail:
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004157 PyObject_FREE((void *)ff);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004158 st->st_future = NULL;
4159 PySymtable_Free(st);
4160 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004161}
4162
Guido van Rossum79f25d91997-04-29 20:08:16 +00004163static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004164icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004165{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004166 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004167}
4168
Guido van Rossum79f25d91997-04-29 20:08:16 +00004169static PyCodeObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004170jcompile(node *n, char *filename, struct compiling *base,
4171 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004172{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004173 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004174 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004175 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004176 return NULL;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004177 if (TYPE(n) == encoding_decl) {
4178 sc.c_encoding = STR(n);
4179 n = CHILD(n, 0);
4180 } else {
4181 sc.c_encoding = NULL;
4182 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004183 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004184 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004185 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004186 /* c_symtable still points to parent's symbols */
4187 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004188 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004189 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004190 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004191 if (base->c_encoding != NULL) {
4192 assert(sc.c_encoding == NULL);
4193 sc.c_encoding = base->c_encoding;
4194 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004195 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004196 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004197 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004198 if (sc.c_future == NULL) {
4199 com_free(&sc);
4200 return NULL;
4201 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004202 if (flags) {
4203 int merged = sc.c_future->ff_features |
4204 flags->cf_flags;
4205 sc.c_future->ff_features = merged;
4206 flags->cf_flags = merged;
4207 }
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004208 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004209 com_free(&sc);
4210 return NULL;
4211 }
4212 }
4213 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004214 if (symtable_load_symbols(&sc) < 0) {
4215 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004216 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004217 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004218 compile_node(&sc, n);
4219 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004220 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004221 PyObject *consts, *names, *varnames, *filename, *name,
4222 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004223 consts = PyList_AsTuple(sc.c_consts);
4224 names = PyList_AsTuple(sc.c_names);
4225 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004226 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4227 freevars = dict_keys_inorder(sc.c_freevars,
4228 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004229 filename = PyString_InternFromString(sc.c_filename);
4230 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004231 if (!PyErr_Occurred())
4232 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004233 sc.c_nlocals,
4234 sc.c_maxstacklevel,
4235 sc.c_flags,
4236 sc.c_code,
4237 consts,
4238 names,
4239 varnames,
4240 freevars,
4241 cellvars,
4242 filename,
4243 name,
4244 sc.c_firstlineno,
4245 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004246 Py_XDECREF(consts);
4247 Py_XDECREF(names);
4248 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004249 Py_XDECREF(freevars);
4250 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004251 Py_XDECREF(filename);
4252 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004253 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004254 else if (!PyErr_Occurred()) {
4255 /* This could happen if someone called PyErr_Clear() after an
4256 error was reported above. That's not supposed to happen,
4257 but I just plugged one case and I'm not sure there can't be
4258 others. In that case, raise SystemError so that at least
4259 it gets reported instead dumping core. */
4260 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4261 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004262 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004263 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004264 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004265 sc.c_symtable = NULL;
4266 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004267 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004268 return co;
4269}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004270
4271int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004272PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004273{
4274 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004275 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004276 int line = co->co_firstlineno;
4277 int addr = 0;
4278 while (--size >= 0) {
4279 addr += *p++;
4280 if (addr > addrq)
4281 break;
4282 line += *p++;
4283 }
4284 return line;
4285}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004286
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004287/* The test for LOCAL must come before the test for FREE in order to
4288 handle classes where name is both local and free. The local var is
4289 a method and the free var is a free var referenced within a method.
4290*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004291
4292static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004293get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004294{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004295 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004296 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004297
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004298 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4299 return CELL;
4300 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4301 return LOCAL;
4302 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4303 return FREE;
4304 v = PyDict_GetItemString(c->c_globals, name);
4305 if (v) {
4306 if (v == Py_None)
4307 return GLOBAL_EXPLICIT;
4308 else {
4309 return GLOBAL_IMPLICIT;
4310 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004311 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004312 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004313 "unknown scope for %.100s in %.100s(%s) "
4314 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4315 name, c->c_name,
4316 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4317 c->c_filename,
4318 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4319 PyObject_REPR(c->c_locals),
4320 PyObject_REPR(c->c_globals)
4321 );
4322
4323 Py_FatalError(buf);
4324 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004325}
4326
Guido van Rossum207fda62001-03-02 03:30:41 +00004327/* Helper functions to issue warnings */
4328
4329static int
4330issue_warning(char *msg, char *filename, int lineno)
4331{
4332 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4333 lineno, NULL, NULL) < 0) {
4334 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4335 PyErr_SetString(PyExc_SyntaxError, msg);
4336 PyErr_SyntaxLocation(filename, lineno);
4337 }
4338 return -1;
4339 }
4340 return 0;
4341}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004342
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004343static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004344symtable_warn(struct symtable *st, char *msg)
4345{
Guido van Rossum207fda62001-03-02 03:30:41 +00004346 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004347 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004348 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004349 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004350 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004351}
4352
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004353/* Helper function for setting lineno and filename */
4354
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004355static int
4356symtable_build(struct compiling *c, node *n)
4357{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004358 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004359 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004360 c->c_symtable->st_future = c->c_future;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004361 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004362 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4363 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004364 return -1;
4365 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004366 if (c->c_symtable->st_errors > 0)
4367 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004368 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004369 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004370 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004371 return 0;
4372}
4373
4374static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004375symtable_init_compiling_symbols(struct compiling *c)
4376{
4377 PyObject *varnames;
4378
4379 varnames = c->c_symtable->st_cur->ste_varnames;
4380 if (varnames == NULL) {
4381 varnames = PyList_New(0);
4382 if (varnames == NULL)
4383 return -1;
4384 c->c_symtable->st_cur->ste_varnames = varnames;
4385 Py_INCREF(varnames);
4386 } else
4387 Py_INCREF(varnames);
4388 c->c_varnames = varnames;
4389
4390 c->c_globals = PyDict_New();
4391 if (c->c_globals == NULL)
4392 return -1;
4393 c->c_freevars = PyDict_New();
4394 if (c->c_freevars == NULL)
4395 return -1;
4396 c->c_cellvars = PyDict_New();
4397 if (c->c_cellvars == NULL)
4398 return -1;
4399 return 0;
4400}
4401
4402struct symbol_info {
4403 int si_nlocals;
4404 int si_ncells;
4405 int si_nfrees;
4406 int si_nimplicit;
4407};
4408
4409static void
4410symtable_init_info(struct symbol_info *si)
4411{
4412 si->si_nlocals = 0;
4413 si->si_ncells = 0;
4414 si->si_nfrees = 0;
4415 si->si_nimplicit = 0;
4416}
4417
4418static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004419symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004420 struct symbol_info *si)
4421{
4422 PyObject *dict, *v;
4423
4424 /* Seperate logic for DEF_FREE. If it occurs in a function,
4425 it indicates a local that we must allocate storage for (a
4426 cell var). If it occurs in a class, then the class has a
4427 method and a free variable with the same name.
4428 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004429 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004430 /* If it isn't declared locally, it can't be a cell. */
4431 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4432 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004433 v = PyInt_FromLong(si->si_ncells++);
4434 dict = c->c_cellvars;
4435 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004436 /* If it is free anyway, then there is no need to do
4437 anything here.
4438 */
4439 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004440 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004441 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004442 v = PyInt_FromLong(si->si_nfrees++);
4443 dict = c->c_freevars;
4444 }
4445 if (v == NULL)
4446 return -1;
4447 if (PyDict_SetItem(dict, name, v) < 0) {
4448 Py_DECREF(v);
4449 return -1;
4450 }
4451 Py_DECREF(v);
4452 return 0;
4453}
4454
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004455/* If a variable is a cell and an argument, make sure that appears in
4456 co_cellvars before any variable to its right in varnames.
4457*/
4458
4459
4460static int
4461symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4462 PyObject *varnames, int flags)
4463{
4464 PyObject *v, *w, *d, *list = NULL;
4465 int i, pos;
4466
4467 if (flags & CO_VARARGS)
4468 argcount++;
4469 if (flags & CO_VARKEYWORDS)
4470 argcount++;
4471 for (i = argcount; --i >= 0; ) {
4472 v = PyList_GET_ITEM(varnames, i);
4473 if (PyDict_GetItem(*cellvars, v)) {
4474 if (list == NULL) {
4475 list = PyList_New(1);
4476 if (list == NULL)
4477 return -1;
4478 PyList_SET_ITEM(list, 0, v);
4479 Py_INCREF(v);
4480 } else
4481 PyList_Insert(list, 0, v);
4482 }
4483 }
4484 if (list == NULL || PyList_GET_SIZE(list) == 0)
4485 return 0;
4486 /* There are cellvars that are also arguments. Create a dict
4487 to replace cellvars and put the args at the front.
4488 */
4489 d = PyDict_New();
4490 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4491 v = PyInt_FromLong(i);
4492 if (v == NULL)
4493 goto fail;
4494 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4495 goto fail;
4496 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4497 goto fail;
4498 }
4499 pos = 0;
4500 i = PyList_GET_SIZE(list);
4501 Py_DECREF(list);
4502 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4503 w = PyInt_FromLong(i++); /* don't care about the old key */
4504 if (PyDict_SetItem(d, v, w) < 0) {
4505 Py_DECREF(w);
4506 goto fail;
4507 }
4508 Py_DECREF(w);
4509 }
4510 Py_DECREF(*cellvars);
4511 *cellvars = d;
4512 return 1;
4513 fail:
4514 Py_DECREF(d);
4515 return -1;
4516}
4517
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004518static int
4519symtable_freevar_offsets(PyObject *freevars, int offset)
4520{
4521 PyObject *name, *v;
4522 int pos;
4523
4524 /* The cell vars are the first elements of the closure,
4525 followed by the free vars. Update the offsets in
4526 c_freevars to account for number of cellvars. */
4527 pos = 0;
4528 while (PyDict_Next(freevars, &pos, &name, &v)) {
4529 int i = PyInt_AS_LONG(v) + offset;
4530 PyObject *o = PyInt_FromLong(i);
4531 if (o == NULL)
4532 return -1;
4533 if (PyDict_SetItem(freevars, name, o) < 0) {
4534 Py_DECREF(o);
4535 return -1;
4536 }
4537 Py_DECREF(o);
4538 }
4539 return 0;
4540}
4541
4542static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004543symtable_check_unoptimized(struct compiling *c,
4544 PySymtableEntryObject *ste,
4545 struct symbol_info *si)
4546{
4547 char buf[300];
4548
4549 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4550 || (ste->ste_nested && si->si_nimplicit)))
4551 return 0;
4552
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004553#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4554
4555#define ILLEGAL_IS "is a nested function"
4556
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004557#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004558"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004559
4560#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004561"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004562
4563#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00004564"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004565"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004566
4567 /* XXX perhaps the linenos for these opt-breaking statements
4568 should be stored so the exception can point to them. */
4569
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004570 if (ste->ste_child_free) {
4571 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004572 PyOS_snprintf(buf, sizeof(buf),
4573 ILLEGAL_IMPORT_STAR,
4574 PyString_AS_STRING(ste->ste_name),
4575 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004576 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004577 PyOS_snprintf(buf, sizeof(buf),
4578 ILLEGAL_BARE_EXEC,
4579 PyString_AS_STRING(ste->ste_name),
4580 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004581 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004582 PyOS_snprintf(buf, sizeof(buf),
4583 ILLEGAL_EXEC_AND_IMPORT_STAR,
4584 PyString_AS_STRING(ste->ste_name),
4585 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004586 }
4587 } else {
4588 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004589 PyOS_snprintf(buf, sizeof(buf),
4590 ILLEGAL_IMPORT_STAR,
4591 PyString_AS_STRING(ste->ste_name),
4592 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004593 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004594 PyOS_snprintf(buf, sizeof(buf),
4595 ILLEGAL_BARE_EXEC,
4596 PyString_AS_STRING(ste->ste_name),
4597 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004598 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004599 PyOS_snprintf(buf, sizeof(buf),
4600 ILLEGAL_EXEC_AND_IMPORT_STAR,
4601 PyString_AS_STRING(ste->ste_name),
4602 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004603 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004604 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004605
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004606 PyErr_SetString(PyExc_SyntaxError, buf);
4607 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4608 ste->ste_opt_lineno);
4609 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004610}
4611
4612static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004613symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4614 struct symbol_info *si)
4615{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004616 if (c->c_future)
4617 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004618 if (ste->ste_generator)
4619 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004620 if (ste->ste_type != TYPE_MODULE)
4621 c->c_flags |= CO_NEWLOCALS;
4622 if (ste->ste_type == TYPE_FUNCTION) {
4623 c->c_nlocals = si->si_nlocals;
4624 if (ste->ste_optimized == 0)
4625 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004626 else if (ste->ste_optimized != OPT_EXEC)
4627 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004628 }
4629 return 0;
4630}
4631
4632static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004633symtable_load_symbols(struct compiling *c)
4634{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004635 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004636 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004637 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004638 PyObject *name, *varnames, *v;
4639 int i, flags, pos;
4640 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004641
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004642 if (implicit == NULL) {
4643 implicit = PyInt_FromLong(1);
4644 if (implicit == NULL)
4645 return -1;
4646 }
4647 v = NULL;
4648
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004649 if (symtable_init_compiling_symbols(c) < 0)
4650 goto fail;
4651 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004652 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004653 si.si_nlocals = PyList_GET_SIZE(varnames);
4654 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004655
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004656 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004657 v = PyInt_FromLong(i);
4658 if (PyDict_SetItem(c->c_locals,
4659 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004660 goto fail;
4661 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004662 }
4663
4664 /* XXX The cases below define the rules for whether a name is
4665 local or global. The logic could probably be clearer. */
4666 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004667 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4668 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004669
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004670 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004671 /* undo the original DEF_FREE */
4672 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004673
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004674 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004675 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004676 2. Free variables in methods that are also class
4677 variables or declared global.
4678 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004679 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004680 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004681
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004682 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004683 c->c_argcount--;
4684 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004685 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004686 c->c_argcount--;
4687 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004688 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004689 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004690 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004691 if (flags & DEF_PARAM) {
4692 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004693 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004694 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004695 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004696 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004697 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004698 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004699 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4700 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004701 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004702 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004703 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4704 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004705 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004706 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004707 if (v == NULL)
4708 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004709 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004710 goto fail;
4711 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004712 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004713 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004714 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004715 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004716 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004717 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004718 if (v == NULL)
4719 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004720 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004721 goto fail;
4722 Py_DECREF(v);
4723 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004724 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004725 if (PyDict_SetItem(c->c_globals, name,
4726 implicit) < 0)
4727 goto fail;
4728 if (st->st_nscopes != 1) {
4729 v = PyInt_FromLong(flags);
4730 if (PyDict_SetItem(st->st_global,
4731 name, v))
4732 goto fail;
4733 Py_DECREF(v);
4734 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004735 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004736 }
4737 }
4738
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004739 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4740
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004741 if (si.si_ncells > 1) { /* one cell is always in order */
4742 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4743 c->c_varnames, c->c_flags) < 0)
4744 return -1;
4745 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004746 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4747 return -1;
4748 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004749 fail:
4750 /* is this always the right thing to do? */
4751 Py_XDECREF(v);
4752 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004753}
4754
4755static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004756symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004757{
4758 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004759
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004760 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004761 if (st == NULL)
4762 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004763 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00004764
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004765 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004766 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004767 goto fail;
4768 if ((st->st_symbols = PyDict_New()) == NULL)
4769 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004770 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004771 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004772 st->st_errors = 0;
4773 st->st_tmpname = 0;
4774 st->st_private = NULL;
4775 return st;
4776 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004777 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004778 return NULL;
4779}
4780
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004781void
4782PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004783{
4784 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004785 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004786 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004787 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004788}
4789
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004790/* When the compiler exits a scope, it must should update the scope's
4791 free variable information with the list of free variables in its
4792 children.
4793
4794 Variables that are free in children and defined in the current
4795 scope are cellvars.
4796
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004797 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004798 false), free variables in children that are not defined here are
4799 implicit globals.
4800
4801*/
4802
4803static int
4804symtable_update_free_vars(struct symtable *st)
4805{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004806 int i, j, def;
4807 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004808 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004809
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004810 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004811 def = DEF_FREE_CLASS;
4812 else
4813 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004814 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004815 int pos = 0;
4816
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004817 if (list)
4818 PyList_SetSlice(list, 0,
4819 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004820 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004821 PyList_GET_ITEM(ste->ste_children, i);
4822 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004823 int flags = PyInt_AS_LONG(o);
4824 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004825 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004826 if (list == NULL) {
4827 list = PyList_New(0);
4828 if (list == NULL)
4829 return -1;
4830 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004831 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004832 if (PyList_Append(list, name) < 0) {
4833 Py_DECREF(list);
4834 return -1;
4835 }
4836 }
4837 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004838 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004839 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004840 v = PyDict_GetItem(ste->ste_symbols, name);
4841 /* If a name N is declared global in scope A and
4842 referenced in scope B contained (perhaps
4843 indirectly) in A and there are no scopes
4844 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004845 is global in B. Unless A is a class scope,
4846 because class scopes are not considered for
4847 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004848 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004849 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004850 int flags = PyInt_AS_LONG(v);
4851 if (flags & DEF_GLOBAL) {
4852 symtable_undo_free(st, child->ste_id,
4853 name);
4854 continue;
4855 }
4856 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004857 if (ste->ste_nested) {
4858 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004859 name, def) < 0) {
4860 Py_DECREF(list);
4861 return -1;
4862 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004863 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004864 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004865 name) < 0) {
4866 Py_DECREF(list);
4867 return -1;
4868 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004869 }
4870 }
4871 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004872
4873 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004874 return 0;
4875}
4876
4877/* If the current scope is a non-nested class or if name is not
4878 defined in the current, non-nested scope, then it is an implicit
4879 global in all nested scopes.
4880*/
4881
4882static int
4883symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4884{
4885 PyObject *o;
4886 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004887 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004888
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004889 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004890 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004891 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004892 if (o == NULL)
4893 return symtable_undo_free(st, child, name);
4894 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004895
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004896 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004897 return symtable_undo_free(st, child, name);
4898 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004899 return symtable_add_def_o(st, ste->ste_symbols,
4900 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004901}
4902
4903static int
4904symtable_undo_free(struct symtable *st, PyObject *id,
4905 PyObject *name)
4906{
4907 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004908 PyObject *info;
4909 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004910
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004911 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4912 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004913 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00004914
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004915 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004916 if (info == NULL)
4917 return 0;
4918 v = PyInt_AS_LONG(info);
4919 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004920 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004921 DEF_FREE_GLOBAL) < 0)
4922 return -1;
4923 } else
4924 /* If the name is defined here or declared global,
4925 then the recursion stops. */
4926 return 0;
4927
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004928 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4929 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004930 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004931 PyList_GET_ITEM(ste->ste_children, i);
4932 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004933 if (x < 0)
4934 return x;
4935 }
4936 return 0;
4937}
4938
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004939/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4940 This reference is released when the scope is exited, via the DECREF
4941 in symtable_exit_scope().
4942*/
4943
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004944static int
4945symtable_exit_scope(struct symtable *st)
4946{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004947 int end;
4948
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004949 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004950 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004951 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004952 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004953 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4954 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004955 if (PySequence_DelItem(st->st_stack, end) < 0)
4956 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004957 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004958}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004959
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004960static void
4961symtable_enter_scope(struct symtable *st, char *name, int type,
4962 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004963{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004964 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004965
4966 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004967 prev = st->st_cur;
4968 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4969 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004970 st->st_errors++;
4971 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004972 }
4973 }
Barry Warsaw0372af72001-02-23 18:22:59 +00004974 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004975 PySymtableEntry_New(st, name, type, lineno);
4976 if (strcmp(name, TOP) == 0)
4977 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004978 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004979 if (PyList_Append(prev->ste_children,
4980 (PyObject *)st->st_cur) < 0)
4981 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004982 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004983}
4984
4985static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004986symtable_lookup(struct symtable *st, char *name)
4987{
4988 char buffer[MANGLE_LEN];
4989 PyObject *v;
4990 int flags;
4991
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00004992 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004993 name = buffer;
4994 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
4995 if (v == NULL) {
4996 if (PyErr_Occurred())
4997 return -1;
4998 else
4999 return 0;
5000 }
5001
5002 flags = PyInt_AS_LONG(v);
5003 return flags;
5004}
5005
5006static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005007symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005008{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005009 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005010 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005011 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005012
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005013 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005014 name = buffer;
5015 if ((s = PyString_InternFromString(name)) == NULL)
5016 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005017 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5018 Py_DECREF(s);
5019 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005020}
5021
5022/* Must only be called with mangled names */
5023
5024static int
5025symtable_add_def_o(struct symtable *st, PyObject *dict,
5026 PyObject *name, int flag)
5027{
5028 PyObject *o;
5029 int val;
5030
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005031 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005032 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005033 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005034 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005035 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005036 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005037 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005038 return -1;
5039 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005040 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005041 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005042 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005043 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005044 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005045 Py_DECREF(o);
5046 return -1;
5047 }
5048 Py_DECREF(o);
5049
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005050 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005051 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005052 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005053 } else if (flag & DEF_GLOBAL) {
5054 /* XXX need to update DEF_GLOBAL for other flags too;
5055 perhaps only DEF_FREE_GLOBAL */
5056 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005057 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005058 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005059 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005060 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005061 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005062 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005063 Py_DECREF(o);
5064 return -1;
5065 }
5066 Py_DECREF(o);
5067 }
5068 return 0;
5069}
5070
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005071#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005072
Tim Peters08a898f2001-06-28 01:52:22 +00005073/* Look for a yield stmt under n. Return 1 if found, else 0.
5074 This hack is used to look inside "if 0:" blocks (which are normally
5075 ignored) in case those are the only places a yield occurs (so that this
5076 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005077static int
5078look_for_yield(node *n)
5079{
5080 int i;
5081
5082 for (i = 0; i < NCH(n); ++i) {
5083 node *kid = CHILD(n, i);
5084
5085 switch (TYPE(kid)) {
5086
5087 case classdef:
5088 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005089 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005090 /* Stuff in nested functions and classes can't make
5091 the parent a generator. */
5092 return 0;
5093
5094 case yield_stmt:
5095 return 1;
5096
5097 default:
5098 if (look_for_yield(kid))
5099 return 1;
5100 }
5101 }
5102 return 0;
5103}
5104
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005105static void
5106symtable_node(struct symtable *st, node *n)
5107{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005108 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005109
5110 loop:
5111 switch (TYPE(n)) {
5112 case funcdef: {
5113 char *func_name = STR(CHILD(n, 1));
5114 symtable_add_def(st, func_name, DEF_LOCAL);
5115 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005116 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005117 symtable_funcdef(st, n);
5118 symtable_exit_scope(st);
5119 break;
5120 }
5121 case lambdef:
5122 if (NCH(n) == 4)
5123 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005124 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005125 symtable_funcdef(st, n);
5126 symtable_exit_scope(st);
5127 break;
5128 case classdef: {
5129 char *tmp, *class_name = STR(CHILD(n, 1));
5130 symtable_add_def(st, class_name, DEF_LOCAL);
5131 if (TYPE(CHILD(n, 2)) == LPAR) {
5132 node *bases = CHILD(n, 3);
5133 int i;
5134 for (i = 0; i < NCH(bases); i += 2) {
5135 symtable_node(st, CHILD(bases, i));
5136 }
5137 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005138 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005139 tmp = st->st_private;
5140 st->st_private = class_name;
5141 symtable_node(st, CHILD(n, NCH(n) - 1));
5142 st->st_private = tmp;
5143 symtable_exit_scope(st);
5144 break;
5145 }
5146 case if_stmt:
5147 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005148 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5149 if (st->st_cur->ste_generator == 0)
5150 st->st_cur->ste_generator =
5151 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005152 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005153 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005154 symtable_node(st, CHILD(n, i + 1));
5155 symtable_node(st, CHILD(n, i + 3));
5156 }
5157 if (i + 2 < NCH(n))
5158 symtable_node(st, CHILD(n, i + 2));
5159 break;
5160 case global_stmt:
5161 symtable_global(st, n);
5162 break;
5163 case import_stmt:
5164 symtable_import(st, n);
5165 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005166 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005167 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005168 symtable_node(st, CHILD(n, 1));
5169 if (NCH(n) > 2)
5170 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005171 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005172 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005173 st->st_cur->ste_opt_lineno = n->n_lineno;
5174 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005175 if (NCH(n) > 4)
5176 symtable_node(st, CHILD(n, 5));
5177 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005178
5179 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005180 case assert_stmt:
5181 if (Py_OptimizeFlag)
5182 return;
5183 if (NCH(n) == 2) {
5184 n = CHILD(n, 1);
5185 goto loop;
5186 } else {
5187 symtable_node(st, CHILD(n, 1));
5188 n = CHILD(n, 3);
5189 goto loop;
5190 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005191 case except_clause:
5192 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005193 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005194 if (NCH(n) > 1) {
5195 n = CHILD(n, 1);
5196 goto loop;
5197 }
5198 break;
5199 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005200 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005201 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005202 case yield_stmt:
5203 st->st_cur->ste_generator = 1;
5204 n = CHILD(n, 1);
5205 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005206 case expr_stmt:
5207 if (NCH(n) == 1)
5208 n = CHILD(n, 0);
5209 else {
5210 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005211 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005212 symtable_node(st, CHILD(n, 2));
5213 break;
5214 } else {
5215 int i;
5216 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005217 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005218 n = CHILD(n, NCH(n) - 1);
5219 }
5220 }
5221 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005222 case list_iter:
5223 n = CHILD(n, 0);
5224 if (TYPE(n) == list_for) {
5225 st->st_tmpname++;
5226 symtable_list_comprehension(st, n);
5227 st->st_tmpname--;
5228 } else {
5229 REQ(n, list_if);
5230 symtable_node(st, CHILD(n, 1));
5231 if (NCH(n) == 3) {
5232 n = CHILD(n, 2);
5233 goto loop;
5234 }
5235 }
5236 break;
5237 case for_stmt:
5238 symtable_assign(st, CHILD(n, 1), 0);
5239 for (i = 3; i < NCH(n); ++i)
5240 if (TYPE(CHILD(n, i)) >= single_input)
5241 symtable_node(st, CHILD(n, i));
5242 break;
5243 /* The remaining cases fall through to default except in
5244 special circumstances. This requires the individual cases
5245 to be coded with great care, even though they look like
5246 rather innocuous. Each case must double-check TYPE(n).
5247 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005248 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005249 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005250 n = CHILD(n, 2);
5251 goto loop;
5252 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005253 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005254 case listmaker:
5255 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00005256 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005257 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00005258 symtable_node(st, CHILD(n, 0));
5259 st->st_tmpname--;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005260 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005261 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005262 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005263 case atom:
5264 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5265 symtable_add_use(st, STR(CHILD(n, 0)));
5266 break;
5267 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005268 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005269 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005270 /* Walk over every non-token child with a special case
5271 for one child.
5272 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005273 if (NCH(n) == 1) {
5274 n = CHILD(n, 0);
5275 goto loop;
5276 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005277 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005278 if (TYPE(CHILD(n, i)) >= single_input)
5279 symtable_node(st, CHILD(n, i));
5280 }
5281}
5282
5283static void
5284symtable_funcdef(struct symtable *st, node *n)
5285{
5286 node *body;
5287
5288 if (TYPE(n) == lambdef) {
5289 if (NCH(n) == 4)
5290 symtable_params(st, CHILD(n, 1));
5291 } else
5292 symtable_params(st, CHILD(n, 2));
5293 body = CHILD(n, NCH(n) - 1);
5294 symtable_node(st, body);
5295}
5296
5297/* The next two functions parse the argument tuple.
5298 symtable_default_arg() checks for names in the default arguments,
5299 which are references in the defining scope. symtable_params()
5300 parses the parameter names, which are defined in the function's
5301 body.
5302
5303 varargslist:
5304 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5305 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5306*/
5307
5308static void
5309symtable_default_args(struct symtable *st, node *n)
5310{
5311 node *c;
5312 int i;
5313
5314 if (TYPE(n) == parameters) {
5315 n = CHILD(n, 1);
5316 if (TYPE(n) == RPAR)
5317 return;
5318 }
5319 REQ(n, varargslist);
5320 for (i = 0; i < NCH(n); i += 2) {
5321 c = CHILD(n, i);
5322 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5323 break;
5324 }
5325 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5326 symtable_node(st, CHILD(n, i));
5327 }
5328}
5329
5330static void
5331symtable_params(struct symtable *st, node *n)
5332{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005333 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005334 node *c = NULL;
5335
5336 if (TYPE(n) == parameters) {
5337 n = CHILD(n, 1);
5338 if (TYPE(n) == RPAR)
5339 return;
5340 }
5341 REQ(n, varargslist);
5342 for (i = 0; i < NCH(n); i += 2) {
5343 c = CHILD(n, i);
5344 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5345 ext = 1;
5346 break;
5347 }
5348 if (TYPE(c) == test) {
5349 continue;
5350 }
5351 if (TYPE(CHILD(c, 0)) == NAME)
5352 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
5353 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005354 char nbuf[30];
5355 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005356 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005357 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005358 }
5359 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005360 if (ext) {
5361 c = CHILD(n, i);
5362 if (TYPE(c) == STAR) {
5363 i++;
5364 symtable_add_def(st, STR(CHILD(n, i)),
5365 DEF_PARAM | DEF_STAR);
5366 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005367 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005368 c = NULL;
5369 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005370 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005371 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005372 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005373 i++;
5374 symtable_add_def(st, STR(CHILD(n, i)),
5375 DEF_PARAM | DEF_DOUBLESTAR);
5376 }
5377 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005378 if (complex >= 0) {
5379 int j;
5380 for (j = 0; j <= complex; j++) {
5381 c = CHILD(n, j);
5382 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005383 c = CHILD(n, ++j);
5384 else if (TYPE(c) == EQUAL)
5385 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005386 if (TYPE(CHILD(c, 0)) == LPAR)
5387 symtable_params_fplist(st, CHILD(c, 1));
5388 }
5389 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005390}
5391
5392static void
5393symtable_params_fplist(struct symtable *st, node *n)
5394{
5395 int i;
5396 node *c;
5397
5398 REQ(n, fplist);
5399 for (i = 0; i < NCH(n); i += 2) {
5400 c = CHILD(n, i);
5401 REQ(c, fpdef);
5402 if (NCH(c) == 1)
5403 symtable_add_def(st, STR(CHILD(c, 0)),
5404 DEF_PARAM | DEF_INTUPLE);
5405 else
5406 symtable_params_fplist(st, CHILD(c, 1));
5407 }
5408
5409}
5410
5411static void
5412symtable_global(struct symtable *st, node *n)
5413{
5414 int i;
5415
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005416 /* XXX It might be helpful to warn about module-level global
5417 statements, but it's hard to tell the difference between
5418 module-level and a string passed to exec.
5419 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005420
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005421 for (i = 1; i < NCH(n); i += 2) {
5422 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005423 int flags;
5424
5425 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005426 if (flags < 0)
5427 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005428 if (flags && flags != DEF_GLOBAL) {
5429 char buf[500];
5430 if (flags & DEF_PARAM) {
5431 PyErr_Format(PyExc_SyntaxError,
5432 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005433 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005434 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005435 st->st_cur->ste_lineno);
5436 st->st_errors++;
5437 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005438 }
5439 else {
5440 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005441 PyOS_snprintf(buf, sizeof(buf),
5442 GLOBAL_AFTER_ASSIGN,
5443 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005444 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005445 PyOS_snprintf(buf, sizeof(buf),
5446 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005447 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005448 }
5449 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005450 symtable_add_def(st, name, DEF_GLOBAL);
5451 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005452}
5453
5454static void
5455symtable_list_comprehension(struct symtable *st, node *n)
5456{
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005457 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005458
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005459 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005460 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005461 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005462 symtable_node(st, CHILD(n, 3));
5463 if (NCH(n) == 5)
5464 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005465}
5466
5467static void
5468symtable_import(struct symtable *st, node *n)
5469{
5470 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005471 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005472 | 'from' dotted_name 'import'
5473 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005474 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005475 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005476 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005477 node *dotname = CHILD(n, 1);
5478 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5479 /* check for bogus imports */
5480 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5481 PyErr_SetString(PyExc_SyntaxError,
5482 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005483 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005484 n->n_lineno);
5485 st->st_errors++;
5486 return;
5487 }
5488 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005489 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005490 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005491 if (symtable_warn(st,
5492 "import * only allowed at module level") < 0)
5493 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005494 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005495 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005496 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005497 } else {
5498 for (i = 3; i < NCH(n); i += 2) {
5499 node *c = CHILD(n, i);
5500 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005501 symtable_assign(st, CHILD(c, 2),
5502 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005503 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005504 symtable_assign(st, CHILD(c, 0),
5505 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005506 }
5507 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005508 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005509 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005510 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005511 }
5512 }
5513}
5514
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005515/* The third argument to symatble_assign() is a flag to be passed to
5516 symtable_add_def() if it is eventually called. The flag is useful
5517 to specify the particular type of assignment that should be
5518 recorded, e.g. an assignment caused by import.
5519 */
5520
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005521static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005522symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005523{
5524 node *tmp;
5525 int i;
5526
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005527 loop:
5528 switch (TYPE(n)) {
5529 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005530 /* invalid assignment, e.g. lambda x:x=2. The next
5531 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005532 return;
5533 case power:
5534 if (NCH(n) > 2) {
5535 for (i = 2; i < NCH(n); ++i)
5536 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5537 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005538 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005539 if (NCH(n) > 1) {
5540 symtable_node(st, CHILD(n, 0));
5541 symtable_node(st, CHILD(n, 1));
5542 } else {
5543 n = CHILD(n, 0);
5544 goto loop;
5545 }
5546 return;
5547 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005548 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5549 /* XXX This is an error, but the next pass
5550 will catch it. */
5551 return;
5552 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005553 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005554 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005555 }
5556 return;
5557 case exprlist:
5558 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00005559 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005560 if (NCH(n) == 1) {
5561 n = CHILD(n, 0);
5562 goto loop;
5563 }
5564 else {
5565 int i;
5566 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005567 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005568 return;
5569 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005570 case atom:
5571 tmp = CHILD(n, 0);
5572 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5573 n = CHILD(n, 1);
5574 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005575 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00005576 if (strcmp(STR(tmp), "__debug__") == 0) {
5577 PyErr_SetString(PyExc_SyntaxError,
5578 ASSIGN_DEBUG);
5579 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton86424e32001-12-04 02:41:46 +00005580 n->n_lineno);
Jeremy Hylton778e2652001-11-09 19:50:08 +00005581 st->st_errors++;
5582 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005583 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005584 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005585 return;
5586 case dotted_as_name:
5587 if (NCH(n) == 3)
5588 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005589 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005590 else
5591 symtable_add_def(st,
5592 STR(CHILD(CHILD(n,
5593 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005594 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005595 return;
5596 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005597 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005598 return;
5599 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005600 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005601 return;
5602 default:
5603 if (NCH(n) == 0)
5604 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005605 if (NCH(n) == 1) {
5606 n = CHILD(n, 0);
5607 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005608 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005609 /* Should only occur for errors like x + 1 = 1,
5610 which will be caught in the next pass. */
5611 for (i = 0; i < NCH(n); ++i)
5612 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005613 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005614 }
5615}