blob: 01e961b69101c089b0c95b93a2c056c4ba010445 [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
2072 && !(childtype == MINUS && is_float_zero(STR(pnum)))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002073 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002074 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002075 return;
2076 }
2077 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002078 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002079 if (s == NULL) {
2080 com_error(c, PyExc_MemoryError, "");
2081 com_addbyte(c, 255);
2082 return;
2083 }
2084 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002085 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002086 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002087 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002088 }
Tim Peters51e26512001-09-07 08:45:55 +00002089 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002090 }
2091 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002092 com_factor(c, CHILD(n, 1));
2093 com_addbyte(c, UNARY_POSITIVE);
2094 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002095 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002096 com_factor(c, CHILD(n, 1));
2097 com_addbyte(c, UNARY_NEGATIVE);
2098 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002099 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002100 com_factor(c, CHILD(n, 1));
2101 com_addbyte(c, UNARY_INVERT);
2102 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002103 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002104 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002105 }
2106}
2107
2108static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002109com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002110{
2111 int i;
2112 int op;
2113 REQ(n, term);
2114 com_factor(c, CHILD(n, 0));
2115 for (i = 2; i < NCH(n); i += 2) {
2116 com_factor(c, CHILD(n, i));
2117 switch (TYPE(CHILD(n, i-1))) {
2118 case STAR:
2119 op = BINARY_MULTIPLY;
2120 break;
2121 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002122 if (c->c_flags & CO_FUTURE_DIVISION)
2123 op = BINARY_TRUE_DIVIDE;
2124 else
2125 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002126 break;
2127 case PERCENT:
2128 op = BINARY_MODULO;
2129 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002130 case DOUBLESLASH:
2131 op = BINARY_FLOOR_DIVIDE;
2132 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002133 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002134 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002135 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002136 op = 255;
2137 }
2138 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002139 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002140 }
2141}
2142
2143static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002144com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002145{
2146 int i;
2147 int op;
2148 REQ(n, arith_expr);
2149 com_term(c, CHILD(n, 0));
2150 for (i = 2; i < NCH(n); i += 2) {
2151 com_term(c, CHILD(n, i));
2152 switch (TYPE(CHILD(n, i-1))) {
2153 case PLUS:
2154 op = BINARY_ADD;
2155 break;
2156 case MINUS:
2157 op = BINARY_SUBTRACT;
2158 break;
2159 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002160 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002161 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002162 op = 255;
2163 }
2164 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002165 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002166 }
2167}
2168
2169static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002170com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002171{
2172 int i;
2173 int op;
2174 REQ(n, shift_expr);
2175 com_arith_expr(c, CHILD(n, 0));
2176 for (i = 2; i < NCH(n); i += 2) {
2177 com_arith_expr(c, CHILD(n, i));
2178 switch (TYPE(CHILD(n, i-1))) {
2179 case LEFTSHIFT:
2180 op = BINARY_LSHIFT;
2181 break;
2182 case RIGHTSHIFT:
2183 op = BINARY_RSHIFT;
2184 break;
2185 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002186 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002187 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002188 op = 255;
2189 }
2190 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002191 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002192 }
2193}
2194
2195static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002196com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002197{
2198 int i;
2199 int op;
2200 REQ(n, and_expr);
2201 com_shift_expr(c, CHILD(n, 0));
2202 for (i = 2; i < NCH(n); i += 2) {
2203 com_shift_expr(c, CHILD(n, i));
2204 if (TYPE(CHILD(n, i-1)) == AMPER) {
2205 op = BINARY_AND;
2206 }
2207 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002208 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002209 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002210 op = 255;
2211 }
2212 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002213 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002214 }
2215}
2216
2217static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002218com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002219{
2220 int i;
2221 int op;
2222 REQ(n, xor_expr);
2223 com_and_expr(c, CHILD(n, 0));
2224 for (i = 2; i < NCH(n); i += 2) {
2225 com_and_expr(c, CHILD(n, i));
2226 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2227 op = BINARY_XOR;
2228 }
2229 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002230 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002231 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002232 op = 255;
2233 }
2234 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002235 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002236 }
2237}
2238
2239static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002240com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002241{
2242 int i;
2243 int op;
2244 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002245 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002246 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002247 com_xor_expr(c, CHILD(n, i));
2248 if (TYPE(CHILD(n, i-1)) == VBAR) {
2249 op = BINARY_OR;
2250 }
2251 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002252 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002253 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002254 op = 255;
2255 }
2256 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002257 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002258 }
2259}
2260
2261static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002262cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002263{
2264 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00002265 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002266 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2267 if (NCH(n) == 1) {
2268 n = CHILD(n, 0);
2269 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002270 case LESS: return PyCmp_LT;
2271 case GREATER: return PyCmp_GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002272 case EQEQUAL: /* == */
Martin v. Löwis7198a522002-01-01 19:59:11 +00002273 case EQUAL: return PyCmp_EQ;
2274 case LESSEQUAL: return PyCmp_LE;
2275 case GREATEREQUAL: return PyCmp_GE;
2276 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2277 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2278 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002279 }
2280 }
2281 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002282 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002283 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002284 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002285 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002286 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002287 }
2288 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002289 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002290}
2291
2292static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002293com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002294{
2295 int i;
2296 enum cmp_op op;
2297 int anchor;
2298 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2299 com_expr(c, CHILD(n, 0));
2300 if (NCH(n) == 1)
2301 return;
2302
2303 /****************************************************************
2304 The following code is generated for all but the last
2305 comparison in a chain:
2306
2307 label: on stack: opcode: jump to:
2308
2309 a <code to load b>
2310 a, b DUP_TOP
2311 a, b, b ROT_THREE
2312 b, a, b COMPARE_OP
2313 b, 0-or-1 JUMP_IF_FALSE L1
2314 b, 1 POP_TOP
2315 b
2316
2317 We are now ready to repeat this sequence for the next
2318 comparison in the chain.
2319
2320 For the last we generate:
2321
2322 b <code to load c>
2323 b, c COMPARE_OP
2324 0-or-1
2325
2326 If there were any jumps to L1 (i.e., there was more than one
2327 comparison), we generate:
2328
2329 0-or-1 JUMP_FORWARD L2
2330 L1: b, 0 ROT_TWO
2331 0, b POP_TOP
2332 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002333 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002334 ****************************************************************/
2335
2336 anchor = 0;
2337
2338 for (i = 2; i < NCH(n); i += 2) {
2339 com_expr(c, CHILD(n, i));
2340 if (i+2 < NCH(n)) {
2341 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002342 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002343 com_addbyte(c, ROT_THREE);
2344 }
2345 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002346 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002347 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002348 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002349 }
2350 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002351 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002352 if (i+2 < NCH(n)) {
2353 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2354 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002355 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002356 }
2357 }
2358
2359 if (anchor) {
2360 int anchor2 = 0;
2361 com_addfwref(c, JUMP_FORWARD, &anchor2);
2362 com_backpatch(c, anchor);
2363 com_addbyte(c, ROT_TWO);
2364 com_addbyte(c, POP_TOP);
2365 com_backpatch(c, anchor2);
2366 }
2367}
2368
2369static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002370com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002371{
2372 REQ(n, not_test); /* 'not' not_test | comparison */
2373 if (NCH(n) == 1) {
2374 com_comparison(c, CHILD(n, 0));
2375 }
2376 else {
2377 com_not_test(c, CHILD(n, 1));
2378 com_addbyte(c, UNARY_NOT);
2379 }
2380}
2381
2382static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002383com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002384{
2385 int i;
2386 int anchor;
2387 REQ(n, and_test); /* not_test ('and' not_test)* */
2388 anchor = 0;
2389 i = 0;
2390 for (;;) {
2391 com_not_test(c, CHILD(n, i));
2392 if ((i += 2) >= NCH(n))
2393 break;
2394 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2395 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002396 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002397 }
2398 if (anchor)
2399 com_backpatch(c, anchor);
2400}
2401
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002402static int
2403com_make_closure(struct compiling *c, PyCodeObject *co)
2404{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002405 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002406 if (free == 0)
2407 return 0;
2408 for (i = 0; i < free; ++i) {
2409 /* Bypass com_addop_varname because it will generate
2410 LOAD_DEREF but LOAD_CLOSURE is needed.
2411 */
2412 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2413 int arg, reftype;
2414
2415 /* Special case: If a class contains a method with a
2416 free variable that has the same name as a method,
2417 the name will be considered free *and* local in the
2418 class. It should be handled by the closure, as
2419 well as by the normal name loookup logic.
2420 */
2421 reftype = get_ref_type(c, PyString_AS_STRING(name));
2422 if (reftype == CELL)
2423 arg = com_lookup_arg(c->c_cellvars, name);
2424 else /* (reftype == FREE) */
2425 arg = com_lookup_arg(c->c_freevars, name);
2426 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002427 fprintf(stderr, "lookup %s in %s %d %d\n"
2428 "freevars of %s: %s\n",
2429 PyObject_REPR(name),
2430 c->c_name,
2431 reftype, arg,
2432 PyString_AS_STRING(co->co_name),
2433 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002434 Py_FatalError("com_make_closure()");
2435 }
2436 com_addoparg(c, LOAD_CLOSURE, arg);
2437
2438 }
2439 com_push(c, free);
2440 return 1;
2441}
2442
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002443static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002444com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002445{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002446 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002447 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002448 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002449 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002450 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002451 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2452 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002453 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002454 if (co == NULL) {
2455 c->c_errors++;
2456 return;
2457 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002458 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002459 i = com_addconst(c, (PyObject *)co);
2460 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002461 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002462 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002463 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002464 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002465 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002466 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002467 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002468 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002469 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002470 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002471 else {
2472 int anchor = 0;
2473 int i = 0;
2474 for (;;) {
2475 com_and_test(c, CHILD(n, i));
2476 if ((i += 2) >= NCH(n))
2477 break;
2478 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2479 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002480 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002481 }
2482 if (anchor)
2483 com_backpatch(c, anchor);
2484 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002485}
2486
2487static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002488com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002489{
2490 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002491 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002492 com_node(c, CHILD(n, 0));
2493 }
2494 else {
2495 int i;
2496 int len;
2497 len = (NCH(n) + 1) / 2;
2498 for (i = 0; i < NCH(n); i += 2)
2499 com_node(c, CHILD(n, i));
2500 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002501 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002502 }
2503}
2504
2505
2506/* Begin of assignment compilation */
2507
Thomas Wouters434d0822000-08-24 20:11:32 +00002508
2509static void
2510com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2511{
2512 com_addbyte(c, DUP_TOP);
2513 com_push(c, 1);
2514 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002515 com_node(c, augn);
2516 com_addbyte(c, opcode);
2517 com_pop(c, 1);
2518 com_addbyte(c, ROT_TWO);
2519 com_addopname(c, STORE_ATTR, n);
2520 com_pop(c, 2);
2521}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002522
2523static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002524com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002525{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00002526 if (none_assignment_check(c, STR(n), assigning))
2527 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002528 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002529 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002530}
2531
2532static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002533com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002534{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002535 REQ(n, trailer);
2536 switch (TYPE(CHILD(n, 0))) {
2537 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002538 if (assigning == OP_DELETE)
2539 com_error(c, PyExc_SyntaxError,
2540 "can't delete function call");
2541 else
2542 com_error(c, PyExc_SyntaxError,
2543 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002544 break;
2545 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002546 if (assigning > OP_APPLY)
2547 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2548 else
2549 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002550 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002551 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002552 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002553 break;
2554 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002555 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002556 }
2557}
2558
2559static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002560com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002561{
2562 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002563 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002564 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002565 if (assigning) {
2566 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002567 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002568 com_push(c, i-1);
2569 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002570 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002571 com_assign(c, CHILD(n, i), assigning, NULL);
2572}
2573
2574static void
2575com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2576{
2577 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002578 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002579 com_push(c, 1);
2580 com_node(c, augn);
2581 com_addbyte(c, opcode);
2582 com_pop(c, 1);
2583 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002584}
2585
2586static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002587com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002588{
2589 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002590 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002591 if (assigning)
2592 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002593}
2594
2595static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002596com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002597{
2598 /* Loop to avoid trivial recursion */
2599 for (;;) {
2600 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002601
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002602 case exprlist:
2603 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002604 case testlist1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002605 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002606 if (assigning > OP_APPLY) {
2607 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002608 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002609 return;
2610 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002611 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002612 return;
2613 }
2614 n = CHILD(n, 0);
2615 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002616
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002617 case test:
2618 case and_test:
2619 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002620 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002621 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002622 case xor_expr:
2623 case and_expr:
2624 case shift_expr:
2625 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002626 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002627 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002628 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002629 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002630 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002631 return;
2632 }
2633 n = CHILD(n, 0);
2634 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002635
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002636 case power: /* atom trailer* ('**' power)*
2637 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002638 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002639 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002640 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002641 return;
2642 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002643 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002644 int i;
2645 com_node(c, CHILD(n, 0));
2646 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002647 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002648 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002649 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002650 return;
2651 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002652 com_apply_trailer(c, CHILD(n, i));
2653 } /* NB i is still alive */
2654 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002655 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002656 return;
2657 }
2658 n = CHILD(n, 0);
2659 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002660
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002661 case atom:
2662 switch (TYPE(CHILD(n, 0))) {
2663 case LPAR:
2664 n = CHILD(n, 1);
2665 if (TYPE(n) == RPAR) {
2666 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002667 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002668 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002669 return;
2670 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002671 if (assigning > OP_APPLY) {
2672 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002673 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002674 return;
2675 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002676 break;
2677 case LSQB:
2678 n = CHILD(n, 1);
2679 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002680 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002681 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002682 return;
2683 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002684 if (assigning > OP_APPLY) {
2685 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002686 "augmented assign to list not possible");
2687 return;
2688 }
2689 if (NCH(n) > 1
2690 && TYPE(CHILD(n, 1)) == list_for) {
2691 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002692 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002693 return;
2694 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002695 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002696 return;
2697 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002698 if (assigning > OP_APPLY)
2699 com_augassign_name(c, CHILD(n, 0),
2700 assigning, augn);
2701 else
2702 com_assign_name(c, CHILD(n, 0),
2703 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002704 return;
2705 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002706 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002707 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002708 return;
2709 }
2710 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002711
2712 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002713 com_error(c, PyExc_SyntaxError,
2714 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002715 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002716
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002717 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002718 com_error(c, PyExc_SystemError,
2719 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002720 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002721
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002722 }
2723 }
2724}
Guido van Rossum7c531111997-03-11 18:42:21 +00002725
Thomas Wouters434d0822000-08-24 20:11:32 +00002726static void
2727com_augassign(struct compiling *c, node *n)
2728{
2729 int opcode;
2730
2731 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2732 case '+': opcode = INPLACE_ADD; break;
2733 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002734 case '/':
2735 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
2736 opcode = INPLACE_FLOOR_DIVIDE;
2737 else if (c->c_flags & CO_FUTURE_DIVISION)
2738 opcode = INPLACE_TRUE_DIVIDE;
2739 else
2740 opcode = INPLACE_DIVIDE;
2741 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00002742 case '%': opcode = INPLACE_MODULO; break;
2743 case '<': opcode = INPLACE_LSHIFT; break;
2744 case '>': opcode = INPLACE_RSHIFT; break;
2745 case '&': opcode = INPLACE_AND; break;
2746 case '^': opcode = INPLACE_XOR; break;
2747 case '|': opcode = INPLACE_OR; break;
2748 case '*':
2749 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2750 opcode = INPLACE_POWER;
2751 else
2752 opcode = INPLACE_MULTIPLY;
2753 break;
2754 default:
2755 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2756 return;
2757 }
2758 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2759}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002760
2761static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002762com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002763{
Thomas Wouters434d0822000-08-24 20:11:32 +00002764 REQ(n, expr_stmt);
2765 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002766 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002767 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002768 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002769 if (NCH(n) == 1) {
2770 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002771 if (c->c_interactive)
2772 com_addbyte(c, PRINT_EXPR);
2773 else
2774 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002775 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002776 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002777 else if (TYPE(CHILD(n,1)) == augassign)
2778 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002779 else {
2780 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002781 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002782 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002783 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002784 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002785 com_push(c, 1);
2786 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002787 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002788 }
2789 }
2790}
2791
2792static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002793com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002794{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002795 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002796 int i;
2797 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002798 if (Py_OptimizeFlag)
2799 return;
2800 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00002801
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002802 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00002803 raise AssertionError [, <message>]
2804
2805 where <message> is the second test, if present.
2806 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002807 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002808 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002809 com_addbyte(c, POP_TOP);
2810 com_pop(c, 1);
2811 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002812 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002813 com_push(c, 1);
2814 i = NCH(n)/2; /* Either 2 or 4 */
2815 if (i > 1)
2816 com_node(c, CHILD(n, 3));
2817 com_addoparg(c, RAISE_VARARGS, i);
2818 com_pop(c, i);
2819 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002820 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002821 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002822 com_addbyte(c, POP_TOP);
2823}
2824
2825static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002826com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002827{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002828 int i = 1;
2829 node* stream = NULL;
2830
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002831 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002832
2833 /* are we using the extended print form? */
2834 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2835 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002836 com_node(c, stream);
2837 /* stack: [...] => [... stream] */
2838 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002839 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2840 i = 4;
2841 else
2842 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002843 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002844 for (; i < NCH(n); i += 2) {
2845 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002846 com_addbyte(c, DUP_TOP);
2847 /* stack: [stream] => [stream stream] */
2848 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002849 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002850 /* stack: [stream stream] => [stream stream obj] */
2851 com_addbyte(c, ROT_TWO);
2852 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002853 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002854 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002855 com_pop(c, 2);
2856 }
2857 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002858 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002859 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002860 com_addbyte(c, PRINT_ITEM);
2861 com_pop(c, 1);
2862 }
2863 }
2864 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002865 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002866 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002867 /* must pop the extra stream object off the stack */
2868 com_addbyte(c, POP_TOP);
2869 /* stack: [... stream] => [...] */
2870 com_pop(c, 1);
2871 }
2872 }
2873 else {
2874 if (stream != NULL) {
2875 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002876 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002877 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002878 com_pop(c, 1);
2879 }
2880 else
2881 com_addbyte(c, PRINT_NEWLINE);
2882 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002883}
2884
2885static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002886com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002887{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002888 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002889 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002890 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002891 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002892 if (c->c_flags & CO_GENERATOR) {
2893 if (NCH(n) > 1) {
2894 com_error(c, PyExc_SyntaxError,
2895 "'return' with argument inside generator");
2896 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002897 }
2898 if (NCH(n) < 2) {
2899 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002900 com_push(c, 1);
2901 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002902 else
2903 com_node(c, CHILD(n, 1));
2904 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00002905 com_pop(c, 1);
2906}
2907
2908static void
2909com_yield_stmt(struct compiling *c, node *n)
2910{
Tim Peters95c80f82001-06-23 02:07:08 +00002911 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00002912 REQ(n, yield_stmt); /* 'yield' testlist */
2913 if (!c->c_infunction) {
2914 com_error(c, PyExc_SyntaxError, "'yield' outside function");
2915 }
Tim Peters95c80f82001-06-23 02:07:08 +00002916
2917 for (i = 0; i < c->c_nblocks; ++i) {
2918 if (c->c_block[i] == SETUP_FINALLY) {
2919 com_error(c, PyExc_SyntaxError,
2920 "'yield' not allowed in a 'try' block "
2921 "with a 'finally' clause");
2922 return;
2923 }
2924 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002925 com_node(c, CHILD(n, 1));
2926 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002927 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002928}
2929
2930static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002931com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002932{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002933 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002934 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2935 if (NCH(n) > 1) {
2936 com_node(c, CHILD(n, 1));
2937 if (NCH(n) > 3) {
2938 com_node(c, CHILD(n, 3));
2939 if (NCH(n) > 5)
2940 com_node(c, CHILD(n, 5));
2941 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002942 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002943 i = NCH(n)/2;
2944 com_addoparg(c, RAISE_VARARGS, i);
2945 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002946}
2947
2948static void
Thomas Wouters52152252000-08-17 22:55:00 +00002949com_from_import(struct compiling *c, node *n)
2950{
2951 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2952 com_push(c, 1);
2953 if (NCH(n) > 1) {
2954 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2955 com_error(c, PyExc_SyntaxError, "invalid syntax");
2956 return;
2957 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002958 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002959 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002960 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002961 com_pop(c, 1);
2962}
2963
2964static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002965com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002966{
2967 int i;
2968 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002969 /* 'import' dotted_name (',' dotted_name)* |
2970 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002971 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002972 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002973 /* 'from' dotted_name 'import' ... */
2974 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002975
2976 if (TYPE(CHILD(n, 3)) == STAR) {
2977 tup = Py_BuildValue("(s)", "*");
2978 } else {
2979 tup = PyTuple_New((NCH(n) - 2)/2);
2980 for (i = 3; i < NCH(n); i += 2) {
2981 PyTuple_SET_ITEM(tup, (i-3)/2,
Guido van Rossum633d90c2002-12-23 16:51:42 +00002982 PyString_FromString(STR(
2983 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002984 }
2985 }
2986 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002987 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002988 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002989 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002990 if (TYPE(CHILD(n, 3)) == STAR)
2991 com_addbyte(c, IMPORT_STAR);
2992 else {
2993 for (i = 3; i < NCH(n); i += 2)
2994 com_from_import(c, CHILD(n, i));
2995 com_addbyte(c, POP_TOP);
2996 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002997 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002998 }
2999 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003000 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003001 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003002 node *subn = CHILD(n, i);
3003 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003004 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003005 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003006 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003007 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003008 int j;
3009 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003010 com_error(c, PyExc_SyntaxError,
3011 "invalid syntax");
3012 return;
3013 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003014 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3015 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003016 CHILD(CHILD(subn, 0),
3017 j));
3018 com_addop_varname(c, VAR_STORE,
3019 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003020 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003021 com_addop_varname(c, VAR_STORE,
3022 STR(CHILD(CHILD(subn, 0),
3023 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003024 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003025 }
3026 }
3027}
3028
3029static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003030com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003031{
3032 REQ(n, exec_stmt);
3033 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3034 com_node(c, CHILD(n, 1));
3035 if (NCH(n) >= 4)
3036 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003037 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003038 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003039 com_push(c, 1);
3040 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003041 if (NCH(n) >= 6)
3042 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003043 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003044 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003045 com_push(c, 1);
3046 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003047 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003048 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003049}
3050
Guido van Rossum7c531111997-03-11 18:42:21 +00003051static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003052is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003053{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003054 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003055 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003056 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003057
3058 /* Label to avoid tail recursion */
3059 next:
3060 switch (TYPE(n)) {
3061
3062 case suite:
3063 if (NCH(n) == 1) {
3064 n = CHILD(n, 0);
3065 goto next;
3066 }
3067 /* Fall through */
3068 case file_input:
3069 for (i = 0; i < NCH(n); i++) {
3070 node *ch = CHILD(n, i);
3071 if (TYPE(ch) == stmt) {
3072 n = ch;
3073 goto next;
3074 }
3075 }
3076 break;
3077
3078 case stmt:
3079 case simple_stmt:
3080 case small_stmt:
3081 n = CHILD(n, 0);
3082 goto next;
3083
3084 case expr_stmt:
3085 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003086 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003087 case test:
3088 case and_test:
3089 case not_test:
3090 case comparison:
3091 case expr:
3092 case xor_expr:
3093 case and_expr:
3094 case shift_expr:
3095 case arith_expr:
3096 case term:
3097 case factor:
3098 case power:
3099 case atom:
3100 if (NCH(n) == 1) {
3101 n = CHILD(n, 0);
3102 goto next;
3103 }
3104 break;
3105
3106 case NAME:
3107 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3108 return 1;
3109 break;
3110
3111 case NUMBER:
3112 v = parsenumber(c, STR(n));
3113 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003114 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003115 break;
3116 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003117 i = PyObject_IsTrue(v);
3118 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003119 return i == 0;
3120
3121 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003122 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003123 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003124 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003125 break;
3126 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003127 i = PyObject_IsTrue(v);
3128 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003129 return i == 0;
3130
3131 }
3132 return 0;
3133}
3134
Tim Peters08a898f2001-06-28 01:52:22 +00003135
3136/* Look under n for a return stmt with an expression.
3137 * This hack is used to find illegal returns under "if 0:" blocks in
3138 * functions already known to be generators (as determined by the symtable
3139 * pass).
3140 * Return the offending return node if found, else NULL.
3141 */
3142static node *
3143look_for_offending_return(node *n)
3144{
3145 int i;
3146
3147 for (i = 0; i < NCH(n); ++i) {
3148 node *kid = CHILD(n, i);
3149
3150 switch (TYPE(kid)) {
3151 case classdef:
3152 case funcdef:
3153 case lambdef:
3154 /* Stuff in nested functions & classes doesn't
3155 affect the code block we started in. */
3156 return NULL;
3157
3158 case return_stmt:
3159 if (NCH(kid) > 1)
3160 return kid;
3161 break;
3162
3163 default: {
3164 node *bad = look_for_offending_return(kid);
3165 if (bad != NULL)
3166 return bad;
3167 }
3168 }
3169 }
3170
3171 return NULL;
3172}
3173
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003174static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003175com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003176{
3177 int i;
3178 int anchor = 0;
3179 REQ(n, if_stmt);
3180 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3181 for (i = 0; i+3 < NCH(n); i+=4) {
3182 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003183 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003184 if (is_constant_false(c, ch)) {
3185 /* We're going to skip this block. However, if this
3186 is a generator, we have to check the dead code
3187 anyway to make sure there aren't any return stmts
3188 with expressions, in the same scope. */
3189 if (c->c_flags & CO_GENERATOR) {
3190 node *p = look_for_offending_return(n);
3191 if (p != NULL) {
3192 int savelineno = c->c_lineno;
3193 c->c_lineno = p->n_lineno;
3194 com_error(c, PyExc_SyntaxError,
3195 "'return' with argument "
3196 "inside generator");
3197 c->c_lineno = savelineno;
3198 }
3199 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003200 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003201 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003202 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003203 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003204 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003205 com_addfwref(c, JUMP_IF_FALSE, &a);
3206 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003207 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003208 com_node(c, CHILD(n, i+3));
3209 com_addfwref(c, JUMP_FORWARD, &anchor);
3210 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003211 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003212 com_addbyte(c, POP_TOP);
3213 }
3214 if (i+2 < NCH(n))
3215 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003216 if (anchor)
3217 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003218}
3219
3220static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003221com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003222{
3223 int break_anchor = 0;
3224 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003225 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003226 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3227 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003228 block_push(c, SETUP_LOOP);
3229 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003230 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003231 com_node(c, CHILD(n, 1));
3232 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3233 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003234 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003235 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003236 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003237 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003238 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3239 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003240 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003241 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003242 com_addbyte(c, POP_TOP);
3243 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003244 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003245 if (NCH(n) > 4)
3246 com_node(c, CHILD(n, 6));
3247 com_backpatch(c, break_anchor);
3248}
3249
3250static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003251com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003252{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003253 int break_anchor = 0;
3254 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003255 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003256 REQ(n, for_stmt);
3257 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3258 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003259 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003260 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003261 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003262 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003263 com_set_lineno(c, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003264 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003265 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003266 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003267 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003268 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003269 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003270 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3271 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003272 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003273 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003274 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003275 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003276 if (NCH(n) > 8)
3277 com_node(c, CHILD(n, 8));
3278 com_backpatch(c, break_anchor);
3279}
3280
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003281/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003282
3283 SETUP_FINALLY L
3284 <code for S>
3285 POP_BLOCK
3286 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003287 L: <code for Sf>
3288 END_FINALLY
3289
3290 The special instructions use the block stack. Each block
3291 stack entry contains the instruction that created it (here
3292 SETUP_FINALLY), the level of the value stack at the time the
3293 block stack entry was created, and a label (here L).
3294
3295 SETUP_FINALLY:
3296 Pushes the current value stack level and the label
3297 onto the block stack.
3298 POP_BLOCK:
3299 Pops en entry from the block stack, and pops the value
3300 stack until its level is the same as indicated on the
3301 block stack. (The label is ignored.)
3302 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003303 Pops a variable number of entries from the *value* stack
3304 and re-raises the exception they specify. The number of
3305 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003306
3307 The block stack is unwound when an exception is raised:
3308 when a SETUP_FINALLY entry is found, the exception is pushed
3309 onto the value stack (and the exception condition is cleared),
3310 and the interpreter jumps to the label gotten from the block
3311 stack.
3312
3313 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003314 (The contents of the value stack is shown in [], with the top
3315 at the right; 'tb' is trace-back info, 'val' the exception's
3316 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003317
3318 Value stack Label Instruction Argument
3319 [] SETUP_EXCEPT L1
3320 [] <code for S>
3321 [] POP_BLOCK
3322 [] JUMP_FORWARD L0
3323
Guido van Rossum3f5da241990-12-20 15:06:42 +00003324 [tb, val, exc] L1: DUP )
3325 [tb, val, exc, exc] <evaluate E1> )
3326 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3327 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3328 [tb, val, exc, 1] POP )
3329 [tb, val, exc] POP
3330 [tb, val] <assign to V1> (or POP if no V1)
3331 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003332 [] <code for S1>
3333 JUMP_FORWARD L0
3334
Guido van Rossum3f5da241990-12-20 15:06:42 +00003335 [tb, val, exc, 0] L2: POP
3336 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003337 .............................etc.......................
3338
Guido van Rossum3f5da241990-12-20 15:06:42 +00003339 [tb, val, exc, 0] Ln+1: POP
3340 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003341
3342 [] L0: <next statement>
3343
3344 Of course, parts are not generated if Vi or Ei is not present.
3345*/
3346
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003347static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003348com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003349{
3350 int except_anchor = 0;
3351 int end_anchor = 0;
3352 int else_anchor = 0;
3353 int i;
3354 node *ch;
3355
3356 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3357 block_push(c, SETUP_EXCEPT);
3358 com_node(c, CHILD(n, 2));
3359 com_addbyte(c, POP_BLOCK);
3360 block_pop(c, SETUP_EXCEPT);
3361 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3362 com_backpatch(c, except_anchor);
3363 for (i = 3;
3364 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3365 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003366 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003367 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003368 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003369 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003370 break;
3371 }
3372 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003373 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003374 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003375 if (NCH(ch) > 1) {
3376 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003377 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003378 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003379 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003380 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003381 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3382 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003383 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003384 }
3385 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003386 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003387 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003388 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003389 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003390 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003391 com_pop(c, 1);
3392 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003393 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003394 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003395 com_node(c, CHILD(n, i+2));
3396 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3397 if (except_anchor) {
3398 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003399 /* We come in with [tb, val, exc, 0] on the
3400 stack; one pop and it's the same as
3401 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003402 com_addbyte(c, POP_TOP);
3403 }
3404 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003405 /* We actually come in here with [tb, val, exc] but the
3406 END_FINALLY will zap those and jump around.
3407 The c_stacklevel does not reflect them so we need not pop
3408 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003409 com_addbyte(c, END_FINALLY);
3410 com_backpatch(c, else_anchor);
3411 if (i < NCH(n))
3412 com_node(c, CHILD(n, i+2));
3413 com_backpatch(c, end_anchor);
3414}
3415
3416static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003417com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003418{
3419 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003420 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003421
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003422 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3423 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003424 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003425 com_addbyte(c, POP_BLOCK);
3426 block_pop(c, SETUP_FINALLY);
3427 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003428 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003429 /* While the generated code pushes only one item,
3430 the try-finally handling can enter here with
3431 up to three items. OK, here are the details:
3432 3 for an exception, 2 for RETURN, 1 for BREAK. */
3433 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003434 com_backpatch(c, finally_anchor);
3435 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003436 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003437 com_node(c, ch);
3438 com_addbyte(c, END_FINALLY);
3439 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003440 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003441}
3442
3443static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003444com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003445{
3446 REQ(n, try_stmt);
3447 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3448 | 'try' ':' suite 'finally' ':' suite */
3449 if (TYPE(CHILD(n, 3)) != except_clause)
3450 com_try_finally(c, n);
3451 else
3452 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003453}
3454
Guido van Rossum8b993a91997-01-17 21:04:03 +00003455static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003456get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003457{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003458 int i;
3459
Guido van Rossum8b993a91997-01-17 21:04:03 +00003460 /* Label to avoid tail recursion */
3461 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003462 switch (TYPE(n)) {
3463
3464 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003465 if (NCH(n) == 1) {
3466 n = CHILD(n, 0);
3467 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003468 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003469 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003470 case file_input:
3471 for (i = 0; i < NCH(n); i++) {
3472 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003473 if (TYPE(ch) == stmt) {
3474 n = ch;
3475 goto next;
3476 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003477 }
3478 break;
3479
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003480 case stmt:
3481 case simple_stmt:
3482 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003483 n = CHILD(n, 0);
3484 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003485
3486 case expr_stmt:
3487 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003488 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003489 case test:
3490 case and_test:
3491 case not_test:
3492 case comparison:
3493 case expr:
3494 case xor_expr:
3495 case and_expr:
3496 case shift_expr:
3497 case arith_expr:
3498 case term:
3499 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003500 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003501 if (NCH(n) == 1) {
3502 n = CHILD(n, 0);
3503 goto next;
3504 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003505 break;
3506
3507 case atom:
3508 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003509 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003510 break;
3511
3512 }
3513 return NULL;
3514}
3515
Guido van Rossum79f25d91997-04-29 20:08:16 +00003516static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003517get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003518{
Guido van Rossum541563e1999-01-28 15:08:09 +00003519 /* Don't generate doc-strings if run with -OO */
3520 if (Py_OptimizeFlag > 1)
3521 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003522 n = get_rawdocstring(n);
3523 if (n == NULL)
3524 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003525 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003526}
3527
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003528static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003529com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003530{
3531 REQ(n, suite);
3532 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3533 if (NCH(n) == 1) {
3534 com_node(c, CHILD(n, 0));
3535 }
3536 else {
3537 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003538 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003539 node *ch = CHILD(n, i);
3540 if (TYPE(ch) == stmt)
3541 com_node(c, ch);
3542 }
3543 }
3544}
3545
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003546/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003547static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003548com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003549{
3550 int i = c->c_nblocks;
3551 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3552 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3553 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003554 else if (i <= 0) {
3555 /* at the outer level */
3556 com_error(c, PyExc_SyntaxError,
3557 "'continue' not properly in loop");
3558 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003559 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003560 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003561 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003562 if (c->c_block[j] == SETUP_LOOP)
3563 break;
3564 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003565 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003566 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003567 for (; i > j; --i) {
3568 if (c->c_block[i] == SETUP_EXCEPT ||
3569 c->c_block[i] == SETUP_FINALLY) {
3570 com_addoparg(c, CONTINUE_LOOP,
3571 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003572 return;
3573 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003574 if (c->c_block[i] == END_FINALLY) {
3575 com_error(c, PyExc_SyntaxError,
3576 "'continue' not supported inside 'finally' clause");
3577 return;
3578 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003579 }
3580 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003581 com_error(c, PyExc_SyntaxError,
3582 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003583 }
3584 /* XXX Could allow it inside a 'finally' clause
3585 XXX if we could pop the exception still on the stack */
3586}
3587
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003588static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003589com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003590{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003591 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003592 if (TYPE(n) == lambdef) {
3593 /* lambdef: 'lambda' [varargslist] ':' test */
3594 n = CHILD(n, 1);
3595 }
3596 else {
3597 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3598 n = CHILD(n, 2);
3599 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3600 n = CHILD(n, 1);
3601 }
3602 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003603 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003604 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003605 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003606 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3607 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003608 nargs = 0;
3609 ndefs = 0;
3610 for (i = 0; i < nch; i++) {
3611 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003612 if (TYPE(CHILD(n, i)) == STAR ||
3613 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003614 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003615 nargs++;
3616 i++;
3617 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003618 t = RPAR; /* Anything except EQUAL or COMMA */
3619 else
3620 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003621 if (t == EQUAL) {
3622 i++;
3623 ndefs++;
3624 com_node(c, CHILD(n, i));
3625 i++;
3626 if (i >= nch)
3627 break;
3628 t = TYPE(CHILD(n, i));
3629 }
3630 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003631 /* Treat "(a=1, b)" as an error */
3632 if (ndefs)
3633 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003634 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003635 }
3636 if (t != COMMA)
3637 break;
3638 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003639 return ndefs;
3640}
3641
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003642static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003643com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003644{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003645 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003646 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003647 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003648 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003649 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3650 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003651 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003652 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003653 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003654 c->c_errors++;
3655 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003656 int closure = com_make_closure(c, (PyCodeObject *)co);
3657 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003658 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003659 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003660 if (closure)
3661 com_addoparg(c, MAKE_CLOSURE, ndefs);
3662 else
3663 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003664 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003665 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003666 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003667 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003668 }
3669}
3670
3671static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003672com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003673{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003674 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003675 REQ(n, testlist);
3676 /* testlist: test (',' test)* [','] */
3677 for (i = 0; i < NCH(n); i += 2)
3678 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003679 i = (NCH(n)+1) / 2;
3680 com_addoparg(c, BUILD_TUPLE, i);
3681 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003682}
3683
3684static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003685com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003686{
Guido van Rossum25831651993-05-19 14:50:45 +00003687 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003688 PyObject *v;
3689 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003690 char *name;
3691
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003692 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003693 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003694 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003695 c->c_errors++;
3696 return;
3697 }
3698 /* Push the class name on the stack */
3699 i = com_addconst(c, v);
3700 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003701 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003702 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003703 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003704 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003705 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003706 com_push(c, 1);
3707 }
Guido van Rossum25831651993-05-19 14:50:45 +00003708 else
3709 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003710 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003711 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003712 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003713 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003714 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003715 c->c_errors++;
3716 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003717 int closure = com_make_closure(c, co);
3718 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003719 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003720 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003721 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003722 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003723 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003724 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003725 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003726 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003727 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003728 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003729 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003730 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003731 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003732 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003733}
3734
3735static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003736com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003737{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003738 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003739 if (c->c_errors)
3740 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003741 switch (TYPE(n)) {
3742
3743 /* Definition nodes */
3744
3745 case funcdef:
3746 com_funcdef(c, n);
3747 break;
3748 case classdef:
3749 com_classdef(c, n);
3750 break;
3751
3752 /* Trivial parse tree nodes */
3753
3754 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003755 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003756 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003757 n = CHILD(n, 0);
3758 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003759
3760 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003761 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003762 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003763 {
3764 int i;
3765 for (i = 0; i < NCH(n)-1; i += 2)
3766 com_node(c, CHILD(n, i));
3767 }
3768 break;
3769
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003770 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003771 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003772 n = CHILD(n, 0);
3773 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003774
3775 /* Statement nodes */
3776
3777 case expr_stmt:
3778 com_expr_stmt(c, n);
3779 break;
3780 case print_stmt:
3781 com_print_stmt(c, n);
3782 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003783 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003784 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003785 break;
3786 case pass_stmt:
3787 break;
3788 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003789 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003790 com_error(c, PyExc_SyntaxError,
3791 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003792 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003793 com_addbyte(c, BREAK_LOOP);
3794 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003795 case continue_stmt:
3796 com_continue_stmt(c, n);
3797 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003798 case return_stmt:
3799 com_return_stmt(c, n);
3800 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003801 case yield_stmt:
3802 com_yield_stmt(c, n);
3803 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003804 case raise_stmt:
3805 com_raise_stmt(c, n);
3806 break;
3807 case import_stmt:
3808 com_import_stmt(c, n);
3809 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003810 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003811 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003812 case exec_stmt:
3813 com_exec_stmt(c, n);
3814 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003815 case assert_stmt:
3816 com_assert_stmt(c, n);
3817 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003818 case if_stmt:
3819 com_if_stmt(c, n);
3820 break;
3821 case while_stmt:
3822 com_while_stmt(c, n);
3823 break;
3824 case for_stmt:
3825 com_for_stmt(c, n);
3826 break;
3827 case try_stmt:
3828 com_try_stmt(c, n);
3829 break;
3830 case suite:
3831 com_suite(c, n);
3832 break;
3833
3834 /* Expression nodes */
3835
3836 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003837 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00003838 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003839 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003840 break;
3841 case test:
3842 com_test(c, n);
3843 break;
3844 case and_test:
3845 com_and_test(c, n);
3846 break;
3847 case not_test:
3848 com_not_test(c, n);
3849 break;
3850 case comparison:
3851 com_comparison(c, n);
3852 break;
3853 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003854 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003855 break;
3856 case expr:
3857 com_expr(c, n);
3858 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003859 case xor_expr:
3860 com_xor_expr(c, n);
3861 break;
3862 case and_expr:
3863 com_and_expr(c, n);
3864 break;
3865 case shift_expr:
3866 com_shift_expr(c, n);
3867 break;
3868 case arith_expr:
3869 com_arith_expr(c, n);
3870 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003871 case term:
3872 com_term(c, n);
3873 break;
3874 case factor:
3875 com_factor(c, n);
3876 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003877 case power:
3878 com_power(c, n);
3879 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003880 case atom:
3881 com_atom(c, n);
3882 break;
3883
3884 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003885 com_error(c, PyExc_SystemError,
3886 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003887 }
3888}
3889
Tim Petersdbd9ba62000-07-09 03:09:57 +00003890static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003891
3892static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003893com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003894{
3895 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3896 if (TYPE(CHILD(n, 0)) == LPAR)
3897 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003898 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003899 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003900 com_pop(c, 1);
3901 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003902}
3903
3904static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003905com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003906{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003907 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003908 if (NCH(n) == 1) {
3909 com_fpdef(c, CHILD(n, 0));
3910 }
3911 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003912 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003913 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003914 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003915 for (i = 0; i < NCH(n); i += 2)
3916 com_fpdef(c, CHILD(n, i));
3917 }
3918}
3919
3920static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003921com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003922{
Guido van Rossum633d90c2002-12-23 16:51:42 +00003923 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003924 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00003925 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003926 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003927 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003928 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00003929 nch = NCH(n);
3930 /* Enter all arguments in table of locals */
3931 for (i = 0, narg = 0; i < nch; i++) {
3932 node *ch = CHILD(n, i);
3933 node *fp;
3934 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003935 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00003936 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3937 fp = CHILD(ch, 0);
3938 if (TYPE(fp) != NAME) {
3939 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
3940 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00003941 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00003942 narg++;
3943 /* all name updates handled by symtable */
3944 if (++i >= nch)
3945 break;
3946 ch = CHILD(n, i);
3947 if (TYPE(ch) == EQUAL)
3948 i += 2;
3949 else
3950 REQ(ch, COMMA);
3951 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003952 if (complex) {
3953 /* Generate code for complex arguments only after
3954 having counted the simple arguments */
3955 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00003956 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003957 node *ch = CHILD(n, i);
3958 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003959 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003960 break;
3961 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3962 fp = CHILD(ch, 0);
3963 if (TYPE(fp) != NAME) {
3964 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003965 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003966 com_fpdef(c, ch);
3967 }
3968 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00003969 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003970 break;
3971 ch = CHILD(n, i);
3972 if (TYPE(ch) == EQUAL)
3973 i += 2;
3974 else
3975 REQ(ch, COMMA);
3976 }
3977 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003978}
3979
3980static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003981com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003982{
3983 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003984 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003985 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003986 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003987 if (doc != NULL) {
3988 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003989 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003990 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003991 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003992 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003993 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003994 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003995 for (i = 0; i < NCH(n); i++) {
3996 node *ch = CHILD(n, i);
3997 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3998 com_node(c, ch);
3999 }
4000}
4001
4002/* Top-level compile-node interface */
4003
4004static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004005compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004006{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004007 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004008 node *ch;
4009 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00004010 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004011 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004012 if (doc != NULL) {
4013 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004014 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004015 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004016 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004017 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004018 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
4019 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004020 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004021 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004022 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004023 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004024 c->c_infunction = 0;
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004025 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4026 com_push(c, 1);
4027 com_addbyte(c, RETURN_VALUE);
4028 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004029}
4030
4031static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004032compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004033{
Guido van Rossum590baa41993-11-30 13:40:46 +00004034 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004035 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004036 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004037
4038 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004039 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004040 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004041 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004042 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004043 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004044 else
4045 ch = CHILD(n, 2);
4046 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004047 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004048 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004049}
4050
4051static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004052compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004053{
4054 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004055 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004056 REQ(n, classdef);
4057 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4058 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004059 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004060 /* Initialize local __module__ from global __name__ */
4061 com_addop_name(c, LOAD_GLOBAL, "__name__");
4062 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004063 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004064 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004065 if (doc != NULL) {
4066 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004067 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004068 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004069 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004070 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004071 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004072 }
4073 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004074 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004075 com_node(c, ch);
4076 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004077 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004078 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004079 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004080}
4081
4082static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004083compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004084{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004085 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004086
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004087 switch (TYPE(n)) {
4088
Guido van Rossum4c417781991-01-21 16:09:22 +00004089 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004090 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004091 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004092 n = CHILD(n, 0);
4093 if (TYPE(n) != NEWLINE)
4094 com_node(c, n);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004095 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4096 com_push(c, 1);
4097 com_addbyte(c, RETURN_VALUE);
4098 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004099 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004100 break;
4101
Guido van Rossum4c417781991-01-21 16:09:22 +00004102 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004103 com_file_input(c, n);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004104 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4105 com_push(c, 1);
4106 com_addbyte(c, RETURN_VALUE);
4107 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004108 break;
4109
Guido van Rossum590baa41993-11-30 13:40:46 +00004110 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004111 com_node(c, CHILD(n, 0));
4112 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004113 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004114 break;
4115
Guido van Rossum590baa41993-11-30 13:40:46 +00004116 case lambdef: /* anonymous function definition */
4117 compile_lambdef(c, n);
4118 break;
4119
Guido van Rossum4c417781991-01-21 16:09:22 +00004120 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004121 compile_funcdef(c, n);
4122 break;
4123
Guido van Rossum4c417781991-01-21 16:09:22 +00004124 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004125 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004126 break;
4127
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004128 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004129 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004130 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004131 }
4132}
4133
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004134static PyObject *
4135dict_keys_inorder(PyObject *dict, int offset)
4136{
4137 PyObject *tuple, *k, *v;
4138 int i, pos = 0, size = PyDict_Size(dict);
4139
4140 tuple = PyTuple_New(size);
4141 if (tuple == NULL)
4142 return NULL;
4143 while (PyDict_Next(dict, &pos, &k, &v)) {
4144 i = PyInt_AS_LONG(v);
4145 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004146 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004147 PyTuple_SET_ITEM(tuple, i - offset, k);
4148 }
4149 return tuple;
4150}
4151
Guido van Rossum79f25d91997-04-29 20:08:16 +00004152PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004153PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004154{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004155 return PyNode_CompileFlags(n, filename, NULL);
4156}
4157
4158PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004159PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004160{
4161 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004162}
4163
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004164struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004165PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004166{
4167 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004168 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004169
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004170 ff = PyNode_Future(n, filename);
4171 if (ff == NULL)
4172 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004173
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004174 st = symtable_init();
Tim Peters8c5e4152001-11-04 19:26:58 +00004175 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004176 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004177 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004178 }
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004179 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004180 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004181 if (st->st_errors > 0)
4182 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004183 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004184 if (st->st_errors > 0)
4185 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004186
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004187 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004188 fail:
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004189 PyObject_FREE((void *)ff);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004190 st->st_future = NULL;
4191 PySymtable_Free(st);
4192 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004193}
4194
Guido van Rossum79f25d91997-04-29 20:08:16 +00004195static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004196icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004197{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004198 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004199}
4200
Guido van Rossum79f25d91997-04-29 20:08:16 +00004201static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004202jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004203 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004204{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004205 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004206 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004207 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004208 return NULL;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004209 if (TYPE(n) == encoding_decl) {
4210 sc.c_encoding = STR(n);
4211 n = CHILD(n, 0);
4212 } else {
4213 sc.c_encoding = NULL;
4214 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004215 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004216 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004217 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004218 /* c_symtable still points to parent's symbols */
4219 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004220 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004221 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004222 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004223 if (base->c_encoding != NULL) {
4224 assert(sc.c_encoding == NULL);
4225 sc.c_encoding = base->c_encoding;
4226 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004227 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004228 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004229 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004230 if (sc.c_future == NULL) {
4231 com_free(&sc);
4232 return NULL;
4233 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004234 if (flags) {
4235 int merged = sc.c_future->ff_features |
4236 flags->cf_flags;
4237 sc.c_future->ff_features = merged;
4238 flags->cf_flags = merged;
4239 }
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004240 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004241 com_free(&sc);
4242 return NULL;
4243 }
4244 }
4245 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004246 if (symtable_load_symbols(&sc) < 0) {
4247 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004248 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004249 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004250 compile_node(&sc, n);
4251 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004252 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004253 PyObject *consts, *names, *varnames, *filename, *name,
4254 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004255 consts = PyList_AsTuple(sc.c_consts);
4256 names = PyList_AsTuple(sc.c_names);
4257 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004258 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4259 freevars = dict_keys_inorder(sc.c_freevars,
4260 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004261 filename = PyString_InternFromString(sc.c_filename);
4262 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004263 if (!PyErr_Occurred())
4264 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004265 sc.c_nlocals,
4266 sc.c_maxstacklevel,
4267 sc.c_flags,
4268 sc.c_code,
4269 consts,
4270 names,
4271 varnames,
4272 freevars,
4273 cellvars,
4274 filename,
4275 name,
4276 sc.c_firstlineno,
4277 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004278 Py_XDECREF(consts);
4279 Py_XDECREF(names);
4280 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004281 Py_XDECREF(freevars);
4282 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004283 Py_XDECREF(filename);
4284 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004285 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004286 else if (!PyErr_Occurred()) {
4287 /* This could happen if someone called PyErr_Clear() after an
4288 error was reported above. That's not supposed to happen,
4289 but I just plugged one case and I'm not sure there can't be
4290 others. In that case, raise SystemError so that at least
4291 it gets reported instead dumping core. */
4292 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4293 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004294 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004295 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004296 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004297 sc.c_symtable = NULL;
4298 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004299 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004300 return co;
4301}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004302
4303int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004304PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004305{
4306 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004307 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004308 int line = co->co_firstlineno;
4309 int addr = 0;
4310 while (--size >= 0) {
4311 addr += *p++;
4312 if (addr > addrq)
4313 break;
4314 line += *p++;
4315 }
4316 return line;
4317}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004318
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004319/* The test for LOCAL must come before the test for FREE in order to
4320 handle classes where name is both local and free. The local var is
4321 a method and the free var is a free var referenced within a method.
4322*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004323
4324static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004325get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004326{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004327 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004328 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004329
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004330 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4331 return CELL;
4332 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4333 return LOCAL;
4334 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4335 return FREE;
4336 v = PyDict_GetItemString(c->c_globals, name);
4337 if (v) {
4338 if (v == Py_None)
4339 return GLOBAL_EXPLICIT;
4340 else {
4341 return GLOBAL_IMPLICIT;
4342 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004343 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004344 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004345 "unknown scope for %.100s in %.100s(%s) "
4346 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4347 name, c->c_name,
4348 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4349 c->c_filename,
4350 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4351 PyObject_REPR(c->c_locals),
4352 PyObject_REPR(c->c_globals)
4353 );
4354
4355 Py_FatalError(buf);
4356 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004357}
4358
Guido van Rossum207fda62001-03-02 03:30:41 +00004359/* Helper functions to issue warnings */
4360
4361static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004362issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004363{
4364 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4365 lineno, NULL, NULL) < 0) {
4366 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4367 PyErr_SetString(PyExc_SyntaxError, msg);
4368 PyErr_SyntaxLocation(filename, lineno);
4369 }
4370 return -1;
4371 }
4372 return 0;
4373}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004374
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004375static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004376symtable_warn(struct symtable *st, char *msg)
4377{
Guido van Rossum207fda62001-03-02 03:30:41 +00004378 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004379 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004380 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004381 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004382 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004383}
4384
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004385/* Helper function for setting lineno and filename */
4386
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004387static int
4388symtable_build(struct compiling *c, node *n)
4389{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004390 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004391 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004392 c->c_symtable->st_future = c->c_future;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004393 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004394 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4395 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004396 return -1;
4397 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004398 if (c->c_symtable->st_errors > 0)
4399 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004400 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004401 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004402 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004403 return 0;
4404}
4405
4406static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004407symtable_init_compiling_symbols(struct compiling *c)
4408{
4409 PyObject *varnames;
4410
4411 varnames = c->c_symtable->st_cur->ste_varnames;
4412 if (varnames == NULL) {
4413 varnames = PyList_New(0);
4414 if (varnames == NULL)
4415 return -1;
4416 c->c_symtable->st_cur->ste_varnames = varnames;
4417 Py_INCREF(varnames);
4418 } else
4419 Py_INCREF(varnames);
4420 c->c_varnames = varnames;
4421
4422 c->c_globals = PyDict_New();
4423 if (c->c_globals == NULL)
4424 return -1;
4425 c->c_freevars = PyDict_New();
4426 if (c->c_freevars == NULL)
4427 return -1;
4428 c->c_cellvars = PyDict_New();
4429 if (c->c_cellvars == NULL)
4430 return -1;
4431 return 0;
4432}
4433
4434struct symbol_info {
4435 int si_nlocals;
4436 int si_ncells;
4437 int si_nfrees;
4438 int si_nimplicit;
4439};
4440
4441static void
4442symtable_init_info(struct symbol_info *si)
4443{
4444 si->si_nlocals = 0;
4445 si->si_ncells = 0;
4446 si->si_nfrees = 0;
4447 si->si_nimplicit = 0;
4448}
4449
4450static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004451symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004452 struct symbol_info *si)
4453{
4454 PyObject *dict, *v;
4455
4456 /* Seperate logic for DEF_FREE. If it occurs in a function,
4457 it indicates a local that we must allocate storage for (a
4458 cell var). If it occurs in a class, then the class has a
4459 method and a free variable with the same name.
4460 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004461 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004462 /* If it isn't declared locally, it can't be a cell. */
4463 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4464 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004465 v = PyInt_FromLong(si->si_ncells++);
4466 dict = c->c_cellvars;
4467 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004468 /* If it is free anyway, then there is no need to do
4469 anything here.
4470 */
4471 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004472 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004473 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004474 v = PyInt_FromLong(si->si_nfrees++);
4475 dict = c->c_freevars;
4476 }
4477 if (v == NULL)
4478 return -1;
4479 if (PyDict_SetItem(dict, name, v) < 0) {
4480 Py_DECREF(v);
4481 return -1;
4482 }
4483 Py_DECREF(v);
4484 return 0;
4485}
4486
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004487/* If a variable is a cell and an argument, make sure that appears in
4488 co_cellvars before any variable to its right in varnames.
4489*/
4490
4491
4492static int
4493symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4494 PyObject *varnames, int flags)
4495{
4496 PyObject *v, *w, *d, *list = NULL;
4497 int i, pos;
4498
4499 if (flags & CO_VARARGS)
4500 argcount++;
4501 if (flags & CO_VARKEYWORDS)
4502 argcount++;
4503 for (i = argcount; --i >= 0; ) {
4504 v = PyList_GET_ITEM(varnames, i);
4505 if (PyDict_GetItem(*cellvars, v)) {
4506 if (list == NULL) {
4507 list = PyList_New(1);
4508 if (list == NULL)
4509 return -1;
4510 PyList_SET_ITEM(list, 0, v);
4511 Py_INCREF(v);
4512 } else
4513 PyList_Insert(list, 0, v);
4514 }
4515 }
4516 if (list == NULL || PyList_GET_SIZE(list) == 0)
4517 return 0;
4518 /* There are cellvars that are also arguments. Create a dict
4519 to replace cellvars and put the args at the front.
4520 */
4521 d = PyDict_New();
4522 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4523 v = PyInt_FromLong(i);
4524 if (v == NULL)
4525 goto fail;
4526 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4527 goto fail;
4528 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4529 goto fail;
4530 }
4531 pos = 0;
4532 i = PyList_GET_SIZE(list);
4533 Py_DECREF(list);
4534 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4535 w = PyInt_FromLong(i++); /* don't care about the old key */
4536 if (PyDict_SetItem(d, v, w) < 0) {
4537 Py_DECREF(w);
4538 goto fail;
4539 }
4540 Py_DECREF(w);
4541 }
4542 Py_DECREF(*cellvars);
4543 *cellvars = d;
4544 return 1;
4545 fail:
4546 Py_DECREF(d);
4547 return -1;
4548}
4549
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004550static int
4551symtable_freevar_offsets(PyObject *freevars, int offset)
4552{
4553 PyObject *name, *v;
4554 int pos;
4555
4556 /* The cell vars are the first elements of the closure,
4557 followed by the free vars. Update the offsets in
4558 c_freevars to account for number of cellvars. */
4559 pos = 0;
4560 while (PyDict_Next(freevars, &pos, &name, &v)) {
4561 int i = PyInt_AS_LONG(v) + offset;
4562 PyObject *o = PyInt_FromLong(i);
4563 if (o == NULL)
4564 return -1;
4565 if (PyDict_SetItem(freevars, name, o) < 0) {
4566 Py_DECREF(o);
4567 return -1;
4568 }
4569 Py_DECREF(o);
4570 }
4571 return 0;
4572}
4573
4574static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004575symtable_check_unoptimized(struct compiling *c,
4576 PySymtableEntryObject *ste,
4577 struct symbol_info *si)
4578{
4579 char buf[300];
4580
4581 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4582 || (ste->ste_nested && si->si_nimplicit)))
4583 return 0;
4584
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004585#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4586
4587#define ILLEGAL_IS "is a nested function"
4588
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004589#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004590"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004591
4592#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004593"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004594
4595#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00004596"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004597"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004598
4599 /* XXX perhaps the linenos for these opt-breaking statements
4600 should be stored so the exception can point to them. */
4601
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004602 if (ste->ste_child_free) {
4603 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004604 PyOS_snprintf(buf, sizeof(buf),
4605 ILLEGAL_IMPORT_STAR,
4606 PyString_AS_STRING(ste->ste_name),
4607 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004608 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004609 PyOS_snprintf(buf, sizeof(buf),
4610 ILLEGAL_BARE_EXEC,
4611 PyString_AS_STRING(ste->ste_name),
4612 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004613 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004614 PyOS_snprintf(buf, sizeof(buf),
4615 ILLEGAL_EXEC_AND_IMPORT_STAR,
4616 PyString_AS_STRING(ste->ste_name),
4617 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004618 }
4619 } else {
4620 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004621 PyOS_snprintf(buf, sizeof(buf),
4622 ILLEGAL_IMPORT_STAR,
4623 PyString_AS_STRING(ste->ste_name),
4624 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004625 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004626 PyOS_snprintf(buf, sizeof(buf),
4627 ILLEGAL_BARE_EXEC,
4628 PyString_AS_STRING(ste->ste_name),
4629 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004630 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004631 PyOS_snprintf(buf, sizeof(buf),
4632 ILLEGAL_EXEC_AND_IMPORT_STAR,
4633 PyString_AS_STRING(ste->ste_name),
4634 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004635 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004636 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004637
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004638 PyErr_SetString(PyExc_SyntaxError, buf);
4639 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4640 ste->ste_opt_lineno);
4641 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004642}
4643
4644static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004645symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4646 struct symbol_info *si)
4647{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004648 if (c->c_future)
4649 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004650 if (ste->ste_generator)
4651 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004652 if (ste->ste_type != TYPE_MODULE)
4653 c->c_flags |= CO_NEWLOCALS;
4654 if (ste->ste_type == TYPE_FUNCTION) {
4655 c->c_nlocals = si->si_nlocals;
4656 if (ste->ste_optimized == 0)
4657 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004658 else if (ste->ste_optimized != OPT_EXEC)
4659 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004660 }
4661 return 0;
4662}
4663
4664static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004665symtable_load_symbols(struct compiling *c)
4666{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004667 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004668 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004669 PyObject *name, *varnames, *v;
4670 int i, flags, pos;
4671 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004672
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004673 v = NULL;
4674
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004675 if (symtable_init_compiling_symbols(c) < 0)
4676 goto fail;
4677 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004678 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004679 si.si_nlocals = PyList_GET_SIZE(varnames);
4680 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004681
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004682 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004683 v = PyInt_FromLong(i);
4684 if (PyDict_SetItem(c->c_locals,
4685 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004686 goto fail;
4687 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004688 }
4689
4690 /* XXX The cases below define the rules for whether a name is
4691 local or global. The logic could probably be clearer. */
4692 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004693 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4694 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004695
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004696 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004697 /* undo the original DEF_FREE */
4698 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004699
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004700 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004701 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004702 2. Free variables in methods that are also class
4703 variables or declared global.
4704 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004705 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004706 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004707
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004708 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004709 c->c_argcount--;
4710 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004711 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004712 c->c_argcount--;
4713 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004714 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004715 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004716 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004717 if (flags & DEF_PARAM) {
4718 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004719 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004720 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004721 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004722 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004723 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004724 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004725 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4726 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004727 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004728 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00004729 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004730 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004731 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004732 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004733 if (v == NULL)
4734 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004735 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004736 goto fail;
4737 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004738 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004739 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004740 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004741 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004742 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004743 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004744 if (v == NULL)
4745 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004746 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004747 goto fail;
4748 Py_DECREF(v);
4749 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004750 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004751 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00004752 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004753 goto fail;
4754 if (st->st_nscopes != 1) {
4755 v = PyInt_FromLong(flags);
4756 if (PyDict_SetItem(st->st_global,
4757 name, v))
4758 goto fail;
4759 Py_DECREF(v);
4760 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004761 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004762 }
4763 }
4764
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004765 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4766
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004767 if (si.si_ncells > 1) { /* one cell is always in order */
4768 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4769 c->c_varnames, c->c_flags) < 0)
4770 return -1;
4771 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004772 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4773 return -1;
4774 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004775 fail:
4776 /* is this always the right thing to do? */
4777 Py_XDECREF(v);
4778 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004779}
4780
4781static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004782symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004783{
4784 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004785
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004786 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004787 if (st == NULL)
4788 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004789 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00004790
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004791 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004792 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004793 goto fail;
4794 if ((st->st_symbols = PyDict_New()) == NULL)
4795 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004796 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004797 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004798 st->st_errors = 0;
4799 st->st_tmpname = 0;
4800 st->st_private = NULL;
4801 return st;
4802 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004803 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004804 return NULL;
4805}
4806
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004807void
4808PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004809{
4810 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004811 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004812 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004813 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004814}
4815
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004816/* When the compiler exits a scope, it must should update the scope's
4817 free variable information with the list of free variables in its
4818 children.
4819
4820 Variables that are free in children and defined in the current
4821 scope are cellvars.
4822
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004823 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004824 false), free variables in children that are not defined here are
4825 implicit globals.
4826
4827*/
4828
4829static int
4830symtable_update_free_vars(struct symtable *st)
4831{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004832 int i, j, def;
4833 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004834 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004835
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004836 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004837 def = DEF_FREE_CLASS;
4838 else
4839 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004840 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004841 int pos = 0;
4842
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004843 if (list)
4844 PyList_SetSlice(list, 0,
4845 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004846 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004847 PyList_GET_ITEM(ste->ste_children, i);
4848 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004849 int flags = PyInt_AS_LONG(o);
4850 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004851 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004852 if (list == NULL) {
4853 list = PyList_New(0);
4854 if (list == NULL)
4855 return -1;
4856 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004857 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004858 if (PyList_Append(list, name) < 0) {
4859 Py_DECREF(list);
4860 return -1;
4861 }
4862 }
4863 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004864 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004865 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004866 v = PyDict_GetItem(ste->ste_symbols, name);
4867 /* If a name N is declared global in scope A and
4868 referenced in scope B contained (perhaps
4869 indirectly) in A and there are no scopes
4870 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004871 is global in B. Unless A is a class scope,
4872 because class scopes are not considered for
4873 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004874 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004875 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004876 int flags = PyInt_AS_LONG(v);
4877 if (flags & DEF_GLOBAL) {
4878 symtable_undo_free(st, child->ste_id,
4879 name);
4880 continue;
4881 }
4882 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004883 if (ste->ste_nested) {
4884 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004885 name, def) < 0) {
4886 Py_DECREF(list);
4887 return -1;
4888 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004889 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004890 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004891 name) < 0) {
4892 Py_DECREF(list);
4893 return -1;
4894 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004895 }
4896 }
4897 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004898
4899 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004900 return 0;
4901}
4902
4903/* If the current scope is a non-nested class or if name is not
4904 defined in the current, non-nested scope, then it is an implicit
4905 global in all nested scopes.
4906*/
4907
4908static int
4909symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4910{
4911 PyObject *o;
4912 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004913 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004914
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004915 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004916 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004917 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004918 if (o == NULL)
4919 return symtable_undo_free(st, child, name);
4920 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004921
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004922 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004923 return symtable_undo_free(st, child, name);
4924 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004925 return symtable_add_def_o(st, ste->ste_symbols,
4926 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004927}
4928
4929static int
4930symtable_undo_free(struct symtable *st, PyObject *id,
4931 PyObject *name)
4932{
4933 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004934 PyObject *info;
4935 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004936
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004937 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4938 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004939 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00004940
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004941 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004942 if (info == NULL)
4943 return 0;
4944 v = PyInt_AS_LONG(info);
4945 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004946 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004947 DEF_FREE_GLOBAL) < 0)
4948 return -1;
4949 } else
4950 /* If the name is defined here or declared global,
4951 then the recursion stops. */
4952 return 0;
4953
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004954 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4955 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004956 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004957 PyList_GET_ITEM(ste->ste_children, i);
4958 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004959 if (x < 0)
4960 return x;
4961 }
4962 return 0;
4963}
4964
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004965/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4966 This reference is released when the scope is exited, via the DECREF
4967 in symtable_exit_scope().
4968*/
4969
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004970static int
4971symtable_exit_scope(struct symtable *st)
4972{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004973 int end;
4974
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004975 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004976 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004977 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004978 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004979 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4980 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004981 if (PySequence_DelItem(st->st_stack, end) < 0)
4982 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004983 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004984}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004985
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004986static void
4987symtable_enter_scope(struct symtable *st, char *name, int type,
4988 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004989{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004990 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004991
4992 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004993 prev = st->st_cur;
4994 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4995 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004996 st->st_errors++;
4997 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004998 }
4999 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005000 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005001 PySymtableEntry_New(st, name, type, lineno);
5002 if (strcmp(name, TOP) == 0)
5003 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005004 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005005 if (PyList_Append(prev->ste_children,
5006 (PyObject *)st->st_cur) < 0)
5007 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005008 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005009}
5010
5011static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005012symtable_lookup(struct symtable *st, char *name)
5013{
5014 char buffer[MANGLE_LEN];
5015 PyObject *v;
5016 int flags;
5017
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005018 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005019 name = buffer;
5020 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5021 if (v == NULL) {
5022 if (PyErr_Occurred())
5023 return -1;
5024 else
5025 return 0;
5026 }
5027
5028 flags = PyInt_AS_LONG(v);
5029 return flags;
5030}
5031
5032static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005033symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005034{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005035 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005036 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005037 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005038
Guido van Rossumb7164622002-08-16 02:48:11 +00005039 /* Warn about None, except inside a tuple (where the assignment
5040 code already issues a warning). */
5041 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5042 *name == 'N' && strcmp(name, "None") == 0)
5043 {
5044 if (symtable_warn(st, "argument named None"))
5045 return -1;
5046 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005047 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005048 name = buffer;
5049 if ((s = PyString_InternFromString(name)) == NULL)
5050 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005051 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5052 Py_DECREF(s);
5053 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005054}
5055
5056/* Must only be called with mangled names */
5057
5058static int
5059symtable_add_def_o(struct symtable *st, PyObject *dict,
5060 PyObject *name, int flag)
5061{
5062 PyObject *o;
5063 int val;
5064
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005065 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005066 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005067 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005068 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005069 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005070 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005071 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005072 return -1;
5073 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005074 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005075 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005076 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005077 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005078 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005079 Py_DECREF(o);
5080 return -1;
5081 }
5082 Py_DECREF(o);
5083
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005084 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005085 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005086 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005087 } else if (flag & DEF_GLOBAL) {
5088 /* XXX need to update DEF_GLOBAL for other flags too;
5089 perhaps only DEF_FREE_GLOBAL */
5090 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005091 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005092 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005093 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005094 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005095 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005096 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005097 Py_DECREF(o);
5098 return -1;
5099 }
5100 Py_DECREF(o);
5101 }
5102 return 0;
5103}
5104
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005105#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005106
Tim Peters08a898f2001-06-28 01:52:22 +00005107/* Look for a yield stmt under n. Return 1 if found, else 0.
5108 This hack is used to look inside "if 0:" blocks (which are normally
5109 ignored) in case those are the only places a yield occurs (so that this
5110 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005111static int
5112look_for_yield(node *n)
5113{
5114 int i;
5115
5116 for (i = 0; i < NCH(n); ++i) {
5117 node *kid = CHILD(n, i);
5118
5119 switch (TYPE(kid)) {
5120
5121 case classdef:
5122 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005123 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005124 /* Stuff in nested functions and classes can't make
5125 the parent a generator. */
5126 return 0;
5127
5128 case yield_stmt:
5129 return 1;
5130
5131 default:
5132 if (look_for_yield(kid))
5133 return 1;
5134 }
5135 }
5136 return 0;
5137}
5138
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005139static void
5140symtable_node(struct symtable *st, node *n)
5141{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005142 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005143
5144 loop:
5145 switch (TYPE(n)) {
5146 case funcdef: {
5147 char *func_name = STR(CHILD(n, 1));
5148 symtable_add_def(st, func_name, DEF_LOCAL);
5149 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005150 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005151 symtable_funcdef(st, n);
5152 symtable_exit_scope(st);
5153 break;
5154 }
5155 case lambdef:
5156 if (NCH(n) == 4)
5157 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005158 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005159 symtable_funcdef(st, n);
5160 symtable_exit_scope(st);
5161 break;
5162 case classdef: {
5163 char *tmp, *class_name = STR(CHILD(n, 1));
5164 symtable_add_def(st, class_name, DEF_LOCAL);
5165 if (TYPE(CHILD(n, 2)) == LPAR) {
5166 node *bases = CHILD(n, 3);
5167 int i;
5168 for (i = 0; i < NCH(bases); i += 2) {
5169 symtable_node(st, CHILD(bases, i));
5170 }
5171 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005172 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005173 tmp = st->st_private;
5174 st->st_private = class_name;
5175 symtable_node(st, CHILD(n, NCH(n) - 1));
5176 st->st_private = tmp;
5177 symtable_exit_scope(st);
5178 break;
5179 }
5180 case if_stmt:
5181 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005182 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5183 if (st->st_cur->ste_generator == 0)
5184 st->st_cur->ste_generator =
5185 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005186 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005187 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005188 symtable_node(st, CHILD(n, i + 1));
5189 symtable_node(st, CHILD(n, i + 3));
5190 }
5191 if (i + 2 < NCH(n))
5192 symtable_node(st, CHILD(n, i + 2));
5193 break;
5194 case global_stmt:
5195 symtable_global(st, n);
5196 break;
5197 case import_stmt:
5198 symtable_import(st, n);
5199 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005200 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005201 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005202 symtable_node(st, CHILD(n, 1));
5203 if (NCH(n) > 2)
5204 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005205 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005206 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005207 st->st_cur->ste_opt_lineno = n->n_lineno;
5208 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005209 if (NCH(n) > 4)
5210 symtable_node(st, CHILD(n, 5));
5211 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005212
5213 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005214 case assert_stmt:
5215 if (Py_OptimizeFlag)
5216 return;
5217 if (NCH(n) == 2) {
5218 n = CHILD(n, 1);
5219 goto loop;
5220 } else {
5221 symtable_node(st, CHILD(n, 1));
5222 n = CHILD(n, 3);
5223 goto loop;
5224 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005225 case except_clause:
5226 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005227 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005228 if (NCH(n) > 1) {
5229 n = CHILD(n, 1);
5230 goto loop;
5231 }
5232 break;
5233 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005234 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005235 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005236 case yield_stmt:
5237 st->st_cur->ste_generator = 1;
5238 n = CHILD(n, 1);
5239 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005240 case expr_stmt:
5241 if (NCH(n) == 1)
5242 n = CHILD(n, 0);
5243 else {
5244 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005245 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005246 symtable_node(st, CHILD(n, 2));
5247 break;
5248 } else {
5249 int i;
5250 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005251 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005252 n = CHILD(n, NCH(n) - 1);
5253 }
5254 }
5255 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005256 case list_iter:
5257 n = CHILD(n, 0);
5258 if (TYPE(n) == list_for) {
5259 st->st_tmpname++;
5260 symtable_list_comprehension(st, n);
5261 st->st_tmpname--;
5262 } else {
5263 REQ(n, list_if);
5264 symtable_node(st, CHILD(n, 1));
5265 if (NCH(n) == 3) {
5266 n = CHILD(n, 2);
5267 goto loop;
5268 }
5269 }
5270 break;
5271 case for_stmt:
5272 symtable_assign(st, CHILD(n, 1), 0);
5273 for (i = 3; i < NCH(n); ++i)
5274 if (TYPE(CHILD(n, i)) >= single_input)
5275 symtable_node(st, CHILD(n, i));
5276 break;
5277 /* The remaining cases fall through to default except in
5278 special circumstances. This requires the individual cases
5279 to be coded with great care, even though they look like
5280 rather innocuous. Each case must double-check TYPE(n).
5281 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005282 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005283 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005284 n = CHILD(n, 2);
5285 goto loop;
5286 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005287 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005288 case listmaker:
5289 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00005290 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005291 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00005292 symtable_node(st, CHILD(n, 0));
5293 st->st_tmpname--;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005294 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005295 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005296 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005297 case atom:
5298 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5299 symtable_add_use(st, STR(CHILD(n, 0)));
5300 break;
5301 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005302 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005303 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005304 /* Walk over every non-token child with a special case
5305 for one child.
5306 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005307 if (NCH(n) == 1) {
5308 n = CHILD(n, 0);
5309 goto loop;
5310 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005311 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005312 if (TYPE(CHILD(n, i)) >= single_input)
5313 symtable_node(st, CHILD(n, i));
5314 }
5315}
5316
5317static void
5318symtable_funcdef(struct symtable *st, node *n)
5319{
5320 node *body;
5321
5322 if (TYPE(n) == lambdef) {
5323 if (NCH(n) == 4)
5324 symtable_params(st, CHILD(n, 1));
5325 } else
5326 symtable_params(st, CHILD(n, 2));
5327 body = CHILD(n, NCH(n) - 1);
5328 symtable_node(st, body);
5329}
5330
5331/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00005332 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005333 which are references in the defining scope. symtable_params()
5334 parses the parameter names, which are defined in the function's
5335 body.
5336
5337 varargslist:
5338 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5339 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5340*/
5341
5342static void
5343symtable_default_args(struct symtable *st, node *n)
5344{
5345 node *c;
5346 int i;
5347
5348 if (TYPE(n) == parameters) {
5349 n = CHILD(n, 1);
5350 if (TYPE(n) == RPAR)
5351 return;
5352 }
5353 REQ(n, varargslist);
5354 for (i = 0; i < NCH(n); i += 2) {
5355 c = CHILD(n, i);
5356 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5357 break;
5358 }
5359 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5360 symtable_node(st, CHILD(n, i));
5361 }
5362}
5363
5364static void
5365symtable_params(struct symtable *st, node *n)
5366{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005367 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00005368 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005369
5370 if (TYPE(n) == parameters) {
5371 n = CHILD(n, 1);
5372 if (TYPE(n) == RPAR)
5373 return;
5374 }
5375 REQ(n, varargslist);
5376 for (i = 0; i < NCH(n); i += 2) {
5377 c = CHILD(n, i);
5378 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5379 ext = 1;
5380 break;
5381 }
5382 if (TYPE(c) == test) {
5383 continue;
5384 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00005385 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005386 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00005387 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005388 char nbuf[30];
5389 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005390 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005391 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005392 }
5393 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005394 if (ext) {
5395 c = CHILD(n, i);
5396 if (TYPE(c) == STAR) {
5397 i++;
5398 symtable_add_def(st, STR(CHILD(n, i)),
5399 DEF_PARAM | DEF_STAR);
5400 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005401 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005402 c = NULL;
5403 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005404 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005405 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005406 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005407 i++;
5408 symtable_add_def(st, STR(CHILD(n, i)),
5409 DEF_PARAM | DEF_DOUBLESTAR);
5410 }
5411 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005412 if (complex >= 0) {
5413 int j;
5414 for (j = 0; j <= complex; j++) {
5415 c = CHILD(n, j);
5416 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005417 c = CHILD(n, ++j);
5418 else if (TYPE(c) == EQUAL)
5419 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005420 if (TYPE(CHILD(c, 0)) == LPAR)
5421 symtable_params_fplist(st, CHILD(c, 1));
5422 }
5423 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005424}
5425
5426static void
5427symtable_params_fplist(struct symtable *st, node *n)
5428{
5429 int i;
5430 node *c;
5431
5432 REQ(n, fplist);
5433 for (i = 0; i < NCH(n); i += 2) {
5434 c = CHILD(n, i);
5435 REQ(c, fpdef);
5436 if (NCH(c) == 1)
5437 symtable_add_def(st, STR(CHILD(c, 0)),
5438 DEF_PARAM | DEF_INTUPLE);
5439 else
5440 symtable_params_fplist(st, CHILD(c, 1));
5441 }
5442
5443}
5444
5445static void
5446symtable_global(struct symtable *st, node *n)
5447{
5448 int i;
5449
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005450 /* XXX It might be helpful to warn about module-level global
5451 statements, but it's hard to tell the difference between
5452 module-level and a string passed to exec.
5453 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005454
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005455 for (i = 1; i < NCH(n); i += 2) {
5456 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005457 int flags;
5458
5459 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005460 if (flags < 0)
5461 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005462 if (flags && flags != DEF_GLOBAL) {
5463 char buf[500];
5464 if (flags & DEF_PARAM) {
5465 PyErr_Format(PyExc_SyntaxError,
5466 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005467 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005468 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005469 st->st_cur->ste_lineno);
5470 st->st_errors++;
5471 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005472 }
5473 else {
5474 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005475 PyOS_snprintf(buf, sizeof(buf),
5476 GLOBAL_AFTER_ASSIGN,
5477 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005478 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005479 PyOS_snprintf(buf, sizeof(buf),
5480 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005481 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005482 }
5483 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005484 symtable_add_def(st, name, DEF_GLOBAL);
5485 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005486}
5487
5488static void
5489symtable_list_comprehension(struct symtable *st, node *n)
5490{
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005491 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005492
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005493 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005494 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005495 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005496 symtable_node(st, CHILD(n, 3));
5497 if (NCH(n) == 5)
5498 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005499}
5500
5501static void
5502symtable_import(struct symtable *st, node *n)
5503{
5504 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005505 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005506 | 'from' dotted_name 'import'
5507 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005508 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005509 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005510 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005511 node *dotname = CHILD(n, 1);
5512 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5513 /* check for bogus imports */
5514 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5515 PyErr_SetString(PyExc_SyntaxError,
5516 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005517 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005518 n->n_lineno);
5519 st->st_errors++;
5520 return;
5521 }
5522 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005523 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005524 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005525 if (symtable_warn(st,
5526 "import * only allowed at module level") < 0)
5527 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005528 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005529 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005530 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005531 } else {
5532 for (i = 3; i < NCH(n); i += 2) {
5533 node *c = CHILD(n, i);
5534 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005535 symtable_assign(st, CHILD(c, 2),
5536 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005537 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005538 symtable_assign(st, CHILD(c, 0),
5539 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005540 }
5541 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005542 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005543 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005544 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005545 }
5546 }
5547}
5548
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005549/* The third argument to symatble_assign() is a flag to be passed to
5550 symtable_add_def() if it is eventually called. The flag is useful
5551 to specify the particular type of assignment that should be
5552 recorded, e.g. an assignment caused by import.
5553 */
5554
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005555static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005556symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005557{
5558 node *tmp;
5559 int i;
5560
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005561 loop:
5562 switch (TYPE(n)) {
5563 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005564 /* invalid assignment, e.g. lambda x:x=2. The next
5565 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005566 return;
5567 case power:
5568 if (NCH(n) > 2) {
5569 for (i = 2; i < NCH(n); ++i)
5570 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5571 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005572 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005573 if (NCH(n) > 1) {
5574 symtable_node(st, CHILD(n, 0));
5575 symtable_node(st, CHILD(n, 1));
5576 } else {
5577 n = CHILD(n, 0);
5578 goto loop;
5579 }
5580 return;
5581 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005582 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5583 /* XXX This is an error, but the next pass
5584 will catch it. */
5585 return;
5586 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005587 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005588 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005589 }
5590 return;
5591 case exprlist:
5592 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00005593 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005594 if (NCH(n) == 1) {
5595 n = CHILD(n, 0);
5596 goto loop;
5597 }
5598 else {
5599 int i;
5600 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005601 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005602 return;
5603 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005604 case atom:
5605 tmp = CHILD(n, 0);
5606 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5607 n = CHILD(n, 1);
5608 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005609 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00005610 if (strcmp(STR(tmp), "__debug__") == 0) {
5611 PyErr_SetString(PyExc_SyntaxError,
5612 ASSIGN_DEBUG);
5613 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton86424e32001-12-04 02:41:46 +00005614 n->n_lineno);
Jeremy Hylton778e2652001-11-09 19:50:08 +00005615 st->st_errors++;
5616 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005617 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005618 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005619 return;
5620 case dotted_as_name:
5621 if (NCH(n) == 3)
5622 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005623 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005624 else
5625 symtable_add_def(st,
5626 STR(CHILD(CHILD(n,
5627 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005628 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005629 return;
5630 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005631 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005632 return;
5633 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005634 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005635 return;
5636 default:
5637 if (NCH(n) == 0)
5638 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005639 if (NCH(n) == 1) {
5640 n = CHILD(n, 0);
5641 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005642 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005643 /* Should only occur for errors like x + 1 = 1,
5644 which will be caught in the next pass. */
5645 for (i = 0; i < NCH(n); ++i)
5646 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005647 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005648 }
5649}