blob: 717b3ffe1e5fd87904ec59e831b6a862be4b4a73 [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;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000199 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000200 cmp = co->co_nlocals - cp->co_nlocals;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000201 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000202 cmp = co->co_flags - cp->co_flags;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000203 if (cmp) return (cmp<0)?-1:1;
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;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000388 if (PyTuple_GET_SIZE(freevars) == 0 &&
389 PyTuple_GET_SIZE(cellvars) == 0)
390 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000391 }
392 return co;
393}
394
395
396/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000397
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000398/* The compiler uses two passes to generate bytecodes. The first pass
399 builds the symbol table. The second pass generates the bytecode.
400
401 The first pass uses a single symtable struct. The second pass uses
402 a compiling struct for each code block. The compiling structs
403 share a reference to the symtable.
404
405 The two passes communicate via symtable_load_symbols() and via
406 is_local() and is_global(). The former initializes several slots
407 in the compiling struct: c_varnames, c_locals, c_nlocals,
408 c_argcount, c_globals, and c_flags.
409*/
410
Tim Peters2a7f3842001-06-09 09:26:21 +0000411/* All about c_lnotab.
412
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000413c_lnotab is an array of unsigned bytes disguised as a Python string. Since
414version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
415mapped to source code line #s via c_lnotab instead.
416
Tim Peters2a7f3842001-06-09 09:26:21 +0000417The array is conceptually a list of
418 (bytecode offset increment, line number increment)
419pairs. The details are important and delicate, best illustrated by example:
420
421 byte code offset source code line number
422 0 1
423 6 2
424 50 7
425 350 307
426 361 308
427
428The first trick is that these numbers aren't stored, only the increments
429from one row to the next (this doesn't really work, but it's a start):
430
431 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
432
433The second trick is that an unsigned byte can't hold negative values, or
434values larger than 255, so (a) there's a deep assumption that byte code
435offsets and their corresponding line #s both increase monotonically, and (b)
436if at least one column jumps by more than 255 from one row to the next, more
437than one pair is written to the table. In case #b, there's no way to know
438from looking at the table later how many were written. That's the delicate
439part. A user of c_lnotab desiring to find the source line number
440corresponding to a bytecode address A should do something like this
441
442 lineno = addr = 0
443 for addr_incr, line_incr in c_lnotab:
444 addr += addr_incr
445 if addr > A:
446 return lineno
447 lineno += line_incr
448
449In order for this to work, when the addr field increments by more than 255,
450the line # increment in each pair generated must be 0 until the remaining addr
451increment is < 256. So, in the example above, com_set_lineno should not (as
452was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
453255, 0, 45, 255, 0, 45.
454*/
455
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000456struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000457 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000458 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000459 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000460 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000461 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +0000462 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000463 PyObject *c_locals; /* dictionary (value=localID) */
464 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000465 PyObject *c_freevars; /* dictionary (value=None) */
466 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000467 int c_nlocals; /* index of next local */
468 int c_argcount; /* number of top-level arguments */
469 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000470 int c_nexti; /* index into c_code */
471 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000472 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000473 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000474 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000475 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000476 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000477 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +0000478 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000479 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000480 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000481 int c_stacklevel; /* Current stack level */
482 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000483 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000484 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000485 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000486 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000487 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000488 int c_nested; /* Is block nested funcdef or lamdef? */
489 int c_closure; /* Is nested w/freevars? */
490 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000491 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000492 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000493};
494
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000495static int
496is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000497{
498 if ((v & (USE | DEF_FREE))
499 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
500 return 1;
501 if (v & DEF_FREE_CLASS)
502 return 1;
503 return 0;
504}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000505
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000506static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000507com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000508{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000509 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
510
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000511 if (c == NULL) {
512 /* Error occurred via symtable call to
513 is_constant_false */
514 PyErr_SetString(exc, msg);
515 return;
516 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000517 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000518 if (c->c_lineno < 1 || c->c_interactive) {
519 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000520 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000521 return;
522 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000523 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000524 if (v == NULL)
525 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000526
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000527 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000528 if (line == NULL) {
529 Py_INCREF(Py_None);
530 line = Py_None;
531 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000532 if (exc == PyExc_SyntaxError) {
533 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
534 Py_None, line);
535 if (t == NULL)
536 goto exit;
537 w = Py_BuildValue("(OO)", v, t);
538 if (w == NULL)
539 goto exit;
540 PyErr_SetObject(exc, w);
541 } else {
542 /* Make sure additional exceptions are printed with
543 file and line, also. */
544 PyErr_SetObject(exc, v);
545 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
546 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000547 exit:
548 Py_XDECREF(t);
549 Py_XDECREF(v);
550 Py_XDECREF(w);
551 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000552}
553
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000554/* Interface to the block stack */
555
556static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000557block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000558{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000559 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000560 com_error(c, PyExc_SystemError,
561 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000562 }
563 else {
564 c->c_block[c->c_nblocks++] = type;
565 }
566}
567
568static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000569block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000570{
571 if (c->c_nblocks > 0)
572 c->c_nblocks--;
573 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000574 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000575 }
576}
577
Guido van Rossum681d79a1995-07-18 14:51:37 +0000578/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000579
Martin v. Löwis95292d62002-12-11 14:04:59 +0000580static int issue_warning(const char *, const char *, int);
581static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000582static void com_free(struct compiling *);
583static void com_push(struct compiling *, int);
584static void com_pop(struct compiling *, int);
585static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000586static void com_node(struct compiling *, node *);
587static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000588static void com_addbyte(struct compiling *, int);
589static void com_addint(struct compiling *, int);
590static void com_addoparg(struct compiling *, int, int);
591static void com_addfwref(struct compiling *, int, int *);
592static void com_backpatch(struct compiling *, int);
593static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
594static int com_addconst(struct compiling *, PyObject *);
595static int com_addname(struct compiling *, PyObject *);
596static void com_addopname(struct compiling *, int, node *);
597static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000598static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000599static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000600static void com_assign(struct compiling *, node *, int, node *);
601static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000602static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +0000603static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000604 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000605static PyObject *parsestrplus(struct compiling*, node *);
606static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000607static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000608
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000609static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000610
611/* symtable operations */
612static int symtable_build(struct compiling *, node *);
613static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000614static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000615static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000616static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000617static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000618static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000619
620static void symtable_node(struct symtable *, node *);
621static void symtable_funcdef(struct symtable *, node *);
622static void symtable_default_args(struct symtable *, node *);
623static void symtable_params(struct symtable *, node *);
624static void symtable_params_fplist(struct symtable *, node *n);
625static void symtable_global(struct symtable *, node *);
626static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000627static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000628static void symtable_list_comprehension(struct symtable *, node *);
629
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000630static int symtable_update_free_vars(struct symtable *);
631static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
632static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
633
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000634/* helper */
635static void
636do_pad(int pad)
637{
638 int i;
639 for (i = 0; i < pad; ++i)
640 fprintf(stderr, " ");
641}
642
643static void
644dump(node *n, int pad, int depth)
645{
646 int i;
647 if (depth == 0)
648 return;
649 do_pad(pad);
650 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
651 if (depth > 0)
652 depth--;
653 for (i = 0; i < NCH(n); ++i)
654 dump(CHILD(n, i), pad + 1, depth);
655}
656
657#define DUMP(N) dump(N, 0, -1)
658
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000659static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000660com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000661{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000662 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000663 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
664 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000665 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000666 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000667 goto fail;
668 if ((c->c_const_dict = PyDict_New()) == NULL)
669 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000670 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000671 goto fail;
672 if ((c->c_name_dict = PyDict_New()) == NULL)
673 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000674 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000675 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000676 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
677 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000678 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000679 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000680 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000681 c->c_freevars = NULL;
682 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000683 c->c_nlocals = 0;
684 c->c_argcount = 0;
685 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000686 c->c_nexti = 0;
687 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000688 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000689 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000690 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000691 c->c_begin = 0;
692 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000693 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000694 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000695 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000696 c->c_stacklevel = 0;
697 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000698 c->c_firstlineno = 0;
699 c->c_last_addr = 0;
700 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000701 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000702 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000703 c->c_nested = 0;
704 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000705 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000706 return 1;
707
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000708 fail:
709 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000710 return 0;
711}
712
713static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000714com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000715{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000716 Py_XDECREF(c->c_code);
717 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000718 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000719 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000720 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000721 Py_XDECREF(c->c_globals);
722 Py_XDECREF(c->c_locals);
723 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000724 Py_XDECREF(c->c_freevars);
725 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000726 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000727 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +0000728 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000729}
730
731static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000732com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000733{
734 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000735 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +0000736 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000737 /*
738 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
739 c->c_filename, c->c_name, c->c_lineno,
740 c->c_nexti, c->c_stacklevel, n);
741 */
742 }
Guido van Rossum8b993a91997-01-17 21:04:03 +0000743}
744
745static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000746com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000747{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000748 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000749 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000750 else
751 c->c_stacklevel -= n;
752}
753
754static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000755com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000756{
757 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000758 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000759 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000760 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000761}
762
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000763static int
764com_check_size(PyObject **s, int offset)
765{
766 int len = PyString_GET_SIZE(*s);
767 if (offset >= len)
768 return _PyString_Resize(s, len * 2);
769 return 0;
770}
771
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000772static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000773com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000774{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000775 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000776 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +0000777 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000778 if (com_check_size(&c->c_code, c->c_nexti)) {
779 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000780 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000781 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000782 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000783}
784
785static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000786com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000787{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000788 com_addbyte(c, x & 0xff);
789 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000790}
791
792static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000793com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000794{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000795 char *p;
796 if (c->c_lnotab == NULL)
797 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000798 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
799 c->c_errors++;
800 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000801 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000802 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000803 *p++ = addr;
804 *p++ = line;
805 c->c_lnotab_next += 2;
806}
807
808static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000809com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000810{
811 c->c_lineno = lineno;
812 if (c->c_firstlineno == 0) {
813 c->c_firstlineno = c->c_last_line = lineno;
814 }
815 else {
816 int incr_addr = c->c_nexti - c->c_last_addr;
817 int incr_line = lineno - c->c_last_line;
Tim Peters2a7f3842001-06-09 09:26:21 +0000818 while (incr_addr > 255) {
819 com_add_lnotab(c, 255, 0);
820 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000821 }
Tim Peters2a7f3842001-06-09 09:26:21 +0000822 while (incr_line > 255) {
823 com_add_lnotab(c, incr_addr, 255);
824 incr_line -=255;
825 incr_addr = 0;
826 }
827 if (incr_addr > 0 || incr_line > 0)
828 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000829 c->c_last_addr = c->c_nexti;
830 c->c_last_line = lineno;
831 }
832}
833
834static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000835com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000836{
Fred Drakeef8ace32000-08-24 00:32:09 +0000837 int extended_arg = arg >> 16;
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
Guido van Rossum3ac99d42002-08-16 02:13:49 +0000995static int
996none_assignment_check(struct compiling *c, char *name, int assigning)
997{
998 if (name[0] == 'N' && strcmp(name, "None") == 0) {
999 char *msg;
1000 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001001 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001002 else
1003 msg = "deleting None";
1004 if (issue_warning(msg, c->c_filename, c->c_lineno) < 0) {
1005 c->c_errors++;
1006 return -1;
1007 }
1008 }
1009 return 0;
1010}
1011
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001012static void
1013com_addop_varname(struct compiling *c, int kind, char *name)
1014{
1015 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001016 int i, reftype;
1017 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001018 int op = STOP_CODE;
1019 char buffer[MANGLE_LEN];
1020
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001021 if (kind != VAR_LOAD &&
1022 none_assignment_check(c, name, kind == VAR_STORE))
1023 {
1024 c->c_errors++;
1025 i = 255;
1026 goto done;
1027 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001028 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001029 name = buffer;
1030 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1031 c->c_errors++;
1032 i = 255;
1033 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001034 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001035
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001036 reftype = get_ref_type(c, name);
1037 switch (reftype) {
1038 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001039 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001040 scope = NAME_LOCAL;
1041 break;
1042 case GLOBAL_EXPLICIT:
1043 scope = NAME_GLOBAL;
1044 break;
1045 case GLOBAL_IMPLICIT:
1046 if (c->c_flags & CO_OPTIMIZED)
1047 scope = NAME_GLOBAL;
1048 break;
1049 case FREE:
1050 case CELL:
1051 scope = NAME_CLOSURE;
1052 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001053 }
1054
1055 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001056 if (scope == NAME_LOCAL)
1057 i = com_lookup_arg(c->c_locals, v);
1058 else if (reftype == FREE)
1059 i = com_lookup_arg(c->c_freevars, v);
1060 else if (reftype == CELL)
1061 i = com_lookup_arg(c->c_cellvars, v);
1062 if (i == -1) {
1063 c->c_errors++; /* XXX no exception set */
1064 i = 255;
1065 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001066 }
1067 Py_DECREF(v);
1068
1069 switch (kind) {
1070 case VAR_LOAD:
1071 switch (scope) {
1072 case NAME_LOCAL:
1073 op = LOAD_FAST;
1074 break;
1075 case NAME_GLOBAL:
1076 op = LOAD_GLOBAL;
1077 break;
1078 case NAME_DEFAULT:
1079 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001080 break;
1081 case NAME_CLOSURE:
1082 op = LOAD_DEREF;
1083 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001084 }
1085 break;
1086 case VAR_STORE:
1087 switch (scope) {
1088 case NAME_LOCAL:
1089 op = STORE_FAST;
1090 break;
1091 case NAME_GLOBAL:
1092 op = STORE_GLOBAL;
1093 break;
1094 case NAME_DEFAULT:
1095 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001096 break;
1097 case NAME_CLOSURE:
1098 op = STORE_DEREF;
1099 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001100 }
1101 break;
1102 case VAR_DELETE:
1103 switch (scope) {
1104 case NAME_LOCAL:
1105 op = DELETE_FAST;
1106 break;
1107 case NAME_GLOBAL:
1108 op = DELETE_GLOBAL;
1109 break;
1110 case NAME_DEFAULT:
1111 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001112 break;
1113 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001114 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001115 PyOS_snprintf(buf, sizeof(buf),
1116 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001117 com_error(c, PyExc_SyntaxError, buf);
1118 i = 255;
1119 break;
1120 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001121 }
1122 break;
1123 }
1124done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001125 com_addoparg(c, op, i);
1126}
1127
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001128static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001129com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001130{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001131 char *name;
1132 char buffer[1000];
1133 /* XXX it is possible to write this code without the 1000
1134 chars on the total length of dotted names, I just can't be
1135 bothered right now */
1136 if (TYPE(n) == STAR)
1137 name = "*";
1138 else if (TYPE(n) == dotted_name) {
1139 char *p = buffer;
1140 int i;
1141 name = buffer;
1142 for (i = 0; i < NCH(n); i += 2) {
1143 char *s = STR(CHILD(n, i));
1144 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001145 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001146 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001147 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001148 break;
1149 }
1150 if (p != buffer)
1151 *p++ = '.';
1152 strcpy(p, s);
1153 p = strchr(p, '\0');
1154 }
1155 }
1156 else {
1157 REQ(n, NAME);
1158 name = STR(n);
1159 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001160 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001161}
1162
Guido van Rossum79f25d91997-04-29 20:08:16 +00001163static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001164parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001165{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001166 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001167 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001168 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001169#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001170 int imflag;
1171#endif
1172
Guido van Rossum282914b1991-04-04 10:42:56 +00001173 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001174 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001175#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001176 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001177#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001178 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001179 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001180 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001181 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001182 if (x < 0 && errno == 0) {
Guido van Rossum715eca92002-08-12 21:54:46 +00001183 if (PyErr_WarnExplicit(
Barry Warsaw9f007392002-08-14 15:51:29 +00001184 PyExc_FutureWarning,
Guido van Rossum715eca92002-08-12 21:54:46 +00001185 "hex/oct constants > sys.maxint "
1186 "will return positive values "
1187 "in Python 2.4 and up",
Martin v. Löwis95292d62002-12-11 14:04:59 +00001188 /* XXX: Give WarnExplicit
1189 a const char* argument. */
1190 (char*)c->c_filename,
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001191 c->c_lineno,
Guido van Rossum715eca92002-08-12 21:54:46 +00001192 NULL,
1193 NULL) < 0)
Guido van Rossum078151d2002-08-11 04:24:12 +00001194 return NULL;
Guido van Rossum3cb8e542002-08-11 14:06:15 +00001195 errno = 0; /* Might be changed by PyErr_Warn() */
Guido van Rossum078151d2002-08-11 04:24:12 +00001196 }
1197 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001198 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001199 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001200 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001201 if (errno != 0)
1202 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001203 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001204 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001205 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001206#ifndef WITHOUT_COMPLEX
1207 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001208 Py_complex z;
1209 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001210 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001211 z.imag = atof(s);
1212 PyFPE_END_PROTECT(z)
1213 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001214 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001215 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001216#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001217 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001218 PyFPE_START_PROTECT("atof", return 0)
1219 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001220 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001221 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001222 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001223}
1224
Guido van Rossum79f25d91997-04-29 20:08:16 +00001225static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001226decode_utf8(char **sPtr, char *end, char* encoding)
1227{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001228#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001229 Py_FatalError("decode_utf8 should not be called in this build.");
1230 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001231#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001232 PyObject *u, *v;
1233 char *s, *t;
1234 t = s = *sPtr;
1235 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1236 while (s < end && (*s & 0x80)) s++;
1237 *sPtr = s;
1238 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1239 if (u == NULL)
1240 return NULL;
1241 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1242 Py_DECREF(u);
1243 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001244#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001245}
1246
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001247/* compiler.transformer.Transformer.decode_literal depends on what
1248 might seem like minor details of this function -- changes here
1249 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001250static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001251parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001252{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001253 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001254 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001255 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001256 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001257 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001258 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001259 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001260
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001261 if (isalpha(quote) || quote == '_') {
1262 if (quote == 'u' || quote == 'U') {
1263 quote = *++s;
1264 unicode = 1;
1265 }
1266 if (quote == 'r' || quote == 'R') {
1267 quote = *++s;
1268 rawmode = 1;
1269 }
1270 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001271 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001272 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001273 return NULL;
1274 }
1275 s++;
1276 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001277 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001278 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001279 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001280 return NULL;
1281 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001282 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001283 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001284 return NULL;
1285 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001286 if (len >= 4 && s[0] == quote && s[1] == quote) {
1287 s += 2;
1288 len -= 2;
1289 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001290 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001291 return NULL;
1292 }
1293 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001294#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001295 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001296 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001297 char *buf;
1298 char *p;
1299 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001300 if (encoding == NULL) {
1301 buf = s;
1302 u = NULL;
1303 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1304 buf = s;
1305 u = NULL;
1306 } else {
1307 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1308 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1309 if (u == NULL)
1310 return NULL;
1311 p = buf = PyString_AsString(u);
1312 end = s + len;
1313 while (s < end) {
1314 if (*s == '\\') {
1315 *p++ = *s++;
1316 if (*s & 0x80) {
1317 strcpy(p, "u005c");
1318 p += 5;
1319 }
1320 }
1321 if (*s & 0x80) { /* XXX inefficient */
1322 char *r;
1323 int rn, i;
1324 w = decode_utf8(&s, end, "utf-16-be");
1325 if (w == NULL) {
1326 Py_DECREF(u);
1327 return NULL;
1328 }
1329 r = PyString_AsString(w);
1330 rn = PyString_Size(w);
1331 assert(rn % 2 == 0);
1332 for (i = 0; i < rn; i += 2) {
1333 sprintf(p, "\\u%02x%02x",
1334 r[i + 0] & 0xFF,
1335 r[i + 1] & 0xFF);
1336 p += 6;
1337 }
1338 Py_DECREF(w);
1339 } else {
1340 *p++ = *s++;
1341 }
1342 }
1343 len = p - buf;
1344 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001345 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001346 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001347 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001348 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1349 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001350 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001351 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001352 return v;
1353
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001354 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001355#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001356 need_encoding = (encoding != NULL &&
1357 strcmp(encoding, "utf-8") != 0 &&
1358 strcmp(encoding, "iso-8859-1") != 0);
1359 if (rawmode || strchr(s, '\\') == NULL) {
1360 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001361#ifndef Py_USING_UNICODE
1362 /* This should not happen - we never see any other
1363 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001364 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001365#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001366 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1367 if (u == NULL)
1368 return NULL;
1369 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1370 Py_DECREF(u);
1371 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001372#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001373 } else {
1374 return PyString_FromStringAndSize(s, len);
1375 }
1376 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001377
1378 v = PyString_DecodeEscape(s, len, NULL, unicode,
1379 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001380 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001381 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001382 return v;
1383}
1384
Guido van Rossum79f25d91997-04-29 20:08:16 +00001385static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001386parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001387{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001388 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001389 int i;
1390 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001391 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001392 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001393 for (i = 1; i < NCH(n); i++) {
1394 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001395 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001396 if (s == NULL)
1397 goto onError;
1398 if (PyString_Check(v) && PyString_Check(s)) {
1399 PyString_ConcatAndDel(&v, s);
1400 if (v == NULL)
1401 goto onError;
1402 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001403#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001404 else {
1405 PyObject *temp;
1406 temp = PyUnicode_Concat(v, s);
1407 Py_DECREF(s);
1408 if (temp == NULL)
1409 goto onError;
1410 Py_DECREF(v);
1411 v = temp;
1412 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001413#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001414 }
1415 }
1416 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001417
1418 onError:
1419 Py_XDECREF(v);
1420 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001421}
1422
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001423static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001424com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001425{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001426 int anchor = 0;
1427 int save_begin = c->c_begin;
1428
1429 /* list_iter: for v in expr [list_iter] */
1430 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001431 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001432 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001433 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001434 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001435 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001436 c->c_loops++;
1437 com_list_iter(c, n, e, t);
1438 c->c_loops--;
1439 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1440 c->c_begin = save_begin;
1441 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001442 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001443}
1444
1445static void
1446com_list_if(struct compiling *c, node *n, node *e, char *t)
1447{
1448 int anchor = 0;
1449 int a = 0;
1450 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001451 com_node(c, CHILD(n, 1));
1452 com_addfwref(c, JUMP_IF_FALSE, &a);
1453 com_addbyte(c, POP_TOP);
1454 com_pop(c, 1);
1455 com_list_iter(c, n, e, t);
1456 com_addfwref(c, JUMP_FORWARD, &anchor);
1457 com_backpatch(c, a);
1458 /* We jump here with an extra entry which we now pop */
1459 com_addbyte(c, POP_TOP);
1460 com_backpatch(c, anchor);
1461}
1462
1463static void
1464com_list_iter(struct compiling *c,
1465 node *p, /* parent of list_iter node */
1466 node *e, /* element expression node */
1467 char *t /* name of result list temp local */)
1468{
1469 /* list_iter is the last child in a listmaker, list_for, or list_if */
1470 node *n = CHILD(p, NCH(p)-1);
1471 if (TYPE(n) == list_iter) {
1472 n = CHILD(n, 0);
1473 switch (TYPE(n)) {
1474 case list_for:
1475 com_list_for(c, n, e, t);
1476 break;
1477 case list_if:
1478 com_list_if(c, n, e, t);
1479 break;
1480 default:
1481 com_error(c, PyExc_SystemError,
1482 "invalid list_iter node type");
1483 }
1484 }
1485 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001486 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001487 com_push(c, 1);
1488 com_node(c, e);
1489 com_addoparg(c, CALL_FUNCTION, 1);
1490 com_addbyte(c, POP_TOP);
1491 com_pop(c, 2);
1492 }
1493}
1494
1495static void
1496com_list_comprehension(struct compiling *c, node *n)
1497{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001498 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001499 char tmpname[30];
1500 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001501 com_addoparg(c, BUILD_LIST, 0);
1502 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1503 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001504 com_addop_name(c, LOAD_ATTR, "append");
1505 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001506 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001507 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001508 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001509 --c->c_tmpname;
1510}
1511
1512static void
1513com_listmaker(struct compiling *c, node *n)
1514{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001515 /* listmaker: test ( list_for | (',' test)* [','] ) */
1516 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001517 com_list_comprehension(c, n);
1518 else {
1519 int len = 0;
1520 int i;
1521 for (i = 0; i < NCH(n); i += 2, len++)
1522 com_node(c, CHILD(n, i));
1523 com_addoparg(c, BUILD_LIST, len);
1524 com_pop(c, len-1);
1525 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001526}
1527
1528static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001529com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001530{
1531 int i;
1532 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1533 for (i = 0; i+2 < NCH(n); i += 4) {
1534 /* We must arrange things just right for STORE_SUBSCR.
1535 It wants the stack to look like (value) (dict) (key) */
1536 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001537 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001538 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00001539 com_node(c, CHILD(n, i+2)); /* value */
1540 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001541 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001542 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001543 }
1544}
1545
1546static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001547com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001548{
1549 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001550 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001551 int i;
1552 REQ(n, atom);
1553 ch = CHILD(n, 0);
1554 switch (TYPE(ch)) {
1555 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001556 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001557 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001558 com_push(c, 1);
1559 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001560 else
1561 com_node(c, CHILD(n, 1));
1562 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001563 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001564 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001565 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001566 com_push(c, 1);
1567 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001568 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001569 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001570 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001571 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001572 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001573 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001574 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001575 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001576 break;
1577 case BACKQUOTE:
1578 com_node(c, CHILD(n, 1));
1579 com_addbyte(c, UNARY_CONVERT);
1580 break;
1581 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001582 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001583 i = 255;
1584 }
1585 else {
1586 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001587 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001588 }
1589 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001590 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001591 break;
1592 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001593 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001594 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001595 c->c_errors++;
1596 i = 255;
1597 }
1598 else {
1599 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001600 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001601 }
1602 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001603 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001604 break;
1605 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001606 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001607 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001608 break;
1609 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001610 com_error(c, PyExc_SystemError,
1611 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001612 }
1613}
1614
1615static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001616com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001617{
1618 if (NCH(n) == 1) {
1619 com_addbyte(c, op);
1620 }
1621 else if (NCH(n) == 2) {
1622 if (TYPE(CHILD(n, 0)) != COLON) {
1623 com_node(c, CHILD(n, 0));
1624 com_addbyte(c, op+1);
1625 }
1626 else {
1627 com_node(c, CHILD(n, 1));
1628 com_addbyte(c, op+2);
1629 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001630 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001631 }
1632 else {
1633 com_node(c, CHILD(n, 0));
1634 com_node(c, CHILD(n, 2));
1635 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001636 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001637 }
1638}
1639
Guido van Rossum635abd21997-01-06 22:56:52 +00001640static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001641com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1642{
1643 if (NCH(n) == 1) {
1644 com_addbyte(c, DUP_TOP);
1645 com_push(c, 1);
1646 com_addbyte(c, SLICE);
1647 com_node(c, augn);
1648 com_addbyte(c, opcode);
1649 com_pop(c, 1);
1650 com_addbyte(c, ROT_TWO);
1651 com_addbyte(c, STORE_SLICE);
1652 com_pop(c, 2);
1653 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1654 com_node(c, CHILD(n, 0));
1655 com_addoparg(c, DUP_TOPX, 2);
1656 com_push(c, 2);
1657 com_addbyte(c, SLICE+1);
1658 com_pop(c, 1);
1659 com_node(c, augn);
1660 com_addbyte(c, opcode);
1661 com_pop(c, 1);
1662 com_addbyte(c, ROT_THREE);
1663 com_addbyte(c, STORE_SLICE+1);
1664 com_pop(c, 3);
1665 } else if (NCH(n) == 2) {
1666 com_node(c, CHILD(n, 1));
1667 com_addoparg(c, DUP_TOPX, 2);
1668 com_push(c, 2);
1669 com_addbyte(c, SLICE+2);
1670 com_pop(c, 1);
1671 com_node(c, augn);
1672 com_addbyte(c, opcode);
1673 com_pop(c, 1);
1674 com_addbyte(c, ROT_THREE);
1675 com_addbyte(c, STORE_SLICE+2);
1676 com_pop(c, 3);
1677 } else {
1678 com_node(c, CHILD(n, 0));
1679 com_node(c, CHILD(n, 2));
1680 com_addoparg(c, DUP_TOPX, 3);
1681 com_push(c, 3);
1682 com_addbyte(c, SLICE+3);
1683 com_pop(c, 2);
1684 com_node(c, augn);
1685 com_addbyte(c, opcode);
1686 com_pop(c, 1);
1687 com_addbyte(c, ROT_FOUR);
1688 com_addbyte(c, STORE_SLICE+3);
1689 com_pop(c, 4);
1690 }
1691}
1692
1693static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001694com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001695{
1696 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001697 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001698 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001699 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001700 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001701 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001702 }
1703 else {
1704 com_node(c, CHILD(n, 0));
1705 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001706 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001707 }
1708 m = n;
1709 do {
1710 m = CHILD(m, 0);
1711 } while (NCH(m) == 1);
1712 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001713 /* f(lambda x: x[0] = 3) ends up getting parsed with
1714 * LHS test = lambda x: x[0], and RHS test = 3.
1715 * SF bug 132313 points out that complaining about a keyword
1716 * then is very confusing.
1717 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001718 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001719 TYPE(m) == lambdef ?
1720 "lambda cannot contain assignment" :
1721 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001722 }
1723 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001724 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00001725 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00001726 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001727 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001728 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001729 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001730 else if (*pkeywords == NULL) {
1731 c->c_errors++;
1732 Py_DECREF(v);
1733 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001734 if (PyDict_GetItem(*pkeywords, v) != NULL)
1735 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001736 "duplicate keyword argument");
1737 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001738 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001739 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001740 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001741 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001742 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001743 }
1744 }
1745 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001746}
1747
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001748static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001749com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001750{
1751 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001752 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001753 }
1754 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001755 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001756 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001757 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001758 int star_flag = 0;
1759 int starstar_flag = 0;
1760 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001761 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001762 na = 0;
1763 nk = 0;
1764 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001765 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001766 if (TYPE(ch) == STAR ||
1767 TYPE(ch) == DOUBLESTAR)
1768 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001769 if (ch->n_lineno != lineno) {
1770 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001771 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00001772 }
1773 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001774 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001775 na++;
1776 else
1777 nk++;
1778 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001779 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001780 while (i < NCH(n)) {
1781 node *tok = CHILD(n, i);
1782 node *ch = CHILD(n, i+1);
1783 i += 3;
1784 switch (TYPE(tok)) {
1785 case STAR: star_flag = 1; break;
1786 case DOUBLESTAR: starstar_flag = 1; break;
1787 }
1788 com_node(c, ch);
1789 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001790 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001791 com_error(c, PyExc_SyntaxError,
1792 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001793 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001794 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001795 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001796 star_flag + (starstar_flag << 1);
1797 else
1798 opcode = CALL_FUNCTION;
1799 com_addoparg(c, opcode, na | (nk << 8));
1800 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001801 }
1802}
1803
1804static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001805com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001806{
1807 com_addopname(c, LOAD_ATTR, n);
1808}
1809
1810static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001811com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001812{
1813 int i=0;
1814 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001815 node *ch;
1816
1817 /* first argument */
1818 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001819 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001820 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001821 i++;
1822 }
1823 else {
1824 com_node(c, CHILD(n,i));
1825 i++;
1826 REQ(CHILD(n,i),COLON);
1827 i++;
1828 }
1829 /* second argument */
1830 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1831 com_node(c, CHILD(n,i));
1832 i++;
1833 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001834 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001835 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001836 com_push(c, 1);
1837 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001838 /* remaining arguments */
1839 for (; i < NCH(n); i++) {
1840 ns++;
1841 ch=CHILD(n,i);
1842 REQ(ch, sliceop);
1843 if (NCH(ch) == 1) {
1844 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001845 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001846 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001847 }
1848 else
1849 com_node(c, CHILD(ch,1));
1850 }
1851 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001852 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001853}
1854
1855static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001856com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001857{
1858 node *ch;
1859 REQ(n, subscript);
1860 ch = CHILD(n,0);
1861 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001862 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001863 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001864 com_push(c, 1);
1865 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001866 else {
1867 /* check for slice */
1868 if ((TYPE(ch) == COLON || NCH(n) > 1))
1869 com_sliceobj(c, n);
1870 else {
1871 REQ(ch, test);
1872 com_node(c, ch);
1873 }
1874 }
1875}
1876
1877static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001878com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001879{
1880 int i, op;
1881 REQ(n, subscriptlist);
1882 /* Check to make backward compatible slice behavior for '[i:j]' */
1883 if (NCH(n) == 1) {
1884 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001885 /* 'Basic' slice, should have exactly one colon. */
1886 if ((TYPE(CHILD(sub, 0)) == COLON
1887 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1888 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1889 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001890 switch (assigning) {
1891 case OP_DELETE:
1892 op = DELETE_SLICE;
1893 break;
1894 case OP_ASSIGN:
1895 op = STORE_SLICE;
1896 break;
1897 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001898 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001899 break;
1900 default:
1901 com_augassign_slice(c, sub, assigning, augn);
1902 return;
1903 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001904 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001905 if (op == STORE_SLICE)
1906 com_pop(c, 2);
1907 else if (op == DELETE_SLICE)
1908 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001909 return;
1910 }
1911 }
1912 /* Else normal subscriptlist. Compile each subscript. */
1913 for (i = 0; i < NCH(n); i += 2)
1914 com_subscript(c, CHILD(n, i));
1915 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001916 if (NCH(n) > 1) {
1917 i = (NCH(n)+1) / 2;
1918 com_addoparg(c, BUILD_TUPLE, i);
1919 com_pop(c, i-1);
1920 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001921 switch (assigning) {
1922 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001923 op = DELETE_SUBSCR;
1924 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001925 break;
1926 default:
1927 case OP_ASSIGN:
1928 op = STORE_SUBSCR;
1929 i = 3;
1930 break;
1931 case OP_APPLY:
1932 op = BINARY_SUBSCR;
1933 i = 1;
1934 break;
1935 }
1936 if (assigning > OP_APPLY) {
1937 com_addoparg(c, DUP_TOPX, 2);
1938 com_push(c, 2);
1939 com_addbyte(c, BINARY_SUBSCR);
1940 com_pop(c, 1);
1941 com_node(c, augn);
1942 com_addbyte(c, assigning);
1943 com_pop(c, 1);
1944 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001945 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001946 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001947 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001948}
1949
1950static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001951com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001952{
1953 REQ(n, trailer);
1954 switch (TYPE(CHILD(n, 0))) {
1955 case LPAR:
1956 com_call_function(c, CHILD(n, 1));
1957 break;
1958 case DOT:
1959 com_select_member(c, CHILD(n, 1));
1960 break;
1961 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001962 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001963 break;
1964 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001965 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001966 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001967 }
1968}
1969
1970static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001971com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001972{
1973 int i;
1974 REQ(n, power);
1975 com_atom(c, CHILD(n, 0));
1976 for (i = 1; i < NCH(n); i++) {
1977 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1978 com_factor(c, CHILD(n, i+1));
1979 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001980 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001981 break;
1982 }
1983 else
1984 com_apply_trailer(c, CHILD(n, i));
1985 }
1986}
1987
1988static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001989com_invert_constant(struct compiling *c, node *n)
1990{
1991 /* Compute the inverse of int and longs and use them directly,
1992 but be prepared to generate code for all other
1993 possibilities (invalid numbers, floats, complex).
1994 */
1995 PyObject *num, *inv = NULL;
1996 int i;
1997
1998 REQ(n, NUMBER);
1999 num = parsenumber(c, STR(n));
2000 if (num == NULL)
2001 i = 255;
2002 else {
2003 inv = PyNumber_Invert(num);
2004 if (inv == NULL) {
2005 PyErr_Clear();
2006 i = com_addconst(c, num);
2007 } else {
2008 i = com_addconst(c, inv);
2009 Py_DECREF(inv);
2010 }
2011 Py_DECREF(num);
2012 }
2013 com_addoparg(c, LOAD_CONST, i);
2014 com_push(c, 1);
2015 if (num != NULL && inv == NULL)
2016 com_addbyte(c, UNARY_INVERT);
2017}
2018
Tim Peters51e26512001-09-07 08:45:55 +00002019static int
2020is_float_zero(const char *p)
2021{
2022 int found_radix_point = 0;
2023 int ch;
2024 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2025 switch (ch) {
2026 case '0':
2027 /* no reason to believe it's not 0 -- continue */
2028 break;
2029
2030 case 'e': case 'E': case 'j': case 'J':
2031 /* If this was a hex constant, we already would have
2032 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2033 must be an exponent marker, and we haven't yet
2034 seen a non-zero digit, and it doesn't matter what
2035 the exponent is then. For 'j' or 'J' similarly,
2036 except that this is an imaginary 0 then. */
2037 return 1;
2038
2039 case '.':
2040 found_radix_point = 1;
2041 break;
2042
2043 default:
2044 return 0;
2045 }
2046 }
2047 return found_radix_point;
2048}
2049
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002050static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002051com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002052{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002053 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002054 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002055 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002056 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002057 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002058 approriate value as a constant. If the value is negative,
2059 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002060 negative in the 0th position -- unless we're doing unary minus
2061 of a floating zero! In that case the sign is significant, but
2062 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002063 */
2064 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002065 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002066 && TYPE((pfactor = CHILD(n, 1))) == factor
2067 && NCH(pfactor) == 1
2068 && TYPE((ppower = CHILD(pfactor, 0))) == power
2069 && NCH(ppower) == 1
2070 && TYPE((patom = CHILD(ppower, 0))) == atom
2071 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002072 && !(childtype == MINUS &&
2073 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002074 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002075 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002076 return;
2077 }
2078 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002079 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002080 if (s == NULL) {
2081 com_error(c, PyExc_MemoryError, "");
2082 com_addbyte(c, 255);
2083 return;
2084 }
2085 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002086 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002087 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002088 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002089 }
Tim Peters51e26512001-09-07 08:45:55 +00002090 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002091 }
2092 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002093 com_factor(c, CHILD(n, 1));
2094 com_addbyte(c, UNARY_POSITIVE);
2095 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002096 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002097 com_factor(c, CHILD(n, 1));
2098 com_addbyte(c, UNARY_NEGATIVE);
2099 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002100 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002101 com_factor(c, CHILD(n, 1));
2102 com_addbyte(c, UNARY_INVERT);
2103 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002104 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002105 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002106 }
2107}
2108
2109static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002110com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002111{
2112 int i;
2113 int op;
2114 REQ(n, term);
2115 com_factor(c, CHILD(n, 0));
2116 for (i = 2; i < NCH(n); i += 2) {
2117 com_factor(c, CHILD(n, i));
2118 switch (TYPE(CHILD(n, i-1))) {
2119 case STAR:
2120 op = BINARY_MULTIPLY;
2121 break;
2122 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002123 if (c->c_flags & CO_FUTURE_DIVISION)
2124 op = BINARY_TRUE_DIVIDE;
2125 else
2126 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002127 break;
2128 case PERCENT:
2129 op = BINARY_MODULO;
2130 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002131 case DOUBLESLASH:
2132 op = BINARY_FLOOR_DIVIDE;
2133 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002134 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002135 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002136 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002137 op = 255;
2138 }
2139 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002140 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002141 }
2142}
2143
2144static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002145com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002146{
2147 int i;
2148 int op;
2149 REQ(n, arith_expr);
2150 com_term(c, CHILD(n, 0));
2151 for (i = 2; i < NCH(n); i += 2) {
2152 com_term(c, CHILD(n, i));
2153 switch (TYPE(CHILD(n, i-1))) {
2154 case PLUS:
2155 op = BINARY_ADD;
2156 break;
2157 case MINUS:
2158 op = BINARY_SUBTRACT;
2159 break;
2160 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002161 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002162 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002163 op = 255;
2164 }
2165 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002166 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002167 }
2168}
2169
2170static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002171com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002172{
2173 int i;
2174 int op;
2175 REQ(n, shift_expr);
2176 com_arith_expr(c, CHILD(n, 0));
2177 for (i = 2; i < NCH(n); i += 2) {
2178 com_arith_expr(c, CHILD(n, i));
2179 switch (TYPE(CHILD(n, i-1))) {
2180 case LEFTSHIFT:
2181 op = BINARY_LSHIFT;
2182 break;
2183 case RIGHTSHIFT:
2184 op = BINARY_RSHIFT;
2185 break;
2186 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002187 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002188 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002189 op = 255;
2190 }
2191 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002192 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002193 }
2194}
2195
2196static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002197com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002198{
2199 int i;
2200 int op;
2201 REQ(n, and_expr);
2202 com_shift_expr(c, CHILD(n, 0));
2203 for (i = 2; i < NCH(n); i += 2) {
2204 com_shift_expr(c, CHILD(n, i));
2205 if (TYPE(CHILD(n, i-1)) == AMPER) {
2206 op = BINARY_AND;
2207 }
2208 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002209 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002210 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002211 op = 255;
2212 }
2213 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002214 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002215 }
2216}
2217
2218static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002219com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002220{
2221 int i;
2222 int op;
2223 REQ(n, xor_expr);
2224 com_and_expr(c, CHILD(n, 0));
2225 for (i = 2; i < NCH(n); i += 2) {
2226 com_and_expr(c, CHILD(n, i));
2227 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2228 op = BINARY_XOR;
2229 }
2230 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002231 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002232 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002233 op = 255;
2234 }
2235 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002236 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002237 }
2238}
2239
2240static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002241com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002242{
2243 int i;
2244 int op;
2245 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002246 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002247 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002248 com_xor_expr(c, CHILD(n, i));
2249 if (TYPE(CHILD(n, i-1)) == VBAR) {
2250 op = BINARY_OR;
2251 }
2252 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002253 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002254 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002255 op = 255;
2256 }
2257 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002258 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002259 }
2260}
2261
2262static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002263cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002264{
2265 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00002266 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002267 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2268 if (NCH(n) == 1) {
2269 n = CHILD(n, 0);
2270 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002271 case LESS: return PyCmp_LT;
2272 case GREATER: return PyCmp_GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002273 case EQEQUAL: /* == */
Martin v. Löwis7198a522002-01-01 19:59:11 +00002274 case EQUAL: return PyCmp_EQ;
2275 case LESSEQUAL: return PyCmp_LE;
2276 case GREATEREQUAL: return PyCmp_GE;
2277 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2278 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2279 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002280 }
2281 }
2282 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002283 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002284 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002285 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002286 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002287 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002288 }
2289 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002290 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002291}
2292
2293static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002294com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002295{
2296 int i;
2297 enum cmp_op op;
2298 int anchor;
2299 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2300 com_expr(c, CHILD(n, 0));
2301 if (NCH(n) == 1)
2302 return;
2303
2304 /****************************************************************
2305 The following code is generated for all but the last
2306 comparison in a chain:
2307
2308 label: on stack: opcode: jump to:
2309
2310 a <code to load b>
2311 a, b DUP_TOP
2312 a, b, b ROT_THREE
2313 b, a, b COMPARE_OP
2314 b, 0-or-1 JUMP_IF_FALSE L1
2315 b, 1 POP_TOP
2316 b
2317
2318 We are now ready to repeat this sequence for the next
2319 comparison in the chain.
2320
2321 For the last we generate:
2322
2323 b <code to load c>
2324 b, c COMPARE_OP
2325 0-or-1
2326
2327 If there were any jumps to L1 (i.e., there was more than one
2328 comparison), we generate:
2329
2330 0-or-1 JUMP_FORWARD L2
2331 L1: b, 0 ROT_TWO
2332 0, b POP_TOP
2333 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002334 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002335 ****************************************************************/
2336
2337 anchor = 0;
2338
2339 for (i = 2; i < NCH(n); i += 2) {
2340 com_expr(c, CHILD(n, i));
2341 if (i+2 < NCH(n)) {
2342 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002343 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002344 com_addbyte(c, ROT_THREE);
2345 }
2346 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002347 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002348 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002349 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002350 }
2351 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002352 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002353 if (i+2 < NCH(n)) {
2354 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2355 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002356 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002357 }
2358 }
2359
2360 if (anchor) {
2361 int anchor2 = 0;
2362 com_addfwref(c, JUMP_FORWARD, &anchor2);
2363 com_backpatch(c, anchor);
2364 com_addbyte(c, ROT_TWO);
2365 com_addbyte(c, POP_TOP);
2366 com_backpatch(c, anchor2);
2367 }
2368}
2369
2370static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002371com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002372{
2373 REQ(n, not_test); /* 'not' not_test | comparison */
2374 if (NCH(n) == 1) {
2375 com_comparison(c, CHILD(n, 0));
2376 }
2377 else {
2378 com_not_test(c, CHILD(n, 1));
2379 com_addbyte(c, UNARY_NOT);
2380 }
2381}
2382
2383static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002384com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002385{
2386 int i;
2387 int anchor;
2388 REQ(n, and_test); /* not_test ('and' not_test)* */
2389 anchor = 0;
2390 i = 0;
2391 for (;;) {
2392 com_not_test(c, CHILD(n, i));
2393 if ((i += 2) >= NCH(n))
2394 break;
2395 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2396 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002397 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002398 }
2399 if (anchor)
2400 com_backpatch(c, anchor);
2401}
2402
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002403static int
2404com_make_closure(struct compiling *c, PyCodeObject *co)
2405{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002406 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002407 if (free == 0)
2408 return 0;
2409 for (i = 0; i < free; ++i) {
2410 /* Bypass com_addop_varname because it will generate
2411 LOAD_DEREF but LOAD_CLOSURE is needed.
2412 */
2413 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2414 int arg, reftype;
2415
2416 /* Special case: If a class contains a method with a
2417 free variable that has the same name as a method,
2418 the name will be considered free *and* local in the
2419 class. It should be handled by the closure, as
2420 well as by the normal name loookup logic.
2421 */
2422 reftype = get_ref_type(c, PyString_AS_STRING(name));
2423 if (reftype == CELL)
2424 arg = com_lookup_arg(c->c_cellvars, name);
2425 else /* (reftype == FREE) */
2426 arg = com_lookup_arg(c->c_freevars, name);
2427 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002428 fprintf(stderr, "lookup %s in %s %d %d\n"
2429 "freevars of %s: %s\n",
2430 PyObject_REPR(name),
2431 c->c_name,
2432 reftype, arg,
2433 PyString_AS_STRING(co->co_name),
2434 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002435 Py_FatalError("com_make_closure()");
2436 }
2437 com_addoparg(c, LOAD_CLOSURE, arg);
2438
2439 }
2440 com_push(c, free);
2441 return 1;
2442}
2443
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002444static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002445com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002446{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002447 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002448 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002449 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002450 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002451 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002452 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2453 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002454 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002455 if (co == NULL) {
2456 c->c_errors++;
2457 return;
2458 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002459 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002460 i = com_addconst(c, (PyObject *)co);
2461 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002462 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002463 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002464 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002465 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002466 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002467 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002468 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002469 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002470 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002471 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002472 else {
2473 int anchor = 0;
2474 int i = 0;
2475 for (;;) {
2476 com_and_test(c, CHILD(n, i));
2477 if ((i += 2) >= NCH(n))
2478 break;
2479 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2480 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002481 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002482 }
2483 if (anchor)
2484 com_backpatch(c, anchor);
2485 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002486}
2487
2488static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002489com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002490{
2491 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002492 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002493 com_node(c, CHILD(n, 0));
2494 }
2495 else {
2496 int i;
2497 int len;
2498 len = (NCH(n) + 1) / 2;
2499 for (i = 0; i < NCH(n); i += 2)
2500 com_node(c, CHILD(n, i));
2501 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002502 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002503 }
2504}
2505
2506
2507/* Begin of assignment compilation */
2508
Thomas Wouters434d0822000-08-24 20:11:32 +00002509
2510static void
2511com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2512{
2513 com_addbyte(c, DUP_TOP);
2514 com_push(c, 1);
2515 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002516 com_node(c, augn);
2517 com_addbyte(c, opcode);
2518 com_pop(c, 1);
2519 com_addbyte(c, ROT_TWO);
2520 com_addopname(c, STORE_ATTR, n);
2521 com_pop(c, 2);
2522}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002523
2524static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002525com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002526{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00002527 if (none_assignment_check(c, STR(n), assigning))
2528 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002529 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002530 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002531}
2532
2533static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002534com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002535{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002536 REQ(n, trailer);
2537 switch (TYPE(CHILD(n, 0))) {
2538 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002539 if (assigning == OP_DELETE)
2540 com_error(c, PyExc_SyntaxError,
2541 "can't delete function call");
2542 else
2543 com_error(c, PyExc_SyntaxError,
2544 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002545 break;
2546 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002547 if (assigning > OP_APPLY)
2548 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2549 else
2550 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002551 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002552 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002553 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002554 break;
2555 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002556 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002557 }
2558}
2559
2560static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002561com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002562{
2563 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002564 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002565 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002566 if (assigning) {
2567 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002568 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002569 com_push(c, i-1);
2570 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002571 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002572 com_assign(c, CHILD(n, i), assigning, NULL);
2573}
2574
2575static void
2576com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2577{
2578 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002579 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002580 com_push(c, 1);
2581 com_node(c, augn);
2582 com_addbyte(c, opcode);
2583 com_pop(c, 1);
2584 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002585}
2586
2587static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002588com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002589{
2590 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002591 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002592 if (assigning)
2593 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002594}
2595
2596static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002597com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002598{
2599 /* Loop to avoid trivial recursion */
2600 for (;;) {
2601 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002602
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002603 case exprlist:
2604 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002605 case testlist1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002606 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002607 if (assigning > OP_APPLY) {
2608 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002609 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002610 return;
2611 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002612 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002613 return;
2614 }
2615 n = CHILD(n, 0);
2616 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002617
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002618 case test:
2619 case and_test:
2620 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002621 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002622 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002623 case xor_expr:
2624 case and_expr:
2625 case shift_expr:
2626 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002627 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002628 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002629 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002630 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002631 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002632 return;
2633 }
2634 n = CHILD(n, 0);
2635 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002636
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002637 case power: /* atom trailer* ('**' power)*
2638 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002639 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002640 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002641 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002642 return;
2643 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002644 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002645 int i;
2646 com_node(c, CHILD(n, 0));
2647 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002648 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002649 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002650 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002651 return;
2652 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002653 com_apply_trailer(c, CHILD(n, i));
2654 } /* NB i is still alive */
2655 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002656 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002657 return;
2658 }
2659 n = CHILD(n, 0);
2660 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002661
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002662 case atom:
2663 switch (TYPE(CHILD(n, 0))) {
2664 case LPAR:
2665 n = CHILD(n, 1);
2666 if (TYPE(n) == RPAR) {
2667 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002668 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002669 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002670 return;
2671 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002672 if (assigning > OP_APPLY) {
2673 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002674 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002675 return;
2676 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002677 break;
2678 case LSQB:
2679 n = CHILD(n, 1);
2680 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002681 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002682 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002683 return;
2684 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002685 if (assigning > OP_APPLY) {
2686 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002687 "augmented assign to list not possible");
2688 return;
2689 }
2690 if (NCH(n) > 1
2691 && TYPE(CHILD(n, 1)) == list_for) {
2692 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002693 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002694 return;
2695 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002696 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002697 return;
2698 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002699 if (assigning > OP_APPLY)
2700 com_augassign_name(c, CHILD(n, 0),
2701 assigning, augn);
2702 else
2703 com_assign_name(c, CHILD(n, 0),
2704 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002705 return;
2706 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002707 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002708 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002709 return;
2710 }
2711 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002712
2713 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002714 com_error(c, PyExc_SyntaxError,
2715 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002716 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002717
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002718 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002719 com_error(c, PyExc_SystemError,
2720 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002721 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002722
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002723 }
2724 }
2725}
Guido van Rossum7c531111997-03-11 18:42:21 +00002726
Thomas Wouters434d0822000-08-24 20:11:32 +00002727static void
2728com_augassign(struct compiling *c, node *n)
2729{
2730 int opcode;
2731
2732 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2733 case '+': opcode = INPLACE_ADD; break;
2734 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002735 case '/':
2736 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
2737 opcode = INPLACE_FLOOR_DIVIDE;
2738 else if (c->c_flags & CO_FUTURE_DIVISION)
2739 opcode = INPLACE_TRUE_DIVIDE;
2740 else
2741 opcode = INPLACE_DIVIDE;
2742 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00002743 case '%': opcode = INPLACE_MODULO; break;
2744 case '<': opcode = INPLACE_LSHIFT; break;
2745 case '>': opcode = INPLACE_RSHIFT; break;
2746 case '&': opcode = INPLACE_AND; break;
2747 case '^': opcode = INPLACE_XOR; break;
2748 case '|': opcode = INPLACE_OR; break;
2749 case '*':
2750 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2751 opcode = INPLACE_POWER;
2752 else
2753 opcode = INPLACE_MULTIPLY;
2754 break;
2755 default:
2756 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2757 return;
2758 }
2759 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2760}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002761
2762static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002763com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002764{
Thomas Wouters434d0822000-08-24 20:11:32 +00002765 REQ(n, expr_stmt);
2766 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002767 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002768 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002769 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002770 if (NCH(n) == 1) {
2771 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002772 if (c->c_interactive)
2773 com_addbyte(c, PRINT_EXPR);
2774 else
2775 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002776 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002777 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002778 else if (TYPE(CHILD(n,1)) == augassign)
2779 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002780 else {
2781 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002782 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002783 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002784 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002785 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002786 com_push(c, 1);
2787 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002788 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002789 }
2790 }
2791}
2792
2793static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002794com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002795{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002796 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002797 int i;
2798 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002799 if (Py_OptimizeFlag)
2800 return;
2801 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00002802
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002803 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00002804 raise AssertionError [, <message>]
2805
2806 where <message> is the second test, if present.
2807 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002808 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002809 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002810 com_addbyte(c, POP_TOP);
2811 com_pop(c, 1);
2812 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002813 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002814 com_push(c, 1);
2815 i = NCH(n)/2; /* Either 2 or 4 */
2816 if (i > 1)
2817 com_node(c, CHILD(n, 3));
2818 com_addoparg(c, RAISE_VARARGS, i);
2819 com_pop(c, i);
2820 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002821 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002822 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002823 com_addbyte(c, POP_TOP);
2824}
2825
2826static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002827com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002828{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002829 int i = 1;
2830 node* stream = NULL;
2831
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002832 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002833
2834 /* are we using the extended print form? */
2835 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2836 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002837 com_node(c, stream);
2838 /* stack: [...] => [... stream] */
2839 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002840 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2841 i = 4;
2842 else
2843 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002844 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002845 for (; i < NCH(n); i += 2) {
2846 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002847 com_addbyte(c, DUP_TOP);
2848 /* stack: [stream] => [stream stream] */
2849 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002850 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002851 /* stack: [stream stream] => [stream stream obj] */
2852 com_addbyte(c, ROT_TWO);
2853 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002854 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002855 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002856 com_pop(c, 2);
2857 }
2858 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002859 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002860 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002861 com_addbyte(c, PRINT_ITEM);
2862 com_pop(c, 1);
2863 }
2864 }
2865 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002866 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002867 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002868 /* must pop the extra stream object off the stack */
2869 com_addbyte(c, POP_TOP);
2870 /* stack: [... stream] => [...] */
2871 com_pop(c, 1);
2872 }
2873 }
2874 else {
2875 if (stream != NULL) {
2876 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002877 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002878 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002879 com_pop(c, 1);
2880 }
2881 else
2882 com_addbyte(c, PRINT_NEWLINE);
2883 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002884}
2885
2886static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002887com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002888{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002889 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002890 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002891 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002892 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002893 if (c->c_flags & CO_GENERATOR) {
2894 if (NCH(n) > 1) {
2895 com_error(c, PyExc_SyntaxError,
2896 "'return' with argument inside generator");
2897 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002898 }
2899 if (NCH(n) < 2) {
2900 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002901 com_push(c, 1);
2902 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002903 else
2904 com_node(c, CHILD(n, 1));
2905 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00002906 com_pop(c, 1);
2907}
2908
2909static void
2910com_yield_stmt(struct compiling *c, node *n)
2911{
Tim Peters95c80f82001-06-23 02:07:08 +00002912 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00002913 REQ(n, yield_stmt); /* 'yield' testlist */
2914 if (!c->c_infunction) {
2915 com_error(c, PyExc_SyntaxError, "'yield' outside function");
2916 }
Tim Peters95c80f82001-06-23 02:07:08 +00002917
2918 for (i = 0; i < c->c_nblocks; ++i) {
2919 if (c->c_block[i] == SETUP_FINALLY) {
2920 com_error(c, PyExc_SyntaxError,
2921 "'yield' not allowed in a 'try' block "
2922 "with a 'finally' clause");
2923 return;
2924 }
2925 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002926 com_node(c, CHILD(n, 1));
2927 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002928 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002929}
2930
2931static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002932com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002933{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002934 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002935 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2936 if (NCH(n) > 1) {
2937 com_node(c, CHILD(n, 1));
2938 if (NCH(n) > 3) {
2939 com_node(c, CHILD(n, 3));
2940 if (NCH(n) > 5)
2941 com_node(c, CHILD(n, 5));
2942 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002943 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002944 i = NCH(n)/2;
2945 com_addoparg(c, RAISE_VARARGS, i);
2946 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002947}
2948
2949static void
Thomas Wouters52152252000-08-17 22:55:00 +00002950com_from_import(struct compiling *c, node *n)
2951{
2952 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2953 com_push(c, 1);
2954 if (NCH(n) > 1) {
2955 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2956 com_error(c, PyExc_SyntaxError, "invalid syntax");
2957 return;
2958 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002959 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002960 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002961 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002962 com_pop(c, 1);
2963}
2964
2965static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002966com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002967{
2968 int i;
2969 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002970 /* 'import' dotted_name (',' dotted_name)* |
2971 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002972 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002973 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002974 /* 'from' dotted_name 'import' ... */
2975 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002976
2977 if (TYPE(CHILD(n, 3)) == STAR) {
2978 tup = Py_BuildValue("(s)", "*");
2979 } else {
2980 tup = PyTuple_New((NCH(n) - 2)/2);
2981 for (i = 3; i < NCH(n); i += 2) {
2982 PyTuple_SET_ITEM(tup, (i-3)/2,
Guido van Rossum633d90c2002-12-23 16:51:42 +00002983 PyString_FromString(STR(
2984 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002985 }
2986 }
2987 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002988 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002989 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002990 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002991 if (TYPE(CHILD(n, 3)) == STAR)
2992 com_addbyte(c, IMPORT_STAR);
2993 else {
2994 for (i = 3; i < NCH(n); i += 2)
2995 com_from_import(c, CHILD(n, i));
2996 com_addbyte(c, POP_TOP);
2997 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002998 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002999 }
3000 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003001 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003002 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003003 node *subn = CHILD(n, i);
3004 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003005 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003006 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003007 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003008 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003009 int j;
3010 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003011 com_error(c, PyExc_SyntaxError,
3012 "invalid syntax");
3013 return;
3014 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003015 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3016 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003017 CHILD(CHILD(subn, 0),
3018 j));
3019 com_addop_varname(c, VAR_STORE,
3020 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003021 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003022 com_addop_varname(c, VAR_STORE,
3023 STR(CHILD(CHILD(subn, 0),
3024 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003025 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003026 }
3027 }
3028}
3029
3030static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003031com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003032{
3033 REQ(n, exec_stmt);
3034 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3035 com_node(c, CHILD(n, 1));
3036 if (NCH(n) >= 4)
3037 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003038 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003039 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003040 com_push(c, 1);
3041 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003042 if (NCH(n) >= 6)
3043 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003044 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003045 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003046 com_push(c, 1);
3047 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003048 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003049 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003050}
3051
Guido van Rossum7c531111997-03-11 18:42:21 +00003052static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003053is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003054{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003055 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003056 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003057 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003058
3059 /* Label to avoid tail recursion */
3060 next:
3061 switch (TYPE(n)) {
3062
3063 case suite:
3064 if (NCH(n) == 1) {
3065 n = CHILD(n, 0);
3066 goto next;
3067 }
3068 /* Fall through */
3069 case file_input:
3070 for (i = 0; i < NCH(n); i++) {
3071 node *ch = CHILD(n, i);
3072 if (TYPE(ch) == stmt) {
3073 n = ch;
3074 goto next;
3075 }
3076 }
3077 break;
3078
3079 case stmt:
3080 case simple_stmt:
3081 case small_stmt:
3082 n = CHILD(n, 0);
3083 goto next;
3084
3085 case expr_stmt:
3086 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003087 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003088 case test:
3089 case and_test:
3090 case not_test:
3091 case comparison:
3092 case expr:
3093 case xor_expr:
3094 case and_expr:
3095 case shift_expr:
3096 case arith_expr:
3097 case term:
3098 case factor:
3099 case power:
3100 case atom:
3101 if (NCH(n) == 1) {
3102 n = CHILD(n, 0);
3103 goto next;
3104 }
3105 break;
3106
3107 case NAME:
3108 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3109 return 1;
3110 break;
3111
3112 case NUMBER:
3113 v = parsenumber(c, STR(n));
3114 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003115 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003116 break;
3117 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003118 i = PyObject_IsTrue(v);
3119 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003120 return i == 0;
3121
3122 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003123 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003124 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003125 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003126 break;
3127 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003128 i = PyObject_IsTrue(v);
3129 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003130 return i == 0;
3131
3132 }
3133 return 0;
3134}
3135
Tim Peters08a898f2001-06-28 01:52:22 +00003136
3137/* Look under n for a return stmt with an expression.
3138 * This hack is used to find illegal returns under "if 0:" blocks in
3139 * functions already known to be generators (as determined by the symtable
3140 * pass).
3141 * Return the offending return node if found, else NULL.
3142 */
3143static node *
3144look_for_offending_return(node *n)
3145{
3146 int i;
3147
3148 for (i = 0; i < NCH(n); ++i) {
3149 node *kid = CHILD(n, i);
3150
3151 switch (TYPE(kid)) {
3152 case classdef:
3153 case funcdef:
3154 case lambdef:
3155 /* Stuff in nested functions & classes doesn't
3156 affect the code block we started in. */
3157 return NULL;
3158
3159 case return_stmt:
3160 if (NCH(kid) > 1)
3161 return kid;
3162 break;
3163
3164 default: {
3165 node *bad = look_for_offending_return(kid);
3166 if (bad != NULL)
3167 return bad;
3168 }
3169 }
3170 }
3171
3172 return NULL;
3173}
3174
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003175static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003176com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003177{
3178 int i;
3179 int anchor = 0;
3180 REQ(n, if_stmt);
3181 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3182 for (i = 0; i+3 < NCH(n); i+=4) {
3183 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003184 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003185 if (is_constant_false(c, ch)) {
3186 /* We're going to skip this block. However, if this
3187 is a generator, we have to check the dead code
3188 anyway to make sure there aren't any return stmts
3189 with expressions, in the same scope. */
3190 if (c->c_flags & CO_GENERATOR) {
3191 node *p = look_for_offending_return(n);
3192 if (p != NULL) {
3193 int savelineno = c->c_lineno;
3194 c->c_lineno = p->n_lineno;
3195 com_error(c, PyExc_SyntaxError,
3196 "'return' with argument "
3197 "inside generator");
3198 c->c_lineno = savelineno;
3199 }
3200 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003201 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003202 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003203 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003204 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003205 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003206 com_addfwref(c, JUMP_IF_FALSE, &a);
3207 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003208 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003209 com_node(c, CHILD(n, i+3));
3210 com_addfwref(c, JUMP_FORWARD, &anchor);
3211 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003212 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003213 com_addbyte(c, POP_TOP);
3214 }
3215 if (i+2 < NCH(n))
3216 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003217 if (anchor)
3218 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003219}
3220
3221static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003222com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003223{
3224 int break_anchor = 0;
3225 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003226 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003227 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3228 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003229 block_push(c, SETUP_LOOP);
3230 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003231 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003232 com_node(c, CHILD(n, 1));
3233 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3234 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003235 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003236 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003237 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003238 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003239 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3240 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003241 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003242 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003243 com_addbyte(c, POP_TOP);
3244 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003245 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003246 if (NCH(n) > 4)
3247 com_node(c, CHILD(n, 6));
3248 com_backpatch(c, break_anchor);
3249}
3250
3251static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003252com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003253{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003254 int break_anchor = 0;
3255 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003256 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003257 REQ(n, for_stmt);
3258 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3259 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003260 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003261 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003262 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003263 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003264 com_set_lineno(c, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003265 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003266 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003267 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003268 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003269 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003270 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003271 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3272 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003273 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003274 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003275 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003276 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003277 if (NCH(n) > 8)
3278 com_node(c, CHILD(n, 8));
3279 com_backpatch(c, break_anchor);
3280}
3281
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003282/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003283
3284 SETUP_FINALLY L
3285 <code for S>
3286 POP_BLOCK
3287 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003288 L: <code for Sf>
3289 END_FINALLY
3290
3291 The special instructions use the block stack. Each block
3292 stack entry contains the instruction that created it (here
3293 SETUP_FINALLY), the level of the value stack at the time the
3294 block stack entry was created, and a label (here L).
3295
3296 SETUP_FINALLY:
3297 Pushes the current value stack level and the label
3298 onto the block stack.
3299 POP_BLOCK:
3300 Pops en entry from the block stack, and pops the value
3301 stack until its level is the same as indicated on the
3302 block stack. (The label is ignored.)
3303 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003304 Pops a variable number of entries from the *value* stack
3305 and re-raises the exception they specify. The number of
3306 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003307
3308 The block stack is unwound when an exception is raised:
3309 when a SETUP_FINALLY entry is found, the exception is pushed
3310 onto the value stack (and the exception condition is cleared),
3311 and the interpreter jumps to the label gotten from the block
3312 stack.
3313
3314 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003315 (The contents of the value stack is shown in [], with the top
3316 at the right; 'tb' is trace-back info, 'val' the exception's
3317 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003318
3319 Value stack Label Instruction Argument
3320 [] SETUP_EXCEPT L1
3321 [] <code for S>
3322 [] POP_BLOCK
3323 [] JUMP_FORWARD L0
3324
Guido van Rossum3f5da241990-12-20 15:06:42 +00003325 [tb, val, exc] L1: DUP )
3326 [tb, val, exc, exc] <evaluate E1> )
3327 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3328 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3329 [tb, val, exc, 1] POP )
3330 [tb, val, exc] POP
3331 [tb, val] <assign to V1> (or POP if no V1)
3332 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003333 [] <code for S1>
3334 JUMP_FORWARD L0
3335
Guido van Rossum3f5da241990-12-20 15:06:42 +00003336 [tb, val, exc, 0] L2: POP
3337 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003338 .............................etc.......................
3339
Guido van Rossum3f5da241990-12-20 15:06:42 +00003340 [tb, val, exc, 0] Ln+1: POP
3341 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003342
3343 [] L0: <next statement>
3344
3345 Of course, parts are not generated if Vi or Ei is not present.
3346*/
3347
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003348static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003349com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003350{
3351 int except_anchor = 0;
3352 int end_anchor = 0;
3353 int else_anchor = 0;
3354 int i;
3355 node *ch;
3356
3357 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3358 block_push(c, SETUP_EXCEPT);
3359 com_node(c, CHILD(n, 2));
3360 com_addbyte(c, POP_BLOCK);
3361 block_pop(c, SETUP_EXCEPT);
3362 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3363 com_backpatch(c, except_anchor);
3364 for (i = 3;
3365 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3366 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003367 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003368 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003369 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003370 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003371 break;
3372 }
3373 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003374 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003375 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003376 if (NCH(ch) > 1) {
3377 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003378 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003379 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003380 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003381 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003382 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3383 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003384 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003385 }
3386 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003387 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003388 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003389 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003390 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003391 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003392 com_pop(c, 1);
3393 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003394 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003395 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003396 com_node(c, CHILD(n, i+2));
3397 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3398 if (except_anchor) {
3399 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003400 /* We come in with [tb, val, exc, 0] on the
3401 stack; one pop and it's the same as
3402 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003403 com_addbyte(c, POP_TOP);
3404 }
3405 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003406 /* We actually come in here with [tb, val, exc] but the
3407 END_FINALLY will zap those and jump around.
3408 The c_stacklevel does not reflect them so we need not pop
3409 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003410 com_addbyte(c, END_FINALLY);
3411 com_backpatch(c, else_anchor);
3412 if (i < NCH(n))
3413 com_node(c, CHILD(n, i+2));
3414 com_backpatch(c, end_anchor);
3415}
3416
3417static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003418com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003419{
3420 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003421 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003422
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003423 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3424 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003425 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003426 com_addbyte(c, POP_BLOCK);
3427 block_pop(c, SETUP_FINALLY);
3428 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003429 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003430 /* While the generated code pushes only one item,
3431 the try-finally handling can enter here with
3432 up to three items. OK, here are the details:
3433 3 for an exception, 2 for RETURN, 1 for BREAK. */
3434 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003435 com_backpatch(c, finally_anchor);
3436 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003437 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003438 com_node(c, ch);
3439 com_addbyte(c, END_FINALLY);
3440 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003441 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003442}
3443
3444static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003445com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003446{
3447 REQ(n, try_stmt);
3448 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3449 | 'try' ':' suite 'finally' ':' suite */
3450 if (TYPE(CHILD(n, 3)) != except_clause)
3451 com_try_finally(c, n);
3452 else
3453 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003454}
3455
Guido van Rossum8b993a91997-01-17 21:04:03 +00003456static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003457get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003458{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003459 int i;
3460
Guido van Rossum8b993a91997-01-17 21:04:03 +00003461 /* Label to avoid tail recursion */
3462 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003463 switch (TYPE(n)) {
3464
3465 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003466 if (NCH(n) == 1) {
3467 n = CHILD(n, 0);
3468 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003469 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003470 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003471 case file_input:
3472 for (i = 0; i < NCH(n); i++) {
3473 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003474 if (TYPE(ch) == stmt) {
3475 n = ch;
3476 goto next;
3477 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003478 }
3479 break;
3480
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003481 case stmt:
3482 case simple_stmt:
3483 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003484 n = CHILD(n, 0);
3485 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003486
3487 case expr_stmt:
3488 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003489 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003490 case test:
3491 case and_test:
3492 case not_test:
3493 case comparison:
3494 case expr:
3495 case xor_expr:
3496 case and_expr:
3497 case shift_expr:
3498 case arith_expr:
3499 case term:
3500 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003501 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003502 if (NCH(n) == 1) {
3503 n = CHILD(n, 0);
3504 goto next;
3505 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003506 break;
3507
3508 case atom:
3509 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003510 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003511 break;
3512
3513 }
3514 return NULL;
3515}
3516
Guido van Rossum79f25d91997-04-29 20:08:16 +00003517static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003518get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003519{
Guido van Rossum541563e1999-01-28 15:08:09 +00003520 /* Don't generate doc-strings if run with -OO */
3521 if (Py_OptimizeFlag > 1)
3522 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003523 n = get_rawdocstring(n);
3524 if (n == NULL)
3525 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003526 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003527}
3528
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003529static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003530com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003531{
3532 REQ(n, suite);
3533 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3534 if (NCH(n) == 1) {
3535 com_node(c, CHILD(n, 0));
3536 }
3537 else {
3538 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003539 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003540 node *ch = CHILD(n, i);
3541 if (TYPE(ch) == stmt)
3542 com_node(c, ch);
3543 }
3544 }
3545}
3546
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003547/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003548static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003549com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003550{
3551 int i = c->c_nblocks;
3552 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3553 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3554 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003555 else if (i <= 0) {
3556 /* at the outer level */
3557 com_error(c, PyExc_SyntaxError,
3558 "'continue' not properly in loop");
3559 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003560 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003561 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003562 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003563 if (c->c_block[j] == SETUP_LOOP)
3564 break;
3565 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003566 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003567 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003568 for (; i > j; --i) {
3569 if (c->c_block[i] == SETUP_EXCEPT ||
3570 c->c_block[i] == SETUP_FINALLY) {
3571 com_addoparg(c, CONTINUE_LOOP,
3572 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003573 return;
3574 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003575 if (c->c_block[i] == END_FINALLY) {
3576 com_error(c, PyExc_SyntaxError,
3577 "'continue' not supported inside 'finally' clause");
3578 return;
3579 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003580 }
3581 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003582 com_error(c, PyExc_SyntaxError,
3583 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003584 }
3585 /* XXX Could allow it inside a 'finally' clause
3586 XXX if we could pop the exception still on the stack */
3587}
3588
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003589static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003590com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003591{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003592 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003593 if (TYPE(n) == lambdef) {
3594 /* lambdef: 'lambda' [varargslist] ':' test */
3595 n = CHILD(n, 1);
3596 }
3597 else {
3598 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3599 n = CHILD(n, 2);
3600 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3601 n = CHILD(n, 1);
3602 }
3603 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003604 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003605 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003606 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003607 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3608 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003609 nargs = 0;
3610 ndefs = 0;
3611 for (i = 0; i < nch; i++) {
3612 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003613 if (TYPE(CHILD(n, i)) == STAR ||
3614 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003615 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003616 nargs++;
3617 i++;
3618 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003619 t = RPAR; /* Anything except EQUAL or COMMA */
3620 else
3621 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003622 if (t == EQUAL) {
3623 i++;
3624 ndefs++;
3625 com_node(c, CHILD(n, i));
3626 i++;
3627 if (i >= nch)
3628 break;
3629 t = TYPE(CHILD(n, i));
3630 }
3631 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003632 /* Treat "(a=1, b)" as an error */
3633 if (ndefs)
3634 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003635 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003636 }
3637 if (t != COMMA)
3638 break;
3639 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003640 return ndefs;
3641}
3642
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003643static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003644com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003645{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003646 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003647 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003648 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003649 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003650 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3651 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003652 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003653 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003654 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003655 c->c_errors++;
3656 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003657 int closure = com_make_closure(c, (PyCodeObject *)co);
3658 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003659 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003660 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003661 if (closure)
3662 com_addoparg(c, MAKE_CLOSURE, ndefs);
3663 else
3664 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003665 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003666 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003667 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003668 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003669 }
3670}
3671
3672static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003673com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003674{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003675 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003676 REQ(n, testlist);
3677 /* testlist: test (',' test)* [','] */
3678 for (i = 0; i < NCH(n); i += 2)
3679 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003680 i = (NCH(n)+1) / 2;
3681 com_addoparg(c, BUILD_TUPLE, i);
3682 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003683}
3684
3685static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003686com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003687{
Guido van Rossum25831651993-05-19 14:50:45 +00003688 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003689 PyObject *v;
3690 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003691 char *name;
3692
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003693 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003694 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003695 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003696 c->c_errors++;
3697 return;
3698 }
3699 /* Push the class name on the stack */
3700 i = com_addconst(c, v);
3701 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003702 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003703 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003704 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003705 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003706 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003707 com_push(c, 1);
3708 }
Guido van Rossum25831651993-05-19 14:50:45 +00003709 else
3710 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003711 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003712 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003713 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003714 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003715 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003716 c->c_errors++;
3717 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003718 int closure = com_make_closure(c, co);
3719 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003720 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003721 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003722 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003723 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003724 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003725 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003726 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003727 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003728 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003729 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003730 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003731 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003732 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003733 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003734}
3735
3736static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003737com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003738{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003739 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003740 if (c->c_errors)
3741 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003742 switch (TYPE(n)) {
3743
3744 /* Definition nodes */
3745
3746 case funcdef:
3747 com_funcdef(c, n);
3748 break;
3749 case classdef:
3750 com_classdef(c, n);
3751 break;
3752
3753 /* Trivial parse tree nodes */
3754
3755 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003756 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003757 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003758 n = CHILD(n, 0);
3759 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003760
3761 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003762 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003763 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003764 {
3765 int i;
3766 for (i = 0; i < NCH(n)-1; i += 2)
3767 com_node(c, CHILD(n, i));
3768 }
3769 break;
3770
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003771 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003772 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003773 n = CHILD(n, 0);
3774 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003775
3776 /* Statement nodes */
3777
3778 case expr_stmt:
3779 com_expr_stmt(c, n);
3780 break;
3781 case print_stmt:
3782 com_print_stmt(c, n);
3783 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003784 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003785 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003786 break;
3787 case pass_stmt:
3788 break;
3789 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003790 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003791 com_error(c, PyExc_SyntaxError,
3792 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003793 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003794 com_addbyte(c, BREAK_LOOP);
3795 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003796 case continue_stmt:
3797 com_continue_stmt(c, n);
3798 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003799 case return_stmt:
3800 com_return_stmt(c, n);
3801 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003802 case yield_stmt:
3803 com_yield_stmt(c, n);
3804 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003805 case raise_stmt:
3806 com_raise_stmt(c, n);
3807 break;
3808 case import_stmt:
3809 com_import_stmt(c, n);
3810 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003811 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003812 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003813 case exec_stmt:
3814 com_exec_stmt(c, n);
3815 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003816 case assert_stmt:
3817 com_assert_stmt(c, n);
3818 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003819 case if_stmt:
3820 com_if_stmt(c, n);
3821 break;
3822 case while_stmt:
3823 com_while_stmt(c, n);
3824 break;
3825 case for_stmt:
3826 com_for_stmt(c, n);
3827 break;
3828 case try_stmt:
3829 com_try_stmt(c, n);
3830 break;
3831 case suite:
3832 com_suite(c, n);
3833 break;
3834
3835 /* Expression nodes */
3836
3837 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003838 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00003839 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003840 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003841 break;
3842 case test:
3843 com_test(c, n);
3844 break;
3845 case and_test:
3846 com_and_test(c, n);
3847 break;
3848 case not_test:
3849 com_not_test(c, n);
3850 break;
3851 case comparison:
3852 com_comparison(c, n);
3853 break;
3854 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003855 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003856 break;
3857 case expr:
3858 com_expr(c, n);
3859 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003860 case xor_expr:
3861 com_xor_expr(c, n);
3862 break;
3863 case and_expr:
3864 com_and_expr(c, n);
3865 break;
3866 case shift_expr:
3867 com_shift_expr(c, n);
3868 break;
3869 case arith_expr:
3870 com_arith_expr(c, n);
3871 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003872 case term:
3873 com_term(c, n);
3874 break;
3875 case factor:
3876 com_factor(c, n);
3877 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003878 case power:
3879 com_power(c, n);
3880 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003881 case atom:
3882 com_atom(c, n);
3883 break;
3884
3885 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003886 com_error(c, PyExc_SystemError,
3887 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003888 }
3889}
3890
Tim Petersdbd9ba62000-07-09 03:09:57 +00003891static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003892
3893static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003894com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003895{
3896 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3897 if (TYPE(CHILD(n, 0)) == LPAR)
3898 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003899 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003900 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003901 com_pop(c, 1);
3902 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003903}
3904
3905static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003906com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003907{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003908 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003909 if (NCH(n) == 1) {
3910 com_fpdef(c, CHILD(n, 0));
3911 }
3912 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003913 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003914 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003915 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003916 for (i = 0; i < NCH(n); i += 2)
3917 com_fpdef(c, CHILD(n, i));
3918 }
3919}
3920
3921static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003922com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003923{
Guido van Rossum633d90c2002-12-23 16:51:42 +00003924 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003925 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00003926 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003927 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003928 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003929 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00003930 nch = NCH(n);
3931 /* Enter all arguments in table of locals */
3932 for (i = 0, narg = 0; i < nch; i++) {
3933 node *ch = CHILD(n, i);
3934 node *fp;
3935 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003936 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00003937 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3938 fp = CHILD(ch, 0);
3939 if (TYPE(fp) != NAME) {
3940 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
3941 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00003942 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00003943 narg++;
3944 /* all name updates handled by symtable */
3945 if (++i >= nch)
3946 break;
3947 ch = CHILD(n, i);
3948 if (TYPE(ch) == EQUAL)
3949 i += 2;
3950 else
3951 REQ(ch, COMMA);
3952 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003953 if (complex) {
3954 /* Generate code for complex arguments only after
3955 having counted the simple arguments */
3956 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00003957 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003958 node *ch = CHILD(n, i);
3959 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003960 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003961 break;
3962 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3963 fp = CHILD(ch, 0);
3964 if (TYPE(fp) != NAME) {
3965 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003966 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003967 com_fpdef(c, ch);
3968 }
3969 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00003970 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003971 break;
3972 ch = CHILD(n, i);
3973 if (TYPE(ch) == EQUAL)
3974 i += 2;
3975 else
3976 REQ(ch, COMMA);
3977 }
3978 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003979}
3980
3981static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003982com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003983{
3984 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003985 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003986 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003987 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003988 if (doc != NULL) {
3989 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003990 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003991 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003992 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003993 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003994 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003995 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003996 for (i = 0; i < NCH(n); i++) {
3997 node *ch = CHILD(n, i);
3998 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3999 com_node(c, ch);
4000 }
4001}
4002
4003/* Top-level compile-node interface */
4004
4005static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004006compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004007{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004008 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004009 node *ch;
4010 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00004011 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004012 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004013 if (doc != NULL) {
4014 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004015 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004016 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004017 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004018 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004019 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
4020 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004021 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004022 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004023 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004024 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004025 c->c_infunction = 0;
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004026 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4027 com_push(c, 1);
4028 com_addbyte(c, RETURN_VALUE);
4029 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004030}
4031
4032static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004033compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004034{
Guido van Rossum590baa41993-11-30 13:40:46 +00004035 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004036 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004037 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004038
4039 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004040 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004041 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004042 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004043 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004044 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004045 else
4046 ch = CHILD(n, 2);
4047 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004048 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004049 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004050}
4051
4052static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004053compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004054{
4055 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004056 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004057 REQ(n, classdef);
4058 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4059 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004060 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004061 /* Initialize local __module__ from global __name__ */
4062 com_addop_name(c, LOAD_GLOBAL, "__name__");
4063 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004064 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004065 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004066 if (doc != NULL) {
4067 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004068 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004069 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004070 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004071 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004072 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004073 }
4074 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004075 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004076 com_node(c, ch);
4077 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004078 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004079 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004080 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004081}
4082
4083static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004084compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004085{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004086 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004087
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004088 switch (TYPE(n)) {
4089
Guido van Rossum4c417781991-01-21 16:09:22 +00004090 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004091 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004092 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004093 n = CHILD(n, 0);
4094 if (TYPE(n) != NEWLINE)
4095 com_node(c, n);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004096 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4097 com_push(c, 1);
4098 com_addbyte(c, RETURN_VALUE);
4099 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004100 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004101 break;
4102
Guido van Rossum4c417781991-01-21 16:09:22 +00004103 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004104 com_file_input(c, n);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004105 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4106 com_push(c, 1);
4107 com_addbyte(c, RETURN_VALUE);
4108 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004109 break;
4110
Guido van Rossum590baa41993-11-30 13:40:46 +00004111 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004112 com_node(c, CHILD(n, 0));
4113 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004114 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004115 break;
4116
Guido van Rossum590baa41993-11-30 13:40:46 +00004117 case lambdef: /* anonymous function definition */
4118 compile_lambdef(c, n);
4119 break;
4120
Guido van Rossum4c417781991-01-21 16:09:22 +00004121 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004122 compile_funcdef(c, n);
4123 break;
4124
Guido van Rossum4c417781991-01-21 16:09:22 +00004125 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004126 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004127 break;
4128
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004129 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004130 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004131 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004132 }
4133}
4134
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004135static PyObject *
4136dict_keys_inorder(PyObject *dict, int offset)
4137{
4138 PyObject *tuple, *k, *v;
4139 int i, pos = 0, size = PyDict_Size(dict);
4140
4141 tuple = PyTuple_New(size);
4142 if (tuple == NULL)
4143 return NULL;
4144 while (PyDict_Next(dict, &pos, &k, &v)) {
4145 i = PyInt_AS_LONG(v);
4146 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004147 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004148 PyTuple_SET_ITEM(tuple, i - offset, k);
4149 }
4150 return tuple;
4151}
4152
Guido van Rossum79f25d91997-04-29 20:08:16 +00004153PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004154PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004155{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004156 return PyNode_CompileFlags(n, filename, NULL);
4157}
4158
4159PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004160PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004161{
4162 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004163}
4164
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004165struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004166PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004167{
4168 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004169 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004170
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004171 ff = PyNode_Future(n, filename);
4172 if (ff == NULL)
4173 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004174
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004175 st = symtable_init();
Tim Peters8c5e4152001-11-04 19:26:58 +00004176 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004177 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004178 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004179 }
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004180 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004181 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004182 if (st->st_errors > 0)
4183 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004184 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004185 if (st->st_errors > 0)
4186 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004187
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004188 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004189 fail:
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004190 PyObject_FREE((void *)ff);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004191 st->st_future = NULL;
4192 PySymtable_Free(st);
4193 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004194}
4195
Guido van Rossum79f25d91997-04-29 20:08:16 +00004196static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004197icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004198{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004199 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004200}
4201
Guido van Rossum79f25d91997-04-29 20:08:16 +00004202static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004203jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004204 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004205{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004206 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004207 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004208 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004209 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004210 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4211 sc.c_encoding = "utf-8";
4212 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004213 sc.c_encoding = STR(n);
4214 n = CHILD(n, 0);
4215 } else {
4216 sc.c_encoding = NULL;
4217 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004218 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004219 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004220 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004221 /* c_symtable still points to parent's symbols */
4222 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004223 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004224 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004225 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004226 if (base->c_encoding != NULL) {
4227 assert(sc.c_encoding == NULL);
4228 sc.c_encoding = base->c_encoding;
4229 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004230 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004231 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004232 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004233 if (sc.c_future == NULL) {
4234 com_free(&sc);
4235 return NULL;
4236 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004237 if (flags) {
4238 int merged = sc.c_future->ff_features |
4239 flags->cf_flags;
4240 sc.c_future->ff_features = merged;
4241 flags->cf_flags = merged;
4242 }
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004243 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004244 com_free(&sc);
4245 return NULL;
4246 }
4247 }
4248 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004249 if (symtable_load_symbols(&sc) < 0) {
4250 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004251 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004252 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004253 compile_node(&sc, n);
4254 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004255 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004256 PyObject *consts, *names, *varnames, *filename, *name,
4257 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004258 consts = PyList_AsTuple(sc.c_consts);
4259 names = PyList_AsTuple(sc.c_names);
4260 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004261 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4262 freevars = dict_keys_inorder(sc.c_freevars,
4263 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004264 filename = PyString_InternFromString(sc.c_filename);
4265 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004266 if (!PyErr_Occurred())
4267 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004268 sc.c_nlocals,
4269 sc.c_maxstacklevel,
4270 sc.c_flags,
4271 sc.c_code,
4272 consts,
4273 names,
4274 varnames,
4275 freevars,
4276 cellvars,
4277 filename,
4278 name,
4279 sc.c_firstlineno,
4280 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004281 Py_XDECREF(consts);
4282 Py_XDECREF(names);
4283 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004284 Py_XDECREF(freevars);
4285 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004286 Py_XDECREF(filename);
4287 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004288 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004289 else if (!PyErr_Occurred()) {
4290 /* This could happen if someone called PyErr_Clear() after an
4291 error was reported above. That's not supposed to happen,
4292 but I just plugged one case and I'm not sure there can't be
4293 others. In that case, raise SystemError so that at least
4294 it gets reported instead dumping core. */
4295 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4296 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004297 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004298 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004299 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004300 sc.c_symtable = NULL;
4301 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004302 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004303 return co;
4304}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004305
4306int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004307PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004308{
4309 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004310 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004311 int line = co->co_firstlineno;
4312 int addr = 0;
4313 while (--size >= 0) {
4314 addr += *p++;
4315 if (addr > addrq)
4316 break;
4317 line += *p++;
4318 }
4319 return line;
4320}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004321
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004322/* The test for LOCAL must come before the test for FREE in order to
4323 handle classes where name is both local and free. The local var is
4324 a method and the free var is a free var referenced within a method.
4325*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004326
4327static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004328get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004329{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004330 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004331 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004332
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004333 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4334 return CELL;
4335 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4336 return LOCAL;
4337 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4338 return FREE;
4339 v = PyDict_GetItemString(c->c_globals, name);
4340 if (v) {
4341 if (v == Py_None)
4342 return GLOBAL_EXPLICIT;
4343 else {
4344 return GLOBAL_IMPLICIT;
4345 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004346 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004347 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004348 "unknown scope for %.100s in %.100s(%s) "
4349 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4350 name, c->c_name,
4351 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4352 c->c_filename,
4353 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4354 PyObject_REPR(c->c_locals),
4355 PyObject_REPR(c->c_globals)
4356 );
4357
4358 Py_FatalError(buf);
4359 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004360}
4361
Guido van Rossum207fda62001-03-02 03:30:41 +00004362/* Helper functions to issue warnings */
4363
4364static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004365issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004366{
4367 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4368 lineno, NULL, NULL) < 0) {
4369 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4370 PyErr_SetString(PyExc_SyntaxError, msg);
4371 PyErr_SyntaxLocation(filename, lineno);
4372 }
4373 return -1;
4374 }
4375 return 0;
4376}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004377
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004378static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004379symtable_warn(struct symtable *st, char *msg)
4380{
Guido van Rossum207fda62001-03-02 03:30:41 +00004381 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004382 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004383 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004384 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004385 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004386}
4387
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004388/* Helper function for setting lineno and filename */
4389
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004390static int
4391symtable_build(struct compiling *c, node *n)
4392{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004393 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004394 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004395 c->c_symtable->st_future = c->c_future;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004396 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004397 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4398 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004399 return -1;
4400 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004401 if (c->c_symtable->st_errors > 0)
4402 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004403 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004404 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004405 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004406 return 0;
4407}
4408
4409static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004410symtable_init_compiling_symbols(struct compiling *c)
4411{
4412 PyObject *varnames;
4413
4414 varnames = c->c_symtable->st_cur->ste_varnames;
4415 if (varnames == NULL) {
4416 varnames = PyList_New(0);
4417 if (varnames == NULL)
4418 return -1;
4419 c->c_symtable->st_cur->ste_varnames = varnames;
4420 Py_INCREF(varnames);
4421 } else
4422 Py_INCREF(varnames);
4423 c->c_varnames = varnames;
4424
4425 c->c_globals = PyDict_New();
4426 if (c->c_globals == NULL)
4427 return -1;
4428 c->c_freevars = PyDict_New();
4429 if (c->c_freevars == NULL)
4430 return -1;
4431 c->c_cellvars = PyDict_New();
4432 if (c->c_cellvars == NULL)
4433 return -1;
4434 return 0;
4435}
4436
4437struct symbol_info {
4438 int si_nlocals;
4439 int si_ncells;
4440 int si_nfrees;
4441 int si_nimplicit;
4442};
4443
4444static void
4445symtable_init_info(struct symbol_info *si)
4446{
4447 si->si_nlocals = 0;
4448 si->si_ncells = 0;
4449 si->si_nfrees = 0;
4450 si->si_nimplicit = 0;
4451}
4452
4453static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004454symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004455 struct symbol_info *si)
4456{
4457 PyObject *dict, *v;
4458
4459 /* Seperate logic for DEF_FREE. If it occurs in a function,
4460 it indicates a local that we must allocate storage for (a
4461 cell var). If it occurs in a class, then the class has a
4462 method and a free variable with the same name.
4463 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004464 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004465 /* If it isn't declared locally, it can't be a cell. */
4466 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4467 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004468 v = PyInt_FromLong(si->si_ncells++);
4469 dict = c->c_cellvars;
4470 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004471 /* If it is free anyway, then there is no need to do
4472 anything here.
4473 */
4474 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004475 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004476 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004477 v = PyInt_FromLong(si->si_nfrees++);
4478 dict = c->c_freevars;
4479 }
4480 if (v == NULL)
4481 return -1;
4482 if (PyDict_SetItem(dict, name, v) < 0) {
4483 Py_DECREF(v);
4484 return -1;
4485 }
4486 Py_DECREF(v);
4487 return 0;
4488}
4489
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004490/* If a variable is a cell and an argument, make sure that appears in
4491 co_cellvars before any variable to its right in varnames.
4492*/
4493
4494
4495static int
4496symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4497 PyObject *varnames, int flags)
4498{
4499 PyObject *v, *w, *d, *list = NULL;
4500 int i, pos;
4501
4502 if (flags & CO_VARARGS)
4503 argcount++;
4504 if (flags & CO_VARKEYWORDS)
4505 argcount++;
4506 for (i = argcount; --i >= 0; ) {
4507 v = PyList_GET_ITEM(varnames, i);
4508 if (PyDict_GetItem(*cellvars, v)) {
4509 if (list == NULL) {
4510 list = PyList_New(1);
4511 if (list == NULL)
4512 return -1;
4513 PyList_SET_ITEM(list, 0, v);
4514 Py_INCREF(v);
4515 } else
4516 PyList_Insert(list, 0, v);
4517 }
4518 }
4519 if (list == NULL || PyList_GET_SIZE(list) == 0)
4520 return 0;
4521 /* There are cellvars that are also arguments. Create a dict
4522 to replace cellvars and put the args at the front.
4523 */
4524 d = PyDict_New();
4525 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4526 v = PyInt_FromLong(i);
4527 if (v == NULL)
4528 goto fail;
4529 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4530 goto fail;
4531 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4532 goto fail;
4533 }
4534 pos = 0;
4535 i = PyList_GET_SIZE(list);
4536 Py_DECREF(list);
4537 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4538 w = PyInt_FromLong(i++); /* don't care about the old key */
4539 if (PyDict_SetItem(d, v, w) < 0) {
4540 Py_DECREF(w);
4541 goto fail;
4542 }
4543 Py_DECREF(w);
4544 }
4545 Py_DECREF(*cellvars);
4546 *cellvars = d;
4547 return 1;
4548 fail:
4549 Py_DECREF(d);
4550 return -1;
4551}
4552
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004553static int
4554symtable_freevar_offsets(PyObject *freevars, int offset)
4555{
4556 PyObject *name, *v;
4557 int pos;
4558
4559 /* The cell vars are the first elements of the closure,
4560 followed by the free vars. Update the offsets in
4561 c_freevars to account for number of cellvars. */
4562 pos = 0;
4563 while (PyDict_Next(freevars, &pos, &name, &v)) {
4564 int i = PyInt_AS_LONG(v) + offset;
4565 PyObject *o = PyInt_FromLong(i);
4566 if (o == NULL)
4567 return -1;
4568 if (PyDict_SetItem(freevars, name, o) < 0) {
4569 Py_DECREF(o);
4570 return -1;
4571 }
4572 Py_DECREF(o);
4573 }
4574 return 0;
4575}
4576
4577static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004578symtable_check_unoptimized(struct compiling *c,
4579 PySymtableEntryObject *ste,
4580 struct symbol_info *si)
4581{
4582 char buf[300];
4583
4584 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4585 || (ste->ste_nested && si->si_nimplicit)))
4586 return 0;
4587
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004588#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4589
4590#define ILLEGAL_IS "is a nested function"
4591
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004592#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004593"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004594
4595#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004596"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004597
4598#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00004599"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004600"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004601
4602 /* XXX perhaps the linenos for these opt-breaking statements
4603 should be stored so the exception can point to them. */
4604
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004605 if (ste->ste_child_free) {
4606 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004607 PyOS_snprintf(buf, sizeof(buf),
4608 ILLEGAL_IMPORT_STAR,
4609 PyString_AS_STRING(ste->ste_name),
4610 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004611 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004612 PyOS_snprintf(buf, sizeof(buf),
4613 ILLEGAL_BARE_EXEC,
4614 PyString_AS_STRING(ste->ste_name),
4615 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004616 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004617 PyOS_snprintf(buf, sizeof(buf),
4618 ILLEGAL_EXEC_AND_IMPORT_STAR,
4619 PyString_AS_STRING(ste->ste_name),
4620 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004621 }
4622 } else {
4623 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004624 PyOS_snprintf(buf, sizeof(buf),
4625 ILLEGAL_IMPORT_STAR,
4626 PyString_AS_STRING(ste->ste_name),
4627 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004628 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004629 PyOS_snprintf(buf, sizeof(buf),
4630 ILLEGAL_BARE_EXEC,
4631 PyString_AS_STRING(ste->ste_name),
4632 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004633 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004634 PyOS_snprintf(buf, sizeof(buf),
4635 ILLEGAL_EXEC_AND_IMPORT_STAR,
4636 PyString_AS_STRING(ste->ste_name),
4637 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004638 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004639 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004640
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004641 PyErr_SetString(PyExc_SyntaxError, buf);
4642 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4643 ste->ste_opt_lineno);
4644 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004645}
4646
4647static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004648symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4649 struct symbol_info *si)
4650{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004651 if (c->c_future)
4652 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004653 if (ste->ste_generator)
4654 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004655 if (ste->ste_type != TYPE_MODULE)
4656 c->c_flags |= CO_NEWLOCALS;
4657 if (ste->ste_type == TYPE_FUNCTION) {
4658 c->c_nlocals = si->si_nlocals;
4659 if (ste->ste_optimized == 0)
4660 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004661 else if (ste->ste_optimized != OPT_EXEC)
4662 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004663 }
4664 return 0;
4665}
4666
4667static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004668symtable_load_symbols(struct compiling *c)
4669{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004670 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004671 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004672 PyObject *name, *varnames, *v;
4673 int i, flags, pos;
4674 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004675
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004676 v = NULL;
4677
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004678 if (symtable_init_compiling_symbols(c) < 0)
4679 goto fail;
4680 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004681 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004682 si.si_nlocals = PyList_GET_SIZE(varnames);
4683 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004684
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004685 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004686 v = PyInt_FromLong(i);
4687 if (PyDict_SetItem(c->c_locals,
4688 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004689 goto fail;
4690 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004691 }
4692
4693 /* XXX The cases below define the rules for whether a name is
4694 local or global. The logic could probably be clearer. */
4695 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004696 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4697 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004698
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004699 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004700 /* undo the original DEF_FREE */
4701 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004702
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004703 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004704 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004705 2. Free variables in methods that are also class
4706 variables or declared global.
4707 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004708 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004709 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004710
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004711 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004712 c->c_argcount--;
4713 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004714 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004715 c->c_argcount--;
4716 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004717 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004718 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004719 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004720 if (flags & DEF_PARAM) {
4721 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004722 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004723 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004724 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004725 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004726 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004727 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004728 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4729 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004730 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004731 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00004732 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004733 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004734 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004735 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004736 if (v == NULL)
4737 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004738 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004739 goto fail;
4740 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004741 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004742 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004743 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004744 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004745 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004746 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004747 if (v == NULL)
4748 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004749 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004750 goto fail;
4751 Py_DECREF(v);
4752 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004753 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004754 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00004755 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004756 goto fail;
4757 if (st->st_nscopes != 1) {
4758 v = PyInt_FromLong(flags);
4759 if (PyDict_SetItem(st->st_global,
4760 name, v))
4761 goto fail;
4762 Py_DECREF(v);
4763 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004764 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004765 }
4766 }
4767
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004768 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4769
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004770 if (si.si_ncells > 1) { /* one cell is always in order */
4771 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4772 c->c_varnames, c->c_flags) < 0)
4773 return -1;
4774 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004775 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4776 return -1;
4777 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004778 fail:
4779 /* is this always the right thing to do? */
4780 Py_XDECREF(v);
4781 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004782}
4783
4784static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004785symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004786{
4787 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004788
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004789 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004790 if (st == NULL)
4791 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004792 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00004793
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004794 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004795 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004796 goto fail;
4797 if ((st->st_symbols = PyDict_New()) == NULL)
4798 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004799 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004800 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004801 st->st_errors = 0;
4802 st->st_tmpname = 0;
4803 st->st_private = NULL;
4804 return st;
4805 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004806 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004807 return NULL;
4808}
4809
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004810void
4811PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004812{
4813 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004814 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004815 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004816 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004817}
4818
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004819/* When the compiler exits a scope, it must should update the scope's
4820 free variable information with the list of free variables in its
4821 children.
4822
4823 Variables that are free in children and defined in the current
4824 scope are cellvars.
4825
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004826 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004827 false), free variables in children that are not defined here are
4828 implicit globals.
4829
4830*/
4831
4832static int
4833symtable_update_free_vars(struct symtable *st)
4834{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004835 int i, j, def;
4836 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004837 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004838
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004839 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004840 def = DEF_FREE_CLASS;
4841 else
4842 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004843 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004844 int pos = 0;
4845
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004846 if (list)
4847 PyList_SetSlice(list, 0,
4848 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004849 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004850 PyList_GET_ITEM(ste->ste_children, i);
4851 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004852 int flags = PyInt_AS_LONG(o);
4853 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004854 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004855 if (list == NULL) {
4856 list = PyList_New(0);
4857 if (list == NULL)
4858 return -1;
4859 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004860 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004861 if (PyList_Append(list, name) < 0) {
4862 Py_DECREF(list);
4863 return -1;
4864 }
4865 }
4866 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004867 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004868 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004869 v = PyDict_GetItem(ste->ste_symbols, name);
4870 /* If a name N is declared global in scope A and
4871 referenced in scope B contained (perhaps
4872 indirectly) in A and there are no scopes
4873 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004874 is global in B. Unless A is a class scope,
4875 because class scopes are not considered for
4876 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004877 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004878 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004879 int flags = PyInt_AS_LONG(v);
4880 if (flags & DEF_GLOBAL) {
4881 symtable_undo_free(st, child->ste_id,
4882 name);
4883 continue;
4884 }
4885 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004886 if (ste->ste_nested) {
4887 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004888 name, def) < 0) {
4889 Py_DECREF(list);
4890 return -1;
4891 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004892 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004893 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004894 name) < 0) {
4895 Py_DECREF(list);
4896 return -1;
4897 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004898 }
4899 }
4900 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004901
4902 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004903 return 0;
4904}
4905
4906/* If the current scope is a non-nested class or if name is not
4907 defined in the current, non-nested scope, then it is an implicit
4908 global in all nested scopes.
4909*/
4910
4911static int
4912symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4913{
4914 PyObject *o;
4915 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004916 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004917
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004918 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004919 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004920 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004921 if (o == NULL)
4922 return symtable_undo_free(st, child, name);
4923 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004924
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004925 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004926 return symtable_undo_free(st, child, name);
4927 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004928 return symtable_add_def_o(st, ste->ste_symbols,
4929 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004930}
4931
4932static int
4933symtable_undo_free(struct symtable *st, PyObject *id,
4934 PyObject *name)
4935{
4936 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004937 PyObject *info;
4938 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004939
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004940 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4941 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004942 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00004943
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004944 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004945 if (info == NULL)
4946 return 0;
4947 v = PyInt_AS_LONG(info);
4948 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004949 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004950 DEF_FREE_GLOBAL) < 0)
4951 return -1;
4952 } else
4953 /* If the name is defined here or declared global,
4954 then the recursion stops. */
4955 return 0;
4956
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004957 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4958 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004959 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004960 PyList_GET_ITEM(ste->ste_children, i);
4961 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004962 if (x < 0)
4963 return x;
4964 }
4965 return 0;
4966}
4967
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004968/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4969 This reference is released when the scope is exited, via the DECREF
4970 in symtable_exit_scope().
4971*/
4972
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004973static int
4974symtable_exit_scope(struct symtable *st)
4975{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004976 int end;
4977
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004978 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004979 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004980 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004981 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004982 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4983 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004984 if (PySequence_DelItem(st->st_stack, end) < 0)
4985 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004986 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004987}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004988
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004989static void
4990symtable_enter_scope(struct symtable *st, char *name, int type,
4991 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004992{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004993 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004994
4995 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004996 prev = st->st_cur;
4997 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4998 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004999 st->st_errors++;
5000 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005001 }
5002 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005003 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005004 PySymtableEntry_New(st, name, type, lineno);
5005 if (strcmp(name, TOP) == 0)
5006 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005007 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005008 if (PyList_Append(prev->ste_children,
5009 (PyObject *)st->st_cur) < 0)
5010 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005011 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005012}
5013
5014static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005015symtable_lookup(struct symtable *st, char *name)
5016{
5017 char buffer[MANGLE_LEN];
5018 PyObject *v;
5019 int flags;
5020
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005021 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005022 name = buffer;
5023 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5024 if (v == NULL) {
5025 if (PyErr_Occurred())
5026 return -1;
5027 else
5028 return 0;
5029 }
5030
5031 flags = PyInt_AS_LONG(v);
5032 return flags;
5033}
5034
5035static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005036symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005037{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005038 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005039 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005040 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005041
Guido van Rossumb7164622002-08-16 02:48:11 +00005042 /* Warn about None, except inside a tuple (where the assignment
5043 code already issues a warning). */
5044 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5045 *name == 'N' && strcmp(name, "None") == 0)
5046 {
5047 if (symtable_warn(st, "argument named None"))
5048 return -1;
5049 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005050 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005051 name = buffer;
5052 if ((s = PyString_InternFromString(name)) == NULL)
5053 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005054 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5055 Py_DECREF(s);
5056 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005057}
5058
5059/* Must only be called with mangled names */
5060
5061static int
5062symtable_add_def_o(struct symtable *st, PyObject *dict,
5063 PyObject *name, int flag)
5064{
5065 PyObject *o;
5066 int val;
5067
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005068 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005069 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005070 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005071 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005072 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005073 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005074 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005075 return -1;
5076 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005077 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005078 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005079 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005080 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005081 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005082 Py_DECREF(o);
5083 return -1;
5084 }
5085 Py_DECREF(o);
5086
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005087 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005088 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005089 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005090 } else if (flag & DEF_GLOBAL) {
5091 /* XXX need to update DEF_GLOBAL for other flags too;
5092 perhaps only DEF_FREE_GLOBAL */
5093 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005094 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005095 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005096 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005097 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005098 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005099 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005100 Py_DECREF(o);
5101 return -1;
5102 }
5103 Py_DECREF(o);
5104 }
5105 return 0;
5106}
5107
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005108#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005109
Tim Peters08a898f2001-06-28 01:52:22 +00005110/* Look for a yield stmt under n. Return 1 if found, else 0.
5111 This hack is used to look inside "if 0:" blocks (which are normally
5112 ignored) in case those are the only places a yield occurs (so that this
5113 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005114static int
5115look_for_yield(node *n)
5116{
5117 int i;
5118
5119 for (i = 0; i < NCH(n); ++i) {
5120 node *kid = CHILD(n, i);
5121
5122 switch (TYPE(kid)) {
5123
5124 case classdef:
5125 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005126 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005127 /* Stuff in nested functions and classes can't make
5128 the parent a generator. */
5129 return 0;
5130
5131 case yield_stmt:
5132 return 1;
5133
5134 default:
5135 if (look_for_yield(kid))
5136 return 1;
5137 }
5138 }
5139 return 0;
5140}
5141
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005142static void
5143symtable_node(struct symtable *st, node *n)
5144{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005145 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005146
5147 loop:
5148 switch (TYPE(n)) {
5149 case funcdef: {
5150 char *func_name = STR(CHILD(n, 1));
5151 symtable_add_def(st, func_name, DEF_LOCAL);
5152 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005153 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005154 symtable_funcdef(st, n);
5155 symtable_exit_scope(st);
5156 break;
5157 }
5158 case lambdef:
5159 if (NCH(n) == 4)
5160 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005161 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005162 symtable_funcdef(st, n);
5163 symtable_exit_scope(st);
5164 break;
5165 case classdef: {
5166 char *tmp, *class_name = STR(CHILD(n, 1));
5167 symtable_add_def(st, class_name, DEF_LOCAL);
5168 if (TYPE(CHILD(n, 2)) == LPAR) {
5169 node *bases = CHILD(n, 3);
5170 int i;
5171 for (i = 0; i < NCH(bases); i += 2) {
5172 symtable_node(st, CHILD(bases, i));
5173 }
5174 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005175 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005176 tmp = st->st_private;
5177 st->st_private = class_name;
5178 symtable_node(st, CHILD(n, NCH(n) - 1));
5179 st->st_private = tmp;
5180 symtable_exit_scope(st);
5181 break;
5182 }
5183 case if_stmt:
5184 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005185 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5186 if (st->st_cur->ste_generator == 0)
5187 st->st_cur->ste_generator =
5188 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005189 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005190 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005191 symtable_node(st, CHILD(n, i + 1));
5192 symtable_node(st, CHILD(n, i + 3));
5193 }
5194 if (i + 2 < NCH(n))
5195 symtable_node(st, CHILD(n, i + 2));
5196 break;
5197 case global_stmt:
5198 symtable_global(st, n);
5199 break;
5200 case import_stmt:
5201 symtable_import(st, n);
5202 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005203 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005204 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005205 symtable_node(st, CHILD(n, 1));
5206 if (NCH(n) > 2)
5207 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005208 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005209 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005210 st->st_cur->ste_opt_lineno = n->n_lineno;
5211 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005212 if (NCH(n) > 4)
5213 symtable_node(st, CHILD(n, 5));
5214 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005215
5216 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005217 case assert_stmt:
5218 if (Py_OptimizeFlag)
5219 return;
5220 if (NCH(n) == 2) {
5221 n = CHILD(n, 1);
5222 goto loop;
5223 } else {
5224 symtable_node(st, CHILD(n, 1));
5225 n = CHILD(n, 3);
5226 goto loop;
5227 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005228 case except_clause:
5229 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005230 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005231 if (NCH(n) > 1) {
5232 n = CHILD(n, 1);
5233 goto loop;
5234 }
5235 break;
5236 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005237 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005238 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005239 case yield_stmt:
5240 st->st_cur->ste_generator = 1;
5241 n = CHILD(n, 1);
5242 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005243 case expr_stmt:
5244 if (NCH(n) == 1)
5245 n = CHILD(n, 0);
5246 else {
5247 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005248 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005249 symtable_node(st, CHILD(n, 2));
5250 break;
5251 } else {
5252 int i;
5253 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005254 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005255 n = CHILD(n, NCH(n) - 1);
5256 }
5257 }
5258 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005259 case list_iter:
5260 n = CHILD(n, 0);
5261 if (TYPE(n) == list_for) {
5262 st->st_tmpname++;
5263 symtable_list_comprehension(st, n);
5264 st->st_tmpname--;
5265 } else {
5266 REQ(n, list_if);
5267 symtable_node(st, CHILD(n, 1));
5268 if (NCH(n) == 3) {
5269 n = CHILD(n, 2);
5270 goto loop;
5271 }
5272 }
5273 break;
5274 case for_stmt:
5275 symtable_assign(st, CHILD(n, 1), 0);
5276 for (i = 3; i < NCH(n); ++i)
5277 if (TYPE(CHILD(n, i)) >= single_input)
5278 symtable_node(st, CHILD(n, i));
5279 break;
5280 /* The remaining cases fall through to default except in
5281 special circumstances. This requires the individual cases
5282 to be coded with great care, even though they look like
5283 rather innocuous. Each case must double-check TYPE(n).
5284 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005285 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005286 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005287 n = CHILD(n, 2);
5288 goto loop;
5289 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005290 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005291 case listmaker:
5292 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00005293 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005294 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00005295 symtable_node(st, CHILD(n, 0));
5296 st->st_tmpname--;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005297 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005298 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005299 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005300 case atom:
5301 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5302 symtable_add_use(st, STR(CHILD(n, 0)));
5303 break;
5304 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005305 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005306 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005307 /* Walk over every non-token child with a special case
5308 for one child.
5309 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005310 if (NCH(n) == 1) {
5311 n = CHILD(n, 0);
5312 goto loop;
5313 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005314 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005315 if (TYPE(CHILD(n, i)) >= single_input)
5316 symtable_node(st, CHILD(n, i));
5317 }
5318}
5319
5320static void
5321symtable_funcdef(struct symtable *st, node *n)
5322{
5323 node *body;
5324
5325 if (TYPE(n) == lambdef) {
5326 if (NCH(n) == 4)
5327 symtable_params(st, CHILD(n, 1));
5328 } else
5329 symtable_params(st, CHILD(n, 2));
5330 body = CHILD(n, NCH(n) - 1);
5331 symtable_node(st, body);
5332}
5333
5334/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00005335 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005336 which are references in the defining scope. symtable_params()
5337 parses the parameter names, which are defined in the function's
5338 body.
5339
5340 varargslist:
5341 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5342 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5343*/
5344
5345static void
5346symtable_default_args(struct symtable *st, node *n)
5347{
5348 node *c;
5349 int i;
5350
5351 if (TYPE(n) == parameters) {
5352 n = CHILD(n, 1);
5353 if (TYPE(n) == RPAR)
5354 return;
5355 }
5356 REQ(n, varargslist);
5357 for (i = 0; i < NCH(n); i += 2) {
5358 c = CHILD(n, i);
5359 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5360 break;
5361 }
5362 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5363 symtable_node(st, CHILD(n, i));
5364 }
5365}
5366
5367static void
5368symtable_params(struct symtable *st, node *n)
5369{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005370 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00005371 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005372
5373 if (TYPE(n) == parameters) {
5374 n = CHILD(n, 1);
5375 if (TYPE(n) == RPAR)
5376 return;
5377 }
5378 REQ(n, varargslist);
5379 for (i = 0; i < NCH(n); i += 2) {
5380 c = CHILD(n, i);
5381 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5382 ext = 1;
5383 break;
5384 }
5385 if (TYPE(c) == test) {
5386 continue;
5387 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00005388 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005389 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00005390 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005391 char nbuf[30];
5392 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005393 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005394 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005395 }
5396 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005397 if (ext) {
5398 c = CHILD(n, i);
5399 if (TYPE(c) == STAR) {
5400 i++;
5401 symtable_add_def(st, STR(CHILD(n, i)),
5402 DEF_PARAM | DEF_STAR);
5403 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005404 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005405 c = NULL;
5406 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005407 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005408 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005409 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005410 i++;
5411 symtable_add_def(st, STR(CHILD(n, i)),
5412 DEF_PARAM | DEF_DOUBLESTAR);
5413 }
5414 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005415 if (complex >= 0) {
5416 int j;
5417 for (j = 0; j <= complex; j++) {
5418 c = CHILD(n, j);
5419 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005420 c = CHILD(n, ++j);
5421 else if (TYPE(c) == EQUAL)
5422 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005423 if (TYPE(CHILD(c, 0)) == LPAR)
5424 symtable_params_fplist(st, CHILD(c, 1));
5425 }
5426 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005427}
5428
5429static void
5430symtable_params_fplist(struct symtable *st, node *n)
5431{
5432 int i;
5433 node *c;
5434
5435 REQ(n, fplist);
5436 for (i = 0; i < NCH(n); i += 2) {
5437 c = CHILD(n, i);
5438 REQ(c, fpdef);
5439 if (NCH(c) == 1)
5440 symtable_add_def(st, STR(CHILD(c, 0)),
5441 DEF_PARAM | DEF_INTUPLE);
5442 else
5443 symtable_params_fplist(st, CHILD(c, 1));
5444 }
5445
5446}
5447
5448static void
5449symtable_global(struct symtable *st, node *n)
5450{
5451 int i;
5452
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005453 /* XXX It might be helpful to warn about module-level global
5454 statements, but it's hard to tell the difference between
5455 module-level and a string passed to exec.
5456 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005457
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005458 for (i = 1; i < NCH(n); i += 2) {
5459 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005460 int flags;
5461
5462 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005463 if (flags < 0)
5464 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005465 if (flags && flags != DEF_GLOBAL) {
5466 char buf[500];
5467 if (flags & DEF_PARAM) {
5468 PyErr_Format(PyExc_SyntaxError,
5469 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005470 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005471 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005472 st->st_cur->ste_lineno);
5473 st->st_errors++;
5474 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005475 }
5476 else {
5477 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005478 PyOS_snprintf(buf, sizeof(buf),
5479 GLOBAL_AFTER_ASSIGN,
5480 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005481 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005482 PyOS_snprintf(buf, sizeof(buf),
5483 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005484 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005485 }
5486 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005487 symtable_add_def(st, name, DEF_GLOBAL);
5488 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005489}
5490
5491static void
5492symtable_list_comprehension(struct symtable *st, node *n)
5493{
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005494 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005495
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005496 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005497 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005498 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005499 symtable_node(st, CHILD(n, 3));
5500 if (NCH(n) == 5)
5501 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005502}
5503
5504static void
5505symtable_import(struct symtable *st, node *n)
5506{
5507 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005508 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005509 | 'from' dotted_name 'import'
5510 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005511 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005512 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005513 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005514 node *dotname = CHILD(n, 1);
5515 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5516 /* check for bogus imports */
5517 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5518 PyErr_SetString(PyExc_SyntaxError,
5519 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005520 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005521 n->n_lineno);
5522 st->st_errors++;
5523 return;
5524 }
5525 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005526 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005527 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005528 if (symtable_warn(st,
5529 "import * only allowed at module level") < 0)
5530 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005531 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005532 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005533 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005534 } else {
5535 for (i = 3; i < NCH(n); i += 2) {
5536 node *c = CHILD(n, i);
5537 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005538 symtable_assign(st, CHILD(c, 2),
5539 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005540 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005541 symtable_assign(st, CHILD(c, 0),
5542 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005543 }
5544 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005545 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005546 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005547 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005548 }
5549 }
5550}
5551
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005552/* The third argument to symatble_assign() is a flag to be passed to
5553 symtable_add_def() if it is eventually called. The flag is useful
5554 to specify the particular type of assignment that should be
5555 recorded, e.g. an assignment caused by import.
5556 */
5557
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005558static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005559symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005560{
5561 node *tmp;
5562 int i;
5563
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005564 loop:
5565 switch (TYPE(n)) {
5566 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005567 /* invalid assignment, e.g. lambda x:x=2. The next
5568 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005569 return;
5570 case power:
5571 if (NCH(n) > 2) {
5572 for (i = 2; i < NCH(n); ++i)
5573 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5574 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005575 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005576 if (NCH(n) > 1) {
5577 symtable_node(st, CHILD(n, 0));
5578 symtable_node(st, CHILD(n, 1));
5579 } else {
5580 n = CHILD(n, 0);
5581 goto loop;
5582 }
5583 return;
5584 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005585 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5586 /* XXX This is an error, but the next pass
5587 will catch it. */
5588 return;
5589 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005590 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005591 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005592 }
5593 return;
5594 case exprlist:
5595 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00005596 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005597 if (NCH(n) == 1) {
5598 n = CHILD(n, 0);
5599 goto loop;
5600 }
5601 else {
5602 int i;
5603 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005604 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005605 return;
5606 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005607 case atom:
5608 tmp = CHILD(n, 0);
5609 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5610 n = CHILD(n, 1);
5611 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005612 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00005613 if (strcmp(STR(tmp), "__debug__") == 0) {
5614 PyErr_SetString(PyExc_SyntaxError,
5615 ASSIGN_DEBUG);
5616 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton86424e32001-12-04 02:41:46 +00005617 n->n_lineno);
Jeremy Hylton778e2652001-11-09 19:50:08 +00005618 st->st_errors++;
5619 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005620 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005621 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005622 return;
5623 case dotted_as_name:
5624 if (NCH(n) == 3)
5625 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005626 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005627 else
5628 symtable_add_def(st,
5629 STR(CHILD(CHILD(n,
5630 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005631 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005632 return;
5633 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005634 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005635 return;
5636 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005637 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005638 return;
5639 default:
5640 if (NCH(n) == 0)
5641 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005642 if (NCH(n) == 1) {
5643 n = CHILD(n, 0);
5644 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005645 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005646 /* Should only occur for errors like x + 1 = 1,
5647 which will be caught in the next pass. */
5648 for (i = 0; i < NCH(n); ++i)
5649 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005650 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005651 }
5652}