blob: b438ce44f989dbfa461143e3e8a15918565b5319 [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 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000459 PyObject *c_globals; /* dictionary (value=None) */
460 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)
998 msg = "assigment to None";
999 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
1244static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001245parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001246{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001247 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001248 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001249 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001250 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001251 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001252 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001253 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001254
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001255 if (isalpha(quote) || quote == '_') {
1256 if (quote == 'u' || quote == 'U') {
1257 quote = *++s;
1258 unicode = 1;
1259 }
1260 if (quote == 'r' || quote == 'R') {
1261 quote = *++s;
1262 rawmode = 1;
1263 }
1264 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001265 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001266 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001267 return NULL;
1268 }
1269 s++;
1270 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001271 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001272 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001273 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001274 return NULL;
1275 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001276 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001277 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001278 return NULL;
1279 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001280 if (len >= 4 && s[0] == quote && s[1] == quote) {
1281 s += 2;
1282 len -= 2;
1283 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001284 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001285 return NULL;
1286 }
1287 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001288#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001289 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001290 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001291 char *buf;
1292 char *p;
1293 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001294 if (encoding == NULL) {
1295 buf = s;
1296 u = NULL;
1297 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1298 buf = s;
1299 u = NULL;
1300 } else {
1301 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1302 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1303 if (u == NULL)
1304 return NULL;
1305 p = buf = PyString_AsString(u);
1306 end = s + len;
1307 while (s < end) {
1308 if (*s == '\\') {
1309 *p++ = *s++;
1310 if (*s & 0x80) {
1311 strcpy(p, "u005c");
1312 p += 5;
1313 }
1314 }
1315 if (*s & 0x80) { /* XXX inefficient */
1316 char *r;
1317 int rn, i;
1318 w = decode_utf8(&s, end, "utf-16-be");
1319 if (w == NULL) {
1320 Py_DECREF(u);
1321 return NULL;
1322 }
1323 r = PyString_AsString(w);
1324 rn = PyString_Size(w);
1325 assert(rn % 2 == 0);
1326 for (i = 0; i < rn; i += 2) {
1327 sprintf(p, "\\u%02x%02x",
1328 r[i + 0] & 0xFF,
1329 r[i + 1] & 0xFF);
1330 p += 6;
1331 }
1332 Py_DECREF(w);
1333 } else {
1334 *p++ = *s++;
1335 }
1336 }
1337 len = p - buf;
1338 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001339 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001340 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001341 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001342 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1343 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001344 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001345 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001346 return v;
1347
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001348 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001349#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001350 need_encoding = (encoding != NULL &&
1351 strcmp(encoding, "utf-8") != 0 &&
1352 strcmp(encoding, "iso-8859-1") != 0);
1353 if (rawmode || strchr(s, '\\') == NULL) {
1354 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001355#ifndef Py_USING_UNICODE
1356 /* This should not happen - we never see any other
1357 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001358 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001359#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001360 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1361 if (u == NULL)
1362 return NULL;
1363 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1364 Py_DECREF(u);
1365 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001366#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001367 } else {
1368 return PyString_FromStringAndSize(s, len);
1369 }
1370 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001371
1372 v = PyString_DecodeEscape(s, len, NULL, unicode,
1373 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001374 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001375 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001376 return v;
1377}
1378
Guido van Rossum79f25d91997-04-29 20:08:16 +00001379static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001380parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001381{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001382 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001383 int i;
1384 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001385 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001386 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001387 for (i = 1; i < NCH(n); i++) {
1388 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001389 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001390 if (s == NULL)
1391 goto onError;
1392 if (PyString_Check(v) && PyString_Check(s)) {
1393 PyString_ConcatAndDel(&v, s);
1394 if (v == NULL)
1395 goto onError;
1396 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001397#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001398 else {
1399 PyObject *temp;
1400 temp = PyUnicode_Concat(v, s);
1401 Py_DECREF(s);
1402 if (temp == NULL)
1403 goto onError;
1404 Py_DECREF(v);
1405 v = temp;
1406 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001407#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001408 }
1409 }
1410 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001411
1412 onError:
1413 Py_XDECREF(v);
1414 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001415}
1416
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001417static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001418com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001419{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001420 int anchor = 0;
1421 int save_begin = c->c_begin;
1422
1423 /* list_iter: for v in expr [list_iter] */
1424 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001425 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001426 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001427 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001428 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001429 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001430 c->c_loops++;
1431 com_list_iter(c, n, e, t);
1432 c->c_loops--;
1433 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1434 c->c_begin = save_begin;
1435 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001436 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001437}
1438
1439static void
1440com_list_if(struct compiling *c, node *n, node *e, char *t)
1441{
1442 int anchor = 0;
1443 int a = 0;
1444 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001445 com_node(c, CHILD(n, 1));
1446 com_addfwref(c, JUMP_IF_FALSE, &a);
1447 com_addbyte(c, POP_TOP);
1448 com_pop(c, 1);
1449 com_list_iter(c, n, e, t);
1450 com_addfwref(c, JUMP_FORWARD, &anchor);
1451 com_backpatch(c, a);
1452 /* We jump here with an extra entry which we now pop */
1453 com_addbyte(c, POP_TOP);
1454 com_backpatch(c, anchor);
1455}
1456
1457static void
1458com_list_iter(struct compiling *c,
1459 node *p, /* parent of list_iter node */
1460 node *e, /* element expression node */
1461 char *t /* name of result list temp local */)
1462{
1463 /* list_iter is the last child in a listmaker, list_for, or list_if */
1464 node *n = CHILD(p, NCH(p)-1);
1465 if (TYPE(n) == list_iter) {
1466 n = CHILD(n, 0);
1467 switch (TYPE(n)) {
1468 case list_for:
1469 com_list_for(c, n, e, t);
1470 break;
1471 case list_if:
1472 com_list_if(c, n, e, t);
1473 break;
1474 default:
1475 com_error(c, PyExc_SystemError,
1476 "invalid list_iter node type");
1477 }
1478 }
1479 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001480 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001481 com_push(c, 1);
1482 com_node(c, e);
1483 com_addoparg(c, CALL_FUNCTION, 1);
1484 com_addbyte(c, POP_TOP);
1485 com_pop(c, 2);
1486 }
1487}
1488
1489static void
1490com_list_comprehension(struct compiling *c, node *n)
1491{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001492 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001493 char tmpname[30];
1494 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001495 com_addoparg(c, BUILD_LIST, 0);
1496 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1497 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001498 com_addop_name(c, LOAD_ATTR, "append");
1499 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001500 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001501 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001502 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001503 --c->c_tmpname;
1504}
1505
1506static void
1507com_listmaker(struct compiling *c, node *n)
1508{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001509 /* listmaker: test ( list_for | (',' test)* [','] ) */
1510 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001511 com_list_comprehension(c, n);
1512 else {
1513 int len = 0;
1514 int i;
1515 for (i = 0; i < NCH(n); i += 2, len++)
1516 com_node(c, CHILD(n, i));
1517 com_addoparg(c, BUILD_LIST, len);
1518 com_pop(c, len-1);
1519 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001520}
1521
1522static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001523com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001524{
1525 int i;
1526 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1527 for (i = 0; i+2 < NCH(n); i += 4) {
1528 /* We must arrange things just right for STORE_SUBSCR.
1529 It wants the stack to look like (value) (dict) (key) */
1530 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001531 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001532 com_node(c, CHILD(n, i+2)); /* value */
1533 com_addbyte(c, ROT_TWO);
1534 com_node(c, CHILD(n, i)); /* key */
1535 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001536 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001537 }
1538}
1539
1540static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001541com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001542{
1543 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001544 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001545 int i;
1546 REQ(n, atom);
1547 ch = CHILD(n, 0);
1548 switch (TYPE(ch)) {
1549 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001550 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001551 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001552 com_push(c, 1);
1553 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001554 else
1555 com_node(c, CHILD(n, 1));
1556 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001557 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001558 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001559 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001560 com_push(c, 1);
1561 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001562 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001563 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001564 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001565 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001566 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001567 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001568 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001569 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001570 break;
1571 case BACKQUOTE:
1572 com_node(c, CHILD(n, 1));
1573 com_addbyte(c, UNARY_CONVERT);
1574 break;
1575 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001576 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001577 i = 255;
1578 }
1579 else {
1580 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001581 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001582 }
1583 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001584 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001585 break;
1586 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001587 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001588 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001589 c->c_errors++;
1590 i = 255;
1591 }
1592 else {
1593 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001594 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001595 }
1596 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001597 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001598 break;
1599 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001600 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001601 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001602 break;
1603 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001604 com_error(c, PyExc_SystemError,
1605 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001606 }
1607}
1608
1609static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001610com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001611{
1612 if (NCH(n) == 1) {
1613 com_addbyte(c, op);
1614 }
1615 else if (NCH(n) == 2) {
1616 if (TYPE(CHILD(n, 0)) != COLON) {
1617 com_node(c, CHILD(n, 0));
1618 com_addbyte(c, op+1);
1619 }
1620 else {
1621 com_node(c, CHILD(n, 1));
1622 com_addbyte(c, op+2);
1623 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001624 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001625 }
1626 else {
1627 com_node(c, CHILD(n, 0));
1628 com_node(c, CHILD(n, 2));
1629 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001630 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001631 }
1632}
1633
Guido van Rossum635abd21997-01-06 22:56:52 +00001634static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001635com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1636{
1637 if (NCH(n) == 1) {
1638 com_addbyte(c, DUP_TOP);
1639 com_push(c, 1);
1640 com_addbyte(c, SLICE);
1641 com_node(c, augn);
1642 com_addbyte(c, opcode);
1643 com_pop(c, 1);
1644 com_addbyte(c, ROT_TWO);
1645 com_addbyte(c, STORE_SLICE);
1646 com_pop(c, 2);
1647 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1648 com_node(c, CHILD(n, 0));
1649 com_addoparg(c, DUP_TOPX, 2);
1650 com_push(c, 2);
1651 com_addbyte(c, SLICE+1);
1652 com_pop(c, 1);
1653 com_node(c, augn);
1654 com_addbyte(c, opcode);
1655 com_pop(c, 1);
1656 com_addbyte(c, ROT_THREE);
1657 com_addbyte(c, STORE_SLICE+1);
1658 com_pop(c, 3);
1659 } else if (NCH(n) == 2) {
1660 com_node(c, CHILD(n, 1));
1661 com_addoparg(c, DUP_TOPX, 2);
1662 com_push(c, 2);
1663 com_addbyte(c, SLICE+2);
1664 com_pop(c, 1);
1665 com_node(c, augn);
1666 com_addbyte(c, opcode);
1667 com_pop(c, 1);
1668 com_addbyte(c, ROT_THREE);
1669 com_addbyte(c, STORE_SLICE+2);
1670 com_pop(c, 3);
1671 } else {
1672 com_node(c, CHILD(n, 0));
1673 com_node(c, CHILD(n, 2));
1674 com_addoparg(c, DUP_TOPX, 3);
1675 com_push(c, 3);
1676 com_addbyte(c, SLICE+3);
1677 com_pop(c, 2);
1678 com_node(c, augn);
1679 com_addbyte(c, opcode);
1680 com_pop(c, 1);
1681 com_addbyte(c, ROT_FOUR);
1682 com_addbyte(c, STORE_SLICE+3);
1683 com_pop(c, 4);
1684 }
1685}
1686
1687static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001688com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001689{
1690 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001691 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001692 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001693 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001694 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001695 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001696 }
1697 else {
1698 com_node(c, CHILD(n, 0));
1699 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001700 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001701 }
1702 m = n;
1703 do {
1704 m = CHILD(m, 0);
1705 } while (NCH(m) == 1);
1706 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001707 /* f(lambda x: x[0] = 3) ends up getting parsed with
1708 * LHS test = lambda x: x[0], and RHS test = 3.
1709 * SF bug 132313 points out that complaining about a keyword
1710 * then is very confusing.
1711 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001712 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001713 TYPE(m) == lambdef ?
1714 "lambda cannot contain assignment" :
1715 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001716 }
1717 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001718 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00001719 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00001720 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001721 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001722 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001723 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001724 else if (*pkeywords == NULL) {
1725 c->c_errors++;
1726 Py_DECREF(v);
1727 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001728 if (PyDict_GetItem(*pkeywords, v) != NULL)
1729 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001730 "duplicate keyword argument");
1731 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001732 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001733 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001734 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001735 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001736 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001737 }
1738 }
1739 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001740}
1741
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001742static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001743com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001744{
1745 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001746 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001747 }
1748 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001749 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001750 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001751 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001752 int star_flag = 0;
1753 int starstar_flag = 0;
1754 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001755 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001756 na = 0;
1757 nk = 0;
1758 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001759 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001760 if (TYPE(ch) == STAR ||
1761 TYPE(ch) == DOUBLESTAR)
1762 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001763 if (ch->n_lineno != lineno) {
1764 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001765 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00001766 }
1767 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001768 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001769 na++;
1770 else
1771 nk++;
1772 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001773 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001774 while (i < NCH(n)) {
1775 node *tok = CHILD(n, i);
1776 node *ch = CHILD(n, i+1);
1777 i += 3;
1778 switch (TYPE(tok)) {
1779 case STAR: star_flag = 1; break;
1780 case DOUBLESTAR: starstar_flag = 1; break;
1781 }
1782 com_node(c, ch);
1783 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001784 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001785 com_error(c, PyExc_SyntaxError,
1786 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001787 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001788 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001789 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001790 star_flag + (starstar_flag << 1);
1791 else
1792 opcode = CALL_FUNCTION;
1793 com_addoparg(c, opcode, na | (nk << 8));
1794 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001795 }
1796}
1797
1798static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001799com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001800{
1801 com_addopname(c, LOAD_ATTR, n);
1802}
1803
1804static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001805com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001806{
1807 int i=0;
1808 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001809 node *ch;
1810
1811 /* first argument */
1812 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001813 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001814 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001815 i++;
1816 }
1817 else {
1818 com_node(c, CHILD(n,i));
1819 i++;
1820 REQ(CHILD(n,i),COLON);
1821 i++;
1822 }
1823 /* second argument */
1824 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1825 com_node(c, CHILD(n,i));
1826 i++;
1827 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001828 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001829 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001830 com_push(c, 1);
1831 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001832 /* remaining arguments */
1833 for (; i < NCH(n); i++) {
1834 ns++;
1835 ch=CHILD(n,i);
1836 REQ(ch, sliceop);
1837 if (NCH(ch) == 1) {
1838 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001839 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001840 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001841 }
1842 else
1843 com_node(c, CHILD(ch,1));
1844 }
1845 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001846 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001847}
1848
1849static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001850com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001851{
1852 node *ch;
1853 REQ(n, subscript);
1854 ch = CHILD(n,0);
1855 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001856 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001857 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001858 com_push(c, 1);
1859 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001860 else {
1861 /* check for slice */
1862 if ((TYPE(ch) == COLON || NCH(n) > 1))
1863 com_sliceobj(c, n);
1864 else {
1865 REQ(ch, test);
1866 com_node(c, ch);
1867 }
1868 }
1869}
1870
1871static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001872com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001873{
1874 int i, op;
1875 REQ(n, subscriptlist);
1876 /* Check to make backward compatible slice behavior for '[i:j]' */
1877 if (NCH(n) == 1) {
1878 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001879 /* 'Basic' slice, should have exactly one colon. */
1880 if ((TYPE(CHILD(sub, 0)) == COLON
1881 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1882 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1883 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001884 switch (assigning) {
1885 case OP_DELETE:
1886 op = DELETE_SLICE;
1887 break;
1888 case OP_ASSIGN:
1889 op = STORE_SLICE;
1890 break;
1891 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001892 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001893 break;
1894 default:
1895 com_augassign_slice(c, sub, assigning, augn);
1896 return;
1897 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001898 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001899 if (op == STORE_SLICE)
1900 com_pop(c, 2);
1901 else if (op == DELETE_SLICE)
1902 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001903 return;
1904 }
1905 }
1906 /* Else normal subscriptlist. Compile each subscript. */
1907 for (i = 0; i < NCH(n); i += 2)
1908 com_subscript(c, CHILD(n, i));
1909 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001910 if (NCH(n) > 1) {
1911 i = (NCH(n)+1) / 2;
1912 com_addoparg(c, BUILD_TUPLE, i);
1913 com_pop(c, i-1);
1914 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001915 switch (assigning) {
1916 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001917 op = DELETE_SUBSCR;
1918 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001919 break;
1920 default:
1921 case OP_ASSIGN:
1922 op = STORE_SUBSCR;
1923 i = 3;
1924 break;
1925 case OP_APPLY:
1926 op = BINARY_SUBSCR;
1927 i = 1;
1928 break;
1929 }
1930 if (assigning > OP_APPLY) {
1931 com_addoparg(c, DUP_TOPX, 2);
1932 com_push(c, 2);
1933 com_addbyte(c, BINARY_SUBSCR);
1934 com_pop(c, 1);
1935 com_node(c, augn);
1936 com_addbyte(c, assigning);
1937 com_pop(c, 1);
1938 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001939 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001940 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001941 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001942}
1943
1944static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001945com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001946{
1947 REQ(n, trailer);
1948 switch (TYPE(CHILD(n, 0))) {
1949 case LPAR:
1950 com_call_function(c, CHILD(n, 1));
1951 break;
1952 case DOT:
1953 com_select_member(c, CHILD(n, 1));
1954 break;
1955 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001956 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001957 break;
1958 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001959 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001960 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001961 }
1962}
1963
1964static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001965com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001966{
1967 int i;
1968 REQ(n, power);
1969 com_atom(c, CHILD(n, 0));
1970 for (i = 1; i < NCH(n); i++) {
1971 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1972 com_factor(c, CHILD(n, i+1));
1973 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001974 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001975 break;
1976 }
1977 else
1978 com_apply_trailer(c, CHILD(n, i));
1979 }
1980}
1981
1982static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001983com_invert_constant(struct compiling *c, node *n)
1984{
1985 /* Compute the inverse of int and longs and use them directly,
1986 but be prepared to generate code for all other
1987 possibilities (invalid numbers, floats, complex).
1988 */
1989 PyObject *num, *inv = NULL;
1990 int i;
1991
1992 REQ(n, NUMBER);
1993 num = parsenumber(c, STR(n));
1994 if (num == NULL)
1995 i = 255;
1996 else {
1997 inv = PyNumber_Invert(num);
1998 if (inv == NULL) {
1999 PyErr_Clear();
2000 i = com_addconst(c, num);
2001 } else {
2002 i = com_addconst(c, inv);
2003 Py_DECREF(inv);
2004 }
2005 Py_DECREF(num);
2006 }
2007 com_addoparg(c, LOAD_CONST, i);
2008 com_push(c, 1);
2009 if (num != NULL && inv == NULL)
2010 com_addbyte(c, UNARY_INVERT);
2011}
2012
Tim Peters51e26512001-09-07 08:45:55 +00002013static int
2014is_float_zero(const char *p)
2015{
2016 int found_radix_point = 0;
2017 int ch;
2018 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2019 switch (ch) {
2020 case '0':
2021 /* no reason to believe it's not 0 -- continue */
2022 break;
2023
2024 case 'e': case 'E': case 'j': case 'J':
2025 /* If this was a hex constant, we already would have
2026 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2027 must be an exponent marker, and we haven't yet
2028 seen a non-zero digit, and it doesn't matter what
2029 the exponent is then. For 'j' or 'J' similarly,
2030 except that this is an imaginary 0 then. */
2031 return 1;
2032
2033 case '.':
2034 found_radix_point = 1;
2035 break;
2036
2037 default:
2038 return 0;
2039 }
2040 }
2041 return found_radix_point;
2042}
2043
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002044static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002045com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002046{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002047 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002048 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002049 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002050 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002051 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002052 approriate value as a constant. If the value is negative,
2053 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002054 negative in the 0th position -- unless we're doing unary minus
2055 of a floating zero! In that case the sign is significant, but
2056 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002057 */
2058 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002059 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002060 && TYPE((pfactor = CHILD(n, 1))) == factor
2061 && NCH(pfactor) == 1
2062 && TYPE((ppower = CHILD(pfactor, 0))) == power
2063 && NCH(ppower) == 1
2064 && TYPE((patom = CHILD(ppower, 0))) == atom
2065 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
2066 && !(childtype == MINUS && is_float_zero(STR(pnum)))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002067 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002068 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002069 return;
2070 }
2071 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002072 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002073 if (s == NULL) {
2074 com_error(c, PyExc_MemoryError, "");
2075 com_addbyte(c, 255);
2076 return;
2077 }
2078 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002079 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002080 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002081 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002082 }
Tim Peters51e26512001-09-07 08:45:55 +00002083 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002084 }
2085 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002086 com_factor(c, CHILD(n, 1));
2087 com_addbyte(c, UNARY_POSITIVE);
2088 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002089 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002090 com_factor(c, CHILD(n, 1));
2091 com_addbyte(c, UNARY_NEGATIVE);
2092 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002093 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002094 com_factor(c, CHILD(n, 1));
2095 com_addbyte(c, UNARY_INVERT);
2096 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002097 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002098 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002099 }
2100}
2101
2102static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002103com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002104{
2105 int i;
2106 int op;
2107 REQ(n, term);
2108 com_factor(c, CHILD(n, 0));
2109 for (i = 2; i < NCH(n); i += 2) {
2110 com_factor(c, CHILD(n, i));
2111 switch (TYPE(CHILD(n, i-1))) {
2112 case STAR:
2113 op = BINARY_MULTIPLY;
2114 break;
2115 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002116 if (c->c_flags & CO_FUTURE_DIVISION)
2117 op = BINARY_TRUE_DIVIDE;
2118 else
2119 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002120 break;
2121 case PERCENT:
2122 op = BINARY_MODULO;
2123 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002124 case DOUBLESLASH:
2125 op = BINARY_FLOOR_DIVIDE;
2126 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002127 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002128 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002129 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002130 op = 255;
2131 }
2132 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002133 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002134 }
2135}
2136
2137static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002138com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002139{
2140 int i;
2141 int op;
2142 REQ(n, arith_expr);
2143 com_term(c, CHILD(n, 0));
2144 for (i = 2; i < NCH(n); i += 2) {
2145 com_term(c, CHILD(n, i));
2146 switch (TYPE(CHILD(n, i-1))) {
2147 case PLUS:
2148 op = BINARY_ADD;
2149 break;
2150 case MINUS:
2151 op = BINARY_SUBTRACT;
2152 break;
2153 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002154 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002155 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002156 op = 255;
2157 }
2158 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002159 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002160 }
2161}
2162
2163static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002164com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002165{
2166 int i;
2167 int op;
2168 REQ(n, shift_expr);
2169 com_arith_expr(c, CHILD(n, 0));
2170 for (i = 2; i < NCH(n); i += 2) {
2171 com_arith_expr(c, CHILD(n, i));
2172 switch (TYPE(CHILD(n, i-1))) {
2173 case LEFTSHIFT:
2174 op = BINARY_LSHIFT;
2175 break;
2176 case RIGHTSHIFT:
2177 op = BINARY_RSHIFT;
2178 break;
2179 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002180 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002181 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002182 op = 255;
2183 }
2184 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002185 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002186 }
2187}
2188
2189static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002190com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002191{
2192 int i;
2193 int op;
2194 REQ(n, and_expr);
2195 com_shift_expr(c, CHILD(n, 0));
2196 for (i = 2; i < NCH(n); i += 2) {
2197 com_shift_expr(c, CHILD(n, i));
2198 if (TYPE(CHILD(n, i-1)) == AMPER) {
2199 op = BINARY_AND;
2200 }
2201 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002202 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002203 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002204 op = 255;
2205 }
2206 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002207 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002208 }
2209}
2210
2211static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002212com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002213{
2214 int i;
2215 int op;
2216 REQ(n, xor_expr);
2217 com_and_expr(c, CHILD(n, 0));
2218 for (i = 2; i < NCH(n); i += 2) {
2219 com_and_expr(c, CHILD(n, i));
2220 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2221 op = BINARY_XOR;
2222 }
2223 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002224 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002225 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002226 op = 255;
2227 }
2228 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002229 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002230 }
2231}
2232
2233static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002234com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002235{
2236 int i;
2237 int op;
2238 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002239 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002240 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002241 com_xor_expr(c, CHILD(n, i));
2242 if (TYPE(CHILD(n, i-1)) == VBAR) {
2243 op = BINARY_OR;
2244 }
2245 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002246 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002247 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002248 op = 255;
2249 }
2250 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002251 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002252 }
2253}
2254
2255static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002256cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002257{
2258 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00002259 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002260 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2261 if (NCH(n) == 1) {
2262 n = CHILD(n, 0);
2263 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002264 case LESS: return PyCmp_LT;
2265 case GREATER: return PyCmp_GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002266 case EQEQUAL: /* == */
Martin v. Löwis7198a522002-01-01 19:59:11 +00002267 case EQUAL: return PyCmp_EQ;
2268 case LESSEQUAL: return PyCmp_LE;
2269 case GREATEREQUAL: return PyCmp_GE;
2270 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2271 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2272 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002273 }
2274 }
2275 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002276 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002277 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002278 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002279 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002280 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002281 }
2282 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002283 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002284}
2285
2286static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002287com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002288{
2289 int i;
2290 enum cmp_op op;
2291 int anchor;
2292 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2293 com_expr(c, CHILD(n, 0));
2294 if (NCH(n) == 1)
2295 return;
2296
2297 /****************************************************************
2298 The following code is generated for all but the last
2299 comparison in a chain:
2300
2301 label: on stack: opcode: jump to:
2302
2303 a <code to load b>
2304 a, b DUP_TOP
2305 a, b, b ROT_THREE
2306 b, a, b COMPARE_OP
2307 b, 0-or-1 JUMP_IF_FALSE L1
2308 b, 1 POP_TOP
2309 b
2310
2311 We are now ready to repeat this sequence for the next
2312 comparison in the chain.
2313
2314 For the last we generate:
2315
2316 b <code to load c>
2317 b, c COMPARE_OP
2318 0-or-1
2319
2320 If there were any jumps to L1 (i.e., there was more than one
2321 comparison), we generate:
2322
2323 0-or-1 JUMP_FORWARD L2
2324 L1: b, 0 ROT_TWO
2325 0, b POP_TOP
2326 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002327 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002328 ****************************************************************/
2329
2330 anchor = 0;
2331
2332 for (i = 2; i < NCH(n); i += 2) {
2333 com_expr(c, CHILD(n, i));
2334 if (i+2 < NCH(n)) {
2335 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002336 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002337 com_addbyte(c, ROT_THREE);
2338 }
2339 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002340 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002341 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002342 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002343 }
2344 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002345 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002346 if (i+2 < NCH(n)) {
2347 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2348 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002349 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002350 }
2351 }
2352
2353 if (anchor) {
2354 int anchor2 = 0;
2355 com_addfwref(c, JUMP_FORWARD, &anchor2);
2356 com_backpatch(c, anchor);
2357 com_addbyte(c, ROT_TWO);
2358 com_addbyte(c, POP_TOP);
2359 com_backpatch(c, anchor2);
2360 }
2361}
2362
2363static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002364com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002365{
2366 REQ(n, not_test); /* 'not' not_test | comparison */
2367 if (NCH(n) == 1) {
2368 com_comparison(c, CHILD(n, 0));
2369 }
2370 else {
2371 com_not_test(c, CHILD(n, 1));
2372 com_addbyte(c, UNARY_NOT);
2373 }
2374}
2375
2376static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002377com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002378{
2379 int i;
2380 int anchor;
2381 REQ(n, and_test); /* not_test ('and' not_test)* */
2382 anchor = 0;
2383 i = 0;
2384 for (;;) {
2385 com_not_test(c, CHILD(n, i));
2386 if ((i += 2) >= NCH(n))
2387 break;
2388 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2389 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002390 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002391 }
2392 if (anchor)
2393 com_backpatch(c, anchor);
2394}
2395
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002396static int
2397com_make_closure(struct compiling *c, PyCodeObject *co)
2398{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002399 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002400 if (free == 0)
2401 return 0;
2402 for (i = 0; i < free; ++i) {
2403 /* Bypass com_addop_varname because it will generate
2404 LOAD_DEREF but LOAD_CLOSURE is needed.
2405 */
2406 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2407 int arg, reftype;
2408
2409 /* Special case: If a class contains a method with a
2410 free variable that has the same name as a method,
2411 the name will be considered free *and* local in the
2412 class. It should be handled by the closure, as
2413 well as by the normal name loookup logic.
2414 */
2415 reftype = get_ref_type(c, PyString_AS_STRING(name));
2416 if (reftype == CELL)
2417 arg = com_lookup_arg(c->c_cellvars, name);
2418 else /* (reftype == FREE) */
2419 arg = com_lookup_arg(c->c_freevars, name);
2420 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002421 fprintf(stderr, "lookup %s in %s %d %d\n"
2422 "freevars of %s: %s\n",
2423 PyObject_REPR(name),
2424 c->c_name,
2425 reftype, arg,
2426 PyString_AS_STRING(co->co_name),
2427 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002428 Py_FatalError("com_make_closure()");
2429 }
2430 com_addoparg(c, LOAD_CLOSURE, arg);
2431
2432 }
2433 com_push(c, free);
2434 return 1;
2435}
2436
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002437static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002438com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002439{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002440 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002441 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002442 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002443 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002444 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002445 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2446 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002447 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002448 if (co == NULL) {
2449 c->c_errors++;
2450 return;
2451 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002452 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002453 i = com_addconst(c, (PyObject *)co);
2454 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002455 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002456 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002457 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002458 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002459 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002460 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002461 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002462 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002463 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002464 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002465 else {
2466 int anchor = 0;
2467 int i = 0;
2468 for (;;) {
2469 com_and_test(c, CHILD(n, i));
2470 if ((i += 2) >= NCH(n))
2471 break;
2472 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2473 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002474 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002475 }
2476 if (anchor)
2477 com_backpatch(c, anchor);
2478 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002479}
2480
2481static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002482com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002483{
2484 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002485 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002486 com_node(c, CHILD(n, 0));
2487 }
2488 else {
2489 int i;
2490 int len;
2491 len = (NCH(n) + 1) / 2;
2492 for (i = 0; i < NCH(n); i += 2)
2493 com_node(c, CHILD(n, i));
2494 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002495 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002496 }
2497}
2498
2499
2500/* Begin of assignment compilation */
2501
Thomas Wouters434d0822000-08-24 20:11:32 +00002502
2503static void
2504com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2505{
2506 com_addbyte(c, DUP_TOP);
2507 com_push(c, 1);
2508 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002509 com_node(c, augn);
2510 com_addbyte(c, opcode);
2511 com_pop(c, 1);
2512 com_addbyte(c, ROT_TWO);
2513 com_addopname(c, STORE_ATTR, n);
2514 com_pop(c, 2);
2515}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002516
2517static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002518com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002519{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00002520 if (none_assignment_check(c, STR(n), assigning))
2521 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002522 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002523 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002524}
2525
2526static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002527com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002528{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002529 REQ(n, trailer);
2530 switch (TYPE(CHILD(n, 0))) {
2531 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002532 if (assigning == OP_DELETE)
2533 com_error(c, PyExc_SyntaxError,
2534 "can't delete function call");
2535 else
2536 com_error(c, PyExc_SyntaxError,
2537 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002538 break;
2539 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002540 if (assigning > OP_APPLY)
2541 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2542 else
2543 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002544 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002545 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002546 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002547 break;
2548 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002549 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002550 }
2551}
2552
2553static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002554com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002555{
2556 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002557 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002558 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002559 if (assigning) {
2560 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002561 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002562 com_push(c, i-1);
2563 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002564 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002565 com_assign(c, CHILD(n, i), assigning, NULL);
2566}
2567
2568static void
2569com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2570{
2571 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002572 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002573 com_push(c, 1);
2574 com_node(c, augn);
2575 com_addbyte(c, opcode);
2576 com_pop(c, 1);
2577 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002578}
2579
2580static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002581com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002582{
2583 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002584 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002585 if (assigning)
2586 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002587}
2588
2589static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002590com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002591{
2592 /* Loop to avoid trivial recursion */
2593 for (;;) {
2594 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002595
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002596 case exprlist:
2597 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002598 case testlist1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002599 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002600 if (assigning > OP_APPLY) {
2601 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002602 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002603 return;
2604 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002605 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002606 return;
2607 }
2608 n = CHILD(n, 0);
2609 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002610
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002611 case test:
2612 case and_test:
2613 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002614 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002615 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002616 case xor_expr:
2617 case and_expr:
2618 case shift_expr:
2619 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002620 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002621 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002622 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002623 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002624 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002625 return;
2626 }
2627 n = CHILD(n, 0);
2628 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002629
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002630 case power: /* atom trailer* ('**' power)*
2631 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002632 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002633 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002634 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002635 return;
2636 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002637 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002638 int i;
2639 com_node(c, CHILD(n, 0));
2640 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002641 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002642 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002643 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002644 return;
2645 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002646 com_apply_trailer(c, CHILD(n, i));
2647 } /* NB i is still alive */
2648 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002649 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002650 return;
2651 }
2652 n = CHILD(n, 0);
2653 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002654
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002655 case atom:
2656 switch (TYPE(CHILD(n, 0))) {
2657 case LPAR:
2658 n = CHILD(n, 1);
2659 if (TYPE(n) == RPAR) {
2660 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002661 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002662 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002663 return;
2664 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002665 if (assigning > OP_APPLY) {
2666 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002667 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002668 return;
2669 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002670 break;
2671 case LSQB:
2672 n = CHILD(n, 1);
2673 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002674 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002675 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002676 return;
2677 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002678 if (assigning > OP_APPLY) {
2679 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002680 "augmented assign to list not possible");
2681 return;
2682 }
2683 if (NCH(n) > 1
2684 && TYPE(CHILD(n, 1)) == list_for) {
2685 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002686 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002687 return;
2688 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002689 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002690 return;
2691 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002692 if (assigning > OP_APPLY)
2693 com_augassign_name(c, CHILD(n, 0),
2694 assigning, augn);
2695 else
2696 com_assign_name(c, CHILD(n, 0),
2697 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002698 return;
2699 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002700 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002701 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002702 return;
2703 }
2704 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002705
2706 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002707 com_error(c, PyExc_SyntaxError,
2708 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002709 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002710
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002711 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002712 com_error(c, PyExc_SystemError,
2713 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002714 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002715
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002716 }
2717 }
2718}
Guido van Rossum7c531111997-03-11 18:42:21 +00002719
Thomas Wouters434d0822000-08-24 20:11:32 +00002720static void
2721com_augassign(struct compiling *c, node *n)
2722{
2723 int opcode;
2724
2725 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2726 case '+': opcode = INPLACE_ADD; break;
2727 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002728 case '/':
2729 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
2730 opcode = INPLACE_FLOOR_DIVIDE;
2731 else if (c->c_flags & CO_FUTURE_DIVISION)
2732 opcode = INPLACE_TRUE_DIVIDE;
2733 else
2734 opcode = INPLACE_DIVIDE;
2735 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00002736 case '%': opcode = INPLACE_MODULO; break;
2737 case '<': opcode = INPLACE_LSHIFT; break;
2738 case '>': opcode = INPLACE_RSHIFT; break;
2739 case '&': opcode = INPLACE_AND; break;
2740 case '^': opcode = INPLACE_XOR; break;
2741 case '|': opcode = INPLACE_OR; break;
2742 case '*':
2743 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2744 opcode = INPLACE_POWER;
2745 else
2746 opcode = INPLACE_MULTIPLY;
2747 break;
2748 default:
2749 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2750 return;
2751 }
2752 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2753}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002754
2755static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002756com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002757{
Thomas Wouters434d0822000-08-24 20:11:32 +00002758 REQ(n, expr_stmt);
2759 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002760 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002761 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002762 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002763 if (NCH(n) == 1) {
2764 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002765 if (c->c_interactive)
2766 com_addbyte(c, PRINT_EXPR);
2767 else
2768 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002769 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002770 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002771 else if (TYPE(CHILD(n,1)) == augassign)
2772 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002773 else {
2774 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002775 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002776 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002777 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002778 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002779 com_push(c, 1);
2780 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002781 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002782 }
2783 }
2784}
2785
2786static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002787com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002788{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002789 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002790 int i;
2791 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002792 if (Py_OptimizeFlag)
2793 return;
2794 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00002795
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002796 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00002797 raise AssertionError [, <message>]
2798
2799 where <message> is the second test, if present.
2800 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002801 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002802 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002803 com_addbyte(c, POP_TOP);
2804 com_pop(c, 1);
2805 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002806 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002807 com_push(c, 1);
2808 i = NCH(n)/2; /* Either 2 or 4 */
2809 if (i > 1)
2810 com_node(c, CHILD(n, 3));
2811 com_addoparg(c, RAISE_VARARGS, i);
2812 com_pop(c, i);
2813 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002814 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002815 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002816 com_addbyte(c, POP_TOP);
2817}
2818
2819static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002820com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002821{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002822 int i = 1;
2823 node* stream = NULL;
2824
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002825 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002826
2827 /* are we using the extended print form? */
2828 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2829 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002830 com_node(c, stream);
2831 /* stack: [...] => [... stream] */
2832 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002833 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2834 i = 4;
2835 else
2836 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002837 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002838 for (; i < NCH(n); i += 2) {
2839 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002840 com_addbyte(c, DUP_TOP);
2841 /* stack: [stream] => [stream stream] */
2842 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002843 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002844 /* stack: [stream stream] => [stream stream obj] */
2845 com_addbyte(c, ROT_TWO);
2846 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002847 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002848 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002849 com_pop(c, 2);
2850 }
2851 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002852 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002853 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002854 com_addbyte(c, PRINT_ITEM);
2855 com_pop(c, 1);
2856 }
2857 }
2858 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002859 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002860 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002861 /* must pop the extra stream object off the stack */
2862 com_addbyte(c, POP_TOP);
2863 /* stack: [... stream] => [...] */
2864 com_pop(c, 1);
2865 }
2866 }
2867 else {
2868 if (stream != NULL) {
2869 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002870 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002871 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002872 com_pop(c, 1);
2873 }
2874 else
2875 com_addbyte(c, PRINT_NEWLINE);
2876 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002877}
2878
2879static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002880com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002881{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002882 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002883 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002884 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002885 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002886 if (c->c_flags & CO_GENERATOR) {
2887 if (NCH(n) > 1) {
2888 com_error(c, PyExc_SyntaxError,
2889 "'return' with argument inside generator");
2890 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002891 }
2892 if (NCH(n) < 2) {
2893 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002894 com_push(c, 1);
2895 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002896 else
2897 com_node(c, CHILD(n, 1));
2898 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00002899 com_pop(c, 1);
2900}
2901
2902static void
2903com_yield_stmt(struct compiling *c, node *n)
2904{
Tim Peters95c80f82001-06-23 02:07:08 +00002905 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00002906 REQ(n, yield_stmt); /* 'yield' testlist */
2907 if (!c->c_infunction) {
2908 com_error(c, PyExc_SyntaxError, "'yield' outside function");
2909 }
Tim Peters95c80f82001-06-23 02:07:08 +00002910
2911 for (i = 0; i < c->c_nblocks; ++i) {
2912 if (c->c_block[i] == SETUP_FINALLY) {
2913 com_error(c, PyExc_SyntaxError,
2914 "'yield' not allowed in a 'try' block "
2915 "with a 'finally' clause");
2916 return;
2917 }
2918 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002919 com_node(c, CHILD(n, 1));
2920 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002921 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002922}
2923
2924static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002925com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002926{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002927 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002928 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2929 if (NCH(n) > 1) {
2930 com_node(c, CHILD(n, 1));
2931 if (NCH(n) > 3) {
2932 com_node(c, CHILD(n, 3));
2933 if (NCH(n) > 5)
2934 com_node(c, CHILD(n, 5));
2935 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002936 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002937 i = NCH(n)/2;
2938 com_addoparg(c, RAISE_VARARGS, i);
2939 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002940}
2941
2942static void
Thomas Wouters52152252000-08-17 22:55:00 +00002943com_from_import(struct compiling *c, node *n)
2944{
2945 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2946 com_push(c, 1);
2947 if (NCH(n) > 1) {
2948 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2949 com_error(c, PyExc_SyntaxError, "invalid syntax");
2950 return;
2951 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002952 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002953 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002954 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002955 com_pop(c, 1);
2956}
2957
2958static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002959com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002960{
2961 int i;
2962 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002963 /* 'import' dotted_name (',' dotted_name)* |
2964 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002965 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002966 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002967 /* 'from' dotted_name 'import' ... */
2968 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002969
2970 if (TYPE(CHILD(n, 3)) == STAR) {
2971 tup = Py_BuildValue("(s)", "*");
2972 } else {
2973 tup = PyTuple_New((NCH(n) - 2)/2);
2974 for (i = 3; i < NCH(n); i += 2) {
2975 PyTuple_SET_ITEM(tup, (i-3)/2,
2976 PyString_FromString(STR(
Jeremy Hylton4419ac12001-02-28 22:54:51 +00002977 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002978 }
2979 }
2980 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002981 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002982 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002983 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002984 if (TYPE(CHILD(n, 3)) == STAR)
2985 com_addbyte(c, IMPORT_STAR);
2986 else {
2987 for (i = 3; i < NCH(n); i += 2)
2988 com_from_import(c, CHILD(n, i));
2989 com_addbyte(c, POP_TOP);
2990 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002991 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002992 }
2993 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002994 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002995 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002996 node *subn = CHILD(n, i);
2997 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002998 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002999 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003000 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003001 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003002 int j;
3003 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003004 com_error(c, PyExc_SyntaxError,
3005 "invalid syntax");
3006 return;
3007 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003008 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3009 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003010 CHILD(CHILD(subn, 0),
3011 j));
3012 com_addop_varname(c, VAR_STORE,
3013 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003014 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003015 com_addop_varname(c, VAR_STORE,
3016 STR(CHILD(CHILD(subn, 0),
3017 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003018 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003019 }
3020 }
3021}
3022
3023static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003024com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003025{
3026 REQ(n, exec_stmt);
3027 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3028 com_node(c, CHILD(n, 1));
3029 if (NCH(n) >= 4)
3030 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003031 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003032 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003033 com_push(c, 1);
3034 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003035 if (NCH(n) >= 6)
3036 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003037 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003038 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003039 com_push(c, 1);
3040 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003041 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003042 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003043}
3044
Guido van Rossum7c531111997-03-11 18:42:21 +00003045static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003046is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003047{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003048 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003049 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003050 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003051
3052 /* Label to avoid tail recursion */
3053 next:
3054 switch (TYPE(n)) {
3055
3056 case suite:
3057 if (NCH(n) == 1) {
3058 n = CHILD(n, 0);
3059 goto next;
3060 }
3061 /* Fall through */
3062 case file_input:
3063 for (i = 0; i < NCH(n); i++) {
3064 node *ch = CHILD(n, i);
3065 if (TYPE(ch) == stmt) {
3066 n = ch;
3067 goto next;
3068 }
3069 }
3070 break;
3071
3072 case stmt:
3073 case simple_stmt:
3074 case small_stmt:
3075 n = CHILD(n, 0);
3076 goto next;
3077
3078 case expr_stmt:
3079 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003080 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003081 case test:
3082 case and_test:
3083 case not_test:
3084 case comparison:
3085 case expr:
3086 case xor_expr:
3087 case and_expr:
3088 case shift_expr:
3089 case arith_expr:
3090 case term:
3091 case factor:
3092 case power:
3093 case atom:
3094 if (NCH(n) == 1) {
3095 n = CHILD(n, 0);
3096 goto next;
3097 }
3098 break;
3099
3100 case NAME:
3101 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3102 return 1;
3103 break;
3104
3105 case NUMBER:
3106 v = parsenumber(c, STR(n));
3107 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003108 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003109 break;
3110 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003111 i = PyObject_IsTrue(v);
3112 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003113 return i == 0;
3114
3115 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003116 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003117 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003118 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003119 break;
3120 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003121 i = PyObject_IsTrue(v);
3122 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003123 return i == 0;
3124
3125 }
3126 return 0;
3127}
3128
Tim Peters08a898f2001-06-28 01:52:22 +00003129
3130/* Look under n for a return stmt with an expression.
3131 * This hack is used to find illegal returns under "if 0:" blocks in
3132 * functions already known to be generators (as determined by the symtable
3133 * pass).
3134 * Return the offending return node if found, else NULL.
3135 */
3136static node *
3137look_for_offending_return(node *n)
3138{
3139 int i;
3140
3141 for (i = 0; i < NCH(n); ++i) {
3142 node *kid = CHILD(n, i);
3143
3144 switch (TYPE(kid)) {
3145 case classdef:
3146 case funcdef:
3147 case lambdef:
3148 /* Stuff in nested functions & classes doesn't
3149 affect the code block we started in. */
3150 return NULL;
3151
3152 case return_stmt:
3153 if (NCH(kid) > 1)
3154 return kid;
3155 break;
3156
3157 default: {
3158 node *bad = look_for_offending_return(kid);
3159 if (bad != NULL)
3160 return bad;
3161 }
3162 }
3163 }
3164
3165 return NULL;
3166}
3167
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003168static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003169com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003170{
3171 int i;
3172 int anchor = 0;
3173 REQ(n, if_stmt);
3174 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3175 for (i = 0; i+3 < NCH(n); i+=4) {
3176 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003177 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003178 if (is_constant_false(c, ch)) {
3179 /* We're going to skip this block. However, if this
3180 is a generator, we have to check the dead code
3181 anyway to make sure there aren't any return stmts
3182 with expressions, in the same scope. */
3183 if (c->c_flags & CO_GENERATOR) {
3184 node *p = look_for_offending_return(n);
3185 if (p != NULL) {
3186 int savelineno = c->c_lineno;
3187 c->c_lineno = p->n_lineno;
3188 com_error(c, PyExc_SyntaxError,
3189 "'return' with argument "
3190 "inside generator");
3191 c->c_lineno = savelineno;
3192 }
3193 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003194 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003195 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003196 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003197 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003198 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003199 com_addfwref(c, JUMP_IF_FALSE, &a);
3200 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003201 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003202 com_node(c, CHILD(n, i+3));
3203 com_addfwref(c, JUMP_FORWARD, &anchor);
3204 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003205 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003206 com_addbyte(c, POP_TOP);
3207 }
3208 if (i+2 < NCH(n))
3209 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003210 if (anchor)
3211 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003212}
3213
3214static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003215com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003216{
3217 int break_anchor = 0;
3218 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003219 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003220 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3221 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003222 block_push(c, SETUP_LOOP);
3223 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003224 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003225 com_node(c, CHILD(n, 1));
3226 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3227 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003228 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003229 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003230 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003231 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003232 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3233 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003234 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003235 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003236 com_addbyte(c, POP_TOP);
3237 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003238 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003239 if (NCH(n) > 4)
3240 com_node(c, CHILD(n, 6));
3241 com_backpatch(c, break_anchor);
3242}
3243
3244static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003245com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003246{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003247 int break_anchor = 0;
3248 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003249 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003250 REQ(n, for_stmt);
3251 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3252 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003253 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003254 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003255 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003256 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003257 com_set_lineno(c, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003258 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003259 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003260 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003261 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003262 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003263 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003264 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3265 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003266 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003267 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003268 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003269 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003270 if (NCH(n) > 8)
3271 com_node(c, CHILD(n, 8));
3272 com_backpatch(c, break_anchor);
3273}
3274
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003275/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003276
3277 SETUP_FINALLY L
3278 <code for S>
3279 POP_BLOCK
3280 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003281 L: <code for Sf>
3282 END_FINALLY
3283
3284 The special instructions use the block stack. Each block
3285 stack entry contains the instruction that created it (here
3286 SETUP_FINALLY), the level of the value stack at the time the
3287 block stack entry was created, and a label (here L).
3288
3289 SETUP_FINALLY:
3290 Pushes the current value stack level and the label
3291 onto the block stack.
3292 POP_BLOCK:
3293 Pops en entry from the block stack, and pops the value
3294 stack until its level is the same as indicated on the
3295 block stack. (The label is ignored.)
3296 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003297 Pops a variable number of entries from the *value* stack
3298 and re-raises the exception they specify. The number of
3299 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003300
3301 The block stack is unwound when an exception is raised:
3302 when a SETUP_FINALLY entry is found, the exception is pushed
3303 onto the value stack (and the exception condition is cleared),
3304 and the interpreter jumps to the label gotten from the block
3305 stack.
3306
3307 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003308 (The contents of the value stack is shown in [], with the top
3309 at the right; 'tb' is trace-back info, 'val' the exception's
3310 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003311
3312 Value stack Label Instruction Argument
3313 [] SETUP_EXCEPT L1
3314 [] <code for S>
3315 [] POP_BLOCK
3316 [] JUMP_FORWARD L0
3317
Guido van Rossum3f5da241990-12-20 15:06:42 +00003318 [tb, val, exc] L1: DUP )
3319 [tb, val, exc, exc] <evaluate E1> )
3320 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3321 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3322 [tb, val, exc, 1] POP )
3323 [tb, val, exc] POP
3324 [tb, val] <assign to V1> (or POP if no V1)
3325 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003326 [] <code for S1>
3327 JUMP_FORWARD L0
3328
Guido van Rossum3f5da241990-12-20 15:06:42 +00003329 [tb, val, exc, 0] L2: POP
3330 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003331 .............................etc.......................
3332
Guido van Rossum3f5da241990-12-20 15:06:42 +00003333 [tb, val, exc, 0] Ln+1: POP
3334 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003335
3336 [] L0: <next statement>
3337
3338 Of course, parts are not generated if Vi or Ei is not present.
3339*/
3340
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003341static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003342com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003343{
3344 int except_anchor = 0;
3345 int end_anchor = 0;
3346 int else_anchor = 0;
3347 int i;
3348 node *ch;
3349
3350 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3351 block_push(c, SETUP_EXCEPT);
3352 com_node(c, CHILD(n, 2));
3353 com_addbyte(c, POP_BLOCK);
3354 block_pop(c, SETUP_EXCEPT);
3355 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3356 com_backpatch(c, except_anchor);
3357 for (i = 3;
3358 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3359 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003360 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003361 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003362 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003363 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003364 break;
3365 }
3366 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003367 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003368 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003369 if (NCH(ch) > 1) {
3370 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003371 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003372 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003373 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003374 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003375 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3376 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003377 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003378 }
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 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003382 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003383 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003384 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003385 com_pop(c, 1);
3386 }
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);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003389 com_node(c, CHILD(n, i+2));
3390 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3391 if (except_anchor) {
3392 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003393 /* We come in with [tb, val, exc, 0] on the
3394 stack; one pop and it's the same as
3395 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003396 com_addbyte(c, POP_TOP);
3397 }
3398 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003399 /* We actually come in here with [tb, val, exc] but the
3400 END_FINALLY will zap those and jump around.
3401 The c_stacklevel does not reflect them so we need not pop
3402 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003403 com_addbyte(c, END_FINALLY);
3404 com_backpatch(c, else_anchor);
3405 if (i < NCH(n))
3406 com_node(c, CHILD(n, i+2));
3407 com_backpatch(c, end_anchor);
3408}
3409
3410static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003411com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003412{
3413 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003414 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003415
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003416 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3417 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003418 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003419 com_addbyte(c, POP_BLOCK);
3420 block_pop(c, SETUP_FINALLY);
3421 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003422 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003423 /* While the generated code pushes only one item,
3424 the try-finally handling can enter here with
3425 up to three items. OK, here are the details:
3426 3 for an exception, 2 for RETURN, 1 for BREAK. */
3427 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003428 com_backpatch(c, finally_anchor);
3429 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003430 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003431 com_node(c, ch);
3432 com_addbyte(c, END_FINALLY);
3433 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003434 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003435}
3436
3437static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003438com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003439{
3440 REQ(n, try_stmt);
3441 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3442 | 'try' ':' suite 'finally' ':' suite */
3443 if (TYPE(CHILD(n, 3)) != except_clause)
3444 com_try_finally(c, n);
3445 else
3446 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003447}
3448
Guido van Rossum8b993a91997-01-17 21:04:03 +00003449static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003450get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003451{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003452 int i;
3453
Guido van Rossum8b993a91997-01-17 21:04:03 +00003454 /* Label to avoid tail recursion */
3455 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003456 switch (TYPE(n)) {
3457
3458 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003459 if (NCH(n) == 1) {
3460 n = CHILD(n, 0);
3461 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003462 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003463 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003464 case file_input:
3465 for (i = 0; i < NCH(n); i++) {
3466 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003467 if (TYPE(ch) == stmt) {
3468 n = ch;
3469 goto next;
3470 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003471 }
3472 break;
3473
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003474 case stmt:
3475 case simple_stmt:
3476 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003477 n = CHILD(n, 0);
3478 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003479
3480 case expr_stmt:
3481 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003482 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003483 case test:
3484 case and_test:
3485 case not_test:
3486 case comparison:
3487 case expr:
3488 case xor_expr:
3489 case and_expr:
3490 case shift_expr:
3491 case arith_expr:
3492 case term:
3493 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003494 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003495 if (NCH(n) == 1) {
3496 n = CHILD(n, 0);
3497 goto next;
3498 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003499 break;
3500
3501 case atom:
3502 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003503 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003504 break;
3505
3506 }
3507 return NULL;
3508}
3509
Guido van Rossum79f25d91997-04-29 20:08:16 +00003510static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003511get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003512{
Guido van Rossum541563e1999-01-28 15:08:09 +00003513 /* Don't generate doc-strings if run with -OO */
3514 if (Py_OptimizeFlag > 1)
3515 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003516 n = get_rawdocstring(n);
3517 if (n == NULL)
3518 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003519 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003520}
3521
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003522static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003523com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003524{
3525 REQ(n, suite);
3526 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3527 if (NCH(n) == 1) {
3528 com_node(c, CHILD(n, 0));
3529 }
3530 else {
3531 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003532 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003533 node *ch = CHILD(n, i);
3534 if (TYPE(ch) == stmt)
3535 com_node(c, ch);
3536 }
3537 }
3538}
3539
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003540/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003541static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003542com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003543{
3544 int i = c->c_nblocks;
3545 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3546 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3547 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003548 else if (i <= 0) {
3549 /* at the outer level */
3550 com_error(c, PyExc_SyntaxError,
3551 "'continue' not properly in loop");
3552 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003553 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003554 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003555 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003556 if (c->c_block[j] == SETUP_LOOP)
3557 break;
3558 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003559 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003560 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003561 for (; i > j; --i) {
3562 if (c->c_block[i] == SETUP_EXCEPT ||
3563 c->c_block[i] == SETUP_FINALLY) {
3564 com_addoparg(c, CONTINUE_LOOP,
3565 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003566 return;
3567 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003568 if (c->c_block[i] == END_FINALLY) {
3569 com_error(c, PyExc_SyntaxError,
3570 "'continue' not supported inside 'finally' clause");
3571 return;
3572 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003573 }
3574 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003575 com_error(c, PyExc_SyntaxError,
3576 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003577 }
3578 /* XXX Could allow it inside a 'finally' clause
3579 XXX if we could pop the exception still on the stack */
3580}
3581
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003582static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003583com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003584{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003585 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003586 if (TYPE(n) == lambdef) {
3587 /* lambdef: 'lambda' [varargslist] ':' test */
3588 n = CHILD(n, 1);
3589 }
3590 else {
3591 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3592 n = CHILD(n, 2);
3593 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3594 n = CHILD(n, 1);
3595 }
3596 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003597 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003598 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003599 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003600 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3601 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003602 nargs = 0;
3603 ndefs = 0;
3604 for (i = 0; i < nch; i++) {
3605 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003606 if (TYPE(CHILD(n, i)) == STAR ||
3607 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003608 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003609 nargs++;
3610 i++;
3611 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003612 t = RPAR; /* Anything except EQUAL or COMMA */
3613 else
3614 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003615 if (t == EQUAL) {
3616 i++;
3617 ndefs++;
3618 com_node(c, CHILD(n, i));
3619 i++;
3620 if (i >= nch)
3621 break;
3622 t = TYPE(CHILD(n, i));
3623 }
3624 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003625 /* Treat "(a=1, b)" as an error */
3626 if (ndefs)
3627 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003628 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003629 }
3630 if (t != COMMA)
3631 break;
3632 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003633 return ndefs;
3634}
3635
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003636static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003637com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003638{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003639 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003640 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003641 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003642 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003643 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3644 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003645 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003646 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003647 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003648 c->c_errors++;
3649 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003650 int closure = com_make_closure(c, (PyCodeObject *)co);
3651 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003652 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003653 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003654 if (closure)
3655 com_addoparg(c, MAKE_CLOSURE, ndefs);
3656 else
3657 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003658 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003659 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003660 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003661 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003662 }
3663}
3664
3665static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003666com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003667{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003668 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003669 REQ(n, testlist);
3670 /* testlist: test (',' test)* [','] */
3671 for (i = 0; i < NCH(n); i += 2)
3672 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003673 i = (NCH(n)+1) / 2;
3674 com_addoparg(c, BUILD_TUPLE, i);
3675 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003676}
3677
3678static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003679com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003680{
Guido van Rossum25831651993-05-19 14:50:45 +00003681 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003682 PyObject *v;
3683 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003684 char *name;
3685
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003686 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003687 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003688 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003689 c->c_errors++;
3690 return;
3691 }
3692 /* Push the class name on the stack */
3693 i = com_addconst(c, v);
3694 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003695 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003696 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003697 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003698 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003699 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003700 com_push(c, 1);
3701 }
Guido van Rossum25831651993-05-19 14:50:45 +00003702 else
3703 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003704 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003705 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003706 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003707 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003708 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003709 c->c_errors++;
3710 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003711 int closure = com_make_closure(c, co);
3712 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003713 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003714 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003715 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003716 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003717 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003718 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003719 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003720 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003721 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003722 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003723 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003724 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003725 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003726 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003727}
3728
3729static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003730com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003731{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003732 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003733 if (c->c_errors)
3734 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003735 switch (TYPE(n)) {
3736
3737 /* Definition nodes */
3738
3739 case funcdef:
3740 com_funcdef(c, n);
3741 break;
3742 case classdef:
3743 com_classdef(c, n);
3744 break;
3745
3746 /* Trivial parse tree nodes */
3747
3748 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003749 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003750 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003751 n = CHILD(n, 0);
3752 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003753
3754 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003755 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003756 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003757 {
3758 int i;
3759 for (i = 0; i < NCH(n)-1; i += 2)
3760 com_node(c, CHILD(n, i));
3761 }
3762 break;
3763
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003764 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003765 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003766 n = CHILD(n, 0);
3767 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003768
3769 /* Statement nodes */
3770
3771 case expr_stmt:
3772 com_expr_stmt(c, n);
3773 break;
3774 case print_stmt:
3775 com_print_stmt(c, n);
3776 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003777 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003778 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003779 break;
3780 case pass_stmt:
3781 break;
3782 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003783 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003784 com_error(c, PyExc_SyntaxError,
3785 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003786 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003787 com_addbyte(c, BREAK_LOOP);
3788 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003789 case continue_stmt:
3790 com_continue_stmt(c, n);
3791 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003792 case return_stmt:
3793 com_return_stmt(c, n);
3794 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003795 case yield_stmt:
3796 com_yield_stmt(c, n);
3797 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003798 case raise_stmt:
3799 com_raise_stmt(c, n);
3800 break;
3801 case import_stmt:
3802 com_import_stmt(c, n);
3803 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003804 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003805 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003806 case exec_stmt:
3807 com_exec_stmt(c, n);
3808 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003809 case assert_stmt:
3810 com_assert_stmt(c, n);
3811 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003812 case if_stmt:
3813 com_if_stmt(c, n);
3814 break;
3815 case while_stmt:
3816 com_while_stmt(c, n);
3817 break;
3818 case for_stmt:
3819 com_for_stmt(c, n);
3820 break;
3821 case try_stmt:
3822 com_try_stmt(c, n);
3823 break;
3824 case suite:
3825 com_suite(c, n);
3826 break;
3827
3828 /* Expression nodes */
3829
3830 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003831 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00003832 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003833 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003834 break;
3835 case test:
3836 com_test(c, n);
3837 break;
3838 case and_test:
3839 com_and_test(c, n);
3840 break;
3841 case not_test:
3842 com_not_test(c, n);
3843 break;
3844 case comparison:
3845 com_comparison(c, n);
3846 break;
3847 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003848 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003849 break;
3850 case expr:
3851 com_expr(c, n);
3852 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003853 case xor_expr:
3854 com_xor_expr(c, n);
3855 break;
3856 case and_expr:
3857 com_and_expr(c, n);
3858 break;
3859 case shift_expr:
3860 com_shift_expr(c, n);
3861 break;
3862 case arith_expr:
3863 com_arith_expr(c, n);
3864 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003865 case term:
3866 com_term(c, n);
3867 break;
3868 case factor:
3869 com_factor(c, n);
3870 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003871 case power:
3872 com_power(c, n);
3873 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003874 case atom:
3875 com_atom(c, n);
3876 break;
3877
3878 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003879 com_error(c, PyExc_SystemError,
3880 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003881 }
3882}
3883
Tim Petersdbd9ba62000-07-09 03:09:57 +00003884static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003885
3886static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003887com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003888{
3889 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3890 if (TYPE(CHILD(n, 0)) == LPAR)
3891 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003892 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003893 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003894 com_pop(c, 1);
3895 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003896}
3897
3898static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003899com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003900{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003901 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003902 if (NCH(n) == 1) {
3903 com_fpdef(c, CHILD(n, 0));
3904 }
3905 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003906 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003907 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003908 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003909 for (i = 0; i < NCH(n); i += 2)
3910 com_fpdef(c, CHILD(n, i));
3911 }
3912}
3913
3914static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003915com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003916{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003917 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003918 int complex = 0;
Barry Warsaw8f6d8682001-11-28 21:10:39 +00003919 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003920 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003921 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003922 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003923 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003924 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003925 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003926 node *ch = CHILD(n, i);
3927 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003928 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003929 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003930 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3931 fp = CHILD(ch, 0);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00003932 if (TYPE(fp) != NAME) {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00003933 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003934 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003935 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003936 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003937 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003938 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003939 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003940 ch = CHILD(n, i);
3941 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003942 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003943 else
3944 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003945 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003946 if (complex) {
3947 /* Generate code for complex arguments only after
3948 having counted the simple arguments */
3949 int ilocal = 0;
3950 for (i = 0; i < nch; i++) {
3951 node *ch = CHILD(n, i);
3952 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003953 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003954 break;
3955 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3956 fp = CHILD(ch, 0);
3957 if (TYPE(fp) != NAME) {
3958 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003959 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003960 com_fpdef(c, ch);
3961 }
3962 ilocal++;
3963 if (++i >= nch)
3964 break;
3965 ch = CHILD(n, i);
3966 if (TYPE(ch) == EQUAL)
3967 i += 2;
3968 else
3969 REQ(ch, COMMA);
3970 }
3971 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003972}
3973
3974static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003975com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003976{
3977 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003978 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003979 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003980 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003981 if (doc != NULL) {
3982 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003983 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003984 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003985 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003986 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003987 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003988 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003989 for (i = 0; i < NCH(n); i++) {
3990 node *ch = CHILD(n, i);
3991 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3992 com_node(c, ch);
3993 }
3994}
3995
3996/* Top-level compile-node interface */
3997
3998static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003999compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004000{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004001 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004002 node *ch;
4003 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00004004 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004005 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004006 if (doc != NULL) {
4007 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004008 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004009 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004010 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004011 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004012 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
4013 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004014 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004015 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004016 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004017 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004018 c->c_infunction = 0;
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004019 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4020 com_push(c, 1);
4021 com_addbyte(c, RETURN_VALUE);
4022 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004023}
4024
4025static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004026compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004027{
Guido van Rossum590baa41993-11-30 13:40:46 +00004028 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004029 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004030 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004031
4032 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004033 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004034 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004035 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004036 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004037 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004038 else
4039 ch = CHILD(n, 2);
4040 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004041 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004042 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004043}
4044
4045static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004046compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004047{
4048 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004049 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004050 REQ(n, classdef);
4051 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4052 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004053 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004054 /* Initialize local __module__ from global __name__ */
4055 com_addop_name(c, LOAD_GLOBAL, "__name__");
4056 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004057 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004058 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004059 if (doc != NULL) {
4060 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004061 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004062 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004063 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004064 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004065 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004066 }
4067 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004068 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004069 com_node(c, ch);
4070 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004071 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004072 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004073 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004074}
4075
4076static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004077compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004078{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004079 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004080
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004081 switch (TYPE(n)) {
4082
Guido van Rossum4c417781991-01-21 16:09:22 +00004083 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004084 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004085 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004086 n = CHILD(n, 0);
4087 if (TYPE(n) != NEWLINE)
4088 com_node(c, n);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004089 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4090 com_push(c, 1);
4091 com_addbyte(c, RETURN_VALUE);
4092 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004093 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004094 break;
4095
Guido van Rossum4c417781991-01-21 16:09:22 +00004096 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004097 com_file_input(c, n);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004098 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4099 com_push(c, 1);
4100 com_addbyte(c, RETURN_VALUE);
4101 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004102 break;
4103
Guido van Rossum590baa41993-11-30 13:40:46 +00004104 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004105 com_node(c, CHILD(n, 0));
4106 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004107 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004108 break;
4109
Guido van Rossum590baa41993-11-30 13:40:46 +00004110 case lambdef: /* anonymous function definition */
4111 compile_lambdef(c, n);
4112 break;
4113
Guido van Rossum4c417781991-01-21 16:09:22 +00004114 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004115 compile_funcdef(c, n);
4116 break;
4117
Guido van Rossum4c417781991-01-21 16:09:22 +00004118 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004119 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004120 break;
4121
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004122 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004123 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004124 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004125 }
4126}
4127
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004128static PyObject *
4129dict_keys_inorder(PyObject *dict, int offset)
4130{
4131 PyObject *tuple, *k, *v;
4132 int i, pos = 0, size = PyDict_Size(dict);
4133
4134 tuple = PyTuple_New(size);
4135 if (tuple == NULL)
4136 return NULL;
4137 while (PyDict_Next(dict, &pos, &k, &v)) {
4138 i = PyInt_AS_LONG(v);
4139 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004140 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004141 PyTuple_SET_ITEM(tuple, i - offset, k);
4142 }
4143 return tuple;
4144}
4145
Guido van Rossum79f25d91997-04-29 20:08:16 +00004146PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004147PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004148{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004149 return PyNode_CompileFlags(n, filename, NULL);
4150}
4151
4152PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004153PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004154{
4155 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004156}
4157
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004158struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004159PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004160{
4161 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004162 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004163
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004164 ff = PyNode_Future(n, filename);
4165 if (ff == NULL)
4166 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004167
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004168 st = symtable_init();
Tim Peters8c5e4152001-11-04 19:26:58 +00004169 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004170 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004171 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004172 }
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004173 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004174 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004175 if (st->st_errors > 0)
4176 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004177 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004178 if (st->st_errors > 0)
4179 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004180
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004181 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004182 fail:
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004183 PyObject_FREE((void *)ff);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004184 st->st_future = NULL;
4185 PySymtable_Free(st);
4186 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004187}
4188
Guido van Rossum79f25d91997-04-29 20:08:16 +00004189static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004190icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004191{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004192 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004193}
4194
Guido van Rossum79f25d91997-04-29 20:08:16 +00004195static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004196jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004197 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004198{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004199 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004200 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004201 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004202 return NULL;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004203 if (TYPE(n) == encoding_decl) {
4204 sc.c_encoding = STR(n);
4205 n = CHILD(n, 0);
4206 } else {
4207 sc.c_encoding = NULL;
4208 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004209 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004210 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004211 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004212 /* c_symtable still points to parent's symbols */
4213 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004214 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004215 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004216 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004217 if (base->c_encoding != NULL) {
4218 assert(sc.c_encoding == NULL);
4219 sc.c_encoding = base->c_encoding;
4220 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004221 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004222 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004223 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004224 if (sc.c_future == NULL) {
4225 com_free(&sc);
4226 return NULL;
4227 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004228 if (flags) {
4229 int merged = sc.c_future->ff_features |
4230 flags->cf_flags;
4231 sc.c_future->ff_features = merged;
4232 flags->cf_flags = merged;
4233 }
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004234 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004235 com_free(&sc);
4236 return NULL;
4237 }
4238 }
4239 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004240 if (symtable_load_symbols(&sc) < 0) {
4241 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004242 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004243 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004244 compile_node(&sc, n);
4245 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004246 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004247 PyObject *consts, *names, *varnames, *filename, *name,
4248 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004249 consts = PyList_AsTuple(sc.c_consts);
4250 names = PyList_AsTuple(sc.c_names);
4251 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004252 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4253 freevars = dict_keys_inorder(sc.c_freevars,
4254 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004255 filename = PyString_InternFromString(sc.c_filename);
4256 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004257 if (!PyErr_Occurred())
4258 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004259 sc.c_nlocals,
4260 sc.c_maxstacklevel,
4261 sc.c_flags,
4262 sc.c_code,
4263 consts,
4264 names,
4265 varnames,
4266 freevars,
4267 cellvars,
4268 filename,
4269 name,
4270 sc.c_firstlineno,
4271 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004272 Py_XDECREF(consts);
4273 Py_XDECREF(names);
4274 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004275 Py_XDECREF(freevars);
4276 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004277 Py_XDECREF(filename);
4278 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004279 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004280 else if (!PyErr_Occurred()) {
4281 /* This could happen if someone called PyErr_Clear() after an
4282 error was reported above. That's not supposed to happen,
4283 but I just plugged one case and I'm not sure there can't be
4284 others. In that case, raise SystemError so that at least
4285 it gets reported instead dumping core. */
4286 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4287 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004288 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004289 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004290 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004291 sc.c_symtable = NULL;
4292 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004293 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004294 return co;
4295}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004296
4297int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004298PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004299{
4300 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004301 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004302 int line = co->co_firstlineno;
4303 int addr = 0;
4304 while (--size >= 0) {
4305 addr += *p++;
4306 if (addr > addrq)
4307 break;
4308 line += *p++;
4309 }
4310 return line;
4311}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004312
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004313/* The test for LOCAL must come before the test for FREE in order to
4314 handle classes where name is both local and free. The local var is
4315 a method and the free var is a free var referenced within a method.
4316*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004317
4318static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004319get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004320{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004321 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004322 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004323
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004324 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4325 return CELL;
4326 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4327 return LOCAL;
4328 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4329 return FREE;
4330 v = PyDict_GetItemString(c->c_globals, name);
4331 if (v) {
4332 if (v == Py_None)
4333 return GLOBAL_EXPLICIT;
4334 else {
4335 return GLOBAL_IMPLICIT;
4336 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004337 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004338 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004339 "unknown scope for %.100s in %.100s(%s) "
4340 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4341 name, c->c_name,
4342 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4343 c->c_filename,
4344 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4345 PyObject_REPR(c->c_locals),
4346 PyObject_REPR(c->c_globals)
4347 );
4348
4349 Py_FatalError(buf);
4350 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004351}
4352
Guido van Rossum207fda62001-03-02 03:30:41 +00004353/* Helper functions to issue warnings */
4354
4355static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004356issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004357{
4358 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4359 lineno, NULL, NULL) < 0) {
4360 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4361 PyErr_SetString(PyExc_SyntaxError, msg);
4362 PyErr_SyntaxLocation(filename, lineno);
4363 }
4364 return -1;
4365 }
4366 return 0;
4367}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004368
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004369static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004370symtable_warn(struct symtable *st, char *msg)
4371{
Guido van Rossum207fda62001-03-02 03:30:41 +00004372 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004373 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004374 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004375 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004376 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004377}
4378
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004379/* Helper function for setting lineno and filename */
4380
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004381static int
4382symtable_build(struct compiling *c, node *n)
4383{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004384 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004385 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004386 c->c_symtable->st_future = c->c_future;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004387 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004388 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4389 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004390 return -1;
4391 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004392 if (c->c_symtable->st_errors > 0)
4393 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004394 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004395 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004396 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004397 return 0;
4398}
4399
4400static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004401symtable_init_compiling_symbols(struct compiling *c)
4402{
4403 PyObject *varnames;
4404
4405 varnames = c->c_symtable->st_cur->ste_varnames;
4406 if (varnames == NULL) {
4407 varnames = PyList_New(0);
4408 if (varnames == NULL)
4409 return -1;
4410 c->c_symtable->st_cur->ste_varnames = varnames;
4411 Py_INCREF(varnames);
4412 } else
4413 Py_INCREF(varnames);
4414 c->c_varnames = varnames;
4415
4416 c->c_globals = PyDict_New();
4417 if (c->c_globals == NULL)
4418 return -1;
4419 c->c_freevars = PyDict_New();
4420 if (c->c_freevars == NULL)
4421 return -1;
4422 c->c_cellvars = PyDict_New();
4423 if (c->c_cellvars == NULL)
4424 return -1;
4425 return 0;
4426}
4427
4428struct symbol_info {
4429 int si_nlocals;
4430 int si_ncells;
4431 int si_nfrees;
4432 int si_nimplicit;
4433};
4434
4435static void
4436symtable_init_info(struct symbol_info *si)
4437{
4438 si->si_nlocals = 0;
4439 si->si_ncells = 0;
4440 si->si_nfrees = 0;
4441 si->si_nimplicit = 0;
4442}
4443
4444static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004445symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004446 struct symbol_info *si)
4447{
4448 PyObject *dict, *v;
4449
4450 /* Seperate logic for DEF_FREE. If it occurs in a function,
4451 it indicates a local that we must allocate storage for (a
4452 cell var). If it occurs in a class, then the class has a
4453 method and a free variable with the same name.
4454 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004455 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004456 /* If it isn't declared locally, it can't be a cell. */
4457 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4458 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004459 v = PyInt_FromLong(si->si_ncells++);
4460 dict = c->c_cellvars;
4461 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004462 /* If it is free anyway, then there is no need to do
4463 anything here.
4464 */
4465 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004466 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004467 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004468 v = PyInt_FromLong(si->si_nfrees++);
4469 dict = c->c_freevars;
4470 }
4471 if (v == NULL)
4472 return -1;
4473 if (PyDict_SetItem(dict, name, v) < 0) {
4474 Py_DECREF(v);
4475 return -1;
4476 }
4477 Py_DECREF(v);
4478 return 0;
4479}
4480
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004481/* If a variable is a cell and an argument, make sure that appears in
4482 co_cellvars before any variable to its right in varnames.
4483*/
4484
4485
4486static int
4487symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4488 PyObject *varnames, int flags)
4489{
4490 PyObject *v, *w, *d, *list = NULL;
4491 int i, pos;
4492
4493 if (flags & CO_VARARGS)
4494 argcount++;
4495 if (flags & CO_VARKEYWORDS)
4496 argcount++;
4497 for (i = argcount; --i >= 0; ) {
4498 v = PyList_GET_ITEM(varnames, i);
4499 if (PyDict_GetItem(*cellvars, v)) {
4500 if (list == NULL) {
4501 list = PyList_New(1);
4502 if (list == NULL)
4503 return -1;
4504 PyList_SET_ITEM(list, 0, v);
4505 Py_INCREF(v);
4506 } else
4507 PyList_Insert(list, 0, v);
4508 }
4509 }
4510 if (list == NULL || PyList_GET_SIZE(list) == 0)
4511 return 0;
4512 /* There are cellvars that are also arguments. Create a dict
4513 to replace cellvars and put the args at the front.
4514 */
4515 d = PyDict_New();
4516 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4517 v = PyInt_FromLong(i);
4518 if (v == NULL)
4519 goto fail;
4520 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4521 goto fail;
4522 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4523 goto fail;
4524 }
4525 pos = 0;
4526 i = PyList_GET_SIZE(list);
4527 Py_DECREF(list);
4528 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4529 w = PyInt_FromLong(i++); /* don't care about the old key */
4530 if (PyDict_SetItem(d, v, w) < 0) {
4531 Py_DECREF(w);
4532 goto fail;
4533 }
4534 Py_DECREF(w);
4535 }
4536 Py_DECREF(*cellvars);
4537 *cellvars = d;
4538 return 1;
4539 fail:
4540 Py_DECREF(d);
4541 return -1;
4542}
4543
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004544static int
4545symtable_freevar_offsets(PyObject *freevars, int offset)
4546{
4547 PyObject *name, *v;
4548 int pos;
4549
4550 /* The cell vars are the first elements of the closure,
4551 followed by the free vars. Update the offsets in
4552 c_freevars to account for number of cellvars. */
4553 pos = 0;
4554 while (PyDict_Next(freevars, &pos, &name, &v)) {
4555 int i = PyInt_AS_LONG(v) + offset;
4556 PyObject *o = PyInt_FromLong(i);
4557 if (o == NULL)
4558 return -1;
4559 if (PyDict_SetItem(freevars, name, o) < 0) {
4560 Py_DECREF(o);
4561 return -1;
4562 }
4563 Py_DECREF(o);
4564 }
4565 return 0;
4566}
4567
4568static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004569symtable_check_unoptimized(struct compiling *c,
4570 PySymtableEntryObject *ste,
4571 struct symbol_info *si)
4572{
4573 char buf[300];
4574
4575 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4576 || (ste->ste_nested && si->si_nimplicit)))
4577 return 0;
4578
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004579#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4580
4581#define ILLEGAL_IS "is a nested function"
4582
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004583#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004584"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004585
4586#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004587"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004588
4589#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00004590"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004591"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004592
4593 /* XXX perhaps the linenos for these opt-breaking statements
4594 should be stored so the exception can point to them. */
4595
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004596 if (ste->ste_child_free) {
4597 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004598 PyOS_snprintf(buf, sizeof(buf),
4599 ILLEGAL_IMPORT_STAR,
4600 PyString_AS_STRING(ste->ste_name),
4601 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004602 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004603 PyOS_snprintf(buf, sizeof(buf),
4604 ILLEGAL_BARE_EXEC,
4605 PyString_AS_STRING(ste->ste_name),
4606 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004607 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004608 PyOS_snprintf(buf, sizeof(buf),
4609 ILLEGAL_EXEC_AND_IMPORT_STAR,
4610 PyString_AS_STRING(ste->ste_name),
4611 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004612 }
4613 } else {
4614 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004615 PyOS_snprintf(buf, sizeof(buf),
4616 ILLEGAL_IMPORT_STAR,
4617 PyString_AS_STRING(ste->ste_name),
4618 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004619 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004620 PyOS_snprintf(buf, sizeof(buf),
4621 ILLEGAL_BARE_EXEC,
4622 PyString_AS_STRING(ste->ste_name),
4623 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004624 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004625 PyOS_snprintf(buf, sizeof(buf),
4626 ILLEGAL_EXEC_AND_IMPORT_STAR,
4627 PyString_AS_STRING(ste->ste_name),
4628 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004629 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004630 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004631
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004632 PyErr_SetString(PyExc_SyntaxError, buf);
4633 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4634 ste->ste_opt_lineno);
4635 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004636}
4637
4638static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004639symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4640 struct symbol_info *si)
4641{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004642 if (c->c_future)
4643 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004644 if (ste->ste_generator)
4645 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004646 if (ste->ste_type != TYPE_MODULE)
4647 c->c_flags |= CO_NEWLOCALS;
4648 if (ste->ste_type == TYPE_FUNCTION) {
4649 c->c_nlocals = si->si_nlocals;
4650 if (ste->ste_optimized == 0)
4651 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004652 else if (ste->ste_optimized != OPT_EXEC)
4653 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004654 }
4655 return 0;
4656}
4657
4658static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004659symtable_load_symbols(struct compiling *c)
4660{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004661 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004662 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004663 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004664 PyObject *name, *varnames, *v;
4665 int i, flags, pos;
4666 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004667
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004668 if (implicit == NULL) {
4669 implicit = PyInt_FromLong(1);
4670 if (implicit == NULL)
4671 return -1;
4672 }
4673 v = NULL;
4674
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004675 if (symtable_init_compiling_symbols(c) < 0)
4676 goto fail;
4677 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004678 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004679 si.si_nlocals = PyList_GET_SIZE(varnames);
4680 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004681
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004682 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004683 v = PyInt_FromLong(i);
4684 if (PyDict_SetItem(c->c_locals,
4685 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004686 goto fail;
4687 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004688 }
4689
4690 /* XXX The cases below define the rules for whether a name is
4691 local or global. The logic could probably be clearer. */
4692 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004693 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4694 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004695
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004696 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004697 /* undo the original DEF_FREE */
4698 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004699
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004700 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004701 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004702 2. Free variables in methods that are also class
4703 variables or declared global.
4704 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004705 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004706 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004707
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004708 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004709 c->c_argcount--;
4710 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004711 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004712 c->c_argcount--;
4713 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004714 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004715 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004716 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004717 if (flags & DEF_PARAM) {
4718 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004719 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004720 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004721 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004722 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004723 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004724 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004725 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4726 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004727 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004728 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004729 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4730 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004731 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004732 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004733 if (v == NULL)
4734 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004735 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004736 goto fail;
4737 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004738 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004739 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004740 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004741 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004742 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004743 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004744 if (v == NULL)
4745 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004746 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004747 goto fail;
4748 Py_DECREF(v);
4749 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004750 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004751 if (PyDict_SetItem(c->c_globals, name,
4752 implicit) < 0)
4753 goto fail;
4754 if (st->st_nscopes != 1) {
4755 v = PyInt_FromLong(flags);
4756 if (PyDict_SetItem(st->st_global,
4757 name, v))
4758 goto fail;
4759 Py_DECREF(v);
4760 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004761 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004762 }
4763 }
4764
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004765 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4766
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004767 if (si.si_ncells > 1) { /* one cell is always in order */
4768 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4769 c->c_varnames, c->c_flags) < 0)
4770 return -1;
4771 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004772 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4773 return -1;
4774 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004775 fail:
4776 /* is this always the right thing to do? */
4777 Py_XDECREF(v);
4778 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004779}
4780
4781static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004782symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004783{
4784 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004785
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004786 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004787 if (st == NULL)
4788 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004789 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00004790
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004791 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004792 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004793 goto fail;
4794 if ((st->st_symbols = PyDict_New()) == NULL)
4795 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004796 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004797 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004798 st->st_errors = 0;
4799 st->st_tmpname = 0;
4800 st->st_private = NULL;
4801 return st;
4802 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004803 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004804 return NULL;
4805}
4806
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004807void
4808PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004809{
4810 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004811 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004812 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004813 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004814}
4815
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004816/* When the compiler exits a scope, it must should update the scope's
4817 free variable information with the list of free variables in its
4818 children.
4819
4820 Variables that are free in children and defined in the current
4821 scope are cellvars.
4822
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004823 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004824 false), free variables in children that are not defined here are
4825 implicit globals.
4826
4827*/
4828
4829static int
4830symtable_update_free_vars(struct symtable *st)
4831{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004832 int i, j, def;
4833 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004834 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004835
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004836 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004837 def = DEF_FREE_CLASS;
4838 else
4839 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004840 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004841 int pos = 0;
4842
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004843 if (list)
4844 PyList_SetSlice(list, 0,
4845 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004846 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004847 PyList_GET_ITEM(ste->ste_children, i);
4848 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004849 int flags = PyInt_AS_LONG(o);
4850 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004851 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004852 if (list == NULL) {
4853 list = PyList_New(0);
4854 if (list == NULL)
4855 return -1;
4856 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004857 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004858 if (PyList_Append(list, name) < 0) {
4859 Py_DECREF(list);
4860 return -1;
4861 }
4862 }
4863 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004864 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004865 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004866 v = PyDict_GetItem(ste->ste_symbols, name);
4867 /* If a name N is declared global in scope A and
4868 referenced in scope B contained (perhaps
4869 indirectly) in A and there are no scopes
4870 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004871 is global in B. Unless A is a class scope,
4872 because class scopes are not considered for
4873 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004874 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004875 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004876 int flags = PyInt_AS_LONG(v);
4877 if (flags & DEF_GLOBAL) {
4878 symtable_undo_free(st, child->ste_id,
4879 name);
4880 continue;
4881 }
4882 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004883 if (ste->ste_nested) {
4884 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004885 name, def) < 0) {
4886 Py_DECREF(list);
4887 return -1;
4888 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004889 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004890 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004891 name) < 0) {
4892 Py_DECREF(list);
4893 return -1;
4894 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004895 }
4896 }
4897 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004898
4899 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004900 return 0;
4901}
4902
4903/* If the current scope is a non-nested class or if name is not
4904 defined in the current, non-nested scope, then it is an implicit
4905 global in all nested scopes.
4906*/
4907
4908static int
4909symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4910{
4911 PyObject *o;
4912 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004913 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004914
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004915 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004916 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004917 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004918 if (o == NULL)
4919 return symtable_undo_free(st, child, name);
4920 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004921
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004922 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004923 return symtable_undo_free(st, child, name);
4924 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004925 return symtable_add_def_o(st, ste->ste_symbols,
4926 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004927}
4928
4929static int
4930symtable_undo_free(struct symtable *st, PyObject *id,
4931 PyObject *name)
4932{
4933 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004934 PyObject *info;
4935 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004936
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004937 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4938 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004939 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00004940
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004941 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004942 if (info == NULL)
4943 return 0;
4944 v = PyInt_AS_LONG(info);
4945 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004946 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004947 DEF_FREE_GLOBAL) < 0)
4948 return -1;
4949 } else
4950 /* If the name is defined here or declared global,
4951 then the recursion stops. */
4952 return 0;
4953
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004954 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4955 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004956 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004957 PyList_GET_ITEM(ste->ste_children, i);
4958 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004959 if (x < 0)
4960 return x;
4961 }
4962 return 0;
4963}
4964
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004965/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4966 This reference is released when the scope is exited, via the DECREF
4967 in symtable_exit_scope().
4968*/
4969
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004970static int
4971symtable_exit_scope(struct symtable *st)
4972{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004973 int end;
4974
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004975 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004976 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004977 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004978 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004979 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4980 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004981 if (PySequence_DelItem(st->st_stack, end) < 0)
4982 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004983 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004984}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004985
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004986static void
4987symtable_enter_scope(struct symtable *st, char *name, int type,
4988 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004989{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004990 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004991
4992 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004993 prev = st->st_cur;
4994 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4995 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004996 st->st_errors++;
4997 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004998 }
4999 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005000 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005001 PySymtableEntry_New(st, name, type, lineno);
5002 if (strcmp(name, TOP) == 0)
5003 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005004 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005005 if (PyList_Append(prev->ste_children,
5006 (PyObject *)st->st_cur) < 0)
5007 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005008 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005009}
5010
5011static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005012symtable_lookup(struct symtable *st, char *name)
5013{
5014 char buffer[MANGLE_LEN];
5015 PyObject *v;
5016 int flags;
5017
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005018 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005019 name = buffer;
5020 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5021 if (v == NULL) {
5022 if (PyErr_Occurred())
5023 return -1;
5024 else
5025 return 0;
5026 }
5027
5028 flags = PyInt_AS_LONG(v);
5029 return flags;
5030}
5031
5032static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005033symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005034{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005035 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005036 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005037 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005038
Guido van Rossumb7164622002-08-16 02:48:11 +00005039 /* Warn about None, except inside a tuple (where the assignment
5040 code already issues a warning). */
5041 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5042 *name == 'N' && strcmp(name, "None") == 0)
5043 {
5044 if (symtable_warn(st, "argument named None"))
5045 return -1;
5046 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005047 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005048 name = buffer;
5049 if ((s = PyString_InternFromString(name)) == NULL)
5050 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005051 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5052 Py_DECREF(s);
5053 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005054}
5055
5056/* Must only be called with mangled names */
5057
5058static int
5059symtable_add_def_o(struct symtable *st, PyObject *dict,
5060 PyObject *name, int flag)
5061{
5062 PyObject *o;
5063 int val;
5064
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005065 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005066 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005067 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005068 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005069 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005070 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005071 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005072 return -1;
5073 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005074 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005075 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005076 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005077 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005078 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005079 Py_DECREF(o);
5080 return -1;
5081 }
5082 Py_DECREF(o);
5083
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005084 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005085 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005086 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005087 } else if (flag & DEF_GLOBAL) {
5088 /* XXX need to update DEF_GLOBAL for other flags too;
5089 perhaps only DEF_FREE_GLOBAL */
5090 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005091 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005092 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005093 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005094 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005095 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005096 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005097 Py_DECREF(o);
5098 return -1;
5099 }
5100 Py_DECREF(o);
5101 }
5102 return 0;
5103}
5104
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005105#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005106
Tim Peters08a898f2001-06-28 01:52:22 +00005107/* Look for a yield stmt under n. Return 1 if found, else 0.
5108 This hack is used to look inside "if 0:" blocks (which are normally
5109 ignored) in case those are the only places a yield occurs (so that this
5110 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005111static int
5112look_for_yield(node *n)
5113{
5114 int i;
5115
5116 for (i = 0; i < NCH(n); ++i) {
5117 node *kid = CHILD(n, i);
5118
5119 switch (TYPE(kid)) {
5120
5121 case classdef:
5122 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005123 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005124 /* Stuff in nested functions and classes can't make
5125 the parent a generator. */
5126 return 0;
5127
5128 case yield_stmt:
5129 return 1;
5130
5131 default:
5132 if (look_for_yield(kid))
5133 return 1;
5134 }
5135 }
5136 return 0;
5137}
5138
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005139static void
5140symtable_node(struct symtable *st, node *n)
5141{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005142 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005143
5144 loop:
5145 switch (TYPE(n)) {
5146 case funcdef: {
5147 char *func_name = STR(CHILD(n, 1));
5148 symtable_add_def(st, func_name, DEF_LOCAL);
5149 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005150 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005151 symtable_funcdef(st, n);
5152 symtable_exit_scope(st);
5153 break;
5154 }
5155 case lambdef:
5156 if (NCH(n) == 4)
5157 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005158 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005159 symtable_funcdef(st, n);
5160 symtable_exit_scope(st);
5161 break;
5162 case classdef: {
5163 char *tmp, *class_name = STR(CHILD(n, 1));
5164 symtable_add_def(st, class_name, DEF_LOCAL);
5165 if (TYPE(CHILD(n, 2)) == LPAR) {
5166 node *bases = CHILD(n, 3);
5167 int i;
5168 for (i = 0; i < NCH(bases); i += 2) {
5169 symtable_node(st, CHILD(bases, i));
5170 }
5171 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005172 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005173 tmp = st->st_private;
5174 st->st_private = class_name;
5175 symtable_node(st, CHILD(n, NCH(n) - 1));
5176 st->st_private = tmp;
5177 symtable_exit_scope(st);
5178 break;
5179 }
5180 case if_stmt:
5181 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005182 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5183 if (st->st_cur->ste_generator == 0)
5184 st->st_cur->ste_generator =
5185 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005186 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005187 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005188 symtable_node(st, CHILD(n, i + 1));
5189 symtable_node(st, CHILD(n, i + 3));
5190 }
5191 if (i + 2 < NCH(n))
5192 symtable_node(st, CHILD(n, i + 2));
5193 break;
5194 case global_stmt:
5195 symtable_global(st, n);
5196 break;
5197 case import_stmt:
5198 symtable_import(st, n);
5199 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005200 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005201 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005202 symtable_node(st, CHILD(n, 1));
5203 if (NCH(n) > 2)
5204 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005205 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005206 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005207 st->st_cur->ste_opt_lineno = n->n_lineno;
5208 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005209 if (NCH(n) > 4)
5210 symtable_node(st, CHILD(n, 5));
5211 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005212
5213 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005214 case assert_stmt:
5215 if (Py_OptimizeFlag)
5216 return;
5217 if (NCH(n) == 2) {
5218 n = CHILD(n, 1);
5219 goto loop;
5220 } else {
5221 symtable_node(st, CHILD(n, 1));
5222 n = CHILD(n, 3);
5223 goto loop;
5224 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005225 case except_clause:
5226 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005227 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005228 if (NCH(n) > 1) {
5229 n = CHILD(n, 1);
5230 goto loop;
5231 }
5232 break;
5233 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005234 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005235 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005236 case yield_stmt:
5237 st->st_cur->ste_generator = 1;
5238 n = CHILD(n, 1);
5239 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005240 case expr_stmt:
5241 if (NCH(n) == 1)
5242 n = CHILD(n, 0);
5243 else {
5244 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005245 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005246 symtable_node(st, CHILD(n, 2));
5247 break;
5248 } else {
5249 int i;
5250 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005251 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005252 n = CHILD(n, NCH(n) - 1);
5253 }
5254 }
5255 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005256 case list_iter:
5257 n = CHILD(n, 0);
5258 if (TYPE(n) == list_for) {
5259 st->st_tmpname++;
5260 symtable_list_comprehension(st, n);
5261 st->st_tmpname--;
5262 } else {
5263 REQ(n, list_if);
5264 symtable_node(st, CHILD(n, 1));
5265 if (NCH(n) == 3) {
5266 n = CHILD(n, 2);
5267 goto loop;
5268 }
5269 }
5270 break;
5271 case for_stmt:
5272 symtable_assign(st, CHILD(n, 1), 0);
5273 for (i = 3; i < NCH(n); ++i)
5274 if (TYPE(CHILD(n, i)) >= single_input)
5275 symtable_node(st, CHILD(n, i));
5276 break;
5277 /* The remaining cases fall through to default except in
5278 special circumstances. This requires the individual cases
5279 to be coded with great care, even though they look like
5280 rather innocuous. Each case must double-check TYPE(n).
5281 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005282 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005283 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005284 n = CHILD(n, 2);
5285 goto loop;
5286 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005287 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005288 case listmaker:
5289 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00005290 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005291 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00005292 symtable_node(st, CHILD(n, 0));
5293 st->st_tmpname--;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005294 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005295 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005296 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005297 case atom:
5298 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5299 symtable_add_use(st, STR(CHILD(n, 0)));
5300 break;
5301 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005302 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005303 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005304 /* Walk over every non-token child with a special case
5305 for one child.
5306 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005307 if (NCH(n) == 1) {
5308 n = CHILD(n, 0);
5309 goto loop;
5310 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005311 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005312 if (TYPE(CHILD(n, i)) >= single_input)
5313 symtable_node(st, CHILD(n, i));
5314 }
5315}
5316
5317static void
5318symtable_funcdef(struct symtable *st, node *n)
5319{
5320 node *body;
5321
5322 if (TYPE(n) == lambdef) {
5323 if (NCH(n) == 4)
5324 symtable_params(st, CHILD(n, 1));
5325 } else
5326 symtable_params(st, CHILD(n, 2));
5327 body = CHILD(n, NCH(n) - 1);
5328 symtable_node(st, body);
5329}
5330
5331/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00005332 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005333 which are references in the defining scope. symtable_params()
5334 parses the parameter names, which are defined in the function's
5335 body.
5336
5337 varargslist:
5338 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5339 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5340*/
5341
5342static void
5343symtable_default_args(struct symtable *st, node *n)
5344{
5345 node *c;
5346 int i;
5347
5348 if (TYPE(n) == parameters) {
5349 n = CHILD(n, 1);
5350 if (TYPE(n) == RPAR)
5351 return;
5352 }
5353 REQ(n, varargslist);
5354 for (i = 0; i < NCH(n); i += 2) {
5355 c = CHILD(n, i);
5356 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5357 break;
5358 }
5359 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5360 symtable_node(st, CHILD(n, i));
5361 }
5362}
5363
5364static void
5365symtable_params(struct symtable *st, node *n)
5366{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005367 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005368 node *c = NULL;
5369
5370 if (TYPE(n) == parameters) {
5371 n = CHILD(n, 1);
5372 if (TYPE(n) == RPAR)
5373 return;
5374 }
5375 REQ(n, varargslist);
5376 for (i = 0; i < NCH(n); i += 2) {
5377 c = CHILD(n, i);
5378 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5379 ext = 1;
5380 break;
5381 }
5382 if (TYPE(c) == test) {
5383 continue;
5384 }
5385 if (TYPE(CHILD(c, 0)) == NAME)
5386 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
5387 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005388 char nbuf[30];
5389 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005390 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005391 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005392 }
5393 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005394 if (ext) {
5395 c = CHILD(n, i);
5396 if (TYPE(c) == STAR) {
5397 i++;
5398 symtable_add_def(st, STR(CHILD(n, i)),
5399 DEF_PARAM | DEF_STAR);
5400 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005401 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005402 c = NULL;
5403 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005404 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005405 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005406 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005407 i++;
5408 symtable_add_def(st, STR(CHILD(n, i)),
5409 DEF_PARAM | DEF_DOUBLESTAR);
5410 }
5411 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005412 if (complex >= 0) {
5413 int j;
5414 for (j = 0; j <= complex; j++) {
5415 c = CHILD(n, j);
5416 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005417 c = CHILD(n, ++j);
5418 else if (TYPE(c) == EQUAL)
5419 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005420 if (TYPE(CHILD(c, 0)) == LPAR)
5421 symtable_params_fplist(st, CHILD(c, 1));
5422 }
5423 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005424}
5425
5426static void
5427symtable_params_fplist(struct symtable *st, node *n)
5428{
5429 int i;
5430 node *c;
5431
5432 REQ(n, fplist);
5433 for (i = 0; i < NCH(n); i += 2) {
5434 c = CHILD(n, i);
5435 REQ(c, fpdef);
5436 if (NCH(c) == 1)
5437 symtable_add_def(st, STR(CHILD(c, 0)),
5438 DEF_PARAM | DEF_INTUPLE);
5439 else
5440 symtable_params_fplist(st, CHILD(c, 1));
5441 }
5442
5443}
5444
5445static void
5446symtable_global(struct symtable *st, node *n)
5447{
5448 int i;
5449
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005450 /* XXX It might be helpful to warn about module-level global
5451 statements, but it's hard to tell the difference between
5452 module-level and a string passed to exec.
5453 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005454
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005455 for (i = 1; i < NCH(n); i += 2) {
5456 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005457 int flags;
5458
5459 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005460 if (flags < 0)
5461 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005462 if (flags && flags != DEF_GLOBAL) {
5463 char buf[500];
5464 if (flags & DEF_PARAM) {
5465 PyErr_Format(PyExc_SyntaxError,
5466 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005467 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005468 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005469 st->st_cur->ste_lineno);
5470 st->st_errors++;
5471 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005472 }
5473 else {
5474 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005475 PyOS_snprintf(buf, sizeof(buf),
5476 GLOBAL_AFTER_ASSIGN,
5477 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005478 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005479 PyOS_snprintf(buf, sizeof(buf),
5480 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005481 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005482 }
5483 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005484 symtable_add_def(st, name, DEF_GLOBAL);
5485 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005486}
5487
5488static void
5489symtable_list_comprehension(struct symtable *st, node *n)
5490{
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005491 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005492
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005493 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005494 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005495 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005496 symtable_node(st, CHILD(n, 3));
5497 if (NCH(n) == 5)
5498 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005499}
5500
5501static void
5502symtable_import(struct symtable *st, node *n)
5503{
5504 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005505 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005506 | 'from' dotted_name 'import'
5507 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005508 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005509 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005510 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005511 node *dotname = CHILD(n, 1);
5512 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5513 /* check for bogus imports */
5514 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5515 PyErr_SetString(PyExc_SyntaxError,
5516 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005517 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005518 n->n_lineno);
5519 st->st_errors++;
5520 return;
5521 }
5522 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005523 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005524 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005525 if (symtable_warn(st,
5526 "import * only allowed at module level") < 0)
5527 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005528 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005529 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005530 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005531 } else {
5532 for (i = 3; i < NCH(n); i += 2) {
5533 node *c = CHILD(n, i);
5534 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005535 symtable_assign(st, CHILD(c, 2),
5536 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005537 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005538 symtable_assign(st, CHILD(c, 0),
5539 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005540 }
5541 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005542 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005543 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005544 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005545 }
5546 }
5547}
5548
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005549/* The third argument to symatble_assign() is a flag to be passed to
5550 symtable_add_def() if it is eventually called. The flag is useful
5551 to specify the particular type of assignment that should be
5552 recorded, e.g. an assignment caused by import.
5553 */
5554
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005555static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005556symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005557{
5558 node *tmp;
5559 int i;
5560
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005561 loop:
5562 switch (TYPE(n)) {
5563 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005564 /* invalid assignment, e.g. lambda x:x=2. The next
5565 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005566 return;
5567 case power:
5568 if (NCH(n) > 2) {
5569 for (i = 2; i < NCH(n); ++i)
5570 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5571 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005572 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005573 if (NCH(n) > 1) {
5574 symtable_node(st, CHILD(n, 0));
5575 symtable_node(st, CHILD(n, 1));
5576 } else {
5577 n = CHILD(n, 0);
5578 goto loop;
5579 }
5580 return;
5581 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005582 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5583 /* XXX This is an error, but the next pass
5584 will catch it. */
5585 return;
5586 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005587 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005588 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005589 }
5590 return;
5591 case exprlist:
5592 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00005593 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005594 if (NCH(n) == 1) {
5595 n = CHILD(n, 0);
5596 goto loop;
5597 }
5598 else {
5599 int i;
5600 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005601 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005602 return;
5603 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005604 case atom:
5605 tmp = CHILD(n, 0);
5606 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5607 n = CHILD(n, 1);
5608 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005609 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00005610 if (strcmp(STR(tmp), "__debug__") == 0) {
5611 PyErr_SetString(PyExc_SyntaxError,
5612 ASSIGN_DEBUG);
5613 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton86424e32001-12-04 02:41:46 +00005614 n->n_lineno);
Jeremy Hylton778e2652001-11-09 19:50:08 +00005615 st->st_errors++;
5616 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005617 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005618 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005619 return;
5620 case dotted_as_name:
5621 if (NCH(n) == 3)
5622 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005623 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005624 else
5625 symtable_add_def(st,
5626 STR(CHILD(CHILD(n,
5627 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005628 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005629 return;
5630 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005631 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005632 return;
5633 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005634 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005635 return;
5636 default:
5637 if (NCH(n) == 0)
5638 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005639 if (NCH(n) == 1) {
5640 n = CHILD(n, 0);
5641 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005642 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005643 /* Should only occur for errors like x + 1 = 1,
5644 which will be caught in the next pass. */
5645 for (i = 0; i < NCH(n); ++i)
5646 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005647 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005648 }
5649}