blob: 2b2a9d5389a152cf5b91eac0f20d537369c1140f [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;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004209 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4210 sc.c_encoding = "utf-8";
4211 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004212 sc.c_encoding = STR(n);
4213 n = CHILD(n, 0);
4214 } else {
4215 sc.c_encoding = NULL;
4216 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004217 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004218 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004219 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004220 /* c_symtable still points to parent's symbols */
4221 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004222 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004223 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004224 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004225 if (base->c_encoding != NULL) {
4226 assert(sc.c_encoding == NULL);
4227 sc.c_encoding = base->c_encoding;
4228 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004229 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004230 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004231 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004232 if (sc.c_future == NULL) {
4233 com_free(&sc);
4234 return NULL;
4235 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004236 if (flags) {
4237 int merged = sc.c_future->ff_features |
4238 flags->cf_flags;
4239 sc.c_future->ff_features = merged;
4240 flags->cf_flags = merged;
4241 }
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004242 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004243 com_free(&sc);
4244 return NULL;
4245 }
4246 }
4247 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004248 if (symtable_load_symbols(&sc) < 0) {
4249 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004250 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004251 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004252 compile_node(&sc, n);
4253 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004254 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004255 PyObject *consts, *names, *varnames, *filename, *name,
4256 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004257 consts = PyList_AsTuple(sc.c_consts);
4258 names = PyList_AsTuple(sc.c_names);
4259 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004260 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4261 freevars = dict_keys_inorder(sc.c_freevars,
4262 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004263 filename = PyString_InternFromString(sc.c_filename);
4264 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004265 if (!PyErr_Occurred())
4266 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004267 sc.c_nlocals,
4268 sc.c_maxstacklevel,
4269 sc.c_flags,
4270 sc.c_code,
4271 consts,
4272 names,
4273 varnames,
4274 freevars,
4275 cellvars,
4276 filename,
4277 name,
4278 sc.c_firstlineno,
4279 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004280 Py_XDECREF(consts);
4281 Py_XDECREF(names);
4282 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004283 Py_XDECREF(freevars);
4284 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004285 Py_XDECREF(filename);
4286 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004287 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004288 else if (!PyErr_Occurred()) {
4289 /* This could happen if someone called PyErr_Clear() after an
4290 error was reported above. That's not supposed to happen,
4291 but I just plugged one case and I'm not sure there can't be
4292 others. In that case, raise SystemError so that at least
4293 it gets reported instead dumping core. */
4294 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4295 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004296 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004297 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004298 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004299 sc.c_symtable = NULL;
4300 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004301 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004302 return co;
4303}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004304
4305int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004306PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004307{
4308 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004309 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004310 int line = co->co_firstlineno;
4311 int addr = 0;
4312 while (--size >= 0) {
4313 addr += *p++;
4314 if (addr > addrq)
4315 break;
4316 line += *p++;
4317 }
4318 return line;
4319}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004320
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004321/* The test for LOCAL must come before the test for FREE in order to
4322 handle classes where name is both local and free. The local var is
4323 a method and the free var is a free var referenced within a method.
4324*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004325
4326static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004327get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004328{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004329 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004330 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004331
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004332 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4333 return CELL;
4334 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4335 return LOCAL;
4336 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4337 return FREE;
4338 v = PyDict_GetItemString(c->c_globals, name);
4339 if (v) {
4340 if (v == Py_None)
4341 return GLOBAL_EXPLICIT;
4342 else {
4343 return GLOBAL_IMPLICIT;
4344 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004345 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004346 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004347 "unknown scope for %.100s in %.100s(%s) "
4348 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4349 name, c->c_name,
4350 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4351 c->c_filename,
4352 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4353 PyObject_REPR(c->c_locals),
4354 PyObject_REPR(c->c_globals)
4355 );
4356
4357 Py_FatalError(buf);
4358 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004359}
4360
Guido van Rossum207fda62001-03-02 03:30:41 +00004361/* Helper functions to issue warnings */
4362
4363static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004364issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004365{
4366 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4367 lineno, NULL, NULL) < 0) {
4368 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4369 PyErr_SetString(PyExc_SyntaxError, msg);
4370 PyErr_SyntaxLocation(filename, lineno);
4371 }
4372 return -1;
4373 }
4374 return 0;
4375}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004376
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004377static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004378symtable_warn(struct symtable *st, char *msg)
4379{
Guido van Rossum207fda62001-03-02 03:30:41 +00004380 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004381 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004382 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004383 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004384 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004385}
4386
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004387/* Helper function for setting lineno and filename */
4388
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004389static int
4390symtable_build(struct compiling *c, node *n)
4391{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004392 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004393 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004394 c->c_symtable->st_future = c->c_future;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004395 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004396 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4397 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004398 return -1;
4399 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004400 if (c->c_symtable->st_errors > 0)
4401 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004402 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004403 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004404 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004405 return 0;
4406}
4407
4408static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004409symtable_init_compiling_symbols(struct compiling *c)
4410{
4411 PyObject *varnames;
4412
4413 varnames = c->c_symtable->st_cur->ste_varnames;
4414 if (varnames == NULL) {
4415 varnames = PyList_New(0);
4416 if (varnames == NULL)
4417 return -1;
4418 c->c_symtable->st_cur->ste_varnames = varnames;
4419 Py_INCREF(varnames);
4420 } else
4421 Py_INCREF(varnames);
4422 c->c_varnames = varnames;
4423
4424 c->c_globals = PyDict_New();
4425 if (c->c_globals == NULL)
4426 return -1;
4427 c->c_freevars = PyDict_New();
4428 if (c->c_freevars == NULL)
4429 return -1;
4430 c->c_cellvars = PyDict_New();
4431 if (c->c_cellvars == NULL)
4432 return -1;
4433 return 0;
4434}
4435
4436struct symbol_info {
4437 int si_nlocals;
4438 int si_ncells;
4439 int si_nfrees;
4440 int si_nimplicit;
4441};
4442
4443static void
4444symtable_init_info(struct symbol_info *si)
4445{
4446 si->si_nlocals = 0;
4447 si->si_ncells = 0;
4448 si->si_nfrees = 0;
4449 si->si_nimplicit = 0;
4450}
4451
4452static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004453symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004454 struct symbol_info *si)
4455{
4456 PyObject *dict, *v;
4457
4458 /* Seperate logic for DEF_FREE. If it occurs in a function,
4459 it indicates a local that we must allocate storage for (a
4460 cell var). If it occurs in a class, then the class has a
4461 method and a free variable with the same name.
4462 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004463 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004464 /* If it isn't declared locally, it can't be a cell. */
4465 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4466 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004467 v = PyInt_FromLong(si->si_ncells++);
4468 dict = c->c_cellvars;
4469 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004470 /* If it is free anyway, then there is no need to do
4471 anything here.
4472 */
4473 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004474 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004475 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004476 v = PyInt_FromLong(si->si_nfrees++);
4477 dict = c->c_freevars;
4478 }
4479 if (v == NULL)
4480 return -1;
4481 if (PyDict_SetItem(dict, name, v) < 0) {
4482 Py_DECREF(v);
4483 return -1;
4484 }
4485 Py_DECREF(v);
4486 return 0;
4487}
4488
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004489/* If a variable is a cell and an argument, make sure that appears in
4490 co_cellvars before any variable to its right in varnames.
4491*/
4492
4493
4494static int
4495symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4496 PyObject *varnames, int flags)
4497{
4498 PyObject *v, *w, *d, *list = NULL;
4499 int i, pos;
4500
4501 if (flags & CO_VARARGS)
4502 argcount++;
4503 if (flags & CO_VARKEYWORDS)
4504 argcount++;
4505 for (i = argcount; --i >= 0; ) {
4506 v = PyList_GET_ITEM(varnames, i);
4507 if (PyDict_GetItem(*cellvars, v)) {
4508 if (list == NULL) {
4509 list = PyList_New(1);
4510 if (list == NULL)
4511 return -1;
4512 PyList_SET_ITEM(list, 0, v);
4513 Py_INCREF(v);
4514 } else
4515 PyList_Insert(list, 0, v);
4516 }
4517 }
4518 if (list == NULL || PyList_GET_SIZE(list) == 0)
4519 return 0;
4520 /* There are cellvars that are also arguments. Create a dict
4521 to replace cellvars and put the args at the front.
4522 */
4523 d = PyDict_New();
4524 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4525 v = PyInt_FromLong(i);
4526 if (v == NULL)
4527 goto fail;
4528 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4529 goto fail;
4530 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4531 goto fail;
4532 }
4533 pos = 0;
4534 i = PyList_GET_SIZE(list);
4535 Py_DECREF(list);
4536 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4537 w = PyInt_FromLong(i++); /* don't care about the old key */
4538 if (PyDict_SetItem(d, v, w) < 0) {
4539 Py_DECREF(w);
4540 goto fail;
4541 }
4542 Py_DECREF(w);
4543 }
4544 Py_DECREF(*cellvars);
4545 *cellvars = d;
4546 return 1;
4547 fail:
4548 Py_DECREF(d);
4549 return -1;
4550}
4551
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004552static int
4553symtable_freevar_offsets(PyObject *freevars, int offset)
4554{
4555 PyObject *name, *v;
4556 int pos;
4557
4558 /* The cell vars are the first elements of the closure,
4559 followed by the free vars. Update the offsets in
4560 c_freevars to account for number of cellvars. */
4561 pos = 0;
4562 while (PyDict_Next(freevars, &pos, &name, &v)) {
4563 int i = PyInt_AS_LONG(v) + offset;
4564 PyObject *o = PyInt_FromLong(i);
4565 if (o == NULL)
4566 return -1;
4567 if (PyDict_SetItem(freevars, name, o) < 0) {
4568 Py_DECREF(o);
4569 return -1;
4570 }
4571 Py_DECREF(o);
4572 }
4573 return 0;
4574}
4575
4576static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004577symtable_check_unoptimized(struct compiling *c,
4578 PySymtableEntryObject *ste,
4579 struct symbol_info *si)
4580{
4581 char buf[300];
4582
4583 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4584 || (ste->ste_nested && si->si_nimplicit)))
4585 return 0;
4586
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004587#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4588
4589#define ILLEGAL_IS "is a nested function"
4590
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004591#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004592"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004593
4594#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004595"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004596
4597#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00004598"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004599"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004600
4601 /* XXX perhaps the linenos for these opt-breaking statements
4602 should be stored so the exception can point to them. */
4603
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004604 if (ste->ste_child_free) {
4605 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004606 PyOS_snprintf(buf, sizeof(buf),
4607 ILLEGAL_IMPORT_STAR,
4608 PyString_AS_STRING(ste->ste_name),
4609 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004610 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004611 PyOS_snprintf(buf, sizeof(buf),
4612 ILLEGAL_BARE_EXEC,
4613 PyString_AS_STRING(ste->ste_name),
4614 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004615 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004616 PyOS_snprintf(buf, sizeof(buf),
4617 ILLEGAL_EXEC_AND_IMPORT_STAR,
4618 PyString_AS_STRING(ste->ste_name),
4619 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004620 }
4621 } else {
4622 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004623 PyOS_snprintf(buf, sizeof(buf),
4624 ILLEGAL_IMPORT_STAR,
4625 PyString_AS_STRING(ste->ste_name),
4626 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004627 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004628 PyOS_snprintf(buf, sizeof(buf),
4629 ILLEGAL_BARE_EXEC,
4630 PyString_AS_STRING(ste->ste_name),
4631 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004632 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004633 PyOS_snprintf(buf, sizeof(buf),
4634 ILLEGAL_EXEC_AND_IMPORT_STAR,
4635 PyString_AS_STRING(ste->ste_name),
4636 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004637 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004638 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004639
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004640 PyErr_SetString(PyExc_SyntaxError, buf);
4641 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4642 ste->ste_opt_lineno);
4643 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004644}
4645
4646static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004647symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4648 struct symbol_info *si)
4649{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004650 if (c->c_future)
4651 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004652 if (ste->ste_generator)
4653 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004654 if (ste->ste_type != TYPE_MODULE)
4655 c->c_flags |= CO_NEWLOCALS;
4656 if (ste->ste_type == TYPE_FUNCTION) {
4657 c->c_nlocals = si->si_nlocals;
4658 if (ste->ste_optimized == 0)
4659 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004660 else if (ste->ste_optimized != OPT_EXEC)
4661 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004662 }
4663 return 0;
4664}
4665
4666static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004667symtable_load_symbols(struct compiling *c)
4668{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004669 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004670 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004671 PyObject *name, *varnames, *v;
4672 int i, flags, pos;
4673 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004674
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004675 v = NULL;
4676
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004677 if (symtable_init_compiling_symbols(c) < 0)
4678 goto fail;
4679 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004680 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004681 si.si_nlocals = PyList_GET_SIZE(varnames);
4682 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004683
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004684 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004685 v = PyInt_FromLong(i);
4686 if (PyDict_SetItem(c->c_locals,
4687 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004688 goto fail;
4689 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004690 }
4691
4692 /* XXX The cases below define the rules for whether a name is
4693 local or global. The logic could probably be clearer. */
4694 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004695 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4696 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004697
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004698 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004699 /* undo the original DEF_FREE */
4700 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004701
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004702 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004703 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004704 2. Free variables in methods that are also class
4705 variables or declared global.
4706 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004707 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004708 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004709
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004710 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004711 c->c_argcount--;
4712 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004713 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004714 c->c_argcount--;
4715 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004716 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004717 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004718 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004719 if (flags & DEF_PARAM) {
4720 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004721 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004722 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004723 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004724 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004725 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004726 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004727 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4728 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004729 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004730 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00004731 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004732 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004733 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004734 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004735 if (v == NULL)
4736 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004737 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004738 goto fail;
4739 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004740 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004741 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004742 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004743 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004744 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004745 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004746 if (v == NULL)
4747 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004748 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004749 goto fail;
4750 Py_DECREF(v);
4751 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004752 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004753 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00004754 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004755 goto fail;
4756 if (st->st_nscopes != 1) {
4757 v = PyInt_FromLong(flags);
4758 if (PyDict_SetItem(st->st_global,
4759 name, v))
4760 goto fail;
4761 Py_DECREF(v);
4762 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004763 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004764 }
4765 }
4766
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004767 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4768
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004769 if (si.si_ncells > 1) { /* one cell is always in order */
4770 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4771 c->c_varnames, c->c_flags) < 0)
4772 return -1;
4773 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004774 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4775 return -1;
4776 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004777 fail:
4778 /* is this always the right thing to do? */
4779 Py_XDECREF(v);
4780 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004781}
4782
4783static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004784symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004785{
4786 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004787
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004788 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004789 if (st == NULL)
4790 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004791 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00004792
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004793 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004794 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004795 goto fail;
4796 if ((st->st_symbols = PyDict_New()) == NULL)
4797 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004798 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004799 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004800 st->st_errors = 0;
4801 st->st_tmpname = 0;
4802 st->st_private = NULL;
4803 return st;
4804 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004805 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004806 return NULL;
4807}
4808
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004809void
4810PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004811{
4812 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004813 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004814 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004815 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004816}
4817
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004818/* When the compiler exits a scope, it must should update the scope's
4819 free variable information with the list of free variables in its
4820 children.
4821
4822 Variables that are free in children and defined in the current
4823 scope are cellvars.
4824
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004825 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004826 false), free variables in children that are not defined here are
4827 implicit globals.
4828
4829*/
4830
4831static int
4832symtable_update_free_vars(struct symtable *st)
4833{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004834 int i, j, def;
4835 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004836 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004837
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004838 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004839 def = DEF_FREE_CLASS;
4840 else
4841 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004842 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004843 int pos = 0;
4844
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004845 if (list)
4846 PyList_SetSlice(list, 0,
4847 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004848 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004849 PyList_GET_ITEM(ste->ste_children, i);
4850 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004851 int flags = PyInt_AS_LONG(o);
4852 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004853 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004854 if (list == NULL) {
4855 list = PyList_New(0);
4856 if (list == NULL)
4857 return -1;
4858 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004859 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004860 if (PyList_Append(list, name) < 0) {
4861 Py_DECREF(list);
4862 return -1;
4863 }
4864 }
4865 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004866 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004867 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004868 v = PyDict_GetItem(ste->ste_symbols, name);
4869 /* If a name N is declared global in scope A and
4870 referenced in scope B contained (perhaps
4871 indirectly) in A and there are no scopes
4872 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004873 is global in B. Unless A is a class scope,
4874 because class scopes are not considered for
4875 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004876 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004877 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004878 int flags = PyInt_AS_LONG(v);
4879 if (flags & DEF_GLOBAL) {
4880 symtable_undo_free(st, child->ste_id,
4881 name);
4882 continue;
4883 }
4884 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004885 if (ste->ste_nested) {
4886 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004887 name, def) < 0) {
4888 Py_DECREF(list);
4889 return -1;
4890 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004891 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004892 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004893 name) < 0) {
4894 Py_DECREF(list);
4895 return -1;
4896 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004897 }
4898 }
4899 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004900
4901 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004902 return 0;
4903}
4904
4905/* If the current scope is a non-nested class or if name is not
4906 defined in the current, non-nested scope, then it is an implicit
4907 global in all nested scopes.
4908*/
4909
4910static int
4911symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4912{
4913 PyObject *o;
4914 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004915 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004916
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004917 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004918 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004919 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004920 if (o == NULL)
4921 return symtable_undo_free(st, child, name);
4922 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004923
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004924 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004925 return symtable_undo_free(st, child, name);
4926 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004927 return symtable_add_def_o(st, ste->ste_symbols,
4928 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004929}
4930
4931static int
4932symtable_undo_free(struct symtable *st, PyObject *id,
4933 PyObject *name)
4934{
4935 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004936 PyObject *info;
4937 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004938
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004939 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4940 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004941 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00004942
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004943 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004944 if (info == NULL)
4945 return 0;
4946 v = PyInt_AS_LONG(info);
4947 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004948 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004949 DEF_FREE_GLOBAL) < 0)
4950 return -1;
4951 } else
4952 /* If the name is defined here or declared global,
4953 then the recursion stops. */
4954 return 0;
4955
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004956 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4957 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004958 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004959 PyList_GET_ITEM(ste->ste_children, i);
4960 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004961 if (x < 0)
4962 return x;
4963 }
4964 return 0;
4965}
4966
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004967/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4968 This reference is released when the scope is exited, via the DECREF
4969 in symtable_exit_scope().
4970*/
4971
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004972static int
4973symtable_exit_scope(struct symtable *st)
4974{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004975 int end;
4976
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004977 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004978 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004979 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004980 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004981 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4982 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004983 if (PySequence_DelItem(st->st_stack, end) < 0)
4984 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004985 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004986}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004987
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004988static void
4989symtable_enter_scope(struct symtable *st, char *name, int type,
4990 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004991{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004992 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004993
4994 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004995 prev = st->st_cur;
4996 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4997 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004998 st->st_errors++;
4999 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005000 }
5001 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005002 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005003 PySymtableEntry_New(st, name, type, lineno);
5004 if (strcmp(name, TOP) == 0)
5005 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005006 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005007 if (PyList_Append(prev->ste_children,
5008 (PyObject *)st->st_cur) < 0)
5009 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005010 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005011}
5012
5013static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005014symtable_lookup(struct symtable *st, char *name)
5015{
5016 char buffer[MANGLE_LEN];
5017 PyObject *v;
5018 int flags;
5019
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005020 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005021 name = buffer;
5022 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5023 if (v == NULL) {
5024 if (PyErr_Occurred())
5025 return -1;
5026 else
5027 return 0;
5028 }
5029
5030 flags = PyInt_AS_LONG(v);
5031 return flags;
5032}
5033
5034static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005035symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005036{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005037 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005038 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005039 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005040
Guido van Rossumb7164622002-08-16 02:48:11 +00005041 /* Warn about None, except inside a tuple (where the assignment
5042 code already issues a warning). */
5043 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5044 *name == 'N' && strcmp(name, "None") == 0)
5045 {
5046 if (symtable_warn(st, "argument named None"))
5047 return -1;
5048 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005049 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005050 name = buffer;
5051 if ((s = PyString_InternFromString(name)) == NULL)
5052 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005053 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5054 Py_DECREF(s);
5055 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005056}
5057
5058/* Must only be called with mangled names */
5059
5060static int
5061symtable_add_def_o(struct symtable *st, PyObject *dict,
5062 PyObject *name, int flag)
5063{
5064 PyObject *o;
5065 int val;
5066
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005067 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005068 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005069 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005070 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005071 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005072 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005073 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005074 return -1;
5075 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005076 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005077 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005078 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005079 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005080 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005081 Py_DECREF(o);
5082 return -1;
5083 }
5084 Py_DECREF(o);
5085
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005086 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005087 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005088 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005089 } else if (flag & DEF_GLOBAL) {
5090 /* XXX need to update DEF_GLOBAL for other flags too;
5091 perhaps only DEF_FREE_GLOBAL */
5092 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005093 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005094 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005095 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005096 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005097 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005098 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005099 Py_DECREF(o);
5100 return -1;
5101 }
5102 Py_DECREF(o);
5103 }
5104 return 0;
5105}
5106
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005107#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005108
Tim Peters08a898f2001-06-28 01:52:22 +00005109/* Look for a yield stmt under n. Return 1 if found, else 0.
5110 This hack is used to look inside "if 0:" blocks (which are normally
5111 ignored) in case those are the only places a yield occurs (so that this
5112 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005113static int
5114look_for_yield(node *n)
5115{
5116 int i;
5117
5118 for (i = 0; i < NCH(n); ++i) {
5119 node *kid = CHILD(n, i);
5120
5121 switch (TYPE(kid)) {
5122
5123 case classdef:
5124 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005125 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005126 /* Stuff in nested functions and classes can't make
5127 the parent a generator. */
5128 return 0;
5129
5130 case yield_stmt:
5131 return 1;
5132
5133 default:
5134 if (look_for_yield(kid))
5135 return 1;
5136 }
5137 }
5138 return 0;
5139}
5140
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005141static void
5142symtable_node(struct symtable *st, node *n)
5143{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005144 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005145
5146 loop:
5147 switch (TYPE(n)) {
5148 case funcdef: {
5149 char *func_name = STR(CHILD(n, 1));
5150 symtable_add_def(st, func_name, DEF_LOCAL);
5151 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005152 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005153 symtable_funcdef(st, n);
5154 symtable_exit_scope(st);
5155 break;
5156 }
5157 case lambdef:
5158 if (NCH(n) == 4)
5159 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005160 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005161 symtable_funcdef(st, n);
5162 symtable_exit_scope(st);
5163 break;
5164 case classdef: {
5165 char *tmp, *class_name = STR(CHILD(n, 1));
5166 symtable_add_def(st, class_name, DEF_LOCAL);
5167 if (TYPE(CHILD(n, 2)) == LPAR) {
5168 node *bases = CHILD(n, 3);
5169 int i;
5170 for (i = 0; i < NCH(bases); i += 2) {
5171 symtable_node(st, CHILD(bases, i));
5172 }
5173 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005174 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005175 tmp = st->st_private;
5176 st->st_private = class_name;
5177 symtable_node(st, CHILD(n, NCH(n) - 1));
5178 st->st_private = tmp;
5179 symtable_exit_scope(st);
5180 break;
5181 }
5182 case if_stmt:
5183 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005184 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5185 if (st->st_cur->ste_generator == 0)
5186 st->st_cur->ste_generator =
5187 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005188 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005189 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005190 symtable_node(st, CHILD(n, i + 1));
5191 symtable_node(st, CHILD(n, i + 3));
5192 }
5193 if (i + 2 < NCH(n))
5194 symtable_node(st, CHILD(n, i + 2));
5195 break;
5196 case global_stmt:
5197 symtable_global(st, n);
5198 break;
5199 case import_stmt:
5200 symtable_import(st, n);
5201 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005202 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005203 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005204 symtable_node(st, CHILD(n, 1));
5205 if (NCH(n) > 2)
5206 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005207 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005208 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005209 st->st_cur->ste_opt_lineno = n->n_lineno;
5210 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005211 if (NCH(n) > 4)
5212 symtable_node(st, CHILD(n, 5));
5213 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005214
5215 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005216 case assert_stmt:
5217 if (Py_OptimizeFlag)
5218 return;
5219 if (NCH(n) == 2) {
5220 n = CHILD(n, 1);
5221 goto loop;
5222 } else {
5223 symtable_node(st, CHILD(n, 1));
5224 n = CHILD(n, 3);
5225 goto loop;
5226 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005227 case except_clause:
5228 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005229 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005230 if (NCH(n) > 1) {
5231 n = CHILD(n, 1);
5232 goto loop;
5233 }
5234 break;
5235 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005236 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005237 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005238 case yield_stmt:
5239 st->st_cur->ste_generator = 1;
5240 n = CHILD(n, 1);
5241 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005242 case expr_stmt:
5243 if (NCH(n) == 1)
5244 n = CHILD(n, 0);
5245 else {
5246 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005247 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005248 symtable_node(st, CHILD(n, 2));
5249 break;
5250 } else {
5251 int i;
5252 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005253 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005254 n = CHILD(n, NCH(n) - 1);
5255 }
5256 }
5257 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005258 case list_iter:
5259 n = CHILD(n, 0);
5260 if (TYPE(n) == list_for) {
5261 st->st_tmpname++;
5262 symtable_list_comprehension(st, n);
5263 st->st_tmpname--;
5264 } else {
5265 REQ(n, list_if);
5266 symtable_node(st, CHILD(n, 1));
5267 if (NCH(n) == 3) {
5268 n = CHILD(n, 2);
5269 goto loop;
5270 }
5271 }
5272 break;
5273 case for_stmt:
5274 symtable_assign(st, CHILD(n, 1), 0);
5275 for (i = 3; i < NCH(n); ++i)
5276 if (TYPE(CHILD(n, i)) >= single_input)
5277 symtable_node(st, CHILD(n, i));
5278 break;
5279 /* The remaining cases fall through to default except in
5280 special circumstances. This requires the individual cases
5281 to be coded with great care, even though they look like
5282 rather innocuous. Each case must double-check TYPE(n).
5283 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005284 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005285 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005286 n = CHILD(n, 2);
5287 goto loop;
5288 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005289 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005290 case listmaker:
5291 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00005292 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005293 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00005294 symtable_node(st, CHILD(n, 0));
5295 st->st_tmpname--;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005296 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005297 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005298 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005299 case atom:
5300 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5301 symtable_add_use(st, STR(CHILD(n, 0)));
5302 break;
5303 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005304 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005305 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005306 /* Walk over every non-token child with a special case
5307 for one child.
5308 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005309 if (NCH(n) == 1) {
5310 n = CHILD(n, 0);
5311 goto loop;
5312 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005313 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005314 if (TYPE(CHILD(n, i)) >= single_input)
5315 symtable_node(st, CHILD(n, i));
5316 }
5317}
5318
5319static void
5320symtable_funcdef(struct symtable *st, node *n)
5321{
5322 node *body;
5323
5324 if (TYPE(n) == lambdef) {
5325 if (NCH(n) == 4)
5326 symtable_params(st, CHILD(n, 1));
5327 } else
5328 symtable_params(st, CHILD(n, 2));
5329 body = CHILD(n, NCH(n) - 1);
5330 symtable_node(st, body);
5331}
5332
5333/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00005334 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005335 which are references in the defining scope. symtable_params()
5336 parses the parameter names, which are defined in the function's
5337 body.
5338
5339 varargslist:
5340 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5341 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5342*/
5343
5344static void
5345symtable_default_args(struct symtable *st, node *n)
5346{
5347 node *c;
5348 int i;
5349
5350 if (TYPE(n) == parameters) {
5351 n = CHILD(n, 1);
5352 if (TYPE(n) == RPAR)
5353 return;
5354 }
5355 REQ(n, varargslist);
5356 for (i = 0; i < NCH(n); i += 2) {
5357 c = CHILD(n, i);
5358 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5359 break;
5360 }
5361 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5362 symtable_node(st, CHILD(n, i));
5363 }
5364}
5365
5366static void
5367symtable_params(struct symtable *st, node *n)
5368{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005369 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00005370 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005371
5372 if (TYPE(n) == parameters) {
5373 n = CHILD(n, 1);
5374 if (TYPE(n) == RPAR)
5375 return;
5376 }
5377 REQ(n, varargslist);
5378 for (i = 0; i < NCH(n); i += 2) {
5379 c = CHILD(n, i);
5380 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5381 ext = 1;
5382 break;
5383 }
5384 if (TYPE(c) == test) {
5385 continue;
5386 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00005387 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005388 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00005389 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005390 char nbuf[30];
5391 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005392 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005393 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005394 }
5395 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005396 if (ext) {
5397 c = CHILD(n, i);
5398 if (TYPE(c) == STAR) {
5399 i++;
5400 symtable_add_def(st, STR(CHILD(n, i)),
5401 DEF_PARAM | DEF_STAR);
5402 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005403 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005404 c = NULL;
5405 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005406 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005407 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005408 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005409 i++;
5410 symtable_add_def(st, STR(CHILD(n, i)),
5411 DEF_PARAM | DEF_DOUBLESTAR);
5412 }
5413 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005414 if (complex >= 0) {
5415 int j;
5416 for (j = 0; j <= complex; j++) {
5417 c = CHILD(n, j);
5418 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005419 c = CHILD(n, ++j);
5420 else if (TYPE(c) == EQUAL)
5421 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005422 if (TYPE(CHILD(c, 0)) == LPAR)
5423 symtable_params_fplist(st, CHILD(c, 1));
5424 }
5425 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005426}
5427
5428static void
5429symtable_params_fplist(struct symtable *st, node *n)
5430{
5431 int i;
5432 node *c;
5433
5434 REQ(n, fplist);
5435 for (i = 0; i < NCH(n); i += 2) {
5436 c = CHILD(n, i);
5437 REQ(c, fpdef);
5438 if (NCH(c) == 1)
5439 symtable_add_def(st, STR(CHILD(c, 0)),
5440 DEF_PARAM | DEF_INTUPLE);
5441 else
5442 symtable_params_fplist(st, CHILD(c, 1));
5443 }
5444
5445}
5446
5447static void
5448symtable_global(struct symtable *st, node *n)
5449{
5450 int i;
5451
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005452 /* XXX It might be helpful to warn about module-level global
5453 statements, but it's hard to tell the difference between
5454 module-level and a string passed to exec.
5455 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005456
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005457 for (i = 1; i < NCH(n); i += 2) {
5458 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005459 int flags;
5460
5461 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005462 if (flags < 0)
5463 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005464 if (flags && flags != DEF_GLOBAL) {
5465 char buf[500];
5466 if (flags & DEF_PARAM) {
5467 PyErr_Format(PyExc_SyntaxError,
5468 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005469 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005470 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005471 st->st_cur->ste_lineno);
5472 st->st_errors++;
5473 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005474 }
5475 else {
5476 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005477 PyOS_snprintf(buf, sizeof(buf),
5478 GLOBAL_AFTER_ASSIGN,
5479 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005480 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005481 PyOS_snprintf(buf, sizeof(buf),
5482 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005483 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005484 }
5485 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005486 symtable_add_def(st, name, DEF_GLOBAL);
5487 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005488}
5489
5490static void
5491symtable_list_comprehension(struct symtable *st, node *n)
5492{
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005493 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005494
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005495 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005496 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005497 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005498 symtable_node(st, CHILD(n, 3));
5499 if (NCH(n) == 5)
5500 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005501}
5502
5503static void
5504symtable_import(struct symtable *st, node *n)
5505{
5506 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005507 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005508 | 'from' dotted_name 'import'
5509 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005510 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005511 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005512 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005513 node *dotname = CHILD(n, 1);
5514 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5515 /* check for bogus imports */
5516 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5517 PyErr_SetString(PyExc_SyntaxError,
5518 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005519 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005520 n->n_lineno);
5521 st->st_errors++;
5522 return;
5523 }
5524 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005525 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005526 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005527 if (symtable_warn(st,
5528 "import * only allowed at module level") < 0)
5529 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005530 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005531 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005532 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005533 } else {
5534 for (i = 3; i < NCH(n); i += 2) {
5535 node *c = CHILD(n, i);
5536 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005537 symtable_assign(st, CHILD(c, 2),
5538 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005539 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005540 symtable_assign(st, CHILD(c, 0),
5541 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005542 }
5543 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005544 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005545 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005546 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005547 }
5548 }
5549}
5550
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005551/* The third argument to symatble_assign() is a flag to be passed to
5552 symtable_add_def() if it is eventually called. The flag is useful
5553 to specify the particular type of assignment that should be
5554 recorded, e.g. an assignment caused by import.
5555 */
5556
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005557static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005558symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005559{
5560 node *tmp;
5561 int i;
5562
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005563 loop:
5564 switch (TYPE(n)) {
5565 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005566 /* invalid assignment, e.g. lambda x:x=2. The next
5567 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005568 return;
5569 case power:
5570 if (NCH(n) > 2) {
5571 for (i = 2; i < NCH(n); ++i)
5572 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5573 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005574 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005575 if (NCH(n) > 1) {
5576 symtable_node(st, CHILD(n, 0));
5577 symtable_node(st, CHILD(n, 1));
5578 } else {
5579 n = CHILD(n, 0);
5580 goto loop;
5581 }
5582 return;
5583 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005584 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5585 /* XXX This is an error, but the next pass
5586 will catch it. */
5587 return;
5588 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005589 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005590 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005591 }
5592 return;
5593 case exprlist:
5594 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00005595 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005596 if (NCH(n) == 1) {
5597 n = CHILD(n, 0);
5598 goto loop;
5599 }
5600 else {
5601 int i;
5602 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005603 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005604 return;
5605 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005606 case atom:
5607 tmp = CHILD(n, 0);
5608 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5609 n = CHILD(n, 1);
5610 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005611 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00005612 if (strcmp(STR(tmp), "__debug__") == 0) {
5613 PyErr_SetString(PyExc_SyntaxError,
5614 ASSIGN_DEBUG);
5615 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton86424e32001-12-04 02:41:46 +00005616 n->n_lineno);
Jeremy Hylton778e2652001-11-09 19:50:08 +00005617 st->st_errors++;
5618 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005619 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005620 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005621 return;
5622 case dotted_as_name:
5623 if (NCH(n) == 3)
5624 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005625 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005626 else
5627 symtable_add_def(st,
5628 STR(CHILD(CHILD(n,
5629 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005630 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005631 return;
5632 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005633 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005634 return;
5635 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005636 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005637 return;
5638 default:
5639 if (NCH(n) == 0)
5640 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005641 if (NCH(n) == 1) {
5642 n = CHILD(n, 0);
5643 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005644 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005645 /* Should only occur for errors like x + 1 = 1,
5646 which will be caught in the next pass. */
5647 for (i = 0; i < NCH(n); ++i)
5648 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005649 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005650 }
5651}