blob: 49e57d128cc8519b6f8691cfd8f310ff25f3cc9b [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;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000388 }
389 return co;
390}
391
392
393/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000394
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000395/* The compiler uses two passes to generate bytecodes. The first pass
396 builds the symbol table. The second pass generates the bytecode.
397
398 The first pass uses a single symtable struct. The second pass uses
399 a compiling struct for each code block. The compiling structs
400 share a reference to the symtable.
401
402 The two passes communicate via symtable_load_symbols() and via
403 is_local() and is_global(). The former initializes several slots
404 in the compiling struct: c_varnames, c_locals, c_nlocals,
405 c_argcount, c_globals, and c_flags.
406*/
407
Tim Peters2a7f3842001-06-09 09:26:21 +0000408/* All about c_lnotab.
409
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000410c_lnotab is an array of unsigned bytes disguised as a Python string. Since
411version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
412mapped to source code line #s via c_lnotab instead.
413
Tim Peters2a7f3842001-06-09 09:26:21 +0000414The array is conceptually a list of
415 (bytecode offset increment, line number increment)
416pairs. The details are important and delicate, best illustrated by example:
417
418 byte code offset source code line number
419 0 1
420 6 2
421 50 7
422 350 307
423 361 308
424
425The first trick is that these numbers aren't stored, only the increments
426from one row to the next (this doesn't really work, but it's a start):
427
428 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
429
430The second trick is that an unsigned byte can't hold negative values, or
431values larger than 255, so (a) there's a deep assumption that byte code
432offsets and their corresponding line #s both increase monotonically, and (b)
433if at least one column jumps by more than 255 from one row to the next, more
434than one pair is written to the table. In case #b, there's no way to know
435from looking at the table later how many were written. That's the delicate
436part. A user of c_lnotab desiring to find the source line number
437corresponding to a bytecode address A should do something like this
438
439 lineno = addr = 0
440 for addr_incr, line_incr in c_lnotab:
441 addr += addr_incr
442 if addr > A:
443 return lineno
444 lineno += line_incr
445
446In order for this to work, when the addr field increments by more than 255,
447the line # increment in each pair generated must be 0 until the remaining addr
448increment is < 256. So, in the example above, com_set_lineno should not (as
449was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
450255, 0, 45, 255, 0, 45.
451*/
452
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000453struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000454 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000455 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000456 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000457 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000458 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +0000459 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000460 PyObject *c_locals; /* dictionary (value=localID) */
461 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000462 PyObject *c_freevars; /* dictionary (value=None) */
463 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000464 int c_nlocals; /* index of next local */
465 int c_argcount; /* number of top-level arguments */
466 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000467 int c_nexti; /* index into c_code */
468 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000469 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000470 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000471 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000472 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000473 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000474 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +0000475 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000476 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000477 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000478 int c_stacklevel; /* Current stack level */
479 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000480 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000481 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000482 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000483 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000484 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000485 int c_nested; /* Is block nested funcdef or lamdef? */
486 int c_closure; /* Is nested w/freevars? */
487 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000488 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000489 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000490};
491
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000492static int
493is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000494{
495 if ((v & (USE | DEF_FREE))
496 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
497 return 1;
498 if (v & DEF_FREE_CLASS)
499 return 1;
500 return 0;
501}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000502
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000503static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000504com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000505{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000506 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
507
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000508 if (c == NULL) {
509 /* Error occurred via symtable call to
510 is_constant_false */
511 PyErr_SetString(exc, msg);
512 return;
513 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000514 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000515 if (c->c_lineno < 1 || c->c_interactive) {
516 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000517 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000518 return;
519 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000520 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000521 if (v == NULL)
522 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000523
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000524 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000525 if (line == NULL) {
526 Py_INCREF(Py_None);
527 line = Py_None;
528 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000529 if (exc == PyExc_SyntaxError) {
530 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
531 Py_None, line);
532 if (t == NULL)
533 goto exit;
534 w = Py_BuildValue("(OO)", v, t);
535 if (w == NULL)
536 goto exit;
537 PyErr_SetObject(exc, w);
538 } else {
539 /* Make sure additional exceptions are printed with
540 file and line, also. */
541 PyErr_SetObject(exc, v);
542 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
543 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000544 exit:
545 Py_XDECREF(t);
546 Py_XDECREF(v);
547 Py_XDECREF(w);
548 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000549}
550
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000551/* Interface to the block stack */
552
553static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000554block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000555{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000556 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000557 com_error(c, PyExc_SystemError,
558 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000559 }
560 else {
561 c->c_block[c->c_nblocks++] = type;
562 }
563}
564
565static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000566block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000567{
568 if (c->c_nblocks > 0)
569 c->c_nblocks--;
570 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000571 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000572 }
573}
574
Guido van Rossum681d79a1995-07-18 14:51:37 +0000575/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000576
Martin v. Löwis95292d62002-12-11 14:04:59 +0000577static int issue_warning(const char *, const char *, int);
578static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000579static void com_free(struct compiling *);
580static void com_push(struct compiling *, int);
581static void com_pop(struct compiling *, int);
582static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000583static void com_node(struct compiling *, node *);
584static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000585static void com_addbyte(struct compiling *, int);
586static void com_addint(struct compiling *, int);
587static void com_addoparg(struct compiling *, int, int);
588static void com_addfwref(struct compiling *, int, int *);
589static void com_backpatch(struct compiling *, int);
590static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
591static int com_addconst(struct compiling *, PyObject *);
592static int com_addname(struct compiling *, PyObject *);
593static void com_addopname(struct compiling *, int, node *);
594static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000595static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000596static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000597static void com_assign(struct compiling *, node *, int, node *);
598static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000599static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +0000600static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000601 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000602static PyObject *parsestrplus(struct compiling*, node *);
603static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000604static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000605
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000606static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000607
608/* symtable operations */
609static int symtable_build(struct compiling *, node *);
610static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000611static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000612static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000613static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000614static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000615static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000616
617static void symtable_node(struct symtable *, node *);
618static void symtable_funcdef(struct symtable *, node *);
619static void symtable_default_args(struct symtable *, node *);
620static void symtable_params(struct symtable *, node *);
621static void symtable_params_fplist(struct symtable *, node *n);
622static void symtable_global(struct symtable *, node *);
623static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000624static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000625static void symtable_list_comprehension(struct symtable *, node *);
626
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000627static int symtable_update_free_vars(struct symtable *);
628static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
629static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
630
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000631/* helper */
632static void
633do_pad(int pad)
634{
635 int i;
636 for (i = 0; i < pad; ++i)
637 fprintf(stderr, " ");
638}
639
640static void
641dump(node *n, int pad, int depth)
642{
643 int i;
644 if (depth == 0)
645 return;
646 do_pad(pad);
647 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
648 if (depth > 0)
649 depth--;
650 for (i = 0; i < NCH(n); ++i)
651 dump(CHILD(n, i), pad + 1, depth);
652}
653
654#define DUMP(N) dump(N, 0, -1)
655
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000656static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000657com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000658{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000659 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000660 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
661 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000662 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000663 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000664 goto fail;
665 if ((c->c_const_dict = PyDict_New()) == NULL)
666 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000667 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000668 goto fail;
669 if ((c->c_name_dict = PyDict_New()) == NULL)
670 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000671 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000672 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000673 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
674 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000675 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000676 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000677 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000678 c->c_freevars = NULL;
679 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000680 c->c_nlocals = 0;
681 c->c_argcount = 0;
682 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000683 c->c_nexti = 0;
684 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000685 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000686 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000687 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000688 c->c_begin = 0;
689 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000690 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000691 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000692 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000693 c->c_stacklevel = 0;
694 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000695 c->c_firstlineno = 0;
696 c->c_last_addr = 0;
697 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000698 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000699 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000700 c->c_nested = 0;
701 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000702 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000703 return 1;
704
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000705 fail:
706 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000707 return 0;
708}
709
710static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000711com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000712{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000713 Py_XDECREF(c->c_code);
714 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000715 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000716 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000717 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000718 Py_XDECREF(c->c_globals);
719 Py_XDECREF(c->c_locals);
720 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000721 Py_XDECREF(c->c_freevars);
722 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000723 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000724 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +0000725 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000726}
727
728static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000729com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000730{
731 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000732 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +0000733 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000734 /*
735 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
736 c->c_filename, c->c_name, c->c_lineno,
737 c->c_nexti, c->c_stacklevel, n);
738 */
739 }
Guido van Rossum8b993a91997-01-17 21:04:03 +0000740}
741
742static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000743com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000744{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000745 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000746 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000747 else
748 c->c_stacklevel -= n;
749}
750
751static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000752com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000753{
754 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000755 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000756 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000757 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000758}
759
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000760static int
761com_check_size(PyObject **s, int offset)
762{
763 int len = PyString_GET_SIZE(*s);
764 if (offset >= len)
765 return _PyString_Resize(s, len * 2);
766 return 0;
767}
768
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000769static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000770com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000771{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000772 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000773 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +0000774 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000775 if (com_check_size(&c->c_code, c->c_nexti)) {
776 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000777 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000778 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000779 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000780}
781
782static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000783com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000784{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000785 com_addbyte(c, x & 0xff);
786 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000787}
788
789static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000790com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000791{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000792 char *p;
793 if (c->c_lnotab == NULL)
794 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000795 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
796 c->c_errors++;
797 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000798 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000799 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000800 *p++ = addr;
801 *p++ = line;
802 c->c_lnotab_next += 2;
803}
804
805static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000806com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000807{
808 c->c_lineno = lineno;
809 if (c->c_firstlineno == 0) {
810 c->c_firstlineno = c->c_last_line = lineno;
811 }
812 else {
813 int incr_addr = c->c_nexti - c->c_last_addr;
814 int incr_line = lineno - c->c_last_line;
Tim Peters2a7f3842001-06-09 09:26:21 +0000815 while (incr_addr > 255) {
816 com_add_lnotab(c, 255, 0);
817 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000818 }
Tim Peters2a7f3842001-06-09 09:26:21 +0000819 while (incr_line > 255) {
820 com_add_lnotab(c, incr_addr, 255);
821 incr_line -=255;
822 incr_addr = 0;
823 }
824 if (incr_addr > 0 || incr_line > 0)
825 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000826 c->c_last_addr = c->c_nexti;
827 c->c_last_line = lineno;
828 }
829}
830
831static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000832com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000833{
Fred Drakeef8ace32000-08-24 00:32:09 +0000834 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +0000835 if (extended_arg){
836 com_addbyte(c, EXTENDED_ARG);
837 com_addint(c, extended_arg);
838 arg &= 0xffff;
839 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000840 com_addbyte(c, op);
841 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000842}
843
844static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000845com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000846{
847 /* Compile a forward reference for backpatching */
848 int here;
849 int anchor;
850 com_addbyte(c, op);
851 here = c->c_nexti;
852 anchor = *p_anchor;
853 *p_anchor = here;
854 com_addint(c, anchor == 0 ? 0 : here - anchor);
855}
856
857static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000858com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000859{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000860 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000861 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000862 int dist;
863 int prev;
864 for (;;) {
865 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000866 prev = code[anchor] + (code[anchor+1] << 8);
867 dist = target - (anchor+2);
868 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000869 dist >>= 8;
870 code[anchor+1] = dist;
871 dist >>= 8;
872 if (dist) {
873 com_error(c, PyExc_SystemError,
874 "com_backpatch: offset too large");
875 break;
876 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000877 if (!prev)
878 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000879 anchor -= prev;
880 }
881}
882
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000883/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000884
885static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000886com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000887{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000888 PyObject *w, *t, *np=NULL;
889 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000890
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000891 t = Py_BuildValue("(OO)", v, v->ob_type);
892 if (t == NULL)
893 goto fail;
894 w = PyDict_GetItem(dict, t);
895 if (w != NULL) {
896 n = PyInt_AsLong(w);
897 } else {
898 n = PyList_Size(list);
899 np = PyInt_FromLong(n);
900 if (np == NULL)
901 goto fail;
902 if (PyList_Append(list, v) != 0)
903 goto fail;
904 if (PyDict_SetItem(dict, t, np) != 0)
905 goto fail;
906 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000907 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000908 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000909 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000910 fail:
911 Py_XDECREF(np);
912 Py_XDECREF(t);
913 c->c_errors++;
914 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000915}
916
917static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000918com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000919{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000920 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000921}
922
923static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000924com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000925{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000926 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000927}
928
Raymond Hettinger0ae0c072002-06-20 22:23:15 +0000929int
930_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000931{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000932 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000933 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000934 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000935 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
936 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000937 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000938 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000939 return 0; /* Don't mangle __extremely_long_names */
940 if (name[nlen-1] == '_' && name[nlen-2] == '_')
941 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000942 /* Strip leading underscores from class name */
943 while (*p == '_')
944 p++;
945 if (*p == '\0')
946 return 0; /* Don't mangle if class is just underscores */
947 plen = strlen(p);
948 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000949 plen = maxlen-nlen-2; /* Truncate class name if too long */
950 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000951 buffer[0] = '_';
952 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000953 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000954 return 1;
955}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000956
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000957static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000958com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000959{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000960 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000961 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000962 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000963
Raymond Hettinger0ae0c072002-06-20 22:23:15 +0000964 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000965 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000966 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000967 c->c_errors++;
968 i = 255;
969 }
970 else {
971 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000972 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000973 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000974 com_addoparg(c, op, i);
975}
976
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000977#define NAME_LOCAL 0
978#define NAME_GLOBAL 1
979#define NAME_DEFAULT 2
980#define NAME_CLOSURE 3
981
982static int
983com_lookup_arg(PyObject *dict, PyObject *name)
984{
985 PyObject *v = PyDict_GetItem(dict, name);
986 if (v == NULL)
987 return -1;
988 else
989 return PyInt_AS_LONG(v);
990}
991
Guido van Rossum3ac99d42002-08-16 02:13:49 +0000992static int
993none_assignment_check(struct compiling *c, char *name, int assigning)
994{
995 if (name[0] == 'N' && strcmp(name, "None") == 0) {
996 char *msg;
997 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +0000998 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +0000999 else
1000 msg = "deleting None";
1001 if (issue_warning(msg, c->c_filename, c->c_lineno) < 0) {
1002 c->c_errors++;
1003 return -1;
1004 }
1005 }
1006 return 0;
1007}
1008
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001009static void
1010com_addop_varname(struct compiling *c, int kind, char *name)
1011{
1012 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001013 int i, reftype;
1014 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001015 int op = STOP_CODE;
1016 char buffer[MANGLE_LEN];
1017
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001018 if (kind != VAR_LOAD &&
1019 none_assignment_check(c, name, kind == VAR_STORE))
1020 {
1021 c->c_errors++;
1022 i = 255;
1023 goto done;
1024 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001025 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001026 name = buffer;
1027 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1028 c->c_errors++;
1029 i = 255;
1030 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001031 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001032
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001033 reftype = get_ref_type(c, name);
1034 switch (reftype) {
1035 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001036 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001037 scope = NAME_LOCAL;
1038 break;
1039 case GLOBAL_EXPLICIT:
1040 scope = NAME_GLOBAL;
1041 break;
1042 case GLOBAL_IMPLICIT:
1043 if (c->c_flags & CO_OPTIMIZED)
1044 scope = NAME_GLOBAL;
1045 break;
1046 case FREE:
1047 case CELL:
1048 scope = NAME_CLOSURE;
1049 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001050 }
1051
1052 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001053 if (scope == NAME_LOCAL)
1054 i = com_lookup_arg(c->c_locals, v);
1055 else if (reftype == FREE)
1056 i = com_lookup_arg(c->c_freevars, v);
1057 else if (reftype == CELL)
1058 i = com_lookup_arg(c->c_cellvars, v);
1059 if (i == -1) {
1060 c->c_errors++; /* XXX no exception set */
1061 i = 255;
1062 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001063 }
1064 Py_DECREF(v);
1065
1066 switch (kind) {
1067 case VAR_LOAD:
1068 switch (scope) {
1069 case NAME_LOCAL:
1070 op = LOAD_FAST;
1071 break;
1072 case NAME_GLOBAL:
1073 op = LOAD_GLOBAL;
1074 break;
1075 case NAME_DEFAULT:
1076 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001077 break;
1078 case NAME_CLOSURE:
1079 op = LOAD_DEREF;
1080 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001081 }
1082 break;
1083 case VAR_STORE:
1084 switch (scope) {
1085 case NAME_LOCAL:
1086 op = STORE_FAST;
1087 break;
1088 case NAME_GLOBAL:
1089 op = STORE_GLOBAL;
1090 break;
1091 case NAME_DEFAULT:
1092 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001093 break;
1094 case NAME_CLOSURE:
1095 op = STORE_DEREF;
1096 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001097 }
1098 break;
1099 case VAR_DELETE:
1100 switch (scope) {
1101 case NAME_LOCAL:
1102 op = DELETE_FAST;
1103 break;
1104 case NAME_GLOBAL:
1105 op = DELETE_GLOBAL;
1106 break;
1107 case NAME_DEFAULT:
1108 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001109 break;
1110 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001111 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001112 PyOS_snprintf(buf, sizeof(buf),
1113 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001114 com_error(c, PyExc_SyntaxError, buf);
1115 i = 255;
1116 break;
1117 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001118 }
1119 break;
1120 }
1121done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001122 com_addoparg(c, op, i);
1123}
1124
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001125static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001126com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001127{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001128 char *name;
1129 char buffer[1000];
1130 /* XXX it is possible to write this code without the 1000
1131 chars on the total length of dotted names, I just can't be
1132 bothered right now */
1133 if (TYPE(n) == STAR)
1134 name = "*";
1135 else if (TYPE(n) == dotted_name) {
1136 char *p = buffer;
1137 int i;
1138 name = buffer;
1139 for (i = 0; i < NCH(n); i += 2) {
1140 char *s = STR(CHILD(n, i));
1141 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001142 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001143 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001144 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001145 break;
1146 }
1147 if (p != buffer)
1148 *p++ = '.';
1149 strcpy(p, s);
1150 p = strchr(p, '\0');
1151 }
1152 }
1153 else {
1154 REQ(n, NAME);
1155 name = STR(n);
1156 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001157 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001158}
1159
Guido van Rossum79f25d91997-04-29 20:08:16 +00001160static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001161parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001162{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001163 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001164 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001165 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001166#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001167 int imflag;
1168#endif
1169
Guido van Rossum282914b1991-04-04 10:42:56 +00001170 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001171 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001172#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001173 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001174#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001175 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001176 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001177 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001178 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001179 if (x < 0 && errno == 0) {
Guido van Rossum715eca92002-08-12 21:54:46 +00001180 if (PyErr_WarnExplicit(
Barry Warsaw9f007392002-08-14 15:51:29 +00001181 PyExc_FutureWarning,
Guido van Rossum715eca92002-08-12 21:54:46 +00001182 "hex/oct constants > sys.maxint "
1183 "will return positive values "
1184 "in Python 2.4 and up",
Martin v. Löwis95292d62002-12-11 14:04:59 +00001185 /* XXX: Give WarnExplicit
1186 a const char* argument. */
1187 (char*)c->c_filename,
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001188 c->c_lineno,
Guido van Rossum715eca92002-08-12 21:54:46 +00001189 NULL,
1190 NULL) < 0)
Guido van Rossum078151d2002-08-11 04:24:12 +00001191 return NULL;
Guido van Rossum3cb8e542002-08-11 14:06:15 +00001192 errno = 0; /* Might be changed by PyErr_Warn() */
Guido van Rossum078151d2002-08-11 04:24:12 +00001193 }
1194 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001195 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001196 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001197 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001198 if (errno != 0)
1199 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001200 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001201 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001202 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001203#ifndef WITHOUT_COMPLEX
1204 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001205 Py_complex z;
1206 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001207 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001208 z.imag = atof(s);
1209 PyFPE_END_PROTECT(z)
1210 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001211 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001212 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001213#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001214 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001215 PyFPE_START_PROTECT("atof", return 0)
1216 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001217 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001218 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001219 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001220}
1221
Guido van Rossum79f25d91997-04-29 20:08:16 +00001222static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001223decode_utf8(char **sPtr, char *end, char* encoding)
1224{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001225#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001226 Py_FatalError("decode_utf8 should not be called in this build.");
1227 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001228#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001229 PyObject *u, *v;
1230 char *s, *t;
1231 t = s = *sPtr;
1232 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1233 while (s < end && (*s & 0x80)) s++;
1234 *sPtr = s;
1235 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1236 if (u == NULL)
1237 return NULL;
1238 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1239 Py_DECREF(u);
1240 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001241#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001242}
1243
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001244/* compiler.transformer.Transformer.decode_literal depends on what
1245 might seem like minor details of this function -- changes here
1246 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001247static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001248parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001249{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001250 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001251 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001252 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001253 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001254 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001255 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001256 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001257
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001258 if (isalpha(quote) || quote == '_') {
1259 if (quote == 'u' || quote == 'U') {
1260 quote = *++s;
1261 unicode = 1;
1262 }
1263 if (quote == 'r' || quote == 'R') {
1264 quote = *++s;
1265 rawmode = 1;
1266 }
1267 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001268 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001269 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001270 return NULL;
1271 }
1272 s++;
1273 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001274 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001275 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001276 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001277 return NULL;
1278 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001279 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001280 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001281 return NULL;
1282 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001283 if (len >= 4 && s[0] == quote && s[1] == quote) {
1284 s += 2;
1285 len -= 2;
1286 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001287 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001288 return NULL;
1289 }
1290 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001291#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001292 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001293 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001294 char *buf;
1295 char *p;
1296 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001297 if (encoding == NULL) {
1298 buf = s;
1299 u = NULL;
1300 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1301 buf = s;
1302 u = NULL;
1303 } else {
1304 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1305 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1306 if (u == NULL)
1307 return NULL;
1308 p = buf = PyString_AsString(u);
1309 end = s + len;
1310 while (s < end) {
1311 if (*s == '\\') {
1312 *p++ = *s++;
1313 if (*s & 0x80) {
1314 strcpy(p, "u005c");
1315 p += 5;
1316 }
1317 }
1318 if (*s & 0x80) { /* XXX inefficient */
1319 char *r;
1320 int rn, i;
1321 w = decode_utf8(&s, end, "utf-16-be");
1322 if (w == NULL) {
1323 Py_DECREF(u);
1324 return NULL;
1325 }
1326 r = PyString_AsString(w);
1327 rn = PyString_Size(w);
1328 assert(rn % 2 == 0);
1329 for (i = 0; i < rn; i += 2) {
1330 sprintf(p, "\\u%02x%02x",
1331 r[i + 0] & 0xFF,
1332 r[i + 1] & 0xFF);
1333 p += 6;
1334 }
1335 Py_DECREF(w);
1336 } else {
1337 *p++ = *s++;
1338 }
1339 }
1340 len = p - buf;
1341 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001342 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001343 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001344 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001345 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1346 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001347 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001348 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001349 return v;
1350
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001351 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001352#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001353 need_encoding = (encoding != NULL &&
1354 strcmp(encoding, "utf-8") != 0 &&
1355 strcmp(encoding, "iso-8859-1") != 0);
1356 if (rawmode || strchr(s, '\\') == NULL) {
1357 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001358#ifndef Py_USING_UNICODE
1359 /* This should not happen - we never see any other
1360 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001361 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001362#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001363 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1364 if (u == NULL)
1365 return NULL;
1366 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1367 Py_DECREF(u);
1368 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001369#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001370 } else {
1371 return PyString_FromStringAndSize(s, len);
1372 }
1373 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001374
1375 v = PyString_DecodeEscape(s, len, NULL, unicode,
1376 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001377 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001378 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001379 return v;
1380}
1381
Guido van Rossum79f25d91997-04-29 20:08:16 +00001382static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001383parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001384{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001385 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001386 int i;
1387 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001388 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001389 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001390 for (i = 1; i < NCH(n); i++) {
1391 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001392 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001393 if (s == NULL)
1394 goto onError;
1395 if (PyString_Check(v) && PyString_Check(s)) {
1396 PyString_ConcatAndDel(&v, s);
1397 if (v == NULL)
1398 goto onError;
1399 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001400#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001401 else {
1402 PyObject *temp;
1403 temp = PyUnicode_Concat(v, s);
1404 Py_DECREF(s);
1405 if (temp == NULL)
1406 goto onError;
1407 Py_DECREF(v);
1408 v = temp;
1409 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001410#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001411 }
1412 }
1413 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001414
1415 onError:
1416 Py_XDECREF(v);
1417 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001418}
1419
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001420static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001421com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001422{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001423 int anchor = 0;
1424 int save_begin = c->c_begin;
1425
1426 /* list_iter: for v in expr [list_iter] */
1427 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001428 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001429 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001430 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001431 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001432 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001433 c->c_loops++;
1434 com_list_iter(c, n, e, t);
1435 c->c_loops--;
1436 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1437 c->c_begin = save_begin;
1438 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001439 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001440}
1441
1442static void
1443com_list_if(struct compiling *c, node *n, node *e, char *t)
1444{
1445 int anchor = 0;
1446 int a = 0;
1447 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001448 com_node(c, CHILD(n, 1));
1449 com_addfwref(c, JUMP_IF_FALSE, &a);
1450 com_addbyte(c, POP_TOP);
1451 com_pop(c, 1);
1452 com_list_iter(c, n, e, t);
1453 com_addfwref(c, JUMP_FORWARD, &anchor);
1454 com_backpatch(c, a);
1455 /* We jump here with an extra entry which we now pop */
1456 com_addbyte(c, POP_TOP);
1457 com_backpatch(c, anchor);
1458}
1459
1460static void
1461com_list_iter(struct compiling *c,
1462 node *p, /* parent of list_iter node */
1463 node *e, /* element expression node */
1464 char *t /* name of result list temp local */)
1465{
1466 /* list_iter is the last child in a listmaker, list_for, or list_if */
1467 node *n = CHILD(p, NCH(p)-1);
1468 if (TYPE(n) == list_iter) {
1469 n = CHILD(n, 0);
1470 switch (TYPE(n)) {
1471 case list_for:
1472 com_list_for(c, n, e, t);
1473 break;
1474 case list_if:
1475 com_list_if(c, n, e, t);
1476 break;
1477 default:
1478 com_error(c, PyExc_SystemError,
1479 "invalid list_iter node type");
1480 }
1481 }
1482 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001483 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001484 com_push(c, 1);
1485 com_node(c, e);
1486 com_addoparg(c, CALL_FUNCTION, 1);
1487 com_addbyte(c, POP_TOP);
1488 com_pop(c, 2);
1489 }
1490}
1491
1492static void
1493com_list_comprehension(struct compiling *c, node *n)
1494{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001495 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001496 char tmpname[30];
1497 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001498 com_addoparg(c, BUILD_LIST, 0);
1499 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1500 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001501 com_addop_name(c, LOAD_ATTR, "append");
1502 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001503 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001504 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001505 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001506 --c->c_tmpname;
1507}
1508
1509static void
1510com_listmaker(struct compiling *c, node *n)
1511{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001512 /* listmaker: test ( list_for | (',' test)* [','] ) */
1513 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001514 com_list_comprehension(c, n);
1515 else {
1516 int len = 0;
1517 int i;
1518 for (i = 0; i < NCH(n); i += 2, len++)
1519 com_node(c, CHILD(n, i));
1520 com_addoparg(c, BUILD_LIST, len);
1521 com_pop(c, len-1);
1522 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001523}
1524
1525static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001526com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001527{
1528 int i;
1529 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1530 for (i = 0; i+2 < NCH(n); i += 4) {
1531 /* We must arrange things just right for STORE_SUBSCR.
1532 It wants the stack to look like (value) (dict) (key) */
1533 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001534 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001535 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00001536 com_node(c, CHILD(n, i+2)); /* value */
1537 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001538 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001539 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001540 }
1541}
1542
1543static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001544com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001545{
1546 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001547 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001548 int i;
1549 REQ(n, atom);
1550 ch = CHILD(n, 0);
1551 switch (TYPE(ch)) {
1552 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001553 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001554 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001555 com_push(c, 1);
1556 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001557 else
1558 com_node(c, CHILD(n, 1));
1559 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001560 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001561 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001562 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001563 com_push(c, 1);
1564 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001565 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001566 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001567 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001568 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001569 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001570 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001571 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001572 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001573 break;
1574 case BACKQUOTE:
1575 com_node(c, CHILD(n, 1));
1576 com_addbyte(c, UNARY_CONVERT);
1577 break;
1578 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001579 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001580 i = 255;
1581 }
1582 else {
1583 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001584 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001585 }
1586 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001587 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001588 break;
1589 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001590 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001591 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001592 c->c_errors++;
1593 i = 255;
1594 }
1595 else {
1596 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001597 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001598 }
1599 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001600 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001601 break;
1602 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001603 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001604 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001605 break;
1606 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001607 com_error(c, PyExc_SystemError,
1608 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001609 }
1610}
1611
1612static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001613com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001614{
1615 if (NCH(n) == 1) {
1616 com_addbyte(c, op);
1617 }
1618 else if (NCH(n) == 2) {
1619 if (TYPE(CHILD(n, 0)) != COLON) {
1620 com_node(c, CHILD(n, 0));
1621 com_addbyte(c, op+1);
1622 }
1623 else {
1624 com_node(c, CHILD(n, 1));
1625 com_addbyte(c, op+2);
1626 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001627 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001628 }
1629 else {
1630 com_node(c, CHILD(n, 0));
1631 com_node(c, CHILD(n, 2));
1632 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001633 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001634 }
1635}
1636
Guido van Rossum635abd21997-01-06 22:56:52 +00001637static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001638com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1639{
1640 if (NCH(n) == 1) {
1641 com_addbyte(c, DUP_TOP);
1642 com_push(c, 1);
1643 com_addbyte(c, SLICE);
1644 com_node(c, augn);
1645 com_addbyte(c, opcode);
1646 com_pop(c, 1);
1647 com_addbyte(c, ROT_TWO);
1648 com_addbyte(c, STORE_SLICE);
1649 com_pop(c, 2);
1650 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1651 com_node(c, CHILD(n, 0));
1652 com_addoparg(c, DUP_TOPX, 2);
1653 com_push(c, 2);
1654 com_addbyte(c, SLICE+1);
1655 com_pop(c, 1);
1656 com_node(c, augn);
1657 com_addbyte(c, opcode);
1658 com_pop(c, 1);
1659 com_addbyte(c, ROT_THREE);
1660 com_addbyte(c, STORE_SLICE+1);
1661 com_pop(c, 3);
1662 } else if (NCH(n) == 2) {
1663 com_node(c, CHILD(n, 1));
1664 com_addoparg(c, DUP_TOPX, 2);
1665 com_push(c, 2);
1666 com_addbyte(c, SLICE+2);
1667 com_pop(c, 1);
1668 com_node(c, augn);
1669 com_addbyte(c, opcode);
1670 com_pop(c, 1);
1671 com_addbyte(c, ROT_THREE);
1672 com_addbyte(c, STORE_SLICE+2);
1673 com_pop(c, 3);
1674 } else {
1675 com_node(c, CHILD(n, 0));
1676 com_node(c, CHILD(n, 2));
1677 com_addoparg(c, DUP_TOPX, 3);
1678 com_push(c, 3);
1679 com_addbyte(c, SLICE+3);
1680 com_pop(c, 2);
1681 com_node(c, augn);
1682 com_addbyte(c, opcode);
1683 com_pop(c, 1);
1684 com_addbyte(c, ROT_FOUR);
1685 com_addbyte(c, STORE_SLICE+3);
1686 com_pop(c, 4);
1687 }
1688}
1689
1690static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001691com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001692{
1693 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001694 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001695 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001696 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001697 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001698 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001699 }
1700 else {
1701 com_node(c, CHILD(n, 0));
1702 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001703 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001704 }
1705 m = n;
1706 do {
1707 m = CHILD(m, 0);
1708 } while (NCH(m) == 1);
1709 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001710 /* f(lambda x: x[0] = 3) ends up getting parsed with
1711 * LHS test = lambda x: x[0], and RHS test = 3.
1712 * SF bug 132313 points out that complaining about a keyword
1713 * then is very confusing.
1714 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001715 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001716 TYPE(m) == lambdef ?
1717 "lambda cannot contain assignment" :
1718 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001719 }
1720 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001721 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00001722 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00001723 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001724 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001725 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001726 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001727 else if (*pkeywords == NULL) {
1728 c->c_errors++;
1729 Py_DECREF(v);
1730 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001731 if (PyDict_GetItem(*pkeywords, v) != NULL)
1732 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001733 "duplicate keyword argument");
1734 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001735 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001736 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001737 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001738 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001739 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001740 }
1741 }
1742 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001743}
1744
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001745static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001746com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001747{
1748 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001749 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001750 }
1751 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001752 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001753 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001754 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001755 int star_flag = 0;
1756 int starstar_flag = 0;
1757 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001758 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001759 na = 0;
1760 nk = 0;
1761 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001762 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001763 if (TYPE(ch) == STAR ||
1764 TYPE(ch) == DOUBLESTAR)
1765 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001766 if (ch->n_lineno != lineno) {
1767 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001768 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00001769 }
1770 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001771 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001772 na++;
1773 else
1774 nk++;
1775 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001776 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001777 while (i < NCH(n)) {
1778 node *tok = CHILD(n, i);
1779 node *ch = CHILD(n, i+1);
1780 i += 3;
1781 switch (TYPE(tok)) {
1782 case STAR: star_flag = 1; break;
1783 case DOUBLESTAR: starstar_flag = 1; break;
1784 }
1785 com_node(c, ch);
1786 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001787 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001788 com_error(c, PyExc_SyntaxError,
1789 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001790 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001791 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001792 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001793 star_flag + (starstar_flag << 1);
1794 else
1795 opcode = CALL_FUNCTION;
1796 com_addoparg(c, opcode, na | (nk << 8));
1797 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001798 }
1799}
1800
1801static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001802com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001803{
1804 com_addopname(c, LOAD_ATTR, n);
1805}
1806
1807static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001808com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001809{
1810 int i=0;
1811 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001812 node *ch;
1813
1814 /* first argument */
1815 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001816 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001817 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001818 i++;
1819 }
1820 else {
1821 com_node(c, CHILD(n,i));
1822 i++;
1823 REQ(CHILD(n,i),COLON);
1824 i++;
1825 }
1826 /* second argument */
1827 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1828 com_node(c, CHILD(n,i));
1829 i++;
1830 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001831 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001832 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001833 com_push(c, 1);
1834 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001835 /* remaining arguments */
1836 for (; i < NCH(n); i++) {
1837 ns++;
1838 ch=CHILD(n,i);
1839 REQ(ch, sliceop);
1840 if (NCH(ch) == 1) {
1841 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001842 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001843 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001844 }
1845 else
1846 com_node(c, CHILD(ch,1));
1847 }
1848 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001849 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001850}
1851
1852static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001853com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001854{
1855 node *ch;
1856 REQ(n, subscript);
1857 ch = CHILD(n,0);
1858 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001859 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001860 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001861 com_push(c, 1);
1862 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001863 else {
1864 /* check for slice */
1865 if ((TYPE(ch) == COLON || NCH(n) > 1))
1866 com_sliceobj(c, n);
1867 else {
1868 REQ(ch, test);
1869 com_node(c, ch);
1870 }
1871 }
1872}
1873
1874static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001875com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001876{
1877 int i, op;
1878 REQ(n, subscriptlist);
1879 /* Check to make backward compatible slice behavior for '[i:j]' */
1880 if (NCH(n) == 1) {
1881 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001882 /* 'Basic' slice, should have exactly one colon. */
1883 if ((TYPE(CHILD(sub, 0)) == COLON
1884 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1885 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1886 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001887 switch (assigning) {
1888 case OP_DELETE:
1889 op = DELETE_SLICE;
1890 break;
1891 case OP_ASSIGN:
1892 op = STORE_SLICE;
1893 break;
1894 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001895 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001896 break;
1897 default:
1898 com_augassign_slice(c, sub, assigning, augn);
1899 return;
1900 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001901 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001902 if (op == STORE_SLICE)
1903 com_pop(c, 2);
1904 else if (op == DELETE_SLICE)
1905 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001906 return;
1907 }
1908 }
1909 /* Else normal subscriptlist. Compile each subscript. */
1910 for (i = 0; i < NCH(n); i += 2)
1911 com_subscript(c, CHILD(n, i));
1912 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001913 if (NCH(n) > 1) {
1914 i = (NCH(n)+1) / 2;
1915 com_addoparg(c, BUILD_TUPLE, i);
1916 com_pop(c, i-1);
1917 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001918 switch (assigning) {
1919 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001920 op = DELETE_SUBSCR;
1921 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001922 break;
1923 default:
1924 case OP_ASSIGN:
1925 op = STORE_SUBSCR;
1926 i = 3;
1927 break;
1928 case OP_APPLY:
1929 op = BINARY_SUBSCR;
1930 i = 1;
1931 break;
1932 }
1933 if (assigning > OP_APPLY) {
1934 com_addoparg(c, DUP_TOPX, 2);
1935 com_push(c, 2);
1936 com_addbyte(c, BINARY_SUBSCR);
1937 com_pop(c, 1);
1938 com_node(c, augn);
1939 com_addbyte(c, assigning);
1940 com_pop(c, 1);
1941 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001942 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001943 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001944 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001945}
1946
1947static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001948com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001949{
1950 REQ(n, trailer);
1951 switch (TYPE(CHILD(n, 0))) {
1952 case LPAR:
1953 com_call_function(c, CHILD(n, 1));
1954 break;
1955 case DOT:
1956 com_select_member(c, CHILD(n, 1));
1957 break;
1958 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001959 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001960 break;
1961 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001962 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001963 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001964 }
1965}
1966
1967static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001968com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001969{
1970 int i;
1971 REQ(n, power);
1972 com_atom(c, CHILD(n, 0));
1973 for (i = 1; i < NCH(n); i++) {
1974 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1975 com_factor(c, CHILD(n, i+1));
1976 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001977 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001978 break;
1979 }
1980 else
1981 com_apply_trailer(c, CHILD(n, i));
1982 }
1983}
1984
1985static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001986com_invert_constant(struct compiling *c, node *n)
1987{
1988 /* Compute the inverse of int and longs and use them directly,
1989 but be prepared to generate code for all other
1990 possibilities (invalid numbers, floats, complex).
1991 */
1992 PyObject *num, *inv = NULL;
1993 int i;
1994
1995 REQ(n, NUMBER);
1996 num = parsenumber(c, STR(n));
1997 if (num == NULL)
1998 i = 255;
1999 else {
2000 inv = PyNumber_Invert(num);
2001 if (inv == NULL) {
2002 PyErr_Clear();
2003 i = com_addconst(c, num);
2004 } else {
2005 i = com_addconst(c, inv);
2006 Py_DECREF(inv);
2007 }
2008 Py_DECREF(num);
2009 }
2010 com_addoparg(c, LOAD_CONST, i);
2011 com_push(c, 1);
2012 if (num != NULL && inv == NULL)
2013 com_addbyte(c, UNARY_INVERT);
2014}
2015
Tim Peters51e26512001-09-07 08:45:55 +00002016static int
2017is_float_zero(const char *p)
2018{
2019 int found_radix_point = 0;
2020 int ch;
2021 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2022 switch (ch) {
2023 case '0':
2024 /* no reason to believe it's not 0 -- continue */
2025 break;
2026
2027 case 'e': case 'E': case 'j': case 'J':
2028 /* If this was a hex constant, we already would have
2029 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2030 must be an exponent marker, and we haven't yet
2031 seen a non-zero digit, and it doesn't matter what
2032 the exponent is then. For 'j' or 'J' similarly,
2033 except that this is an imaginary 0 then. */
2034 return 1;
2035
2036 case '.':
2037 found_radix_point = 1;
2038 break;
2039
2040 default:
2041 return 0;
2042 }
2043 }
2044 return found_radix_point;
2045}
2046
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002047static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002048com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002049{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002050 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002051 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002052 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002053 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002054 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002055 approriate value as a constant. If the value is negative,
2056 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002057 negative in the 0th position -- unless we're doing unary minus
2058 of a floating zero! In that case the sign is significant, but
2059 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002060 */
2061 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002062 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002063 && TYPE((pfactor = CHILD(n, 1))) == factor
2064 && NCH(pfactor) == 1
2065 && TYPE((ppower = CHILD(pfactor, 0))) == power
2066 && NCH(ppower) == 1
2067 && TYPE((patom = CHILD(ppower, 0))) == atom
2068 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
2069 && !(childtype == MINUS && is_float_zero(STR(pnum)))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002070 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002071 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002072 return;
2073 }
2074 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002075 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002076 if (s == NULL) {
2077 com_error(c, PyExc_MemoryError, "");
2078 com_addbyte(c, 255);
2079 return;
2080 }
2081 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002082 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002083 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002084 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002085 }
Tim Peters51e26512001-09-07 08:45:55 +00002086 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002087 }
2088 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002089 com_factor(c, CHILD(n, 1));
2090 com_addbyte(c, UNARY_POSITIVE);
2091 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002092 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002093 com_factor(c, CHILD(n, 1));
2094 com_addbyte(c, UNARY_NEGATIVE);
2095 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002096 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002097 com_factor(c, CHILD(n, 1));
2098 com_addbyte(c, UNARY_INVERT);
2099 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002100 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002101 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002102 }
2103}
2104
2105static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002106com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002107{
2108 int i;
2109 int op;
2110 REQ(n, term);
2111 com_factor(c, CHILD(n, 0));
2112 for (i = 2; i < NCH(n); i += 2) {
2113 com_factor(c, CHILD(n, i));
2114 switch (TYPE(CHILD(n, i-1))) {
2115 case STAR:
2116 op = BINARY_MULTIPLY;
2117 break;
2118 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002119 if (c->c_flags & CO_FUTURE_DIVISION)
2120 op = BINARY_TRUE_DIVIDE;
2121 else
2122 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002123 break;
2124 case PERCENT:
2125 op = BINARY_MODULO;
2126 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002127 case DOUBLESLASH:
2128 op = BINARY_FLOOR_DIVIDE;
2129 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002130 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002131 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002132 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002133 op = 255;
2134 }
2135 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002136 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002137 }
2138}
2139
2140static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002141com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002142{
2143 int i;
2144 int op;
2145 REQ(n, arith_expr);
2146 com_term(c, CHILD(n, 0));
2147 for (i = 2; i < NCH(n); i += 2) {
2148 com_term(c, CHILD(n, i));
2149 switch (TYPE(CHILD(n, i-1))) {
2150 case PLUS:
2151 op = BINARY_ADD;
2152 break;
2153 case MINUS:
2154 op = BINARY_SUBTRACT;
2155 break;
2156 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002157 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002158 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002159 op = 255;
2160 }
2161 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002162 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002163 }
2164}
2165
2166static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002167com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002168{
2169 int i;
2170 int op;
2171 REQ(n, shift_expr);
2172 com_arith_expr(c, CHILD(n, 0));
2173 for (i = 2; i < NCH(n); i += 2) {
2174 com_arith_expr(c, CHILD(n, i));
2175 switch (TYPE(CHILD(n, i-1))) {
2176 case LEFTSHIFT:
2177 op = BINARY_LSHIFT;
2178 break;
2179 case RIGHTSHIFT:
2180 op = BINARY_RSHIFT;
2181 break;
2182 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002183 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002184 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002185 op = 255;
2186 }
2187 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002188 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002189 }
2190}
2191
2192static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002193com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002194{
2195 int i;
2196 int op;
2197 REQ(n, and_expr);
2198 com_shift_expr(c, CHILD(n, 0));
2199 for (i = 2; i < NCH(n); i += 2) {
2200 com_shift_expr(c, CHILD(n, i));
2201 if (TYPE(CHILD(n, i-1)) == AMPER) {
2202 op = BINARY_AND;
2203 }
2204 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002205 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002206 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002207 op = 255;
2208 }
2209 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002210 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002211 }
2212}
2213
2214static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002215com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002216{
2217 int i;
2218 int op;
2219 REQ(n, xor_expr);
2220 com_and_expr(c, CHILD(n, 0));
2221 for (i = 2; i < NCH(n); i += 2) {
2222 com_and_expr(c, CHILD(n, i));
2223 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2224 op = BINARY_XOR;
2225 }
2226 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002227 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002228 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002229 op = 255;
2230 }
2231 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002232 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002233 }
2234}
2235
2236static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002237com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002238{
2239 int i;
2240 int op;
2241 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002242 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002243 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002244 com_xor_expr(c, CHILD(n, i));
2245 if (TYPE(CHILD(n, i-1)) == VBAR) {
2246 op = BINARY_OR;
2247 }
2248 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002249 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002250 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002251 op = 255;
2252 }
2253 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002254 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002255 }
2256}
2257
2258static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002259cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002260{
2261 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00002262 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002263 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2264 if (NCH(n) == 1) {
2265 n = CHILD(n, 0);
2266 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002267 case LESS: return PyCmp_LT;
2268 case GREATER: return PyCmp_GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002269 case EQEQUAL: /* == */
Martin v. Löwis7198a522002-01-01 19:59:11 +00002270 case EQUAL: return PyCmp_EQ;
2271 case LESSEQUAL: return PyCmp_LE;
2272 case GREATEREQUAL: return PyCmp_GE;
2273 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2274 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2275 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002276 }
2277 }
2278 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002279 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002280 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002281 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002282 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002283 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002284 }
2285 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002286 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002287}
2288
2289static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002290com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002291{
2292 int i;
2293 enum cmp_op op;
2294 int anchor;
2295 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2296 com_expr(c, CHILD(n, 0));
2297 if (NCH(n) == 1)
2298 return;
2299
2300 /****************************************************************
2301 The following code is generated for all but the last
2302 comparison in a chain:
2303
2304 label: on stack: opcode: jump to:
2305
2306 a <code to load b>
2307 a, b DUP_TOP
2308 a, b, b ROT_THREE
2309 b, a, b COMPARE_OP
2310 b, 0-or-1 JUMP_IF_FALSE L1
2311 b, 1 POP_TOP
2312 b
2313
2314 We are now ready to repeat this sequence for the next
2315 comparison in the chain.
2316
2317 For the last we generate:
2318
2319 b <code to load c>
2320 b, c COMPARE_OP
2321 0-or-1
2322
2323 If there were any jumps to L1 (i.e., there was more than one
2324 comparison), we generate:
2325
2326 0-or-1 JUMP_FORWARD L2
2327 L1: b, 0 ROT_TWO
2328 0, b POP_TOP
2329 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002330 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002331 ****************************************************************/
2332
2333 anchor = 0;
2334
2335 for (i = 2; i < NCH(n); i += 2) {
2336 com_expr(c, CHILD(n, i));
2337 if (i+2 < NCH(n)) {
2338 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002339 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002340 com_addbyte(c, ROT_THREE);
2341 }
2342 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002343 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002344 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002345 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002346 }
2347 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002348 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002349 if (i+2 < NCH(n)) {
2350 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2351 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002352 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002353 }
2354 }
2355
2356 if (anchor) {
2357 int anchor2 = 0;
2358 com_addfwref(c, JUMP_FORWARD, &anchor2);
2359 com_backpatch(c, anchor);
2360 com_addbyte(c, ROT_TWO);
2361 com_addbyte(c, POP_TOP);
2362 com_backpatch(c, anchor2);
2363 }
2364}
2365
2366static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002367com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002368{
2369 REQ(n, not_test); /* 'not' not_test | comparison */
2370 if (NCH(n) == 1) {
2371 com_comparison(c, CHILD(n, 0));
2372 }
2373 else {
2374 com_not_test(c, CHILD(n, 1));
2375 com_addbyte(c, UNARY_NOT);
2376 }
2377}
2378
2379static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002380com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002381{
2382 int i;
2383 int anchor;
2384 REQ(n, and_test); /* not_test ('and' not_test)* */
2385 anchor = 0;
2386 i = 0;
2387 for (;;) {
2388 com_not_test(c, CHILD(n, i));
2389 if ((i += 2) >= NCH(n))
2390 break;
2391 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2392 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002393 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002394 }
2395 if (anchor)
2396 com_backpatch(c, anchor);
2397}
2398
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002399static int
2400com_make_closure(struct compiling *c, PyCodeObject *co)
2401{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002402 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002403 if (free == 0)
2404 return 0;
2405 for (i = 0; i < free; ++i) {
2406 /* Bypass com_addop_varname because it will generate
2407 LOAD_DEREF but LOAD_CLOSURE is needed.
2408 */
2409 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2410 int arg, reftype;
2411
2412 /* Special case: If a class contains a method with a
2413 free variable that has the same name as a method,
2414 the name will be considered free *and* local in the
2415 class. It should be handled by the closure, as
2416 well as by the normal name loookup logic.
2417 */
2418 reftype = get_ref_type(c, PyString_AS_STRING(name));
2419 if (reftype == CELL)
2420 arg = com_lookup_arg(c->c_cellvars, name);
2421 else /* (reftype == FREE) */
2422 arg = com_lookup_arg(c->c_freevars, name);
2423 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002424 fprintf(stderr, "lookup %s in %s %d %d\n"
2425 "freevars of %s: %s\n",
2426 PyObject_REPR(name),
2427 c->c_name,
2428 reftype, arg,
2429 PyString_AS_STRING(co->co_name),
2430 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002431 Py_FatalError("com_make_closure()");
2432 }
2433 com_addoparg(c, LOAD_CLOSURE, arg);
2434
2435 }
2436 com_push(c, free);
2437 return 1;
2438}
2439
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002440static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002441com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002442{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002443 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002444 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002445 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002446 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002447 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002448 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2449 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002450 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002451 if (co == NULL) {
2452 c->c_errors++;
2453 return;
2454 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002455 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002456 i = com_addconst(c, (PyObject *)co);
2457 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002458 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002459 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002460 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002461 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002462 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002463 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002464 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002465 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002466 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002467 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002468 else {
2469 int anchor = 0;
2470 int i = 0;
2471 for (;;) {
2472 com_and_test(c, CHILD(n, i));
2473 if ((i += 2) >= NCH(n))
2474 break;
2475 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2476 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002477 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002478 }
2479 if (anchor)
2480 com_backpatch(c, anchor);
2481 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002482}
2483
2484static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002485com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002486{
2487 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002488 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002489 com_node(c, CHILD(n, 0));
2490 }
2491 else {
2492 int i;
2493 int len;
2494 len = (NCH(n) + 1) / 2;
2495 for (i = 0; i < NCH(n); i += 2)
2496 com_node(c, CHILD(n, i));
2497 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002498 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002499 }
2500}
2501
2502
2503/* Begin of assignment compilation */
2504
Thomas Wouters434d0822000-08-24 20:11:32 +00002505
2506static void
2507com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2508{
2509 com_addbyte(c, DUP_TOP);
2510 com_push(c, 1);
2511 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002512 com_node(c, augn);
2513 com_addbyte(c, opcode);
2514 com_pop(c, 1);
2515 com_addbyte(c, ROT_TWO);
2516 com_addopname(c, STORE_ATTR, n);
2517 com_pop(c, 2);
2518}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002519
2520static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002521com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002522{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00002523 if (none_assignment_check(c, STR(n), assigning))
2524 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002525 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002526 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002527}
2528
2529static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002530com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002531{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002532 REQ(n, trailer);
2533 switch (TYPE(CHILD(n, 0))) {
2534 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002535 if (assigning == OP_DELETE)
2536 com_error(c, PyExc_SyntaxError,
2537 "can't delete function call");
2538 else
2539 com_error(c, PyExc_SyntaxError,
2540 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002541 break;
2542 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002543 if (assigning > OP_APPLY)
2544 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2545 else
2546 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002547 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002548 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002549 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002550 break;
2551 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002552 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002553 }
2554}
2555
2556static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002557com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002558{
2559 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002560 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002561 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002562 if (assigning) {
2563 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002564 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002565 com_push(c, i-1);
2566 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002567 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002568 com_assign(c, CHILD(n, i), assigning, NULL);
2569}
2570
2571static void
2572com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2573{
2574 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002575 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002576 com_push(c, 1);
2577 com_node(c, augn);
2578 com_addbyte(c, opcode);
2579 com_pop(c, 1);
2580 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002581}
2582
2583static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002584com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002585{
2586 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002587 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002588 if (assigning)
2589 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002590}
2591
2592static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002593com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002594{
2595 /* Loop to avoid trivial recursion */
2596 for (;;) {
2597 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002598
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002599 case exprlist:
2600 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002601 case testlist1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002602 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002603 if (assigning > OP_APPLY) {
2604 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002605 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002606 return;
2607 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002608 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002609 return;
2610 }
2611 n = CHILD(n, 0);
2612 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002613
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002614 case test:
2615 case and_test:
2616 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002617 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002618 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002619 case xor_expr:
2620 case and_expr:
2621 case shift_expr:
2622 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002623 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002624 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002625 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002626 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002627 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002628 return;
2629 }
2630 n = CHILD(n, 0);
2631 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002632
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002633 case power: /* atom trailer* ('**' power)*
2634 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002635 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002636 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002637 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002638 return;
2639 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002640 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002641 int i;
2642 com_node(c, CHILD(n, 0));
2643 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002644 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002645 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002646 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002647 return;
2648 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002649 com_apply_trailer(c, CHILD(n, i));
2650 } /* NB i is still alive */
2651 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002652 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002653 return;
2654 }
2655 n = CHILD(n, 0);
2656 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002657
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002658 case atom:
2659 switch (TYPE(CHILD(n, 0))) {
2660 case LPAR:
2661 n = CHILD(n, 1);
2662 if (TYPE(n) == RPAR) {
2663 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002664 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002665 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002666 return;
2667 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002668 if (assigning > OP_APPLY) {
2669 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002670 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002671 return;
2672 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002673 break;
2674 case LSQB:
2675 n = CHILD(n, 1);
2676 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002677 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002678 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002679 return;
2680 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002681 if (assigning > OP_APPLY) {
2682 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002683 "augmented assign to list not possible");
2684 return;
2685 }
2686 if (NCH(n) > 1
2687 && TYPE(CHILD(n, 1)) == list_for) {
2688 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002689 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002690 return;
2691 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002692 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002693 return;
2694 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002695 if (assigning > OP_APPLY)
2696 com_augassign_name(c, CHILD(n, 0),
2697 assigning, augn);
2698 else
2699 com_assign_name(c, CHILD(n, 0),
2700 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002701 return;
2702 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002703 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002704 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002705 return;
2706 }
2707 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002708
2709 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002710 com_error(c, PyExc_SyntaxError,
2711 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002712 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002713
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002714 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002715 com_error(c, PyExc_SystemError,
2716 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002717 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002718
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002719 }
2720 }
2721}
Guido van Rossum7c531111997-03-11 18:42:21 +00002722
Thomas Wouters434d0822000-08-24 20:11:32 +00002723static void
2724com_augassign(struct compiling *c, node *n)
2725{
2726 int opcode;
2727
2728 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2729 case '+': opcode = INPLACE_ADD; break;
2730 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002731 case '/':
2732 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
2733 opcode = INPLACE_FLOOR_DIVIDE;
2734 else if (c->c_flags & CO_FUTURE_DIVISION)
2735 opcode = INPLACE_TRUE_DIVIDE;
2736 else
2737 opcode = INPLACE_DIVIDE;
2738 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00002739 case '%': opcode = INPLACE_MODULO; break;
2740 case '<': opcode = INPLACE_LSHIFT; break;
2741 case '>': opcode = INPLACE_RSHIFT; break;
2742 case '&': opcode = INPLACE_AND; break;
2743 case '^': opcode = INPLACE_XOR; break;
2744 case '|': opcode = INPLACE_OR; break;
2745 case '*':
2746 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2747 opcode = INPLACE_POWER;
2748 else
2749 opcode = INPLACE_MULTIPLY;
2750 break;
2751 default:
2752 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2753 return;
2754 }
2755 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2756}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002757
2758static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002759com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002760{
Thomas Wouters434d0822000-08-24 20:11:32 +00002761 REQ(n, expr_stmt);
2762 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002763 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002764 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002765 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002766 if (NCH(n) == 1) {
2767 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002768 if (c->c_interactive)
2769 com_addbyte(c, PRINT_EXPR);
2770 else
2771 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002772 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002773 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002774 else if (TYPE(CHILD(n,1)) == augassign)
2775 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002776 else {
2777 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002778 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002779 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002780 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002781 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002782 com_push(c, 1);
2783 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002784 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002785 }
2786 }
2787}
2788
2789static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002790com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002791{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002792 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002793 int i;
2794 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002795 if (Py_OptimizeFlag)
2796 return;
2797 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00002798
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002799 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00002800 raise AssertionError [, <message>]
2801
2802 where <message> is the second test, if present.
2803 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002804 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002805 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002806 com_addbyte(c, POP_TOP);
2807 com_pop(c, 1);
2808 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002809 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002810 com_push(c, 1);
2811 i = NCH(n)/2; /* Either 2 or 4 */
2812 if (i > 1)
2813 com_node(c, CHILD(n, 3));
2814 com_addoparg(c, RAISE_VARARGS, i);
2815 com_pop(c, i);
2816 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002817 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002818 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002819 com_addbyte(c, POP_TOP);
2820}
2821
2822static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002823com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002824{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002825 int i = 1;
2826 node* stream = NULL;
2827
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002828 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002829
2830 /* are we using the extended print form? */
2831 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2832 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002833 com_node(c, stream);
2834 /* stack: [...] => [... stream] */
2835 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002836 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2837 i = 4;
2838 else
2839 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002840 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002841 for (; i < NCH(n); i += 2) {
2842 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002843 com_addbyte(c, DUP_TOP);
2844 /* stack: [stream] => [stream stream] */
2845 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002846 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002847 /* stack: [stream stream] => [stream stream obj] */
2848 com_addbyte(c, ROT_TWO);
2849 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002850 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002851 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002852 com_pop(c, 2);
2853 }
2854 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002855 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002856 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002857 com_addbyte(c, PRINT_ITEM);
2858 com_pop(c, 1);
2859 }
2860 }
2861 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002862 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002863 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002864 /* must pop the extra stream object off the stack */
2865 com_addbyte(c, POP_TOP);
2866 /* stack: [... stream] => [...] */
2867 com_pop(c, 1);
2868 }
2869 }
2870 else {
2871 if (stream != NULL) {
2872 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002873 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002874 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002875 com_pop(c, 1);
2876 }
2877 else
2878 com_addbyte(c, PRINT_NEWLINE);
2879 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002880}
2881
2882static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002883com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002884{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002885 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002886 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002887 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002888 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002889 if (c->c_flags & CO_GENERATOR) {
2890 if (NCH(n) > 1) {
2891 com_error(c, PyExc_SyntaxError,
2892 "'return' with argument inside generator");
2893 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002894 }
2895 if (NCH(n) < 2) {
2896 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002897 com_push(c, 1);
2898 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002899 else
2900 com_node(c, CHILD(n, 1));
2901 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00002902 com_pop(c, 1);
2903}
2904
2905static void
2906com_yield_stmt(struct compiling *c, node *n)
2907{
Tim Peters95c80f82001-06-23 02:07:08 +00002908 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00002909 REQ(n, yield_stmt); /* 'yield' testlist */
2910 if (!c->c_infunction) {
2911 com_error(c, PyExc_SyntaxError, "'yield' outside function");
2912 }
Tim Peters95c80f82001-06-23 02:07:08 +00002913
2914 for (i = 0; i < c->c_nblocks; ++i) {
2915 if (c->c_block[i] == SETUP_FINALLY) {
2916 com_error(c, PyExc_SyntaxError,
2917 "'yield' not allowed in a 'try' block "
2918 "with a 'finally' clause");
2919 return;
2920 }
2921 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002922 com_node(c, CHILD(n, 1));
2923 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002924 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002925}
2926
2927static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002928com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002929{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002930 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002931 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2932 if (NCH(n) > 1) {
2933 com_node(c, CHILD(n, 1));
2934 if (NCH(n) > 3) {
2935 com_node(c, CHILD(n, 3));
2936 if (NCH(n) > 5)
2937 com_node(c, CHILD(n, 5));
2938 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002939 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002940 i = NCH(n)/2;
2941 com_addoparg(c, RAISE_VARARGS, i);
2942 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002943}
2944
2945static void
Thomas Wouters52152252000-08-17 22:55:00 +00002946com_from_import(struct compiling *c, node *n)
2947{
2948 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2949 com_push(c, 1);
2950 if (NCH(n) > 1) {
2951 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2952 com_error(c, PyExc_SyntaxError, "invalid syntax");
2953 return;
2954 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002955 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002956 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002957 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002958 com_pop(c, 1);
2959}
2960
2961static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002962com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002963{
2964 int i;
2965 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002966 /* 'import' dotted_name (',' dotted_name)* |
2967 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002968 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002969 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002970 /* 'from' dotted_name 'import' ... */
2971 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002972
2973 if (TYPE(CHILD(n, 3)) == STAR) {
2974 tup = Py_BuildValue("(s)", "*");
2975 } else {
2976 tup = PyTuple_New((NCH(n) - 2)/2);
2977 for (i = 3; i < NCH(n); i += 2) {
2978 PyTuple_SET_ITEM(tup, (i-3)/2,
Guido van Rossum633d90c2002-12-23 16:51:42 +00002979 PyString_FromString(STR(
2980 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002981 }
2982 }
2983 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002984 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002985 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002986 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002987 if (TYPE(CHILD(n, 3)) == STAR)
2988 com_addbyte(c, IMPORT_STAR);
2989 else {
2990 for (i = 3; i < NCH(n); i += 2)
2991 com_from_import(c, CHILD(n, i));
2992 com_addbyte(c, POP_TOP);
2993 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002994 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002995 }
2996 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002997 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002998 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002999 node *subn = CHILD(n, i);
3000 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003001 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003002 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003003 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003004 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003005 int j;
3006 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003007 com_error(c, PyExc_SyntaxError,
3008 "invalid syntax");
3009 return;
3010 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003011 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3012 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003013 CHILD(CHILD(subn, 0),
3014 j));
3015 com_addop_varname(c, VAR_STORE,
3016 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003017 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003018 com_addop_varname(c, VAR_STORE,
3019 STR(CHILD(CHILD(subn, 0),
3020 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003021 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003022 }
3023 }
3024}
3025
3026static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003027com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003028{
3029 REQ(n, exec_stmt);
3030 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3031 com_node(c, CHILD(n, 1));
3032 if (NCH(n) >= 4)
3033 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003034 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003035 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003036 com_push(c, 1);
3037 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003038 if (NCH(n) >= 6)
3039 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003040 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003041 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003042 com_push(c, 1);
3043 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003044 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003045 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003046}
3047
Guido van Rossum7c531111997-03-11 18:42:21 +00003048static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003049is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003050{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003051 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003052 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003053 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003054
3055 /* Label to avoid tail recursion */
3056 next:
3057 switch (TYPE(n)) {
3058
3059 case suite:
3060 if (NCH(n) == 1) {
3061 n = CHILD(n, 0);
3062 goto next;
3063 }
3064 /* Fall through */
3065 case file_input:
3066 for (i = 0; i < NCH(n); i++) {
3067 node *ch = CHILD(n, i);
3068 if (TYPE(ch) == stmt) {
3069 n = ch;
3070 goto next;
3071 }
3072 }
3073 break;
3074
3075 case stmt:
3076 case simple_stmt:
3077 case small_stmt:
3078 n = CHILD(n, 0);
3079 goto next;
3080
3081 case expr_stmt:
3082 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003083 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003084 case test:
3085 case and_test:
3086 case not_test:
3087 case comparison:
3088 case expr:
3089 case xor_expr:
3090 case and_expr:
3091 case shift_expr:
3092 case arith_expr:
3093 case term:
3094 case factor:
3095 case power:
3096 case atom:
3097 if (NCH(n) == 1) {
3098 n = CHILD(n, 0);
3099 goto next;
3100 }
3101 break;
3102
3103 case NAME:
3104 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3105 return 1;
3106 break;
3107
3108 case NUMBER:
3109 v = parsenumber(c, STR(n));
3110 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003111 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003112 break;
3113 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003114 i = PyObject_IsTrue(v);
3115 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003116 return i == 0;
3117
3118 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003119 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003120 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003121 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003122 break;
3123 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003124 i = PyObject_IsTrue(v);
3125 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003126 return i == 0;
3127
3128 }
3129 return 0;
3130}
3131
Tim Peters08a898f2001-06-28 01:52:22 +00003132
3133/* Look under n for a return stmt with an expression.
3134 * This hack is used to find illegal returns under "if 0:" blocks in
3135 * functions already known to be generators (as determined by the symtable
3136 * pass).
3137 * Return the offending return node if found, else NULL.
3138 */
3139static node *
3140look_for_offending_return(node *n)
3141{
3142 int i;
3143
3144 for (i = 0; i < NCH(n); ++i) {
3145 node *kid = CHILD(n, i);
3146
3147 switch (TYPE(kid)) {
3148 case classdef:
3149 case funcdef:
3150 case lambdef:
3151 /* Stuff in nested functions & classes doesn't
3152 affect the code block we started in. */
3153 return NULL;
3154
3155 case return_stmt:
3156 if (NCH(kid) > 1)
3157 return kid;
3158 break;
3159
3160 default: {
3161 node *bad = look_for_offending_return(kid);
3162 if (bad != NULL)
3163 return bad;
3164 }
3165 }
3166 }
3167
3168 return NULL;
3169}
3170
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003171static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003172com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003173{
3174 int i;
3175 int anchor = 0;
3176 REQ(n, if_stmt);
3177 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3178 for (i = 0; i+3 < NCH(n); i+=4) {
3179 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003180 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003181 if (is_constant_false(c, ch)) {
3182 /* We're going to skip this block. However, if this
3183 is a generator, we have to check the dead code
3184 anyway to make sure there aren't any return stmts
3185 with expressions, in the same scope. */
3186 if (c->c_flags & CO_GENERATOR) {
3187 node *p = look_for_offending_return(n);
3188 if (p != NULL) {
3189 int savelineno = c->c_lineno;
3190 c->c_lineno = p->n_lineno;
3191 com_error(c, PyExc_SyntaxError,
3192 "'return' with argument "
3193 "inside generator");
3194 c->c_lineno = savelineno;
3195 }
3196 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003197 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003198 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003199 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003200 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003201 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003202 com_addfwref(c, JUMP_IF_FALSE, &a);
3203 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003204 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003205 com_node(c, CHILD(n, i+3));
3206 com_addfwref(c, JUMP_FORWARD, &anchor);
3207 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003208 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003209 com_addbyte(c, POP_TOP);
3210 }
3211 if (i+2 < NCH(n))
3212 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003213 if (anchor)
3214 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003215}
3216
3217static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003218com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003219{
3220 int break_anchor = 0;
3221 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003222 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003223 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3224 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003225 block_push(c, SETUP_LOOP);
3226 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003227 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003228 com_node(c, CHILD(n, 1));
3229 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3230 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003231 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003232 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003233 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003234 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003235 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3236 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003237 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003238 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003239 com_addbyte(c, POP_TOP);
3240 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003241 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003242 if (NCH(n) > 4)
3243 com_node(c, CHILD(n, 6));
3244 com_backpatch(c, break_anchor);
3245}
3246
3247static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003248com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003249{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003250 int break_anchor = 0;
3251 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003252 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003253 REQ(n, for_stmt);
3254 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3255 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003256 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003257 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003258 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003259 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003260 com_set_lineno(c, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003261 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003262 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003263 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003264 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003265 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003266 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003267 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3268 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003269 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003270 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003271 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003272 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003273 if (NCH(n) > 8)
3274 com_node(c, CHILD(n, 8));
3275 com_backpatch(c, break_anchor);
3276}
3277
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003278/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003279
3280 SETUP_FINALLY L
3281 <code for S>
3282 POP_BLOCK
3283 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003284 L: <code for Sf>
3285 END_FINALLY
3286
3287 The special instructions use the block stack. Each block
3288 stack entry contains the instruction that created it (here
3289 SETUP_FINALLY), the level of the value stack at the time the
3290 block stack entry was created, and a label (here L).
3291
3292 SETUP_FINALLY:
3293 Pushes the current value stack level and the label
3294 onto the block stack.
3295 POP_BLOCK:
3296 Pops en entry from the block stack, and pops the value
3297 stack until its level is the same as indicated on the
3298 block stack. (The label is ignored.)
3299 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003300 Pops a variable number of entries from the *value* stack
3301 and re-raises the exception they specify. The number of
3302 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003303
3304 The block stack is unwound when an exception is raised:
3305 when a SETUP_FINALLY entry is found, the exception is pushed
3306 onto the value stack (and the exception condition is cleared),
3307 and the interpreter jumps to the label gotten from the block
3308 stack.
3309
3310 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003311 (The contents of the value stack is shown in [], with the top
3312 at the right; 'tb' is trace-back info, 'val' the exception's
3313 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003314
3315 Value stack Label Instruction Argument
3316 [] SETUP_EXCEPT L1
3317 [] <code for S>
3318 [] POP_BLOCK
3319 [] JUMP_FORWARD L0
3320
Guido van Rossum3f5da241990-12-20 15:06:42 +00003321 [tb, val, exc] L1: DUP )
3322 [tb, val, exc, exc] <evaluate E1> )
3323 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3324 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3325 [tb, val, exc, 1] POP )
3326 [tb, val, exc] POP
3327 [tb, val] <assign to V1> (or POP if no V1)
3328 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003329 [] <code for S1>
3330 JUMP_FORWARD L0
3331
Guido van Rossum3f5da241990-12-20 15:06:42 +00003332 [tb, val, exc, 0] L2: POP
3333 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003334 .............................etc.......................
3335
Guido van Rossum3f5da241990-12-20 15:06:42 +00003336 [tb, val, exc, 0] Ln+1: POP
3337 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003338
3339 [] L0: <next statement>
3340
3341 Of course, parts are not generated if Vi or Ei is not present.
3342*/
3343
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003344static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003345com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003346{
3347 int except_anchor = 0;
3348 int end_anchor = 0;
3349 int else_anchor = 0;
3350 int i;
3351 node *ch;
3352
3353 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3354 block_push(c, SETUP_EXCEPT);
3355 com_node(c, CHILD(n, 2));
3356 com_addbyte(c, POP_BLOCK);
3357 block_pop(c, SETUP_EXCEPT);
3358 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3359 com_backpatch(c, except_anchor);
3360 for (i = 3;
3361 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3362 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003363 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003364 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003365 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003366 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003367 break;
3368 }
3369 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003370 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003371 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003372 if (NCH(ch) > 1) {
3373 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003374 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003375 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003376 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003377 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003378 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3379 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003380 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003381 }
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 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003385 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003386 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003387 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003388 com_pop(c, 1);
3389 }
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);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003392 com_node(c, CHILD(n, i+2));
3393 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3394 if (except_anchor) {
3395 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003396 /* We come in with [tb, val, exc, 0] on the
3397 stack; one pop and it's the same as
3398 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003399 com_addbyte(c, POP_TOP);
3400 }
3401 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003402 /* We actually come in here with [tb, val, exc] but the
3403 END_FINALLY will zap those and jump around.
3404 The c_stacklevel does not reflect them so we need not pop
3405 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003406 com_addbyte(c, END_FINALLY);
3407 com_backpatch(c, else_anchor);
3408 if (i < NCH(n))
3409 com_node(c, CHILD(n, i+2));
3410 com_backpatch(c, end_anchor);
3411}
3412
3413static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003414com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003415{
3416 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003417 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003418
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003419 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3420 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003421 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003422 com_addbyte(c, POP_BLOCK);
3423 block_pop(c, SETUP_FINALLY);
3424 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003425 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003426 /* While the generated code pushes only one item,
3427 the try-finally handling can enter here with
3428 up to three items. OK, here are the details:
3429 3 for an exception, 2 for RETURN, 1 for BREAK. */
3430 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003431 com_backpatch(c, finally_anchor);
3432 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003433 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003434 com_node(c, ch);
3435 com_addbyte(c, END_FINALLY);
3436 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003437 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003438}
3439
3440static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003441com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003442{
3443 REQ(n, try_stmt);
3444 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3445 | 'try' ':' suite 'finally' ':' suite */
3446 if (TYPE(CHILD(n, 3)) != except_clause)
3447 com_try_finally(c, n);
3448 else
3449 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003450}
3451
Guido van Rossum8b993a91997-01-17 21:04:03 +00003452static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003453get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003454{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003455 int i;
3456
Guido van Rossum8b993a91997-01-17 21:04:03 +00003457 /* Label to avoid tail recursion */
3458 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003459 switch (TYPE(n)) {
3460
3461 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003462 if (NCH(n) == 1) {
3463 n = CHILD(n, 0);
3464 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003465 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003466 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003467 case file_input:
3468 for (i = 0; i < NCH(n); i++) {
3469 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003470 if (TYPE(ch) == stmt) {
3471 n = ch;
3472 goto next;
3473 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003474 }
3475 break;
3476
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003477 case stmt:
3478 case simple_stmt:
3479 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003480 n = CHILD(n, 0);
3481 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003482
3483 case expr_stmt:
3484 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003485 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003486 case test:
3487 case and_test:
3488 case not_test:
3489 case comparison:
3490 case expr:
3491 case xor_expr:
3492 case and_expr:
3493 case shift_expr:
3494 case arith_expr:
3495 case term:
3496 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003497 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003498 if (NCH(n) == 1) {
3499 n = CHILD(n, 0);
3500 goto next;
3501 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003502 break;
3503
3504 case atom:
3505 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003506 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003507 break;
3508
3509 }
3510 return NULL;
3511}
3512
Guido van Rossum79f25d91997-04-29 20:08:16 +00003513static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003514get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003515{
Guido van Rossum541563e1999-01-28 15:08:09 +00003516 /* Don't generate doc-strings if run with -OO */
3517 if (Py_OptimizeFlag > 1)
3518 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003519 n = get_rawdocstring(n);
3520 if (n == NULL)
3521 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003522 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003523}
3524
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003525static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003526com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003527{
3528 REQ(n, suite);
3529 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3530 if (NCH(n) == 1) {
3531 com_node(c, CHILD(n, 0));
3532 }
3533 else {
3534 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003535 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003536 node *ch = CHILD(n, i);
3537 if (TYPE(ch) == stmt)
3538 com_node(c, ch);
3539 }
3540 }
3541}
3542
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003543/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003544static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003545com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003546{
3547 int i = c->c_nblocks;
3548 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3549 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3550 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003551 else if (i <= 0) {
3552 /* at the outer level */
3553 com_error(c, PyExc_SyntaxError,
3554 "'continue' not properly in loop");
3555 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003556 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003557 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003558 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003559 if (c->c_block[j] == SETUP_LOOP)
3560 break;
3561 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003562 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003563 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003564 for (; i > j; --i) {
3565 if (c->c_block[i] == SETUP_EXCEPT ||
3566 c->c_block[i] == SETUP_FINALLY) {
3567 com_addoparg(c, CONTINUE_LOOP,
3568 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003569 return;
3570 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003571 if (c->c_block[i] == END_FINALLY) {
3572 com_error(c, PyExc_SyntaxError,
3573 "'continue' not supported inside 'finally' clause");
3574 return;
3575 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003576 }
3577 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003578 com_error(c, PyExc_SyntaxError,
3579 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003580 }
3581 /* XXX Could allow it inside a 'finally' clause
3582 XXX if we could pop the exception still on the stack */
3583}
3584
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003585static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003586com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003587{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003588 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003589 if (TYPE(n) == lambdef) {
3590 /* lambdef: 'lambda' [varargslist] ':' test */
3591 n = CHILD(n, 1);
3592 }
3593 else {
3594 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3595 n = CHILD(n, 2);
3596 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3597 n = CHILD(n, 1);
3598 }
3599 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003600 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003601 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003602 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003603 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3604 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003605 nargs = 0;
3606 ndefs = 0;
3607 for (i = 0; i < nch; i++) {
3608 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003609 if (TYPE(CHILD(n, i)) == STAR ||
3610 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003611 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003612 nargs++;
3613 i++;
3614 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003615 t = RPAR; /* Anything except EQUAL or COMMA */
3616 else
3617 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003618 if (t == EQUAL) {
3619 i++;
3620 ndefs++;
3621 com_node(c, CHILD(n, i));
3622 i++;
3623 if (i >= nch)
3624 break;
3625 t = TYPE(CHILD(n, i));
3626 }
3627 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003628 /* Treat "(a=1, b)" as an error */
3629 if (ndefs)
3630 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003631 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003632 }
3633 if (t != COMMA)
3634 break;
3635 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003636 return ndefs;
3637}
3638
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003639static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003640com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003641{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003642 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003643 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003644 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003645 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003646 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3647 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003648 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003649 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003650 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003651 c->c_errors++;
3652 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003653 int closure = com_make_closure(c, (PyCodeObject *)co);
3654 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003655 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003656 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003657 if (closure)
3658 com_addoparg(c, MAKE_CLOSURE, ndefs);
3659 else
3660 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003661 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003662 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003663 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003664 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003665 }
3666}
3667
3668static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003669com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003670{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003671 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003672 REQ(n, testlist);
3673 /* testlist: test (',' test)* [','] */
3674 for (i = 0; i < NCH(n); i += 2)
3675 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003676 i = (NCH(n)+1) / 2;
3677 com_addoparg(c, BUILD_TUPLE, i);
3678 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003679}
3680
3681static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003682com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003683{
Guido van Rossum25831651993-05-19 14:50:45 +00003684 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003685 PyObject *v;
3686 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003687 char *name;
3688
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003689 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003690 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003691 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003692 c->c_errors++;
3693 return;
3694 }
3695 /* Push the class name on the stack */
3696 i = com_addconst(c, v);
3697 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003698 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003699 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003700 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003701 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003702 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003703 com_push(c, 1);
3704 }
Guido van Rossum25831651993-05-19 14:50:45 +00003705 else
3706 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003707 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003708 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003709 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003710 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003711 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003712 c->c_errors++;
3713 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003714 int closure = com_make_closure(c, co);
3715 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003716 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003717 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003718 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003719 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003720 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003721 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003722 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003723 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003724 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003725 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003726 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003727 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003728 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003729 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003730}
3731
3732static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003733com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003734{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003735 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003736 if (c->c_errors)
3737 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003738 switch (TYPE(n)) {
3739
3740 /* Definition nodes */
3741
3742 case funcdef:
3743 com_funcdef(c, n);
3744 break;
3745 case classdef:
3746 com_classdef(c, n);
3747 break;
3748
3749 /* Trivial parse tree nodes */
3750
3751 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003752 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003753 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003754 n = CHILD(n, 0);
3755 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003756
3757 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003758 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003759 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003760 {
3761 int i;
3762 for (i = 0; i < NCH(n)-1; i += 2)
3763 com_node(c, CHILD(n, i));
3764 }
3765 break;
3766
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003767 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003768 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003769 n = CHILD(n, 0);
3770 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003771
3772 /* Statement nodes */
3773
3774 case expr_stmt:
3775 com_expr_stmt(c, n);
3776 break;
3777 case print_stmt:
3778 com_print_stmt(c, n);
3779 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003780 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003781 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003782 break;
3783 case pass_stmt:
3784 break;
3785 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003786 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003787 com_error(c, PyExc_SyntaxError,
3788 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003789 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003790 com_addbyte(c, BREAK_LOOP);
3791 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003792 case continue_stmt:
3793 com_continue_stmt(c, n);
3794 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003795 case return_stmt:
3796 com_return_stmt(c, n);
3797 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003798 case yield_stmt:
3799 com_yield_stmt(c, n);
3800 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003801 case raise_stmt:
3802 com_raise_stmt(c, n);
3803 break;
3804 case import_stmt:
3805 com_import_stmt(c, n);
3806 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003807 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003808 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003809 case exec_stmt:
3810 com_exec_stmt(c, n);
3811 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003812 case assert_stmt:
3813 com_assert_stmt(c, n);
3814 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003815 case if_stmt:
3816 com_if_stmt(c, n);
3817 break;
3818 case while_stmt:
3819 com_while_stmt(c, n);
3820 break;
3821 case for_stmt:
3822 com_for_stmt(c, n);
3823 break;
3824 case try_stmt:
3825 com_try_stmt(c, n);
3826 break;
3827 case suite:
3828 com_suite(c, n);
3829 break;
3830
3831 /* Expression nodes */
3832
3833 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003834 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00003835 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003836 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003837 break;
3838 case test:
3839 com_test(c, n);
3840 break;
3841 case and_test:
3842 com_and_test(c, n);
3843 break;
3844 case not_test:
3845 com_not_test(c, n);
3846 break;
3847 case comparison:
3848 com_comparison(c, n);
3849 break;
3850 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003851 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003852 break;
3853 case expr:
3854 com_expr(c, n);
3855 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003856 case xor_expr:
3857 com_xor_expr(c, n);
3858 break;
3859 case and_expr:
3860 com_and_expr(c, n);
3861 break;
3862 case shift_expr:
3863 com_shift_expr(c, n);
3864 break;
3865 case arith_expr:
3866 com_arith_expr(c, n);
3867 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003868 case term:
3869 com_term(c, n);
3870 break;
3871 case factor:
3872 com_factor(c, n);
3873 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003874 case power:
3875 com_power(c, n);
3876 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003877 case atom:
3878 com_atom(c, n);
3879 break;
3880
3881 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003882 com_error(c, PyExc_SystemError,
3883 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003884 }
3885}
3886
Tim Petersdbd9ba62000-07-09 03:09:57 +00003887static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003888
3889static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003890com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003891{
3892 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3893 if (TYPE(CHILD(n, 0)) == LPAR)
3894 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003895 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003896 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003897 com_pop(c, 1);
3898 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003899}
3900
3901static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003902com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003903{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003904 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003905 if (NCH(n) == 1) {
3906 com_fpdef(c, CHILD(n, 0));
3907 }
3908 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003909 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003910 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003911 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003912 for (i = 0; i < NCH(n); i += 2)
3913 com_fpdef(c, CHILD(n, i));
3914 }
3915}
3916
3917static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003918com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003919{
Guido van Rossum633d90c2002-12-23 16:51:42 +00003920 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003921 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00003922 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003923 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003924 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003925 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00003926 nch = NCH(n);
3927 /* Enter all arguments in table of locals */
3928 for (i = 0, narg = 0; i < nch; i++) {
3929 node *ch = CHILD(n, i);
3930 node *fp;
3931 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003932 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00003933 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3934 fp = CHILD(ch, 0);
3935 if (TYPE(fp) != NAME) {
3936 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
3937 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00003938 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00003939 narg++;
3940 /* all name updates handled by symtable */
3941 if (++i >= nch)
3942 break;
3943 ch = CHILD(n, i);
3944 if (TYPE(ch) == EQUAL)
3945 i += 2;
3946 else
3947 REQ(ch, COMMA);
3948 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003949 if (complex) {
3950 /* Generate code for complex arguments only after
3951 having counted the simple arguments */
3952 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00003953 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003954 node *ch = CHILD(n, i);
3955 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003956 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003957 break;
3958 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3959 fp = CHILD(ch, 0);
3960 if (TYPE(fp) != NAME) {
3961 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003962 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003963 com_fpdef(c, ch);
3964 }
3965 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00003966 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003967 break;
3968 ch = CHILD(n, i);
3969 if (TYPE(ch) == EQUAL)
3970 i += 2;
3971 else
3972 REQ(ch, COMMA);
3973 }
3974 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003975}
3976
3977static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003978com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003979{
3980 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003981 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003982 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003983 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003984 if (doc != NULL) {
3985 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003986 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003987 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003988 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003989 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003990 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003991 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003992 for (i = 0; i < NCH(n); i++) {
3993 node *ch = CHILD(n, i);
3994 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3995 com_node(c, ch);
3996 }
3997}
3998
3999/* Top-level compile-node interface */
4000
4001static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004002compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004003{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004004 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004005 node *ch;
4006 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00004007 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004008 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004009 if (doc != NULL) {
4010 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004011 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004012 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004013 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004014 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004015 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
4016 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004017 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004018 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004019 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004020 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004021 c->c_infunction = 0;
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004022 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4023 com_push(c, 1);
4024 com_addbyte(c, RETURN_VALUE);
4025 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004026}
4027
4028static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004029compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004030{
Guido van Rossum590baa41993-11-30 13:40:46 +00004031 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004032 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004033 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004034
4035 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004036 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004037 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004038 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004039 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004040 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004041 else
4042 ch = CHILD(n, 2);
4043 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004044 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004045 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004046}
4047
4048static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004049compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004050{
4051 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004052 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004053 REQ(n, classdef);
4054 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4055 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004056 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004057 /* Initialize local __module__ from global __name__ */
4058 com_addop_name(c, LOAD_GLOBAL, "__name__");
4059 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004060 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004061 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004062 if (doc != NULL) {
4063 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004064 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004065 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004066 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004067 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004068 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004069 }
4070 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004071 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004072 com_node(c, ch);
4073 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004074 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004075 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004076 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004077}
4078
4079static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004080compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004081{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004082 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004083
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004084 switch (TYPE(n)) {
4085
Guido van Rossum4c417781991-01-21 16:09:22 +00004086 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004087 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004088 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004089 n = CHILD(n, 0);
4090 if (TYPE(n) != NEWLINE)
4091 com_node(c, n);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004092 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4093 com_push(c, 1);
4094 com_addbyte(c, RETURN_VALUE);
4095 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004096 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004097 break;
4098
Guido van Rossum4c417781991-01-21 16:09:22 +00004099 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004100 com_file_input(c, n);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004101 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4102 com_push(c, 1);
4103 com_addbyte(c, RETURN_VALUE);
4104 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004105 break;
4106
Guido van Rossum590baa41993-11-30 13:40:46 +00004107 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004108 com_node(c, CHILD(n, 0));
4109 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004110 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004111 break;
4112
Guido van Rossum590baa41993-11-30 13:40:46 +00004113 case lambdef: /* anonymous function definition */
4114 compile_lambdef(c, n);
4115 break;
4116
Guido van Rossum4c417781991-01-21 16:09:22 +00004117 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004118 compile_funcdef(c, n);
4119 break;
4120
Guido van Rossum4c417781991-01-21 16:09:22 +00004121 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004122 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004123 break;
4124
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004125 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004126 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004127 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004128 }
4129}
4130
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004131static PyObject *
4132dict_keys_inorder(PyObject *dict, int offset)
4133{
4134 PyObject *tuple, *k, *v;
4135 int i, pos = 0, size = PyDict_Size(dict);
4136
4137 tuple = PyTuple_New(size);
4138 if (tuple == NULL)
4139 return NULL;
4140 while (PyDict_Next(dict, &pos, &k, &v)) {
4141 i = PyInt_AS_LONG(v);
4142 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004143 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004144 PyTuple_SET_ITEM(tuple, i - offset, k);
4145 }
4146 return tuple;
4147}
4148
Guido van Rossum79f25d91997-04-29 20:08:16 +00004149PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004150PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004151{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004152 return PyNode_CompileFlags(n, filename, NULL);
4153}
4154
4155PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004156PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004157{
4158 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004159}
4160
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004161struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004162PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004163{
4164 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004165 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004166
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004167 ff = PyNode_Future(n, filename);
4168 if (ff == NULL)
4169 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004170
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004171 st = symtable_init();
Tim Peters8c5e4152001-11-04 19:26:58 +00004172 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004173 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004174 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004175 }
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004176 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004177 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004178 if (st->st_errors > 0)
4179 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004180 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004181 if (st->st_errors > 0)
4182 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004183
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004184 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004185 fail:
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004186 PyObject_FREE((void *)ff);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004187 st->st_future = NULL;
4188 PySymtable_Free(st);
4189 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004190}
4191
Guido van Rossum79f25d91997-04-29 20:08:16 +00004192static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004193icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004194{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004195 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004196}
4197
Guido van Rossum79f25d91997-04-29 20:08:16 +00004198static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004199jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004200 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004201{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004202 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004203 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004204 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004205 return NULL;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004206 if (TYPE(n) == encoding_decl) {
4207 sc.c_encoding = STR(n);
4208 n = CHILD(n, 0);
4209 } else {
4210 sc.c_encoding = NULL;
4211 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004212 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004213 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004214 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004215 /* c_symtable still points to parent's symbols */
4216 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004217 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004218 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004219 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004220 if (base->c_encoding != NULL) {
4221 assert(sc.c_encoding == NULL);
4222 sc.c_encoding = base->c_encoding;
4223 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004224 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004225 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004226 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004227 if (sc.c_future == NULL) {
4228 com_free(&sc);
4229 return NULL;
4230 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004231 if (flags) {
4232 int merged = sc.c_future->ff_features |
4233 flags->cf_flags;
4234 sc.c_future->ff_features = merged;
4235 flags->cf_flags = merged;
4236 }
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004237 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004238 com_free(&sc);
4239 return NULL;
4240 }
4241 }
4242 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004243 if (symtable_load_symbols(&sc) < 0) {
4244 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004245 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004246 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004247 compile_node(&sc, n);
4248 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004249 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004250 PyObject *consts, *names, *varnames, *filename, *name,
4251 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004252 consts = PyList_AsTuple(sc.c_consts);
4253 names = PyList_AsTuple(sc.c_names);
4254 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004255 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4256 freevars = dict_keys_inorder(sc.c_freevars,
4257 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004258 filename = PyString_InternFromString(sc.c_filename);
4259 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004260 if (!PyErr_Occurred())
4261 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004262 sc.c_nlocals,
4263 sc.c_maxstacklevel,
4264 sc.c_flags,
4265 sc.c_code,
4266 consts,
4267 names,
4268 varnames,
4269 freevars,
4270 cellvars,
4271 filename,
4272 name,
4273 sc.c_firstlineno,
4274 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004275 Py_XDECREF(consts);
4276 Py_XDECREF(names);
4277 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004278 Py_XDECREF(freevars);
4279 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004280 Py_XDECREF(filename);
4281 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004282 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004283 else if (!PyErr_Occurred()) {
4284 /* This could happen if someone called PyErr_Clear() after an
4285 error was reported above. That's not supposed to happen,
4286 but I just plugged one case and I'm not sure there can't be
4287 others. In that case, raise SystemError so that at least
4288 it gets reported instead dumping core. */
4289 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4290 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004291 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004292 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004293 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004294 sc.c_symtable = NULL;
4295 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004296 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004297 return co;
4298}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004299
4300int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004301PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004302{
4303 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004304 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004305 int line = co->co_firstlineno;
4306 int addr = 0;
4307 while (--size >= 0) {
4308 addr += *p++;
4309 if (addr > addrq)
4310 break;
4311 line += *p++;
4312 }
4313 return line;
4314}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004315
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004316/* The test for LOCAL must come before the test for FREE in order to
4317 handle classes where name is both local and free. The local var is
4318 a method and the free var is a free var referenced within a method.
4319*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004320
4321static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004322get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004323{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004324 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004325 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004326
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004327 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4328 return CELL;
4329 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4330 return LOCAL;
4331 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4332 return FREE;
4333 v = PyDict_GetItemString(c->c_globals, name);
4334 if (v) {
4335 if (v == Py_None)
4336 return GLOBAL_EXPLICIT;
4337 else {
4338 return GLOBAL_IMPLICIT;
4339 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004340 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004341 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004342 "unknown scope for %.100s in %.100s(%s) "
4343 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4344 name, c->c_name,
4345 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4346 c->c_filename,
4347 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4348 PyObject_REPR(c->c_locals),
4349 PyObject_REPR(c->c_globals)
4350 );
4351
4352 Py_FatalError(buf);
4353 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004354}
4355
Guido van Rossum207fda62001-03-02 03:30:41 +00004356/* Helper functions to issue warnings */
4357
4358static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004359issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004360{
4361 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4362 lineno, NULL, NULL) < 0) {
4363 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4364 PyErr_SetString(PyExc_SyntaxError, msg);
4365 PyErr_SyntaxLocation(filename, lineno);
4366 }
4367 return -1;
4368 }
4369 return 0;
4370}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004371
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004372static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004373symtable_warn(struct symtable *st, char *msg)
4374{
Guido van Rossum207fda62001-03-02 03:30:41 +00004375 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004376 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004377 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004378 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004379 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004380}
4381
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004382/* Helper function for setting lineno and filename */
4383
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004384static int
4385symtable_build(struct compiling *c, node *n)
4386{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004387 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004388 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004389 c->c_symtable->st_future = c->c_future;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004390 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004391 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4392 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004393 return -1;
4394 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004395 if (c->c_symtable->st_errors > 0)
4396 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004397 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004398 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004399 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004400 return 0;
4401}
4402
4403static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004404symtable_init_compiling_symbols(struct compiling *c)
4405{
4406 PyObject *varnames;
4407
4408 varnames = c->c_symtable->st_cur->ste_varnames;
4409 if (varnames == NULL) {
4410 varnames = PyList_New(0);
4411 if (varnames == NULL)
4412 return -1;
4413 c->c_symtable->st_cur->ste_varnames = varnames;
4414 Py_INCREF(varnames);
4415 } else
4416 Py_INCREF(varnames);
4417 c->c_varnames = varnames;
4418
4419 c->c_globals = PyDict_New();
4420 if (c->c_globals == NULL)
4421 return -1;
4422 c->c_freevars = PyDict_New();
4423 if (c->c_freevars == NULL)
4424 return -1;
4425 c->c_cellvars = PyDict_New();
4426 if (c->c_cellvars == NULL)
4427 return -1;
4428 return 0;
4429}
4430
4431struct symbol_info {
4432 int si_nlocals;
4433 int si_ncells;
4434 int si_nfrees;
4435 int si_nimplicit;
4436};
4437
4438static void
4439symtable_init_info(struct symbol_info *si)
4440{
4441 si->si_nlocals = 0;
4442 si->si_ncells = 0;
4443 si->si_nfrees = 0;
4444 si->si_nimplicit = 0;
4445}
4446
4447static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004448symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004449 struct symbol_info *si)
4450{
4451 PyObject *dict, *v;
4452
4453 /* Seperate logic for DEF_FREE. If it occurs in a function,
4454 it indicates a local that we must allocate storage for (a
4455 cell var). If it occurs in a class, then the class has a
4456 method and a free variable with the same name.
4457 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004458 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004459 /* If it isn't declared locally, it can't be a cell. */
4460 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4461 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004462 v = PyInt_FromLong(si->si_ncells++);
4463 dict = c->c_cellvars;
4464 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004465 /* If it is free anyway, then there is no need to do
4466 anything here.
4467 */
4468 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004469 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004470 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004471 v = PyInt_FromLong(si->si_nfrees++);
4472 dict = c->c_freevars;
4473 }
4474 if (v == NULL)
4475 return -1;
4476 if (PyDict_SetItem(dict, name, v) < 0) {
4477 Py_DECREF(v);
4478 return -1;
4479 }
4480 Py_DECREF(v);
4481 return 0;
4482}
4483
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004484/* If a variable is a cell and an argument, make sure that appears in
4485 co_cellvars before any variable to its right in varnames.
4486*/
4487
4488
4489static int
4490symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4491 PyObject *varnames, int flags)
4492{
4493 PyObject *v, *w, *d, *list = NULL;
4494 int i, pos;
4495
4496 if (flags & CO_VARARGS)
4497 argcount++;
4498 if (flags & CO_VARKEYWORDS)
4499 argcount++;
4500 for (i = argcount; --i >= 0; ) {
4501 v = PyList_GET_ITEM(varnames, i);
4502 if (PyDict_GetItem(*cellvars, v)) {
4503 if (list == NULL) {
4504 list = PyList_New(1);
4505 if (list == NULL)
4506 return -1;
4507 PyList_SET_ITEM(list, 0, v);
4508 Py_INCREF(v);
4509 } else
4510 PyList_Insert(list, 0, v);
4511 }
4512 }
4513 if (list == NULL || PyList_GET_SIZE(list) == 0)
4514 return 0;
4515 /* There are cellvars that are also arguments. Create a dict
4516 to replace cellvars and put the args at the front.
4517 */
4518 d = PyDict_New();
4519 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4520 v = PyInt_FromLong(i);
4521 if (v == NULL)
4522 goto fail;
4523 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4524 goto fail;
4525 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4526 goto fail;
4527 }
4528 pos = 0;
4529 i = PyList_GET_SIZE(list);
4530 Py_DECREF(list);
4531 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4532 w = PyInt_FromLong(i++); /* don't care about the old key */
4533 if (PyDict_SetItem(d, v, w) < 0) {
4534 Py_DECREF(w);
4535 goto fail;
4536 }
4537 Py_DECREF(w);
4538 }
4539 Py_DECREF(*cellvars);
4540 *cellvars = d;
4541 return 1;
4542 fail:
4543 Py_DECREF(d);
4544 return -1;
4545}
4546
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004547static int
4548symtable_freevar_offsets(PyObject *freevars, int offset)
4549{
4550 PyObject *name, *v;
4551 int pos;
4552
4553 /* The cell vars are the first elements of the closure,
4554 followed by the free vars. Update the offsets in
4555 c_freevars to account for number of cellvars. */
4556 pos = 0;
4557 while (PyDict_Next(freevars, &pos, &name, &v)) {
4558 int i = PyInt_AS_LONG(v) + offset;
4559 PyObject *o = PyInt_FromLong(i);
4560 if (o == NULL)
4561 return -1;
4562 if (PyDict_SetItem(freevars, name, o) < 0) {
4563 Py_DECREF(o);
4564 return -1;
4565 }
4566 Py_DECREF(o);
4567 }
4568 return 0;
4569}
4570
4571static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004572symtable_check_unoptimized(struct compiling *c,
4573 PySymtableEntryObject *ste,
4574 struct symbol_info *si)
4575{
4576 char buf[300];
4577
4578 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4579 || (ste->ste_nested && si->si_nimplicit)))
4580 return 0;
4581
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004582#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4583
4584#define ILLEGAL_IS "is a nested function"
4585
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004586#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004587"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004588
4589#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004590"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004591
4592#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00004593"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004594"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004595
4596 /* XXX perhaps the linenos for these opt-breaking statements
4597 should be stored so the exception can point to them. */
4598
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004599 if (ste->ste_child_free) {
4600 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004601 PyOS_snprintf(buf, sizeof(buf),
4602 ILLEGAL_IMPORT_STAR,
4603 PyString_AS_STRING(ste->ste_name),
4604 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004605 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004606 PyOS_snprintf(buf, sizeof(buf),
4607 ILLEGAL_BARE_EXEC,
4608 PyString_AS_STRING(ste->ste_name),
4609 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004610 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004611 PyOS_snprintf(buf, sizeof(buf),
4612 ILLEGAL_EXEC_AND_IMPORT_STAR,
4613 PyString_AS_STRING(ste->ste_name),
4614 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004615 }
4616 } else {
4617 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004618 PyOS_snprintf(buf, sizeof(buf),
4619 ILLEGAL_IMPORT_STAR,
4620 PyString_AS_STRING(ste->ste_name),
4621 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004622 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004623 PyOS_snprintf(buf, sizeof(buf),
4624 ILLEGAL_BARE_EXEC,
4625 PyString_AS_STRING(ste->ste_name),
4626 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004627 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004628 PyOS_snprintf(buf, sizeof(buf),
4629 ILLEGAL_EXEC_AND_IMPORT_STAR,
4630 PyString_AS_STRING(ste->ste_name),
4631 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004632 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004633 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004634
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004635 PyErr_SetString(PyExc_SyntaxError, buf);
4636 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4637 ste->ste_opt_lineno);
4638 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004639}
4640
4641static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004642symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4643 struct symbol_info *si)
4644{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004645 if (c->c_future)
4646 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004647 if (ste->ste_generator)
4648 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004649 if (ste->ste_type != TYPE_MODULE)
4650 c->c_flags |= CO_NEWLOCALS;
4651 if (ste->ste_type == TYPE_FUNCTION) {
4652 c->c_nlocals = si->si_nlocals;
4653 if (ste->ste_optimized == 0)
4654 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004655 else if (ste->ste_optimized != OPT_EXEC)
4656 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004657 }
4658 return 0;
4659}
4660
4661static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004662symtable_load_symbols(struct compiling *c)
4663{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004664 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004665 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004666 PyObject *name, *varnames, *v;
4667 int i, flags, pos;
4668 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004669
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004670 v = NULL;
4671
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004672 if (symtable_init_compiling_symbols(c) < 0)
4673 goto fail;
4674 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004675 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004676 si.si_nlocals = PyList_GET_SIZE(varnames);
4677 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004678
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004679 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004680 v = PyInt_FromLong(i);
4681 if (PyDict_SetItem(c->c_locals,
4682 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004683 goto fail;
4684 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004685 }
4686
4687 /* XXX The cases below define the rules for whether a name is
4688 local or global. The logic could probably be clearer. */
4689 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004690 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4691 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004692
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004693 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004694 /* undo the original DEF_FREE */
4695 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004696
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004697 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004698 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004699 2. Free variables in methods that are also class
4700 variables or declared global.
4701 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004702 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004703 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004704
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004705 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004706 c->c_argcount--;
4707 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004708 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004709 c->c_argcount--;
4710 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004711 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004712 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004713 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004714 if (flags & DEF_PARAM) {
4715 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004716 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004717 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004718 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004719 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004720 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004721 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004722 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4723 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004724 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004725 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00004726 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004727 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004728 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004729 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004730 if (v == NULL)
4731 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004732 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004733 goto fail;
4734 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004735 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004736 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004737 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004738 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004739 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004740 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004741 if (v == NULL)
4742 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004743 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004744 goto fail;
4745 Py_DECREF(v);
4746 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004747 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004748 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00004749 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004750 goto fail;
4751 if (st->st_nscopes != 1) {
4752 v = PyInt_FromLong(flags);
4753 if (PyDict_SetItem(st->st_global,
4754 name, v))
4755 goto fail;
4756 Py_DECREF(v);
4757 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004758 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004759 }
4760 }
4761
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004762 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4763
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004764 if (si.si_ncells > 1) { /* one cell is always in order */
4765 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4766 c->c_varnames, c->c_flags) < 0)
4767 return -1;
4768 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004769 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4770 return -1;
4771 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004772 fail:
4773 /* is this always the right thing to do? */
4774 Py_XDECREF(v);
4775 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004776}
4777
4778static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004779symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004780{
4781 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004782
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004783 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004784 if (st == NULL)
4785 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004786 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00004787
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004788 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004789 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004790 goto fail;
4791 if ((st->st_symbols = PyDict_New()) == NULL)
4792 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004793 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004794 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004795 st->st_errors = 0;
4796 st->st_tmpname = 0;
4797 st->st_private = NULL;
4798 return st;
4799 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004800 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004801 return NULL;
4802}
4803
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004804void
4805PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004806{
4807 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004808 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004809 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004810 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004811}
4812
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004813/* When the compiler exits a scope, it must should update the scope's
4814 free variable information with the list of free variables in its
4815 children.
4816
4817 Variables that are free in children and defined in the current
4818 scope are cellvars.
4819
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004820 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004821 false), free variables in children that are not defined here are
4822 implicit globals.
4823
4824*/
4825
4826static int
4827symtable_update_free_vars(struct symtable *st)
4828{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004829 int i, j, def;
4830 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004831 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004832
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004833 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004834 def = DEF_FREE_CLASS;
4835 else
4836 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004837 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004838 int pos = 0;
4839
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004840 if (list)
4841 PyList_SetSlice(list, 0,
4842 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004843 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004844 PyList_GET_ITEM(ste->ste_children, i);
4845 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004846 int flags = PyInt_AS_LONG(o);
4847 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004848 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004849 if (list == NULL) {
4850 list = PyList_New(0);
4851 if (list == NULL)
4852 return -1;
4853 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004854 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004855 if (PyList_Append(list, name) < 0) {
4856 Py_DECREF(list);
4857 return -1;
4858 }
4859 }
4860 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004861 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004862 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004863 v = PyDict_GetItem(ste->ste_symbols, name);
4864 /* If a name N is declared global in scope A and
4865 referenced in scope B contained (perhaps
4866 indirectly) in A and there are no scopes
4867 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004868 is global in B. Unless A is a class scope,
4869 because class scopes are not considered for
4870 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004871 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004872 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004873 int flags = PyInt_AS_LONG(v);
4874 if (flags & DEF_GLOBAL) {
4875 symtable_undo_free(st, child->ste_id,
4876 name);
4877 continue;
4878 }
4879 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004880 if (ste->ste_nested) {
4881 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004882 name, def) < 0) {
4883 Py_DECREF(list);
4884 return -1;
4885 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004886 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004887 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004888 name) < 0) {
4889 Py_DECREF(list);
4890 return -1;
4891 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004892 }
4893 }
4894 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004895
4896 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004897 return 0;
4898}
4899
4900/* If the current scope is a non-nested class or if name is not
4901 defined in the current, non-nested scope, then it is an implicit
4902 global in all nested scopes.
4903*/
4904
4905static int
4906symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4907{
4908 PyObject *o;
4909 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004910 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004911
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004912 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004913 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004914 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004915 if (o == NULL)
4916 return symtable_undo_free(st, child, name);
4917 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004918
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004919 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004920 return symtable_undo_free(st, child, name);
4921 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004922 return symtable_add_def_o(st, ste->ste_symbols,
4923 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004924}
4925
4926static int
4927symtable_undo_free(struct symtable *st, PyObject *id,
4928 PyObject *name)
4929{
4930 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004931 PyObject *info;
4932 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004933
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004934 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4935 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004936 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00004937
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004938 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004939 if (info == NULL)
4940 return 0;
4941 v = PyInt_AS_LONG(info);
4942 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004943 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004944 DEF_FREE_GLOBAL) < 0)
4945 return -1;
4946 } else
4947 /* If the name is defined here or declared global,
4948 then the recursion stops. */
4949 return 0;
4950
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004951 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4952 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004953 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004954 PyList_GET_ITEM(ste->ste_children, i);
4955 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004956 if (x < 0)
4957 return x;
4958 }
4959 return 0;
4960}
4961
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004962/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4963 This reference is released when the scope is exited, via the DECREF
4964 in symtable_exit_scope().
4965*/
4966
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004967static int
4968symtable_exit_scope(struct symtable *st)
4969{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004970 int end;
4971
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004972 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004973 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004974 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004975 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004976 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4977 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004978 if (PySequence_DelItem(st->st_stack, end) < 0)
4979 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004980 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004981}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004982
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004983static void
4984symtable_enter_scope(struct symtable *st, char *name, int type,
4985 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004986{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004987 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004988
4989 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004990 prev = st->st_cur;
4991 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4992 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004993 st->st_errors++;
4994 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004995 }
4996 }
Barry Warsaw0372af72001-02-23 18:22:59 +00004997 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004998 PySymtableEntry_New(st, name, type, lineno);
4999 if (strcmp(name, TOP) == 0)
5000 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005001 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005002 if (PyList_Append(prev->ste_children,
5003 (PyObject *)st->st_cur) < 0)
5004 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005005 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005006}
5007
5008static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005009symtable_lookup(struct symtable *st, char *name)
5010{
5011 char buffer[MANGLE_LEN];
5012 PyObject *v;
5013 int flags;
5014
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005015 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005016 name = buffer;
5017 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5018 if (v == NULL) {
5019 if (PyErr_Occurred())
5020 return -1;
5021 else
5022 return 0;
5023 }
5024
5025 flags = PyInt_AS_LONG(v);
5026 return flags;
5027}
5028
5029static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005030symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005031{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005032 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005033 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005034 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005035
Guido van Rossumb7164622002-08-16 02:48:11 +00005036 /* Warn about None, except inside a tuple (where the assignment
5037 code already issues a warning). */
5038 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5039 *name == 'N' && strcmp(name, "None") == 0)
5040 {
5041 if (symtable_warn(st, "argument named None"))
5042 return -1;
5043 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005044 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005045 name = buffer;
5046 if ((s = PyString_InternFromString(name)) == NULL)
5047 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005048 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5049 Py_DECREF(s);
5050 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005051}
5052
5053/* Must only be called with mangled names */
5054
5055static int
5056symtable_add_def_o(struct symtable *st, PyObject *dict,
5057 PyObject *name, int flag)
5058{
5059 PyObject *o;
5060 int val;
5061
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005062 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005063 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005064 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005065 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005066 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005067 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005068 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005069 return -1;
5070 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005071 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005072 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005073 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005074 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005075 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005076 Py_DECREF(o);
5077 return -1;
5078 }
5079 Py_DECREF(o);
5080
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005081 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005082 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005083 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005084 } else if (flag & DEF_GLOBAL) {
5085 /* XXX need to update DEF_GLOBAL for other flags too;
5086 perhaps only DEF_FREE_GLOBAL */
5087 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005088 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005089 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005090 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005091 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005092 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005093 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005094 Py_DECREF(o);
5095 return -1;
5096 }
5097 Py_DECREF(o);
5098 }
5099 return 0;
5100}
5101
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005102#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005103
Tim Peters08a898f2001-06-28 01:52:22 +00005104/* Look for a yield stmt under n. Return 1 if found, else 0.
5105 This hack is used to look inside "if 0:" blocks (which are normally
5106 ignored) in case those are the only places a yield occurs (so that this
5107 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005108static int
5109look_for_yield(node *n)
5110{
5111 int i;
5112
5113 for (i = 0; i < NCH(n); ++i) {
5114 node *kid = CHILD(n, i);
5115
5116 switch (TYPE(kid)) {
5117
5118 case classdef:
5119 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005120 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005121 /* Stuff in nested functions and classes can't make
5122 the parent a generator. */
5123 return 0;
5124
5125 case yield_stmt:
5126 return 1;
5127
5128 default:
5129 if (look_for_yield(kid))
5130 return 1;
5131 }
5132 }
5133 return 0;
5134}
5135
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005136static void
5137symtable_node(struct symtable *st, node *n)
5138{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005139 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005140
5141 loop:
5142 switch (TYPE(n)) {
5143 case funcdef: {
5144 char *func_name = STR(CHILD(n, 1));
5145 symtable_add_def(st, func_name, DEF_LOCAL);
5146 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005147 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005148 symtable_funcdef(st, n);
5149 symtable_exit_scope(st);
5150 break;
5151 }
5152 case lambdef:
5153 if (NCH(n) == 4)
5154 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005155 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005156 symtable_funcdef(st, n);
5157 symtable_exit_scope(st);
5158 break;
5159 case classdef: {
5160 char *tmp, *class_name = STR(CHILD(n, 1));
5161 symtable_add_def(st, class_name, DEF_LOCAL);
5162 if (TYPE(CHILD(n, 2)) == LPAR) {
5163 node *bases = CHILD(n, 3);
5164 int i;
5165 for (i = 0; i < NCH(bases); i += 2) {
5166 symtable_node(st, CHILD(bases, i));
5167 }
5168 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005169 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005170 tmp = st->st_private;
5171 st->st_private = class_name;
5172 symtable_node(st, CHILD(n, NCH(n) - 1));
5173 st->st_private = tmp;
5174 symtable_exit_scope(st);
5175 break;
5176 }
5177 case if_stmt:
5178 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005179 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5180 if (st->st_cur->ste_generator == 0)
5181 st->st_cur->ste_generator =
5182 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005183 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005184 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005185 symtable_node(st, CHILD(n, i + 1));
5186 symtable_node(st, CHILD(n, i + 3));
5187 }
5188 if (i + 2 < NCH(n))
5189 symtable_node(st, CHILD(n, i + 2));
5190 break;
5191 case global_stmt:
5192 symtable_global(st, n);
5193 break;
5194 case import_stmt:
5195 symtable_import(st, n);
5196 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005197 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005198 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005199 symtable_node(st, CHILD(n, 1));
5200 if (NCH(n) > 2)
5201 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005202 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005203 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005204 st->st_cur->ste_opt_lineno = n->n_lineno;
5205 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005206 if (NCH(n) > 4)
5207 symtable_node(st, CHILD(n, 5));
5208 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005209
5210 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005211 case assert_stmt:
5212 if (Py_OptimizeFlag)
5213 return;
5214 if (NCH(n) == 2) {
5215 n = CHILD(n, 1);
5216 goto loop;
5217 } else {
5218 symtable_node(st, CHILD(n, 1));
5219 n = CHILD(n, 3);
5220 goto loop;
5221 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005222 case except_clause:
5223 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005224 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005225 if (NCH(n) > 1) {
5226 n = CHILD(n, 1);
5227 goto loop;
5228 }
5229 break;
5230 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005231 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005232 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005233 case yield_stmt:
5234 st->st_cur->ste_generator = 1;
5235 n = CHILD(n, 1);
5236 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005237 case expr_stmt:
5238 if (NCH(n) == 1)
5239 n = CHILD(n, 0);
5240 else {
5241 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005242 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005243 symtable_node(st, CHILD(n, 2));
5244 break;
5245 } else {
5246 int i;
5247 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005248 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005249 n = CHILD(n, NCH(n) - 1);
5250 }
5251 }
5252 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005253 case list_iter:
5254 n = CHILD(n, 0);
5255 if (TYPE(n) == list_for) {
5256 st->st_tmpname++;
5257 symtable_list_comprehension(st, n);
5258 st->st_tmpname--;
5259 } else {
5260 REQ(n, list_if);
5261 symtable_node(st, CHILD(n, 1));
5262 if (NCH(n) == 3) {
5263 n = CHILD(n, 2);
5264 goto loop;
5265 }
5266 }
5267 break;
5268 case for_stmt:
5269 symtable_assign(st, CHILD(n, 1), 0);
5270 for (i = 3; i < NCH(n); ++i)
5271 if (TYPE(CHILD(n, i)) >= single_input)
5272 symtable_node(st, CHILD(n, i));
5273 break;
5274 /* The remaining cases fall through to default except in
5275 special circumstances. This requires the individual cases
5276 to be coded with great care, even though they look like
5277 rather innocuous. Each case must double-check TYPE(n).
5278 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005279 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005280 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005281 n = CHILD(n, 2);
5282 goto loop;
5283 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005284 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005285 case listmaker:
5286 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00005287 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005288 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00005289 symtable_node(st, CHILD(n, 0));
5290 st->st_tmpname--;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005291 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005292 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005293 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005294 case atom:
5295 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5296 symtable_add_use(st, STR(CHILD(n, 0)));
5297 break;
5298 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005299 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005300 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005301 /* Walk over every non-token child with a special case
5302 for one child.
5303 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005304 if (NCH(n) == 1) {
5305 n = CHILD(n, 0);
5306 goto loop;
5307 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005308 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005309 if (TYPE(CHILD(n, i)) >= single_input)
5310 symtable_node(st, CHILD(n, i));
5311 }
5312}
5313
5314static void
5315symtable_funcdef(struct symtable *st, node *n)
5316{
5317 node *body;
5318
5319 if (TYPE(n) == lambdef) {
5320 if (NCH(n) == 4)
5321 symtable_params(st, CHILD(n, 1));
5322 } else
5323 symtable_params(st, CHILD(n, 2));
5324 body = CHILD(n, NCH(n) - 1);
5325 symtable_node(st, body);
5326}
5327
5328/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00005329 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005330 which are references in the defining scope. symtable_params()
5331 parses the parameter names, which are defined in the function's
5332 body.
5333
5334 varargslist:
5335 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5336 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5337*/
5338
5339static void
5340symtable_default_args(struct symtable *st, node *n)
5341{
5342 node *c;
5343 int i;
5344
5345 if (TYPE(n) == parameters) {
5346 n = CHILD(n, 1);
5347 if (TYPE(n) == RPAR)
5348 return;
5349 }
5350 REQ(n, varargslist);
5351 for (i = 0; i < NCH(n); i += 2) {
5352 c = CHILD(n, i);
5353 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5354 break;
5355 }
5356 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5357 symtable_node(st, CHILD(n, i));
5358 }
5359}
5360
5361static void
5362symtable_params(struct symtable *st, node *n)
5363{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005364 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00005365 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005366
5367 if (TYPE(n) == parameters) {
5368 n = CHILD(n, 1);
5369 if (TYPE(n) == RPAR)
5370 return;
5371 }
5372 REQ(n, varargslist);
5373 for (i = 0; i < NCH(n); i += 2) {
5374 c = CHILD(n, i);
5375 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5376 ext = 1;
5377 break;
5378 }
5379 if (TYPE(c) == test) {
5380 continue;
5381 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00005382 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005383 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00005384 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005385 char nbuf[30];
5386 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005387 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005388 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005389 }
5390 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005391 if (ext) {
5392 c = CHILD(n, i);
5393 if (TYPE(c) == STAR) {
5394 i++;
5395 symtable_add_def(st, STR(CHILD(n, i)),
5396 DEF_PARAM | DEF_STAR);
5397 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005398 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005399 c = NULL;
5400 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005401 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005402 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005403 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005404 i++;
5405 symtable_add_def(st, STR(CHILD(n, i)),
5406 DEF_PARAM | DEF_DOUBLESTAR);
5407 }
5408 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005409 if (complex >= 0) {
5410 int j;
5411 for (j = 0; j <= complex; j++) {
5412 c = CHILD(n, j);
5413 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005414 c = CHILD(n, ++j);
5415 else if (TYPE(c) == EQUAL)
5416 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005417 if (TYPE(CHILD(c, 0)) == LPAR)
5418 symtable_params_fplist(st, CHILD(c, 1));
5419 }
5420 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005421}
5422
5423static void
5424symtable_params_fplist(struct symtable *st, node *n)
5425{
5426 int i;
5427 node *c;
5428
5429 REQ(n, fplist);
5430 for (i = 0; i < NCH(n); i += 2) {
5431 c = CHILD(n, i);
5432 REQ(c, fpdef);
5433 if (NCH(c) == 1)
5434 symtable_add_def(st, STR(CHILD(c, 0)),
5435 DEF_PARAM | DEF_INTUPLE);
5436 else
5437 symtable_params_fplist(st, CHILD(c, 1));
5438 }
5439
5440}
5441
5442static void
5443symtable_global(struct symtable *st, node *n)
5444{
5445 int i;
5446
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005447 /* XXX It might be helpful to warn about module-level global
5448 statements, but it's hard to tell the difference between
5449 module-level and a string passed to exec.
5450 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005451
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005452 for (i = 1; i < NCH(n); i += 2) {
5453 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005454 int flags;
5455
5456 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005457 if (flags < 0)
5458 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005459 if (flags && flags != DEF_GLOBAL) {
5460 char buf[500];
5461 if (flags & DEF_PARAM) {
5462 PyErr_Format(PyExc_SyntaxError,
5463 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005464 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005465 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005466 st->st_cur->ste_lineno);
5467 st->st_errors++;
5468 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005469 }
5470 else {
5471 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005472 PyOS_snprintf(buf, sizeof(buf),
5473 GLOBAL_AFTER_ASSIGN,
5474 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005475 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005476 PyOS_snprintf(buf, sizeof(buf),
5477 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005478 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005479 }
5480 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005481 symtable_add_def(st, name, DEF_GLOBAL);
5482 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005483}
5484
5485static void
5486symtable_list_comprehension(struct symtable *st, node *n)
5487{
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005488 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005489
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005490 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005491 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005492 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005493 symtable_node(st, CHILD(n, 3));
5494 if (NCH(n) == 5)
5495 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005496}
5497
5498static void
5499symtable_import(struct symtable *st, node *n)
5500{
5501 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005502 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005503 | 'from' dotted_name 'import'
5504 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005505 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005506 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005507 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005508 node *dotname = CHILD(n, 1);
5509 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5510 /* check for bogus imports */
5511 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5512 PyErr_SetString(PyExc_SyntaxError,
5513 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005514 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005515 n->n_lineno);
5516 st->st_errors++;
5517 return;
5518 }
5519 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005520 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005521 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005522 if (symtable_warn(st,
5523 "import * only allowed at module level") < 0)
5524 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005525 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005526 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005527 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005528 } else {
5529 for (i = 3; i < NCH(n); i += 2) {
5530 node *c = CHILD(n, i);
5531 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005532 symtable_assign(st, CHILD(c, 2),
5533 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005534 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005535 symtable_assign(st, CHILD(c, 0),
5536 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005537 }
5538 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005539 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005540 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005541 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005542 }
5543 }
5544}
5545
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005546/* The third argument to symatble_assign() is a flag to be passed to
5547 symtable_add_def() if it is eventually called. The flag is useful
5548 to specify the particular type of assignment that should be
5549 recorded, e.g. an assignment caused by import.
5550 */
5551
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005552static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005553symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005554{
5555 node *tmp;
5556 int i;
5557
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005558 loop:
5559 switch (TYPE(n)) {
5560 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005561 /* invalid assignment, e.g. lambda x:x=2. The next
5562 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005563 return;
5564 case power:
5565 if (NCH(n) > 2) {
5566 for (i = 2; i < NCH(n); ++i)
5567 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5568 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005569 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005570 if (NCH(n) > 1) {
5571 symtable_node(st, CHILD(n, 0));
5572 symtable_node(st, CHILD(n, 1));
5573 } else {
5574 n = CHILD(n, 0);
5575 goto loop;
5576 }
5577 return;
5578 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005579 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5580 /* XXX This is an error, but the next pass
5581 will catch it. */
5582 return;
5583 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005584 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005585 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005586 }
5587 return;
5588 case exprlist:
5589 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00005590 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005591 if (NCH(n) == 1) {
5592 n = CHILD(n, 0);
5593 goto loop;
5594 }
5595 else {
5596 int i;
5597 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005598 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005599 return;
5600 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005601 case atom:
5602 tmp = CHILD(n, 0);
5603 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5604 n = CHILD(n, 1);
5605 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005606 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00005607 if (strcmp(STR(tmp), "__debug__") == 0) {
5608 PyErr_SetString(PyExc_SyntaxError,
5609 ASSIGN_DEBUG);
5610 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton86424e32001-12-04 02:41:46 +00005611 n->n_lineno);
Jeremy Hylton778e2652001-11-09 19:50:08 +00005612 st->st_errors++;
5613 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005614 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005615 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005616 return;
5617 case dotted_as_name:
5618 if (NCH(n) == 3)
5619 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005620 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005621 else
5622 symtable_add_def(st,
5623 STR(CHILD(CHILD(n,
5624 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005625 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005626 return;
5627 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005628 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005629 return;
5630 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005631 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005632 return;
5633 default:
5634 if (NCH(n) == 0)
5635 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005636 if (NCH(n) == 1) {
5637 n = CHILD(n, 0);
5638 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005639 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005640 /* Should only occur for errors like x + 1 = 1,
5641 which will be caught in the next pass. */
5642 for (i = 0; i < NCH(n); ++i)
5643 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005644 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005645 }
5646}