blob: 0109fe539c8e6a4f3eda4c6b8caa1407a0366945 [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;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000199 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000200 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000201 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000202 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000203 if (cmp) return cmp;
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 */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000475 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
Guido van Rossum3ac99d42002-08-16 02:13:49 +0000577static int issue_warning(char *, char *, int);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000578static int com_init(struct compiling *, char *);
579static 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 *);
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000600static PyCodeObject *jcompile(node *, char *, struct compiling *,
601 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
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000657com_init(struct compiling *c, 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",
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001185 c->c_filename,
1186 c->c_lineno,
Guido van Rossum715eca92002-08-12 21:54:46 +00001187 NULL,
1188 NULL) < 0)
Guido van Rossum078151d2002-08-11 04:24:12 +00001189 return NULL;
Guido van Rossum3cb8e542002-08-11 14:06:15 +00001190 errno = 0; /* Might be changed by PyErr_Warn() */
Guido van Rossum078151d2002-08-11 04:24:12 +00001191 }
1192 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001193 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001194 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001195 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001196 if (errno != 0)
1197 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001198 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001199 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001200 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001201#ifndef WITHOUT_COMPLEX
1202 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001203 Py_complex z;
1204 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001205 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001206 z.imag = atof(s);
1207 PyFPE_END_PROTECT(z)
1208 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001209 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001210 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001211#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001212 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001213 PyFPE_START_PROTECT("atof", return 0)
1214 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001215 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001216 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001217 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001218}
1219
Guido van Rossum79f25d91997-04-29 20:08:16 +00001220static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001221decode_utf8(char **sPtr, char *end, char* encoding)
1222{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001223#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001224 Py_FatalError("decode_utf8 should not be called in this build.");
1225 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001226#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001227 PyObject *u, *v;
1228 char *s, *t;
1229 t = s = *sPtr;
1230 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1231 while (s < end && (*s & 0x80)) s++;
1232 *sPtr = s;
1233 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1234 if (u == NULL)
1235 return NULL;
1236 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1237 Py_DECREF(u);
1238 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001239#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001240}
1241
1242static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001243parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001244{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001245 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001246 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001247 char *buf;
1248 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001249 char *end;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001250 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001251 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001252 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001253 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001254 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001255
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001256 if (isalpha(quote) || quote == '_') {
1257 if (quote == 'u' || quote == 'U') {
1258 quote = *++s;
1259 unicode = 1;
1260 }
1261 if (quote == 'r' || quote == 'R') {
1262 quote = *++s;
1263 rawmode = 1;
1264 }
1265 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001266 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001267 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001268 return NULL;
1269 }
1270 s++;
1271 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001272 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001273 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001274 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001275 return NULL;
1276 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001277 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001278 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001279 return NULL;
1280 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001281 if (len >= 4 && s[0] == quote && s[1] == quote) {
1282 s += 2;
1283 len -= 2;
1284 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001285 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001286 return NULL;
1287 }
1288 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001289#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001290 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001291 PyObject *u, *w;
1292 if (encoding == NULL) {
1293 buf = s;
1294 u = NULL;
1295 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1296 buf = s;
1297 u = NULL;
1298 } else {
1299 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1300 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1301 if (u == NULL)
1302 return NULL;
1303 p = buf = PyString_AsString(u);
1304 end = s + len;
1305 while (s < end) {
1306 if (*s == '\\') {
1307 *p++ = *s++;
1308 if (*s & 0x80) {
1309 strcpy(p, "u005c");
1310 p += 5;
1311 }
1312 }
1313 if (*s & 0x80) { /* XXX inefficient */
1314 char *r;
1315 int rn, i;
1316 w = decode_utf8(&s, end, "utf-16-be");
1317 if (w == NULL) {
1318 Py_DECREF(u);
1319 return NULL;
1320 }
1321 r = PyString_AsString(w);
1322 rn = PyString_Size(w);
1323 assert(rn % 2 == 0);
1324 for (i = 0; i < rn; i += 2) {
1325 sprintf(p, "\\u%02x%02x",
1326 r[i + 0] & 0xFF,
1327 r[i + 1] & 0xFF);
1328 p += 6;
1329 }
1330 Py_DECREF(w);
1331 } else {
1332 *p++ = *s++;
1333 }
1334 }
1335 len = p - buf;
1336 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001337 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001338 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001339 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001340 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1341 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001342 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001343 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001344 return v;
1345
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001346 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001347#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001348 need_encoding = (encoding != NULL &&
1349 strcmp(encoding, "utf-8") != 0 &&
1350 strcmp(encoding, "iso-8859-1") != 0);
1351 if (rawmode || strchr(s, '\\') == NULL) {
1352 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001353#ifndef Py_USING_UNICODE
1354 /* This should not happen - we never see any other
1355 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001356 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001357#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001358 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1359 if (u == NULL)
1360 return NULL;
1361 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1362 Py_DECREF(u);
1363 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001364#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001365 } else {
1366 return PyString_FromStringAndSize(s, len);
1367 }
1368 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001369
1370 v = PyString_DecodeEscape(s, len, NULL, unicode,
1371 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001372 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001373 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001374 return v;
1375}
1376
Guido van Rossum79f25d91997-04-29 20:08:16 +00001377static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001378parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001379{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001380 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001381 int i;
1382 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001383 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001384 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001385 for (i = 1; i < NCH(n); i++) {
1386 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001387 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001388 if (s == NULL)
1389 goto onError;
1390 if (PyString_Check(v) && PyString_Check(s)) {
1391 PyString_ConcatAndDel(&v, s);
1392 if (v == NULL)
1393 goto onError;
1394 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001395#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001396 else {
1397 PyObject *temp;
1398 temp = PyUnicode_Concat(v, s);
1399 Py_DECREF(s);
1400 if (temp == NULL)
1401 goto onError;
1402 Py_DECREF(v);
1403 v = temp;
1404 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001405#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001406 }
1407 }
1408 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001409
1410 onError:
1411 Py_XDECREF(v);
1412 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001413}
1414
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001415static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001416com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001417{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001418 int anchor = 0;
1419 int save_begin = c->c_begin;
1420
1421 /* list_iter: for v in expr [list_iter] */
1422 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001423 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001424 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001425 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001426 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001427 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001428 c->c_loops++;
1429 com_list_iter(c, n, e, t);
1430 c->c_loops--;
1431 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1432 c->c_begin = save_begin;
1433 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001434 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001435}
1436
1437static void
1438com_list_if(struct compiling *c, node *n, node *e, char *t)
1439{
1440 int anchor = 0;
1441 int a = 0;
1442 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001443 com_node(c, CHILD(n, 1));
1444 com_addfwref(c, JUMP_IF_FALSE, &a);
1445 com_addbyte(c, POP_TOP);
1446 com_pop(c, 1);
1447 com_list_iter(c, n, e, t);
1448 com_addfwref(c, JUMP_FORWARD, &anchor);
1449 com_backpatch(c, a);
1450 /* We jump here with an extra entry which we now pop */
1451 com_addbyte(c, POP_TOP);
1452 com_backpatch(c, anchor);
1453}
1454
1455static void
1456com_list_iter(struct compiling *c,
1457 node *p, /* parent of list_iter node */
1458 node *e, /* element expression node */
1459 char *t /* name of result list temp local */)
1460{
1461 /* list_iter is the last child in a listmaker, list_for, or list_if */
1462 node *n = CHILD(p, NCH(p)-1);
1463 if (TYPE(n) == list_iter) {
1464 n = CHILD(n, 0);
1465 switch (TYPE(n)) {
1466 case list_for:
1467 com_list_for(c, n, e, t);
1468 break;
1469 case list_if:
1470 com_list_if(c, n, e, t);
1471 break;
1472 default:
1473 com_error(c, PyExc_SystemError,
1474 "invalid list_iter node type");
1475 }
1476 }
1477 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001478 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001479 com_push(c, 1);
1480 com_node(c, e);
1481 com_addoparg(c, CALL_FUNCTION, 1);
1482 com_addbyte(c, POP_TOP);
1483 com_pop(c, 2);
1484 }
1485}
1486
1487static void
1488com_list_comprehension(struct compiling *c, node *n)
1489{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001490 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001491 char tmpname[30];
1492 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001493 com_addoparg(c, BUILD_LIST, 0);
1494 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1495 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001496 com_addop_name(c, LOAD_ATTR, "append");
1497 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001498 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001499 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001500 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001501 --c->c_tmpname;
1502}
1503
1504static void
1505com_listmaker(struct compiling *c, node *n)
1506{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001507 /* listmaker: test ( list_for | (',' test)* [','] ) */
1508 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001509 com_list_comprehension(c, n);
1510 else {
1511 int len = 0;
1512 int i;
1513 for (i = 0; i < NCH(n); i += 2, len++)
1514 com_node(c, CHILD(n, i));
1515 com_addoparg(c, BUILD_LIST, len);
1516 com_pop(c, len-1);
1517 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001518}
1519
1520static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001521com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001522{
1523 int i;
1524 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1525 for (i = 0; i+2 < NCH(n); i += 4) {
1526 /* We must arrange things just right for STORE_SUBSCR.
1527 It wants the stack to look like (value) (dict) (key) */
1528 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001529 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001530 com_node(c, CHILD(n, i+2)); /* value */
1531 com_addbyte(c, ROT_TWO);
1532 com_node(c, CHILD(n, i)); /* key */
1533 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001534 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001535 }
1536}
1537
1538static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001539com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001540{
1541 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001542 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001543 int i;
1544 REQ(n, atom);
1545 ch = CHILD(n, 0);
1546 switch (TYPE(ch)) {
1547 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001548 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001549 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001550 com_push(c, 1);
1551 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001552 else
1553 com_node(c, CHILD(n, 1));
1554 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001555 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001556 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001557 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001558 com_push(c, 1);
1559 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001560 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001561 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001562 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001563 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001564 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001565 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001566 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001567 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001568 break;
1569 case BACKQUOTE:
1570 com_node(c, CHILD(n, 1));
1571 com_addbyte(c, UNARY_CONVERT);
1572 break;
1573 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001574 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001575 i = 255;
1576 }
1577 else {
1578 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001579 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001580 }
1581 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001582 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001583 break;
1584 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001585 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001586 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001587 c->c_errors++;
1588 i = 255;
1589 }
1590 else {
1591 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001592 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001593 }
1594 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001595 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001596 break;
1597 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001598 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001599 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001600 break;
1601 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001602 com_error(c, PyExc_SystemError,
1603 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001604 }
1605}
1606
1607static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001608com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001609{
1610 if (NCH(n) == 1) {
1611 com_addbyte(c, op);
1612 }
1613 else if (NCH(n) == 2) {
1614 if (TYPE(CHILD(n, 0)) != COLON) {
1615 com_node(c, CHILD(n, 0));
1616 com_addbyte(c, op+1);
1617 }
1618 else {
1619 com_node(c, CHILD(n, 1));
1620 com_addbyte(c, op+2);
1621 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001622 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001623 }
1624 else {
1625 com_node(c, CHILD(n, 0));
1626 com_node(c, CHILD(n, 2));
1627 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001628 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001629 }
1630}
1631
Guido van Rossum635abd21997-01-06 22:56:52 +00001632static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001633com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1634{
1635 if (NCH(n) == 1) {
1636 com_addbyte(c, DUP_TOP);
1637 com_push(c, 1);
1638 com_addbyte(c, SLICE);
1639 com_node(c, augn);
1640 com_addbyte(c, opcode);
1641 com_pop(c, 1);
1642 com_addbyte(c, ROT_TWO);
1643 com_addbyte(c, STORE_SLICE);
1644 com_pop(c, 2);
1645 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1646 com_node(c, CHILD(n, 0));
1647 com_addoparg(c, DUP_TOPX, 2);
1648 com_push(c, 2);
1649 com_addbyte(c, SLICE+1);
1650 com_pop(c, 1);
1651 com_node(c, augn);
1652 com_addbyte(c, opcode);
1653 com_pop(c, 1);
1654 com_addbyte(c, ROT_THREE);
1655 com_addbyte(c, STORE_SLICE+1);
1656 com_pop(c, 3);
1657 } else if (NCH(n) == 2) {
1658 com_node(c, CHILD(n, 1));
1659 com_addoparg(c, DUP_TOPX, 2);
1660 com_push(c, 2);
1661 com_addbyte(c, SLICE+2);
1662 com_pop(c, 1);
1663 com_node(c, augn);
1664 com_addbyte(c, opcode);
1665 com_pop(c, 1);
1666 com_addbyte(c, ROT_THREE);
1667 com_addbyte(c, STORE_SLICE+2);
1668 com_pop(c, 3);
1669 } else {
1670 com_node(c, CHILD(n, 0));
1671 com_node(c, CHILD(n, 2));
1672 com_addoparg(c, DUP_TOPX, 3);
1673 com_push(c, 3);
1674 com_addbyte(c, SLICE+3);
1675 com_pop(c, 2);
1676 com_node(c, augn);
1677 com_addbyte(c, opcode);
1678 com_pop(c, 1);
1679 com_addbyte(c, ROT_FOUR);
1680 com_addbyte(c, STORE_SLICE+3);
1681 com_pop(c, 4);
1682 }
1683}
1684
1685static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001686com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001687{
1688 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001689 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001690 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001691 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001692 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001693 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001694 }
1695 else {
1696 com_node(c, CHILD(n, 0));
1697 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001698 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001699 }
1700 m = n;
1701 do {
1702 m = CHILD(m, 0);
1703 } while (NCH(m) == 1);
1704 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001705 /* f(lambda x: x[0] = 3) ends up getting parsed with
1706 * LHS test = lambda x: x[0], and RHS test = 3.
1707 * SF bug 132313 points out that complaining about a keyword
1708 * then is very confusing.
1709 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001710 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001711 TYPE(m) == lambdef ?
1712 "lambda cannot contain assignment" :
1713 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001714 }
1715 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001716 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00001717 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00001718 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001719 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001720 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001721 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001722 else if (*pkeywords == NULL) {
1723 c->c_errors++;
1724 Py_DECREF(v);
1725 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001726 if (PyDict_GetItem(*pkeywords, v) != NULL)
1727 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001728 "duplicate keyword argument");
1729 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001730 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001731 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001732 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001733 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001734 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001735 }
1736 }
1737 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001738}
1739
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001740static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001741com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001742{
1743 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001744 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001745 }
1746 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001747 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001748 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001749 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001750 int star_flag = 0;
1751 int starstar_flag = 0;
1752 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001753 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001754 na = 0;
1755 nk = 0;
1756 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001757 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001758 if (TYPE(ch) == STAR ||
1759 TYPE(ch) == DOUBLESTAR)
1760 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001761 if (ch->n_lineno != lineno) {
1762 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001763 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00001764 }
1765 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001766 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001767 na++;
1768 else
1769 nk++;
1770 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001771 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001772 while (i < NCH(n)) {
1773 node *tok = CHILD(n, i);
1774 node *ch = CHILD(n, i+1);
1775 i += 3;
1776 switch (TYPE(tok)) {
1777 case STAR: star_flag = 1; break;
1778 case DOUBLESTAR: starstar_flag = 1; break;
1779 }
1780 com_node(c, ch);
1781 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001782 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001783 com_error(c, PyExc_SyntaxError,
1784 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001785 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001786 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001787 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001788 star_flag + (starstar_flag << 1);
1789 else
1790 opcode = CALL_FUNCTION;
1791 com_addoparg(c, opcode, na | (nk << 8));
1792 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001793 }
1794}
1795
1796static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001797com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001798{
1799 com_addopname(c, LOAD_ATTR, n);
1800}
1801
1802static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001803com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001804{
1805 int i=0;
1806 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001807 node *ch;
1808
1809 /* first argument */
1810 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001811 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001812 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001813 i++;
1814 }
1815 else {
1816 com_node(c, CHILD(n,i));
1817 i++;
1818 REQ(CHILD(n,i),COLON);
1819 i++;
1820 }
1821 /* second argument */
1822 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1823 com_node(c, CHILD(n,i));
1824 i++;
1825 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001826 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001827 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001828 com_push(c, 1);
1829 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001830 /* remaining arguments */
1831 for (; i < NCH(n); i++) {
1832 ns++;
1833 ch=CHILD(n,i);
1834 REQ(ch, sliceop);
1835 if (NCH(ch) == 1) {
1836 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001837 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001838 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001839 }
1840 else
1841 com_node(c, CHILD(ch,1));
1842 }
1843 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001844 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001845}
1846
1847static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001848com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001849{
1850 node *ch;
1851 REQ(n, subscript);
1852 ch = CHILD(n,0);
1853 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001854 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001855 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001856 com_push(c, 1);
1857 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001858 else {
1859 /* check for slice */
1860 if ((TYPE(ch) == COLON || NCH(n) > 1))
1861 com_sliceobj(c, n);
1862 else {
1863 REQ(ch, test);
1864 com_node(c, ch);
1865 }
1866 }
1867}
1868
1869static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001870com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001871{
1872 int i, op;
1873 REQ(n, subscriptlist);
1874 /* Check to make backward compatible slice behavior for '[i:j]' */
1875 if (NCH(n) == 1) {
1876 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001877 /* 'Basic' slice, should have exactly one colon. */
1878 if ((TYPE(CHILD(sub, 0)) == COLON
1879 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1880 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1881 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001882 switch (assigning) {
1883 case OP_DELETE:
1884 op = DELETE_SLICE;
1885 break;
1886 case OP_ASSIGN:
1887 op = STORE_SLICE;
1888 break;
1889 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001890 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001891 break;
1892 default:
1893 com_augassign_slice(c, sub, assigning, augn);
1894 return;
1895 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001896 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001897 if (op == STORE_SLICE)
1898 com_pop(c, 2);
1899 else if (op == DELETE_SLICE)
1900 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001901 return;
1902 }
1903 }
1904 /* Else normal subscriptlist. Compile each subscript. */
1905 for (i = 0; i < NCH(n); i += 2)
1906 com_subscript(c, CHILD(n, i));
1907 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001908 if (NCH(n) > 1) {
1909 i = (NCH(n)+1) / 2;
1910 com_addoparg(c, BUILD_TUPLE, i);
1911 com_pop(c, i-1);
1912 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001913 switch (assigning) {
1914 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001915 op = DELETE_SUBSCR;
1916 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001917 break;
1918 default:
1919 case OP_ASSIGN:
1920 op = STORE_SUBSCR;
1921 i = 3;
1922 break;
1923 case OP_APPLY:
1924 op = BINARY_SUBSCR;
1925 i = 1;
1926 break;
1927 }
1928 if (assigning > OP_APPLY) {
1929 com_addoparg(c, DUP_TOPX, 2);
1930 com_push(c, 2);
1931 com_addbyte(c, BINARY_SUBSCR);
1932 com_pop(c, 1);
1933 com_node(c, augn);
1934 com_addbyte(c, assigning);
1935 com_pop(c, 1);
1936 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001937 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001938 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001939 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001940}
1941
1942static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001943com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001944{
1945 REQ(n, trailer);
1946 switch (TYPE(CHILD(n, 0))) {
1947 case LPAR:
1948 com_call_function(c, CHILD(n, 1));
1949 break;
1950 case DOT:
1951 com_select_member(c, CHILD(n, 1));
1952 break;
1953 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001954 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001955 break;
1956 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001957 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001958 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001959 }
1960}
1961
1962static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001963com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001964{
1965 int i;
1966 REQ(n, power);
1967 com_atom(c, CHILD(n, 0));
1968 for (i = 1; i < NCH(n); i++) {
1969 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1970 com_factor(c, CHILD(n, i+1));
1971 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001972 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001973 break;
1974 }
1975 else
1976 com_apply_trailer(c, CHILD(n, i));
1977 }
1978}
1979
1980static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001981com_invert_constant(struct compiling *c, node *n)
1982{
1983 /* Compute the inverse of int and longs and use them directly,
1984 but be prepared to generate code for all other
1985 possibilities (invalid numbers, floats, complex).
1986 */
1987 PyObject *num, *inv = NULL;
1988 int i;
1989
1990 REQ(n, NUMBER);
1991 num = parsenumber(c, STR(n));
1992 if (num == NULL)
1993 i = 255;
1994 else {
1995 inv = PyNumber_Invert(num);
1996 if (inv == NULL) {
1997 PyErr_Clear();
1998 i = com_addconst(c, num);
1999 } else {
2000 i = com_addconst(c, inv);
2001 Py_DECREF(inv);
2002 }
2003 Py_DECREF(num);
2004 }
2005 com_addoparg(c, LOAD_CONST, i);
2006 com_push(c, 1);
2007 if (num != NULL && inv == NULL)
2008 com_addbyte(c, UNARY_INVERT);
2009}
2010
Tim Peters51e26512001-09-07 08:45:55 +00002011static int
2012is_float_zero(const char *p)
2013{
2014 int found_radix_point = 0;
2015 int ch;
2016 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2017 switch (ch) {
2018 case '0':
2019 /* no reason to believe it's not 0 -- continue */
2020 break;
2021
2022 case 'e': case 'E': case 'j': case 'J':
2023 /* If this was a hex constant, we already would have
2024 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2025 must be an exponent marker, and we haven't yet
2026 seen a non-zero digit, and it doesn't matter what
2027 the exponent is then. For 'j' or 'J' similarly,
2028 except that this is an imaginary 0 then. */
2029 return 1;
2030
2031 case '.':
2032 found_radix_point = 1;
2033 break;
2034
2035 default:
2036 return 0;
2037 }
2038 }
2039 return found_radix_point;
2040}
2041
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002042static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002043com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002044{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002045 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002046 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002047 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002048 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002049 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002050 approriate value as a constant. If the value is negative,
2051 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002052 negative in the 0th position -- unless we're doing unary minus
2053 of a floating zero! In that case the sign is significant, but
2054 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002055 */
2056 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002057 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002058 && TYPE((pfactor = CHILD(n, 1))) == factor
2059 && NCH(pfactor) == 1
2060 && TYPE((ppower = CHILD(pfactor, 0))) == power
2061 && NCH(ppower) == 1
2062 && TYPE((patom = CHILD(ppower, 0))) == atom
2063 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
2064 && !(childtype == MINUS && is_float_zero(STR(pnum)))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002065 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002066 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002067 return;
2068 }
2069 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002070 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002071 if (s == NULL) {
2072 com_error(c, PyExc_MemoryError, "");
2073 com_addbyte(c, 255);
2074 return;
2075 }
2076 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002077 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002078 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002079 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002080 }
Tim Peters51e26512001-09-07 08:45:55 +00002081 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002082 }
2083 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002084 com_factor(c, CHILD(n, 1));
2085 com_addbyte(c, UNARY_POSITIVE);
2086 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002087 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002088 com_factor(c, CHILD(n, 1));
2089 com_addbyte(c, UNARY_NEGATIVE);
2090 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002091 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002092 com_factor(c, CHILD(n, 1));
2093 com_addbyte(c, UNARY_INVERT);
2094 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002095 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002096 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002097 }
2098}
2099
2100static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002101com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002102{
2103 int i;
2104 int op;
2105 REQ(n, term);
2106 com_factor(c, CHILD(n, 0));
2107 for (i = 2; i < NCH(n); i += 2) {
2108 com_factor(c, CHILD(n, i));
2109 switch (TYPE(CHILD(n, i-1))) {
2110 case STAR:
2111 op = BINARY_MULTIPLY;
2112 break;
2113 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002114 if (c->c_flags & CO_FUTURE_DIVISION)
2115 op = BINARY_TRUE_DIVIDE;
2116 else
2117 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002118 break;
2119 case PERCENT:
2120 op = BINARY_MODULO;
2121 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002122 case DOUBLESLASH:
2123 op = BINARY_FLOOR_DIVIDE;
2124 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002125 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002126 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002127 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002128 op = 255;
2129 }
2130 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002131 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002132 }
2133}
2134
2135static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002136com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002137{
2138 int i;
2139 int op;
2140 REQ(n, arith_expr);
2141 com_term(c, CHILD(n, 0));
2142 for (i = 2; i < NCH(n); i += 2) {
2143 com_term(c, CHILD(n, i));
2144 switch (TYPE(CHILD(n, i-1))) {
2145 case PLUS:
2146 op = BINARY_ADD;
2147 break;
2148 case MINUS:
2149 op = BINARY_SUBTRACT;
2150 break;
2151 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002152 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002153 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002154 op = 255;
2155 }
2156 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002157 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002158 }
2159}
2160
2161static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002162com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002163{
2164 int i;
2165 int op;
2166 REQ(n, shift_expr);
2167 com_arith_expr(c, CHILD(n, 0));
2168 for (i = 2; i < NCH(n); i += 2) {
2169 com_arith_expr(c, CHILD(n, i));
2170 switch (TYPE(CHILD(n, i-1))) {
2171 case LEFTSHIFT:
2172 op = BINARY_LSHIFT;
2173 break;
2174 case RIGHTSHIFT:
2175 op = BINARY_RSHIFT;
2176 break;
2177 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002178 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002179 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002180 op = 255;
2181 }
2182 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002183 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002184 }
2185}
2186
2187static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002188com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002189{
2190 int i;
2191 int op;
2192 REQ(n, and_expr);
2193 com_shift_expr(c, CHILD(n, 0));
2194 for (i = 2; i < NCH(n); i += 2) {
2195 com_shift_expr(c, CHILD(n, i));
2196 if (TYPE(CHILD(n, i-1)) == AMPER) {
2197 op = BINARY_AND;
2198 }
2199 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002200 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002201 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002202 op = 255;
2203 }
2204 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002205 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002206 }
2207}
2208
2209static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002210com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002211{
2212 int i;
2213 int op;
2214 REQ(n, xor_expr);
2215 com_and_expr(c, CHILD(n, 0));
2216 for (i = 2; i < NCH(n); i += 2) {
2217 com_and_expr(c, CHILD(n, i));
2218 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2219 op = BINARY_XOR;
2220 }
2221 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002222 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002223 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002224 op = 255;
2225 }
2226 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002227 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002228 }
2229}
2230
2231static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002232com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002233{
2234 int i;
2235 int op;
2236 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002237 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002238 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002239 com_xor_expr(c, CHILD(n, i));
2240 if (TYPE(CHILD(n, i-1)) == VBAR) {
2241 op = BINARY_OR;
2242 }
2243 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002244 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002245 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002246 op = 255;
2247 }
2248 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002249 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002250 }
2251}
2252
2253static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002254cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002255{
2256 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00002257 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002258 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2259 if (NCH(n) == 1) {
2260 n = CHILD(n, 0);
2261 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002262 case LESS: return PyCmp_LT;
2263 case GREATER: return PyCmp_GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002264 case EQEQUAL: /* == */
Martin v. Löwis7198a522002-01-01 19:59:11 +00002265 case EQUAL: return PyCmp_EQ;
2266 case LESSEQUAL: return PyCmp_LE;
2267 case GREATEREQUAL: return PyCmp_GE;
2268 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2269 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2270 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002271 }
2272 }
2273 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002274 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002275 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002276 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002277 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002278 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002279 }
2280 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002281 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002282}
2283
2284static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002285com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002286{
2287 int i;
2288 enum cmp_op op;
2289 int anchor;
2290 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2291 com_expr(c, CHILD(n, 0));
2292 if (NCH(n) == 1)
2293 return;
2294
2295 /****************************************************************
2296 The following code is generated for all but the last
2297 comparison in a chain:
2298
2299 label: on stack: opcode: jump to:
2300
2301 a <code to load b>
2302 a, b DUP_TOP
2303 a, b, b ROT_THREE
2304 b, a, b COMPARE_OP
2305 b, 0-or-1 JUMP_IF_FALSE L1
2306 b, 1 POP_TOP
2307 b
2308
2309 We are now ready to repeat this sequence for the next
2310 comparison in the chain.
2311
2312 For the last we generate:
2313
2314 b <code to load c>
2315 b, c COMPARE_OP
2316 0-or-1
2317
2318 If there were any jumps to L1 (i.e., there was more than one
2319 comparison), we generate:
2320
2321 0-or-1 JUMP_FORWARD L2
2322 L1: b, 0 ROT_TWO
2323 0, b POP_TOP
2324 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002325 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002326 ****************************************************************/
2327
2328 anchor = 0;
2329
2330 for (i = 2; i < NCH(n); i += 2) {
2331 com_expr(c, CHILD(n, i));
2332 if (i+2 < NCH(n)) {
2333 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002334 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002335 com_addbyte(c, ROT_THREE);
2336 }
2337 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002338 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002339 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002340 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002341 }
2342 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002343 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002344 if (i+2 < NCH(n)) {
2345 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2346 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002347 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002348 }
2349 }
2350
2351 if (anchor) {
2352 int anchor2 = 0;
2353 com_addfwref(c, JUMP_FORWARD, &anchor2);
2354 com_backpatch(c, anchor);
2355 com_addbyte(c, ROT_TWO);
2356 com_addbyte(c, POP_TOP);
2357 com_backpatch(c, anchor2);
2358 }
2359}
2360
2361static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002362com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002363{
2364 REQ(n, not_test); /* 'not' not_test | comparison */
2365 if (NCH(n) == 1) {
2366 com_comparison(c, CHILD(n, 0));
2367 }
2368 else {
2369 com_not_test(c, CHILD(n, 1));
2370 com_addbyte(c, UNARY_NOT);
2371 }
2372}
2373
2374static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002375com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002376{
2377 int i;
2378 int anchor;
2379 REQ(n, and_test); /* not_test ('and' not_test)* */
2380 anchor = 0;
2381 i = 0;
2382 for (;;) {
2383 com_not_test(c, CHILD(n, i));
2384 if ((i += 2) >= NCH(n))
2385 break;
2386 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2387 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002388 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002389 }
2390 if (anchor)
2391 com_backpatch(c, anchor);
2392}
2393
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002394static int
2395com_make_closure(struct compiling *c, PyCodeObject *co)
2396{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002397 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002398 if (free == 0)
2399 return 0;
2400 for (i = 0; i < free; ++i) {
2401 /* Bypass com_addop_varname because it will generate
2402 LOAD_DEREF but LOAD_CLOSURE is needed.
2403 */
2404 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2405 int arg, reftype;
2406
2407 /* Special case: If a class contains a method with a
2408 free variable that has the same name as a method,
2409 the name will be considered free *and* local in the
2410 class. It should be handled by the closure, as
2411 well as by the normal name loookup logic.
2412 */
2413 reftype = get_ref_type(c, PyString_AS_STRING(name));
2414 if (reftype == CELL)
2415 arg = com_lookup_arg(c->c_cellvars, name);
2416 else /* (reftype == FREE) */
2417 arg = com_lookup_arg(c->c_freevars, name);
2418 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002419 fprintf(stderr, "lookup %s in %s %d %d\n"
2420 "freevars of %s: %s\n",
2421 PyObject_REPR(name),
2422 c->c_name,
2423 reftype, arg,
2424 PyString_AS_STRING(co->co_name),
2425 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002426 Py_FatalError("com_make_closure()");
2427 }
2428 com_addoparg(c, LOAD_CLOSURE, arg);
2429
2430 }
2431 com_push(c, free);
2432 return 1;
2433}
2434
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002435static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002436com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002437{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002438 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002439 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002440 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002441 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002442 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002443 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2444 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002445 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002446 if (co == NULL) {
2447 c->c_errors++;
2448 return;
2449 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002450 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002451 i = com_addconst(c, (PyObject *)co);
2452 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002453 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002454 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002455 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002456 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002457 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002458 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002459 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002460 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002461 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002462 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002463 else {
2464 int anchor = 0;
2465 int i = 0;
2466 for (;;) {
2467 com_and_test(c, CHILD(n, i));
2468 if ((i += 2) >= NCH(n))
2469 break;
2470 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2471 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002472 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002473 }
2474 if (anchor)
2475 com_backpatch(c, anchor);
2476 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002477}
2478
2479static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002480com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002481{
2482 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002483 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002484 com_node(c, CHILD(n, 0));
2485 }
2486 else {
2487 int i;
2488 int len;
2489 len = (NCH(n) + 1) / 2;
2490 for (i = 0; i < NCH(n); i += 2)
2491 com_node(c, CHILD(n, i));
2492 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002493 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002494 }
2495}
2496
2497
2498/* Begin of assignment compilation */
2499
Thomas Wouters434d0822000-08-24 20:11:32 +00002500
2501static void
2502com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2503{
2504 com_addbyte(c, DUP_TOP);
2505 com_push(c, 1);
2506 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002507 com_node(c, augn);
2508 com_addbyte(c, opcode);
2509 com_pop(c, 1);
2510 com_addbyte(c, ROT_TWO);
2511 com_addopname(c, STORE_ATTR, n);
2512 com_pop(c, 2);
2513}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002514
2515static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002516com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002517{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00002518 if (none_assignment_check(c, STR(n), assigning))
2519 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002520 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002521 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002522}
2523
2524static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002525com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002526{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002527 REQ(n, trailer);
2528 switch (TYPE(CHILD(n, 0))) {
2529 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002530 if (assigning == OP_DELETE)
2531 com_error(c, PyExc_SyntaxError,
2532 "can't delete function call");
2533 else
2534 com_error(c, PyExc_SyntaxError,
2535 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002536 break;
2537 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002538 if (assigning > OP_APPLY)
2539 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2540 else
2541 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002542 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002543 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002544 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002545 break;
2546 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002547 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002548 }
2549}
2550
2551static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002552com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002553{
2554 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002555 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002556 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002557 if (assigning) {
2558 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002559 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002560 com_push(c, i-1);
2561 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002562 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002563 com_assign(c, CHILD(n, i), assigning, NULL);
2564}
2565
2566static void
2567com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2568{
2569 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002570 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002571 com_push(c, 1);
2572 com_node(c, augn);
2573 com_addbyte(c, opcode);
2574 com_pop(c, 1);
2575 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002576}
2577
2578static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002579com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002580{
2581 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002582 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002583 if (assigning)
2584 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002585}
2586
2587static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002588com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002589{
2590 /* Loop to avoid trivial recursion */
2591 for (;;) {
2592 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002593
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002594 case exprlist:
2595 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002596 case testlist1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002597 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002598 if (assigning > OP_APPLY) {
2599 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002600 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002601 return;
2602 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002603 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002604 return;
2605 }
2606 n = CHILD(n, 0);
2607 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002608
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002609 case test:
2610 case and_test:
2611 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002612 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002613 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002614 case xor_expr:
2615 case and_expr:
2616 case shift_expr:
2617 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002618 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002619 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002620 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002621 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002622 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002623 return;
2624 }
2625 n = CHILD(n, 0);
2626 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002627
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002628 case power: /* atom trailer* ('**' power)*
2629 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002630 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002631 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002632 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002633 return;
2634 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002635 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002636 int i;
2637 com_node(c, CHILD(n, 0));
2638 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002639 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002640 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002641 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002642 return;
2643 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002644 com_apply_trailer(c, CHILD(n, i));
2645 } /* NB i is still alive */
2646 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002647 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002648 return;
2649 }
2650 n = CHILD(n, 0);
2651 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002652
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002653 case atom:
2654 switch (TYPE(CHILD(n, 0))) {
2655 case LPAR:
2656 n = CHILD(n, 1);
2657 if (TYPE(n) == RPAR) {
2658 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002659 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002660 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002661 return;
2662 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002663 if (assigning > OP_APPLY) {
2664 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002665 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002666 return;
2667 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002668 break;
2669 case LSQB:
2670 n = CHILD(n, 1);
2671 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002672 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002673 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002674 return;
2675 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002676 if (assigning > OP_APPLY) {
2677 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002678 "augmented assign to list not possible");
2679 return;
2680 }
2681 if (NCH(n) > 1
2682 && TYPE(CHILD(n, 1)) == list_for) {
2683 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002684 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002685 return;
2686 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002687 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002688 return;
2689 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002690 if (assigning > OP_APPLY)
2691 com_augassign_name(c, CHILD(n, 0),
2692 assigning, augn);
2693 else
2694 com_assign_name(c, CHILD(n, 0),
2695 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002696 return;
2697 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002698 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002699 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002700 return;
2701 }
2702 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002703
2704 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002705 com_error(c, PyExc_SyntaxError,
2706 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002707 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002708
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002709 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002710 com_error(c, PyExc_SystemError,
2711 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002712 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002713
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002714 }
2715 }
2716}
Guido van Rossum7c531111997-03-11 18:42:21 +00002717
Thomas Wouters434d0822000-08-24 20:11:32 +00002718static void
2719com_augassign(struct compiling *c, node *n)
2720{
2721 int opcode;
2722
2723 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2724 case '+': opcode = INPLACE_ADD; break;
2725 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002726 case '/':
2727 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
2728 opcode = INPLACE_FLOOR_DIVIDE;
2729 else if (c->c_flags & CO_FUTURE_DIVISION)
2730 opcode = INPLACE_TRUE_DIVIDE;
2731 else
2732 opcode = INPLACE_DIVIDE;
2733 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00002734 case '%': opcode = INPLACE_MODULO; break;
2735 case '<': opcode = INPLACE_LSHIFT; break;
2736 case '>': opcode = INPLACE_RSHIFT; break;
2737 case '&': opcode = INPLACE_AND; break;
2738 case '^': opcode = INPLACE_XOR; break;
2739 case '|': opcode = INPLACE_OR; break;
2740 case '*':
2741 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2742 opcode = INPLACE_POWER;
2743 else
2744 opcode = INPLACE_MULTIPLY;
2745 break;
2746 default:
2747 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2748 return;
2749 }
2750 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2751}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002752
2753static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002754com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002755{
Thomas Wouters434d0822000-08-24 20:11:32 +00002756 REQ(n, expr_stmt);
2757 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002758 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002759 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002760 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002761 if (NCH(n) == 1) {
2762 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002763 if (c->c_interactive)
2764 com_addbyte(c, PRINT_EXPR);
2765 else
2766 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002767 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002768 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002769 else if (TYPE(CHILD(n,1)) == augassign)
2770 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002771 else {
2772 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002773 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002774 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002775 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002776 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002777 com_push(c, 1);
2778 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002779 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002780 }
2781 }
2782}
2783
2784static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002785com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002786{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002787 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002788 int i;
2789 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002790 if (Py_OptimizeFlag)
2791 return;
2792 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00002793
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002794 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00002795 raise AssertionError [, <message>]
2796
2797 where <message> is the second test, if present.
2798 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002799 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002800 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002801 com_addbyte(c, POP_TOP);
2802 com_pop(c, 1);
2803 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002804 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002805 com_push(c, 1);
2806 i = NCH(n)/2; /* Either 2 or 4 */
2807 if (i > 1)
2808 com_node(c, CHILD(n, 3));
2809 com_addoparg(c, RAISE_VARARGS, i);
2810 com_pop(c, i);
2811 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002812 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002813 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002814 com_addbyte(c, POP_TOP);
2815}
2816
2817static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002818com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002819{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002820 int i = 1;
2821 node* stream = NULL;
2822
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002823 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002824
2825 /* are we using the extended print form? */
2826 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2827 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002828 com_node(c, stream);
2829 /* stack: [...] => [... stream] */
2830 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002831 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2832 i = 4;
2833 else
2834 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002835 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002836 for (; i < NCH(n); i += 2) {
2837 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002838 com_addbyte(c, DUP_TOP);
2839 /* stack: [stream] => [stream stream] */
2840 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002841 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002842 /* stack: [stream stream] => [stream stream obj] */
2843 com_addbyte(c, ROT_TWO);
2844 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002845 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002846 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002847 com_pop(c, 2);
2848 }
2849 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002850 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002851 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002852 com_addbyte(c, PRINT_ITEM);
2853 com_pop(c, 1);
2854 }
2855 }
2856 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002857 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002858 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002859 /* must pop the extra stream object off the stack */
2860 com_addbyte(c, POP_TOP);
2861 /* stack: [... stream] => [...] */
2862 com_pop(c, 1);
2863 }
2864 }
2865 else {
2866 if (stream != NULL) {
2867 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002868 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002869 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002870 com_pop(c, 1);
2871 }
2872 else
2873 com_addbyte(c, PRINT_NEWLINE);
2874 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002875}
2876
2877static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002878com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002879{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002880 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002881 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002882 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002883 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002884 if (c->c_flags & CO_GENERATOR) {
2885 if (NCH(n) > 1) {
2886 com_error(c, PyExc_SyntaxError,
2887 "'return' with argument inside generator");
2888 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002889 }
2890 if (NCH(n) < 2) {
2891 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002892 com_push(c, 1);
2893 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002894 else
2895 com_node(c, CHILD(n, 1));
2896 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00002897 com_pop(c, 1);
2898}
2899
2900static void
2901com_yield_stmt(struct compiling *c, node *n)
2902{
Tim Peters95c80f82001-06-23 02:07:08 +00002903 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00002904 REQ(n, yield_stmt); /* 'yield' testlist */
2905 if (!c->c_infunction) {
2906 com_error(c, PyExc_SyntaxError, "'yield' outside function");
2907 }
Tim Peters95c80f82001-06-23 02:07:08 +00002908
2909 for (i = 0; i < c->c_nblocks; ++i) {
2910 if (c->c_block[i] == SETUP_FINALLY) {
2911 com_error(c, PyExc_SyntaxError,
2912 "'yield' not allowed in a 'try' block "
2913 "with a 'finally' clause");
2914 return;
2915 }
2916 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002917 com_node(c, CHILD(n, 1));
2918 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002919 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002920}
2921
2922static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002923com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002924{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002925 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002926 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2927 if (NCH(n) > 1) {
2928 com_node(c, CHILD(n, 1));
2929 if (NCH(n) > 3) {
2930 com_node(c, CHILD(n, 3));
2931 if (NCH(n) > 5)
2932 com_node(c, CHILD(n, 5));
2933 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002934 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002935 i = NCH(n)/2;
2936 com_addoparg(c, RAISE_VARARGS, i);
2937 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002938}
2939
2940static void
Thomas Wouters52152252000-08-17 22:55:00 +00002941com_from_import(struct compiling *c, node *n)
2942{
2943 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2944 com_push(c, 1);
2945 if (NCH(n) > 1) {
2946 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2947 com_error(c, PyExc_SyntaxError, "invalid syntax");
2948 return;
2949 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002950 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002951 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002952 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002953 com_pop(c, 1);
2954}
2955
2956static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002957com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002958{
2959 int i;
2960 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002961 /* 'import' dotted_name (',' dotted_name)* |
2962 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002963 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002964 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002965 /* 'from' dotted_name 'import' ... */
2966 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002967
2968 if (TYPE(CHILD(n, 3)) == STAR) {
2969 tup = Py_BuildValue("(s)", "*");
2970 } else {
2971 tup = PyTuple_New((NCH(n) - 2)/2);
2972 for (i = 3; i < NCH(n); i += 2) {
2973 PyTuple_SET_ITEM(tup, (i-3)/2,
2974 PyString_FromString(STR(
Jeremy Hylton4419ac12001-02-28 22:54:51 +00002975 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002976 }
2977 }
2978 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002979 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002980 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002981 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002982 if (TYPE(CHILD(n, 3)) == STAR)
2983 com_addbyte(c, IMPORT_STAR);
2984 else {
2985 for (i = 3; i < NCH(n); i += 2)
2986 com_from_import(c, CHILD(n, i));
2987 com_addbyte(c, POP_TOP);
2988 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002989 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002990 }
2991 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002992 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002993 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002994 node *subn = CHILD(n, i);
2995 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002996 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002997 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002998 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002999 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003000 int j;
3001 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003002 com_error(c, PyExc_SyntaxError,
3003 "invalid syntax");
3004 return;
3005 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003006 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3007 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003008 CHILD(CHILD(subn, 0),
3009 j));
3010 com_addop_varname(c, VAR_STORE,
3011 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003012 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003013 com_addop_varname(c, VAR_STORE,
3014 STR(CHILD(CHILD(subn, 0),
3015 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003016 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003017 }
3018 }
3019}
3020
3021static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003022com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003023{
3024 REQ(n, exec_stmt);
3025 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3026 com_node(c, CHILD(n, 1));
3027 if (NCH(n) >= 4)
3028 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003029 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003030 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003031 com_push(c, 1);
3032 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003033 if (NCH(n) >= 6)
3034 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003035 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003036 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003037 com_push(c, 1);
3038 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003039 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003040 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003041}
3042
Guido van Rossum7c531111997-03-11 18:42:21 +00003043static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003044is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003045{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003046 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003047 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003048 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003049
3050 /* Label to avoid tail recursion */
3051 next:
3052 switch (TYPE(n)) {
3053
3054 case suite:
3055 if (NCH(n) == 1) {
3056 n = CHILD(n, 0);
3057 goto next;
3058 }
3059 /* Fall through */
3060 case file_input:
3061 for (i = 0; i < NCH(n); i++) {
3062 node *ch = CHILD(n, i);
3063 if (TYPE(ch) == stmt) {
3064 n = ch;
3065 goto next;
3066 }
3067 }
3068 break;
3069
3070 case stmt:
3071 case simple_stmt:
3072 case small_stmt:
3073 n = CHILD(n, 0);
3074 goto next;
3075
3076 case expr_stmt:
3077 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003078 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003079 case test:
3080 case and_test:
3081 case not_test:
3082 case comparison:
3083 case expr:
3084 case xor_expr:
3085 case and_expr:
3086 case shift_expr:
3087 case arith_expr:
3088 case term:
3089 case factor:
3090 case power:
3091 case atom:
3092 if (NCH(n) == 1) {
3093 n = CHILD(n, 0);
3094 goto next;
3095 }
3096 break;
3097
3098 case NAME:
3099 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3100 return 1;
3101 break;
3102
3103 case NUMBER:
3104 v = parsenumber(c, STR(n));
3105 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003106 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003107 break;
3108 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003109 i = PyObject_IsTrue(v);
3110 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003111 return i == 0;
3112
3113 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003114 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003115 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003116 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003117 break;
3118 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003119 i = PyObject_IsTrue(v);
3120 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003121 return i == 0;
3122
3123 }
3124 return 0;
3125}
3126
Tim Peters08a898f2001-06-28 01:52:22 +00003127
3128/* Look under n for a return stmt with an expression.
3129 * This hack is used to find illegal returns under "if 0:" blocks in
3130 * functions already known to be generators (as determined by the symtable
3131 * pass).
3132 * Return the offending return node if found, else NULL.
3133 */
3134static node *
3135look_for_offending_return(node *n)
3136{
3137 int i;
3138
3139 for (i = 0; i < NCH(n); ++i) {
3140 node *kid = CHILD(n, i);
3141
3142 switch (TYPE(kid)) {
3143 case classdef:
3144 case funcdef:
3145 case lambdef:
3146 /* Stuff in nested functions & classes doesn't
3147 affect the code block we started in. */
3148 return NULL;
3149
3150 case return_stmt:
3151 if (NCH(kid) > 1)
3152 return kid;
3153 break;
3154
3155 default: {
3156 node *bad = look_for_offending_return(kid);
3157 if (bad != NULL)
3158 return bad;
3159 }
3160 }
3161 }
3162
3163 return NULL;
3164}
3165
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003166static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003167com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003168{
3169 int i;
3170 int anchor = 0;
3171 REQ(n, if_stmt);
3172 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3173 for (i = 0; i+3 < NCH(n); i+=4) {
3174 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003175 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003176 if (is_constant_false(c, ch)) {
3177 /* We're going to skip this block. However, if this
3178 is a generator, we have to check the dead code
3179 anyway to make sure there aren't any return stmts
3180 with expressions, in the same scope. */
3181 if (c->c_flags & CO_GENERATOR) {
3182 node *p = look_for_offending_return(n);
3183 if (p != NULL) {
3184 int savelineno = c->c_lineno;
3185 c->c_lineno = p->n_lineno;
3186 com_error(c, PyExc_SyntaxError,
3187 "'return' with argument "
3188 "inside generator");
3189 c->c_lineno = savelineno;
3190 }
3191 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003192 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003193 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003194 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003195 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003196 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003197 com_addfwref(c, JUMP_IF_FALSE, &a);
3198 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003199 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003200 com_node(c, CHILD(n, i+3));
3201 com_addfwref(c, JUMP_FORWARD, &anchor);
3202 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003203 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003204 com_addbyte(c, POP_TOP);
3205 }
3206 if (i+2 < NCH(n))
3207 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003208 if (anchor)
3209 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003210}
3211
3212static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003213com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003214{
3215 int break_anchor = 0;
3216 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003217 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003218 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3219 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003220 block_push(c, SETUP_LOOP);
3221 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003222 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003223 com_node(c, CHILD(n, 1));
3224 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3225 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003226 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003227 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003228 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003229 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003230 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3231 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003232 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003233 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003234 com_addbyte(c, POP_TOP);
3235 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003236 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003237 if (NCH(n) > 4)
3238 com_node(c, CHILD(n, 6));
3239 com_backpatch(c, break_anchor);
3240}
3241
3242static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003243com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003244{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003245 int break_anchor = 0;
3246 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003247 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003248 REQ(n, for_stmt);
3249 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3250 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003251 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003252 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003253 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003254 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003255 com_set_lineno(c, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003256 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003257 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003258 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003259 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003260 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003261 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003262 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3263 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003264 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003265 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003266 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003267 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003268 if (NCH(n) > 8)
3269 com_node(c, CHILD(n, 8));
3270 com_backpatch(c, break_anchor);
3271}
3272
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003273/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003274
3275 SETUP_FINALLY L
3276 <code for S>
3277 POP_BLOCK
3278 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003279 L: <code for Sf>
3280 END_FINALLY
3281
3282 The special instructions use the block stack. Each block
3283 stack entry contains the instruction that created it (here
3284 SETUP_FINALLY), the level of the value stack at the time the
3285 block stack entry was created, and a label (here L).
3286
3287 SETUP_FINALLY:
3288 Pushes the current value stack level and the label
3289 onto the block stack.
3290 POP_BLOCK:
3291 Pops en entry from the block stack, and pops the value
3292 stack until its level is the same as indicated on the
3293 block stack. (The label is ignored.)
3294 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003295 Pops a variable number of entries from the *value* stack
3296 and re-raises the exception they specify. The number of
3297 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003298
3299 The block stack is unwound when an exception is raised:
3300 when a SETUP_FINALLY entry is found, the exception is pushed
3301 onto the value stack (and the exception condition is cleared),
3302 and the interpreter jumps to the label gotten from the block
3303 stack.
3304
3305 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003306 (The contents of the value stack is shown in [], with the top
3307 at the right; 'tb' is trace-back info, 'val' the exception's
3308 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003309
3310 Value stack Label Instruction Argument
3311 [] SETUP_EXCEPT L1
3312 [] <code for S>
3313 [] POP_BLOCK
3314 [] JUMP_FORWARD L0
3315
Guido van Rossum3f5da241990-12-20 15:06:42 +00003316 [tb, val, exc] L1: DUP )
3317 [tb, val, exc, exc] <evaluate E1> )
3318 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3319 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3320 [tb, val, exc, 1] POP )
3321 [tb, val, exc] POP
3322 [tb, val] <assign to V1> (or POP if no V1)
3323 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003324 [] <code for S1>
3325 JUMP_FORWARD L0
3326
Guido van Rossum3f5da241990-12-20 15:06:42 +00003327 [tb, val, exc, 0] L2: POP
3328 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003329 .............................etc.......................
3330
Guido van Rossum3f5da241990-12-20 15:06:42 +00003331 [tb, val, exc, 0] Ln+1: POP
3332 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003333
3334 [] L0: <next statement>
3335
3336 Of course, parts are not generated if Vi or Ei is not present.
3337*/
3338
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003339static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003340com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003341{
3342 int except_anchor = 0;
3343 int end_anchor = 0;
3344 int else_anchor = 0;
3345 int i;
3346 node *ch;
3347
3348 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3349 block_push(c, SETUP_EXCEPT);
3350 com_node(c, CHILD(n, 2));
3351 com_addbyte(c, POP_BLOCK);
3352 block_pop(c, SETUP_EXCEPT);
3353 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3354 com_backpatch(c, except_anchor);
3355 for (i = 3;
3356 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3357 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003358 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003359 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003360 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003361 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003362 break;
3363 }
3364 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003365 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003366 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003367 if (NCH(ch) > 1) {
3368 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003369 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003370 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003371 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003372 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003373 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3374 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003375 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003376 }
3377 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003378 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003379 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003380 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003381 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003382 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003383 com_pop(c, 1);
3384 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003385 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003386 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003387 com_node(c, CHILD(n, i+2));
3388 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3389 if (except_anchor) {
3390 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003391 /* We come in with [tb, val, exc, 0] on the
3392 stack; one pop and it's the same as
3393 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003394 com_addbyte(c, POP_TOP);
3395 }
3396 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003397 /* We actually come in here with [tb, val, exc] but the
3398 END_FINALLY will zap those and jump around.
3399 The c_stacklevel does not reflect them so we need not pop
3400 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003401 com_addbyte(c, END_FINALLY);
3402 com_backpatch(c, else_anchor);
3403 if (i < NCH(n))
3404 com_node(c, CHILD(n, i+2));
3405 com_backpatch(c, end_anchor);
3406}
3407
3408static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003409com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003410{
3411 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003412 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003413
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003414 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3415 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003416 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003417 com_addbyte(c, POP_BLOCK);
3418 block_pop(c, SETUP_FINALLY);
3419 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003420 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003421 /* While the generated code pushes only one item,
3422 the try-finally handling can enter here with
3423 up to three items. OK, here are the details:
3424 3 for an exception, 2 for RETURN, 1 for BREAK. */
3425 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003426 com_backpatch(c, finally_anchor);
3427 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003428 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003429 com_node(c, ch);
3430 com_addbyte(c, END_FINALLY);
3431 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003432 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003433}
3434
3435static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003436com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003437{
3438 REQ(n, try_stmt);
3439 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3440 | 'try' ':' suite 'finally' ':' suite */
3441 if (TYPE(CHILD(n, 3)) != except_clause)
3442 com_try_finally(c, n);
3443 else
3444 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003445}
3446
Guido van Rossum8b993a91997-01-17 21:04:03 +00003447static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003448get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003449{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003450 int i;
3451
Guido van Rossum8b993a91997-01-17 21:04:03 +00003452 /* Label to avoid tail recursion */
3453 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003454 switch (TYPE(n)) {
3455
3456 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003457 if (NCH(n) == 1) {
3458 n = CHILD(n, 0);
3459 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003460 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003461 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003462 case file_input:
3463 for (i = 0; i < NCH(n); i++) {
3464 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003465 if (TYPE(ch) == stmt) {
3466 n = ch;
3467 goto next;
3468 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003469 }
3470 break;
3471
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003472 case stmt:
3473 case simple_stmt:
3474 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003475 n = CHILD(n, 0);
3476 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003477
3478 case expr_stmt:
3479 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003480 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003481 case test:
3482 case and_test:
3483 case not_test:
3484 case comparison:
3485 case expr:
3486 case xor_expr:
3487 case and_expr:
3488 case shift_expr:
3489 case arith_expr:
3490 case term:
3491 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003492 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003493 if (NCH(n) == 1) {
3494 n = CHILD(n, 0);
3495 goto next;
3496 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003497 break;
3498
3499 case atom:
3500 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003501 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003502 break;
3503
3504 }
3505 return NULL;
3506}
3507
Guido van Rossum79f25d91997-04-29 20:08:16 +00003508static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003509get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003510{
Guido van Rossum541563e1999-01-28 15:08:09 +00003511 /* Don't generate doc-strings if run with -OO */
3512 if (Py_OptimizeFlag > 1)
3513 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003514 n = get_rawdocstring(n);
3515 if (n == NULL)
3516 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003517 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003518}
3519
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003520static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003521com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003522{
3523 REQ(n, suite);
3524 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3525 if (NCH(n) == 1) {
3526 com_node(c, CHILD(n, 0));
3527 }
3528 else {
3529 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003530 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003531 node *ch = CHILD(n, i);
3532 if (TYPE(ch) == stmt)
3533 com_node(c, ch);
3534 }
3535 }
3536}
3537
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003538/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003539static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003540com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003541{
3542 int i = c->c_nblocks;
3543 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3544 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3545 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003546 else if (i <= 0) {
3547 /* at the outer level */
3548 com_error(c, PyExc_SyntaxError,
3549 "'continue' not properly in loop");
3550 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003551 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003552 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003553 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003554 if (c->c_block[j] == SETUP_LOOP)
3555 break;
3556 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003557 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003558 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003559 for (; i > j; --i) {
3560 if (c->c_block[i] == SETUP_EXCEPT ||
3561 c->c_block[i] == SETUP_FINALLY) {
3562 com_addoparg(c, CONTINUE_LOOP,
3563 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003564 return;
3565 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003566 if (c->c_block[i] == END_FINALLY) {
3567 com_error(c, PyExc_SyntaxError,
3568 "'continue' not supported inside 'finally' clause");
3569 return;
3570 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003571 }
3572 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003573 com_error(c, PyExc_SyntaxError,
3574 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003575 }
3576 /* XXX Could allow it inside a 'finally' clause
3577 XXX if we could pop the exception still on the stack */
3578}
3579
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003580static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003581com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003582{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003583 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003584 if (TYPE(n) == lambdef) {
3585 /* lambdef: 'lambda' [varargslist] ':' test */
3586 n = CHILD(n, 1);
3587 }
3588 else {
3589 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3590 n = CHILD(n, 2);
3591 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3592 n = CHILD(n, 1);
3593 }
3594 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003595 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003596 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003597 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003598 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3599 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003600 nargs = 0;
3601 ndefs = 0;
3602 for (i = 0; i < nch; i++) {
3603 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003604 if (TYPE(CHILD(n, i)) == STAR ||
3605 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003606 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003607 nargs++;
3608 i++;
3609 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003610 t = RPAR; /* Anything except EQUAL or COMMA */
3611 else
3612 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003613 if (t == EQUAL) {
3614 i++;
3615 ndefs++;
3616 com_node(c, CHILD(n, i));
3617 i++;
3618 if (i >= nch)
3619 break;
3620 t = TYPE(CHILD(n, i));
3621 }
3622 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003623 /* Treat "(a=1, b)" as an error */
3624 if (ndefs)
3625 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003626 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003627 }
3628 if (t != COMMA)
3629 break;
3630 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003631 return ndefs;
3632}
3633
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003634static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003635com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003636{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003637 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003638 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003639 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003640 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003641 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3642 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003643 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003644 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003645 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003646 c->c_errors++;
3647 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003648 int closure = com_make_closure(c, (PyCodeObject *)co);
3649 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003650 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003651 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003652 if (closure)
3653 com_addoparg(c, MAKE_CLOSURE, ndefs);
3654 else
3655 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003656 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003657 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003658 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003659 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003660 }
3661}
3662
3663static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003664com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003665{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003666 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003667 REQ(n, testlist);
3668 /* testlist: test (',' test)* [','] */
3669 for (i = 0; i < NCH(n); i += 2)
3670 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003671 i = (NCH(n)+1) / 2;
3672 com_addoparg(c, BUILD_TUPLE, i);
3673 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003674}
3675
3676static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003677com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003678{
Guido van Rossum25831651993-05-19 14:50:45 +00003679 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003680 PyObject *v;
3681 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003682 char *name;
3683
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003684 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003685 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003686 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003687 c->c_errors++;
3688 return;
3689 }
3690 /* Push the class name on the stack */
3691 i = com_addconst(c, v);
3692 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003693 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003694 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003695 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003696 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003697 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003698 com_push(c, 1);
3699 }
Guido van Rossum25831651993-05-19 14:50:45 +00003700 else
3701 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003702 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003703 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003704 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003705 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003706 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003707 c->c_errors++;
3708 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003709 int closure = com_make_closure(c, co);
3710 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003711 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003712 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003713 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003714 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003715 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003716 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003717 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003718 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003719 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003720 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003721 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003722 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003723 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003724 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003725}
3726
3727static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003728com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003729{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003730 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003731 if (c->c_errors)
3732 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003733 switch (TYPE(n)) {
3734
3735 /* Definition nodes */
3736
3737 case funcdef:
3738 com_funcdef(c, n);
3739 break;
3740 case classdef:
3741 com_classdef(c, n);
3742 break;
3743
3744 /* Trivial parse tree nodes */
3745
3746 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003747 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003748 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003749 n = CHILD(n, 0);
3750 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003751
3752 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003753 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003754 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003755 {
3756 int i;
3757 for (i = 0; i < NCH(n)-1; i += 2)
3758 com_node(c, CHILD(n, i));
3759 }
3760 break;
3761
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003762 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003763 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003764 n = CHILD(n, 0);
3765 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003766
3767 /* Statement nodes */
3768
3769 case expr_stmt:
3770 com_expr_stmt(c, n);
3771 break;
3772 case print_stmt:
3773 com_print_stmt(c, n);
3774 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003775 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003776 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003777 break;
3778 case pass_stmt:
3779 break;
3780 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003781 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003782 com_error(c, PyExc_SyntaxError,
3783 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003784 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003785 com_addbyte(c, BREAK_LOOP);
3786 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003787 case continue_stmt:
3788 com_continue_stmt(c, n);
3789 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003790 case return_stmt:
3791 com_return_stmt(c, n);
3792 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003793 case yield_stmt:
3794 com_yield_stmt(c, n);
3795 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003796 case raise_stmt:
3797 com_raise_stmt(c, n);
3798 break;
3799 case import_stmt:
3800 com_import_stmt(c, n);
3801 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003802 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003803 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003804 case exec_stmt:
3805 com_exec_stmt(c, n);
3806 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003807 case assert_stmt:
3808 com_assert_stmt(c, n);
3809 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003810 case if_stmt:
3811 com_if_stmt(c, n);
3812 break;
3813 case while_stmt:
3814 com_while_stmt(c, n);
3815 break;
3816 case for_stmt:
3817 com_for_stmt(c, n);
3818 break;
3819 case try_stmt:
3820 com_try_stmt(c, n);
3821 break;
3822 case suite:
3823 com_suite(c, n);
3824 break;
3825
3826 /* Expression nodes */
3827
3828 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003829 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00003830 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003831 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003832 break;
3833 case test:
3834 com_test(c, n);
3835 break;
3836 case and_test:
3837 com_and_test(c, n);
3838 break;
3839 case not_test:
3840 com_not_test(c, n);
3841 break;
3842 case comparison:
3843 com_comparison(c, n);
3844 break;
3845 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003846 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003847 break;
3848 case expr:
3849 com_expr(c, n);
3850 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003851 case xor_expr:
3852 com_xor_expr(c, n);
3853 break;
3854 case and_expr:
3855 com_and_expr(c, n);
3856 break;
3857 case shift_expr:
3858 com_shift_expr(c, n);
3859 break;
3860 case arith_expr:
3861 com_arith_expr(c, n);
3862 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003863 case term:
3864 com_term(c, n);
3865 break;
3866 case factor:
3867 com_factor(c, n);
3868 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003869 case power:
3870 com_power(c, n);
3871 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003872 case atom:
3873 com_atom(c, n);
3874 break;
3875
3876 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003877 com_error(c, PyExc_SystemError,
3878 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003879 }
3880}
3881
Tim Petersdbd9ba62000-07-09 03:09:57 +00003882static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003883
3884static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003885com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003886{
3887 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3888 if (TYPE(CHILD(n, 0)) == LPAR)
3889 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003890 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003891 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003892 com_pop(c, 1);
3893 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003894}
3895
3896static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003897com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003898{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003899 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003900 if (NCH(n) == 1) {
3901 com_fpdef(c, CHILD(n, 0));
3902 }
3903 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003904 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003905 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003906 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003907 for (i = 0; i < NCH(n); i += 2)
3908 com_fpdef(c, CHILD(n, i));
3909 }
3910}
3911
3912static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003913com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003914{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003915 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003916 int complex = 0;
Barry Warsaw8f6d8682001-11-28 21:10:39 +00003917 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003918 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003919 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003920 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003921 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003922 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003923 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003924 node *ch = CHILD(n, i);
3925 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003926 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003927 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003928 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3929 fp = CHILD(ch, 0);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00003930 if (TYPE(fp) != NAME) {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00003931 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003932 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003933 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003934 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003935 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003936 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003937 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003938 ch = CHILD(n, i);
3939 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003940 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003941 else
3942 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003943 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003944 if (complex) {
3945 /* Generate code for complex arguments only after
3946 having counted the simple arguments */
3947 int ilocal = 0;
3948 for (i = 0; i < nch; i++) {
3949 node *ch = CHILD(n, i);
3950 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003951 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003952 break;
3953 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3954 fp = CHILD(ch, 0);
3955 if (TYPE(fp) != NAME) {
3956 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003957 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003958 com_fpdef(c, ch);
3959 }
3960 ilocal++;
3961 if (++i >= nch)
3962 break;
3963 ch = CHILD(n, i);
3964 if (TYPE(ch) == EQUAL)
3965 i += 2;
3966 else
3967 REQ(ch, COMMA);
3968 }
3969 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003970}
3971
3972static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003973com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003974{
3975 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003976 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003977 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003978 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003979 if (doc != NULL) {
3980 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003981 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003982 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003983 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003984 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003985 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003986 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003987 for (i = 0; i < NCH(n); i++) {
3988 node *ch = CHILD(n, i);
3989 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3990 com_node(c, ch);
3991 }
3992}
3993
3994/* Top-level compile-node interface */
3995
3996static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003997compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003998{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003999 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004000 node *ch;
4001 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00004002 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004003 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004004 if (doc != NULL) {
4005 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004006 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004007 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004008 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004009 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004010 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
4011 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004012 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004013 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004014 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004015 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004016 c->c_infunction = 0;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004017 com_addbyte(c, RETURN_NONE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004018}
4019
4020static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004021compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004022{
Guido van Rossum590baa41993-11-30 13:40:46 +00004023 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004024 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004025 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004026
4027 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004028 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004029 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004030 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004031 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004032 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004033 else
4034 ch = CHILD(n, 2);
4035 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004036 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004037 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004038}
4039
4040static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004041compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004042{
4043 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004044 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004045 REQ(n, classdef);
4046 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4047 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004048 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004049 /* Initialize local __module__ from global __name__ */
4050 com_addop_name(c, LOAD_GLOBAL, "__name__");
4051 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004052 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004053 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004054 if (doc != NULL) {
4055 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004056 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004057 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004058 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004059 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004060 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004061 }
4062 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004063 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004064 com_node(c, ch);
4065 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004066 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004067 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004068 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004069}
4070
4071static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004072compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004073{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004074 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004075
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004076 switch (TYPE(n)) {
4077
Guido van Rossum4c417781991-01-21 16:09:22 +00004078 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004079 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004080 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004081 n = CHILD(n, 0);
4082 if (TYPE(n) != NEWLINE)
4083 com_node(c, n);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004084 com_addbyte(c, RETURN_NONE);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004085 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004086 break;
4087
Guido van Rossum4c417781991-01-21 16:09:22 +00004088 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004089 com_file_input(c, n);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004090 com_addbyte(c, RETURN_NONE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004091 break;
4092
Guido van Rossum590baa41993-11-30 13:40:46 +00004093 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004094 com_node(c, CHILD(n, 0));
4095 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004096 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004097 break;
4098
Guido van Rossum590baa41993-11-30 13:40:46 +00004099 case lambdef: /* anonymous function definition */
4100 compile_lambdef(c, n);
4101 break;
4102
Guido van Rossum4c417781991-01-21 16:09:22 +00004103 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004104 compile_funcdef(c, n);
4105 break;
4106
Guido van Rossum4c417781991-01-21 16:09:22 +00004107 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004108 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004109 break;
4110
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004111 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004112 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004113 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004114 }
4115}
4116
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004117static PyObject *
4118dict_keys_inorder(PyObject *dict, int offset)
4119{
4120 PyObject *tuple, *k, *v;
4121 int i, pos = 0, size = PyDict_Size(dict);
4122
4123 tuple = PyTuple_New(size);
4124 if (tuple == NULL)
4125 return NULL;
4126 while (PyDict_Next(dict, &pos, &k, &v)) {
4127 i = PyInt_AS_LONG(v);
4128 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004129 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004130 PyTuple_SET_ITEM(tuple, i - offset, k);
4131 }
4132 return tuple;
4133}
4134
Guido van Rossum79f25d91997-04-29 20:08:16 +00004135PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004136PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004137{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004138 return PyNode_CompileFlags(n, filename, NULL);
4139}
4140
4141PyCodeObject *
4142PyNode_CompileFlags(node *n, char *filename, PyCompilerFlags *flags)
4143{
4144 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004145}
4146
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004147struct symtable *
4148PyNode_CompileSymtable(node *n, char *filename)
4149{
4150 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004151 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004152
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004153 ff = PyNode_Future(n, filename);
4154 if (ff == NULL)
4155 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004156
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004157 st = symtable_init();
Tim Peters8c5e4152001-11-04 19:26:58 +00004158 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004159 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004160 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004161 }
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004162 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004163 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004164 if (st->st_errors > 0)
4165 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004166 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004167 if (st->st_errors > 0)
4168 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004169
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004170 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004171 fail:
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004172 PyObject_FREE((void *)ff);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004173 st->st_future = NULL;
4174 PySymtable_Free(st);
4175 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004176}
4177
Guido van Rossum79f25d91997-04-29 20:08:16 +00004178static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004179icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004180{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004181 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004182}
4183
Guido van Rossum79f25d91997-04-29 20:08:16 +00004184static PyCodeObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004185jcompile(node *n, char *filename, struct compiling *base,
4186 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004187{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004188 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004189 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004190 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004191 return NULL;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004192 if (TYPE(n) == encoding_decl) {
4193 sc.c_encoding = STR(n);
4194 n = CHILD(n, 0);
4195 } else {
4196 sc.c_encoding = NULL;
4197 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004198 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004199 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004200 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004201 /* c_symtable still points to parent's symbols */
4202 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004203 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004204 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004205 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004206 if (base->c_encoding != NULL) {
4207 assert(sc.c_encoding == NULL);
4208 sc.c_encoding = base->c_encoding;
4209 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004210 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004211 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004212 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004213 if (sc.c_future == NULL) {
4214 com_free(&sc);
4215 return NULL;
4216 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004217 if (flags) {
4218 int merged = sc.c_future->ff_features |
4219 flags->cf_flags;
4220 sc.c_future->ff_features = merged;
4221 flags->cf_flags = merged;
4222 }
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004223 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004224 com_free(&sc);
4225 return NULL;
4226 }
4227 }
4228 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004229 if (symtable_load_symbols(&sc) < 0) {
4230 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004231 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004232 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004233 compile_node(&sc, n);
4234 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004235 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004236 PyObject *consts, *names, *varnames, *filename, *name,
4237 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004238 consts = PyList_AsTuple(sc.c_consts);
4239 names = PyList_AsTuple(sc.c_names);
4240 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004241 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4242 freevars = dict_keys_inorder(sc.c_freevars,
4243 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004244 filename = PyString_InternFromString(sc.c_filename);
4245 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004246 if (!PyErr_Occurred())
4247 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004248 sc.c_nlocals,
4249 sc.c_maxstacklevel,
4250 sc.c_flags,
4251 sc.c_code,
4252 consts,
4253 names,
4254 varnames,
4255 freevars,
4256 cellvars,
4257 filename,
4258 name,
4259 sc.c_firstlineno,
4260 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004261 Py_XDECREF(consts);
4262 Py_XDECREF(names);
4263 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004264 Py_XDECREF(freevars);
4265 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004266 Py_XDECREF(filename);
4267 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004268 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004269 else if (!PyErr_Occurred()) {
4270 /* This could happen if someone called PyErr_Clear() after an
4271 error was reported above. That's not supposed to happen,
4272 but I just plugged one case and I'm not sure there can't be
4273 others. In that case, raise SystemError so that at least
4274 it gets reported instead dumping core. */
4275 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4276 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004277 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004278 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004279 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004280 sc.c_symtable = NULL;
4281 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004282 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004283 return co;
4284}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004285
4286int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004287PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004288{
4289 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004290 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004291 int line = co->co_firstlineno;
4292 int addr = 0;
4293 while (--size >= 0) {
4294 addr += *p++;
4295 if (addr > addrq)
4296 break;
4297 line += *p++;
4298 }
4299 return line;
4300}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004301
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004302/* The test for LOCAL must come before the test for FREE in order to
4303 handle classes where name is both local and free. The local var is
4304 a method and the free var is a free var referenced within a method.
4305*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004306
4307static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004308get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004309{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004310 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004311 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004312
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004313 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4314 return CELL;
4315 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4316 return LOCAL;
4317 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4318 return FREE;
4319 v = PyDict_GetItemString(c->c_globals, name);
4320 if (v) {
4321 if (v == Py_None)
4322 return GLOBAL_EXPLICIT;
4323 else {
4324 return GLOBAL_IMPLICIT;
4325 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004326 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004327 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004328 "unknown scope for %.100s in %.100s(%s) "
4329 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4330 name, c->c_name,
4331 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4332 c->c_filename,
4333 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4334 PyObject_REPR(c->c_locals),
4335 PyObject_REPR(c->c_globals)
4336 );
4337
4338 Py_FatalError(buf);
4339 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004340}
4341
Guido van Rossum207fda62001-03-02 03:30:41 +00004342/* Helper functions to issue warnings */
4343
4344static int
4345issue_warning(char *msg, char *filename, int lineno)
4346{
4347 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4348 lineno, NULL, NULL) < 0) {
4349 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4350 PyErr_SetString(PyExc_SyntaxError, msg);
4351 PyErr_SyntaxLocation(filename, lineno);
4352 }
4353 return -1;
4354 }
4355 return 0;
4356}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004357
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004358static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004359symtable_warn(struct symtable *st, char *msg)
4360{
Guido van Rossum207fda62001-03-02 03:30:41 +00004361 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004362 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004363 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004364 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004365 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004366}
4367
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004368/* Helper function for setting lineno and filename */
4369
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004370static int
4371symtable_build(struct compiling *c, node *n)
4372{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004373 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004374 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004375 c->c_symtable->st_future = c->c_future;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004376 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004377 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4378 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004379 return -1;
4380 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004381 if (c->c_symtable->st_errors > 0)
4382 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004383 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004384 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004385 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004386 return 0;
4387}
4388
4389static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004390symtable_init_compiling_symbols(struct compiling *c)
4391{
4392 PyObject *varnames;
4393
4394 varnames = c->c_symtable->st_cur->ste_varnames;
4395 if (varnames == NULL) {
4396 varnames = PyList_New(0);
4397 if (varnames == NULL)
4398 return -1;
4399 c->c_symtable->st_cur->ste_varnames = varnames;
4400 Py_INCREF(varnames);
4401 } else
4402 Py_INCREF(varnames);
4403 c->c_varnames = varnames;
4404
4405 c->c_globals = PyDict_New();
4406 if (c->c_globals == NULL)
4407 return -1;
4408 c->c_freevars = PyDict_New();
4409 if (c->c_freevars == NULL)
4410 return -1;
4411 c->c_cellvars = PyDict_New();
4412 if (c->c_cellvars == NULL)
4413 return -1;
4414 return 0;
4415}
4416
4417struct symbol_info {
4418 int si_nlocals;
4419 int si_ncells;
4420 int si_nfrees;
4421 int si_nimplicit;
4422};
4423
4424static void
4425symtable_init_info(struct symbol_info *si)
4426{
4427 si->si_nlocals = 0;
4428 si->si_ncells = 0;
4429 si->si_nfrees = 0;
4430 si->si_nimplicit = 0;
4431}
4432
4433static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004434symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004435 struct symbol_info *si)
4436{
4437 PyObject *dict, *v;
4438
4439 /* Seperate logic for DEF_FREE. If it occurs in a function,
4440 it indicates a local that we must allocate storage for (a
4441 cell var). If it occurs in a class, then the class has a
4442 method and a free variable with the same name.
4443 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004444 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004445 /* If it isn't declared locally, it can't be a cell. */
4446 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4447 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004448 v = PyInt_FromLong(si->si_ncells++);
4449 dict = c->c_cellvars;
4450 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004451 /* If it is free anyway, then there is no need to do
4452 anything here.
4453 */
4454 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004455 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004456 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004457 v = PyInt_FromLong(si->si_nfrees++);
4458 dict = c->c_freevars;
4459 }
4460 if (v == NULL)
4461 return -1;
4462 if (PyDict_SetItem(dict, name, v) < 0) {
4463 Py_DECREF(v);
4464 return -1;
4465 }
4466 Py_DECREF(v);
4467 return 0;
4468}
4469
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004470/* If a variable is a cell and an argument, make sure that appears in
4471 co_cellvars before any variable to its right in varnames.
4472*/
4473
4474
4475static int
4476symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4477 PyObject *varnames, int flags)
4478{
4479 PyObject *v, *w, *d, *list = NULL;
4480 int i, pos;
4481
4482 if (flags & CO_VARARGS)
4483 argcount++;
4484 if (flags & CO_VARKEYWORDS)
4485 argcount++;
4486 for (i = argcount; --i >= 0; ) {
4487 v = PyList_GET_ITEM(varnames, i);
4488 if (PyDict_GetItem(*cellvars, v)) {
4489 if (list == NULL) {
4490 list = PyList_New(1);
4491 if (list == NULL)
4492 return -1;
4493 PyList_SET_ITEM(list, 0, v);
4494 Py_INCREF(v);
4495 } else
4496 PyList_Insert(list, 0, v);
4497 }
4498 }
4499 if (list == NULL || PyList_GET_SIZE(list) == 0)
4500 return 0;
4501 /* There are cellvars that are also arguments. Create a dict
4502 to replace cellvars and put the args at the front.
4503 */
4504 d = PyDict_New();
4505 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4506 v = PyInt_FromLong(i);
4507 if (v == NULL)
4508 goto fail;
4509 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4510 goto fail;
4511 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4512 goto fail;
4513 }
4514 pos = 0;
4515 i = PyList_GET_SIZE(list);
4516 Py_DECREF(list);
4517 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4518 w = PyInt_FromLong(i++); /* don't care about the old key */
4519 if (PyDict_SetItem(d, v, w) < 0) {
4520 Py_DECREF(w);
4521 goto fail;
4522 }
4523 Py_DECREF(w);
4524 }
4525 Py_DECREF(*cellvars);
4526 *cellvars = d;
4527 return 1;
4528 fail:
4529 Py_DECREF(d);
4530 return -1;
4531}
4532
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004533static int
4534symtable_freevar_offsets(PyObject *freevars, int offset)
4535{
4536 PyObject *name, *v;
4537 int pos;
4538
4539 /* The cell vars are the first elements of the closure,
4540 followed by the free vars. Update the offsets in
4541 c_freevars to account for number of cellvars. */
4542 pos = 0;
4543 while (PyDict_Next(freevars, &pos, &name, &v)) {
4544 int i = PyInt_AS_LONG(v) + offset;
4545 PyObject *o = PyInt_FromLong(i);
4546 if (o == NULL)
4547 return -1;
4548 if (PyDict_SetItem(freevars, name, o) < 0) {
4549 Py_DECREF(o);
4550 return -1;
4551 }
4552 Py_DECREF(o);
4553 }
4554 return 0;
4555}
4556
4557static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004558symtable_check_unoptimized(struct compiling *c,
4559 PySymtableEntryObject *ste,
4560 struct symbol_info *si)
4561{
4562 char buf[300];
4563
4564 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4565 || (ste->ste_nested && si->si_nimplicit)))
4566 return 0;
4567
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004568#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4569
4570#define ILLEGAL_IS "is a nested function"
4571
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004572#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004573"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004574
4575#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004576"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004577
4578#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00004579"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004580"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004581
4582 /* XXX perhaps the linenos for these opt-breaking statements
4583 should be stored so the exception can point to them. */
4584
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004585 if (ste->ste_child_free) {
4586 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004587 PyOS_snprintf(buf, sizeof(buf),
4588 ILLEGAL_IMPORT_STAR,
4589 PyString_AS_STRING(ste->ste_name),
4590 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004591 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004592 PyOS_snprintf(buf, sizeof(buf),
4593 ILLEGAL_BARE_EXEC,
4594 PyString_AS_STRING(ste->ste_name),
4595 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004596 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004597 PyOS_snprintf(buf, sizeof(buf),
4598 ILLEGAL_EXEC_AND_IMPORT_STAR,
4599 PyString_AS_STRING(ste->ste_name),
4600 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004601 }
4602 } else {
4603 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004604 PyOS_snprintf(buf, sizeof(buf),
4605 ILLEGAL_IMPORT_STAR,
4606 PyString_AS_STRING(ste->ste_name),
4607 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004608 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004609 PyOS_snprintf(buf, sizeof(buf),
4610 ILLEGAL_BARE_EXEC,
4611 PyString_AS_STRING(ste->ste_name),
4612 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004613 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004614 PyOS_snprintf(buf, sizeof(buf),
4615 ILLEGAL_EXEC_AND_IMPORT_STAR,
4616 PyString_AS_STRING(ste->ste_name),
4617 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004618 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004619 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004620
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004621 PyErr_SetString(PyExc_SyntaxError, buf);
4622 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4623 ste->ste_opt_lineno);
4624 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004625}
4626
4627static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004628symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4629 struct symbol_info *si)
4630{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004631 if (c->c_future)
4632 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004633 if (ste->ste_generator)
4634 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004635 if (ste->ste_type != TYPE_MODULE)
4636 c->c_flags |= CO_NEWLOCALS;
4637 if (ste->ste_type == TYPE_FUNCTION) {
4638 c->c_nlocals = si->si_nlocals;
4639 if (ste->ste_optimized == 0)
4640 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004641 else if (ste->ste_optimized != OPT_EXEC)
4642 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004643 }
4644 return 0;
4645}
4646
4647static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004648symtable_load_symbols(struct compiling *c)
4649{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004650 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004651 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004652 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004653 PyObject *name, *varnames, *v;
4654 int i, flags, pos;
4655 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004656
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004657 if (implicit == NULL) {
4658 implicit = PyInt_FromLong(1);
4659 if (implicit == NULL)
4660 return -1;
4661 }
4662 v = NULL;
4663
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004664 if (symtable_init_compiling_symbols(c) < 0)
4665 goto fail;
4666 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004667 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004668 si.si_nlocals = PyList_GET_SIZE(varnames);
4669 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004670
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004671 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004672 v = PyInt_FromLong(i);
4673 if (PyDict_SetItem(c->c_locals,
4674 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004675 goto fail;
4676 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004677 }
4678
4679 /* XXX The cases below define the rules for whether a name is
4680 local or global. The logic could probably be clearer. */
4681 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004682 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4683 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004684
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004685 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004686 /* undo the original DEF_FREE */
4687 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004688
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004689 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004690 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004691 2. Free variables in methods that are also class
4692 variables or declared global.
4693 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004694 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004695 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004696
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004697 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004698 c->c_argcount--;
4699 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004700 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004701 c->c_argcount--;
4702 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004703 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004704 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004705 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004706 if (flags & DEF_PARAM) {
4707 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004708 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004709 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004710 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004711 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004712 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004713 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004714 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4715 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004716 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004717 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004718 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4719 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004720 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004721 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004722 if (v == NULL)
4723 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004724 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004725 goto fail;
4726 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004727 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004728 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004729 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004730 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004731 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004732 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004733 if (v == NULL)
4734 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004735 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004736 goto fail;
4737 Py_DECREF(v);
4738 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004739 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004740 if (PyDict_SetItem(c->c_globals, name,
4741 implicit) < 0)
4742 goto fail;
4743 if (st->st_nscopes != 1) {
4744 v = PyInt_FromLong(flags);
4745 if (PyDict_SetItem(st->st_global,
4746 name, v))
4747 goto fail;
4748 Py_DECREF(v);
4749 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004750 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004751 }
4752 }
4753
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004754 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4755
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004756 if (si.si_ncells > 1) { /* one cell is always in order */
4757 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4758 c->c_varnames, c->c_flags) < 0)
4759 return -1;
4760 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004761 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4762 return -1;
4763 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004764 fail:
4765 /* is this always the right thing to do? */
4766 Py_XDECREF(v);
4767 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004768}
4769
4770static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004771symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004772{
4773 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004774
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004775 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004776 if (st == NULL)
4777 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004778 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00004779
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004780 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004781 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004782 goto fail;
4783 if ((st->st_symbols = PyDict_New()) == NULL)
4784 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004785 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004786 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004787 st->st_errors = 0;
4788 st->st_tmpname = 0;
4789 st->st_private = NULL;
4790 return st;
4791 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004792 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004793 return NULL;
4794}
4795
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004796void
4797PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004798{
4799 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004800 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004801 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004802 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004803}
4804
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004805/* When the compiler exits a scope, it must should update the scope's
4806 free variable information with the list of free variables in its
4807 children.
4808
4809 Variables that are free in children and defined in the current
4810 scope are cellvars.
4811
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004812 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004813 false), free variables in children that are not defined here are
4814 implicit globals.
4815
4816*/
4817
4818static int
4819symtable_update_free_vars(struct symtable *st)
4820{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004821 int i, j, def;
4822 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004823 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004824
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004825 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004826 def = DEF_FREE_CLASS;
4827 else
4828 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004829 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004830 int pos = 0;
4831
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004832 if (list)
4833 PyList_SetSlice(list, 0,
4834 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004835 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004836 PyList_GET_ITEM(ste->ste_children, i);
4837 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004838 int flags = PyInt_AS_LONG(o);
4839 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004840 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004841 if (list == NULL) {
4842 list = PyList_New(0);
4843 if (list == NULL)
4844 return -1;
4845 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004846 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004847 if (PyList_Append(list, name) < 0) {
4848 Py_DECREF(list);
4849 return -1;
4850 }
4851 }
4852 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004853 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004854 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004855 v = PyDict_GetItem(ste->ste_symbols, name);
4856 /* If a name N is declared global in scope A and
4857 referenced in scope B contained (perhaps
4858 indirectly) in A and there are no scopes
4859 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004860 is global in B. Unless A is a class scope,
4861 because class scopes are not considered for
4862 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004863 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004864 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004865 int flags = PyInt_AS_LONG(v);
4866 if (flags & DEF_GLOBAL) {
4867 symtable_undo_free(st, child->ste_id,
4868 name);
4869 continue;
4870 }
4871 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004872 if (ste->ste_nested) {
4873 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004874 name, def) < 0) {
4875 Py_DECREF(list);
4876 return -1;
4877 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004878 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004879 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004880 name) < 0) {
4881 Py_DECREF(list);
4882 return -1;
4883 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004884 }
4885 }
4886 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004887
4888 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004889 return 0;
4890}
4891
4892/* If the current scope is a non-nested class or if name is not
4893 defined in the current, non-nested scope, then it is an implicit
4894 global in all nested scopes.
4895*/
4896
4897static int
4898symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4899{
4900 PyObject *o;
4901 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004902 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004903
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004904 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004905 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004906 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004907 if (o == NULL)
4908 return symtable_undo_free(st, child, name);
4909 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004910
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004911 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004912 return symtable_undo_free(st, child, name);
4913 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004914 return symtable_add_def_o(st, ste->ste_symbols,
4915 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004916}
4917
4918static int
4919symtable_undo_free(struct symtable *st, PyObject *id,
4920 PyObject *name)
4921{
4922 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004923 PyObject *info;
4924 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004925
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004926 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4927 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004928 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00004929
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004930 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004931 if (info == NULL)
4932 return 0;
4933 v = PyInt_AS_LONG(info);
4934 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004935 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004936 DEF_FREE_GLOBAL) < 0)
4937 return -1;
4938 } else
4939 /* If the name is defined here or declared global,
4940 then the recursion stops. */
4941 return 0;
4942
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004943 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4944 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004945 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004946 PyList_GET_ITEM(ste->ste_children, i);
4947 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004948 if (x < 0)
4949 return x;
4950 }
4951 return 0;
4952}
4953
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004954/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4955 This reference is released when the scope is exited, via the DECREF
4956 in symtable_exit_scope().
4957*/
4958
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004959static int
4960symtable_exit_scope(struct symtable *st)
4961{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004962 int end;
4963
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004964 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004965 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004966 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004967 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004968 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4969 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004970 if (PySequence_DelItem(st->st_stack, end) < 0)
4971 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004972 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004973}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004974
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004975static void
4976symtable_enter_scope(struct symtable *st, char *name, int type,
4977 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004978{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004979 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004980
4981 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004982 prev = st->st_cur;
4983 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4984 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004985 st->st_errors++;
4986 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004987 }
4988 }
Barry Warsaw0372af72001-02-23 18:22:59 +00004989 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004990 PySymtableEntry_New(st, name, type, lineno);
4991 if (strcmp(name, TOP) == 0)
4992 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004993 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004994 if (PyList_Append(prev->ste_children,
4995 (PyObject *)st->st_cur) < 0)
4996 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004997 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004998}
4999
5000static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005001symtable_lookup(struct symtable *st, char *name)
5002{
5003 char buffer[MANGLE_LEN];
5004 PyObject *v;
5005 int flags;
5006
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005007 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005008 name = buffer;
5009 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5010 if (v == NULL) {
5011 if (PyErr_Occurred())
5012 return -1;
5013 else
5014 return 0;
5015 }
5016
5017 flags = PyInt_AS_LONG(v);
5018 return flags;
5019}
5020
5021static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005022symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005023{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005024 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005025 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005026 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005027
Guido van Rossumb7164622002-08-16 02:48:11 +00005028 /* Warn about None, except inside a tuple (where the assignment
5029 code already issues a warning). */
5030 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5031 *name == 'N' && strcmp(name, "None") == 0)
5032 {
5033 if (symtable_warn(st, "argument named None"))
5034 return -1;
5035 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005036 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005037 name = buffer;
5038 if ((s = PyString_InternFromString(name)) == NULL)
5039 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005040 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5041 Py_DECREF(s);
5042 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005043}
5044
5045/* Must only be called with mangled names */
5046
5047static int
5048symtable_add_def_o(struct symtable *st, PyObject *dict,
5049 PyObject *name, int flag)
5050{
5051 PyObject *o;
5052 int val;
5053
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005054 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005055 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005056 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005057 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005058 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005059 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005060 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005061 return -1;
5062 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005063 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005064 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005065 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005066 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005067 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005068 Py_DECREF(o);
5069 return -1;
5070 }
5071 Py_DECREF(o);
5072
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005073 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005074 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005075 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005076 } else if (flag & DEF_GLOBAL) {
5077 /* XXX need to update DEF_GLOBAL for other flags too;
5078 perhaps only DEF_FREE_GLOBAL */
5079 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005080 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005081 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005082 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005083 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005084 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005085 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005086 Py_DECREF(o);
5087 return -1;
5088 }
5089 Py_DECREF(o);
5090 }
5091 return 0;
5092}
5093
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005094#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005095
Tim Peters08a898f2001-06-28 01:52:22 +00005096/* Look for a yield stmt under n. Return 1 if found, else 0.
5097 This hack is used to look inside "if 0:" blocks (which are normally
5098 ignored) in case those are the only places a yield occurs (so that this
5099 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005100static int
5101look_for_yield(node *n)
5102{
5103 int i;
5104
5105 for (i = 0; i < NCH(n); ++i) {
5106 node *kid = CHILD(n, i);
5107
5108 switch (TYPE(kid)) {
5109
5110 case classdef:
5111 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005112 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005113 /* Stuff in nested functions and classes can't make
5114 the parent a generator. */
5115 return 0;
5116
5117 case yield_stmt:
5118 return 1;
5119
5120 default:
5121 if (look_for_yield(kid))
5122 return 1;
5123 }
5124 }
5125 return 0;
5126}
5127
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005128static void
5129symtable_node(struct symtable *st, node *n)
5130{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005131 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005132
5133 loop:
5134 switch (TYPE(n)) {
5135 case funcdef: {
5136 char *func_name = STR(CHILD(n, 1));
5137 symtable_add_def(st, func_name, DEF_LOCAL);
5138 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005139 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005140 symtable_funcdef(st, n);
5141 symtable_exit_scope(st);
5142 break;
5143 }
5144 case lambdef:
5145 if (NCH(n) == 4)
5146 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005147 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005148 symtable_funcdef(st, n);
5149 symtable_exit_scope(st);
5150 break;
5151 case classdef: {
5152 char *tmp, *class_name = STR(CHILD(n, 1));
5153 symtable_add_def(st, class_name, DEF_LOCAL);
5154 if (TYPE(CHILD(n, 2)) == LPAR) {
5155 node *bases = CHILD(n, 3);
5156 int i;
5157 for (i = 0; i < NCH(bases); i += 2) {
5158 symtable_node(st, CHILD(bases, i));
5159 }
5160 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005161 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005162 tmp = st->st_private;
5163 st->st_private = class_name;
5164 symtable_node(st, CHILD(n, NCH(n) - 1));
5165 st->st_private = tmp;
5166 symtable_exit_scope(st);
5167 break;
5168 }
5169 case if_stmt:
5170 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005171 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5172 if (st->st_cur->ste_generator == 0)
5173 st->st_cur->ste_generator =
5174 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005175 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005176 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005177 symtable_node(st, CHILD(n, i + 1));
5178 symtable_node(st, CHILD(n, i + 3));
5179 }
5180 if (i + 2 < NCH(n))
5181 symtable_node(st, CHILD(n, i + 2));
5182 break;
5183 case global_stmt:
5184 symtable_global(st, n);
5185 break;
5186 case import_stmt:
5187 symtable_import(st, n);
5188 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005189 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005190 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005191 symtable_node(st, CHILD(n, 1));
5192 if (NCH(n) > 2)
5193 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005194 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005195 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005196 st->st_cur->ste_opt_lineno = n->n_lineno;
5197 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005198 if (NCH(n) > 4)
5199 symtable_node(st, CHILD(n, 5));
5200 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005201
5202 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005203 case assert_stmt:
5204 if (Py_OptimizeFlag)
5205 return;
5206 if (NCH(n) == 2) {
5207 n = CHILD(n, 1);
5208 goto loop;
5209 } else {
5210 symtable_node(st, CHILD(n, 1));
5211 n = CHILD(n, 3);
5212 goto loop;
5213 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005214 case except_clause:
5215 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005216 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005217 if (NCH(n) > 1) {
5218 n = CHILD(n, 1);
5219 goto loop;
5220 }
5221 break;
5222 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005223 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005224 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005225 case yield_stmt:
5226 st->st_cur->ste_generator = 1;
5227 n = CHILD(n, 1);
5228 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005229 case expr_stmt:
5230 if (NCH(n) == 1)
5231 n = CHILD(n, 0);
5232 else {
5233 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005234 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005235 symtable_node(st, CHILD(n, 2));
5236 break;
5237 } else {
5238 int i;
5239 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005240 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005241 n = CHILD(n, NCH(n) - 1);
5242 }
5243 }
5244 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005245 case list_iter:
5246 n = CHILD(n, 0);
5247 if (TYPE(n) == list_for) {
5248 st->st_tmpname++;
5249 symtable_list_comprehension(st, n);
5250 st->st_tmpname--;
5251 } else {
5252 REQ(n, list_if);
5253 symtable_node(st, CHILD(n, 1));
5254 if (NCH(n) == 3) {
5255 n = CHILD(n, 2);
5256 goto loop;
5257 }
5258 }
5259 break;
5260 case for_stmt:
5261 symtable_assign(st, CHILD(n, 1), 0);
5262 for (i = 3; i < NCH(n); ++i)
5263 if (TYPE(CHILD(n, i)) >= single_input)
5264 symtable_node(st, CHILD(n, i));
5265 break;
5266 /* The remaining cases fall through to default except in
5267 special circumstances. This requires the individual cases
5268 to be coded with great care, even though they look like
5269 rather innocuous. Each case must double-check TYPE(n).
5270 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005271 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005272 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005273 n = CHILD(n, 2);
5274 goto loop;
5275 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005276 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005277 case listmaker:
5278 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00005279 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005280 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00005281 symtable_node(st, CHILD(n, 0));
5282 st->st_tmpname--;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005283 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005284 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005285 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005286 case atom:
5287 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5288 symtable_add_use(st, STR(CHILD(n, 0)));
5289 break;
5290 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005291 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005292 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005293 /* Walk over every non-token child with a special case
5294 for one child.
5295 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005296 if (NCH(n) == 1) {
5297 n = CHILD(n, 0);
5298 goto loop;
5299 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005300 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005301 if (TYPE(CHILD(n, i)) >= single_input)
5302 symtable_node(st, CHILD(n, i));
5303 }
5304}
5305
5306static void
5307symtable_funcdef(struct symtable *st, node *n)
5308{
5309 node *body;
5310
5311 if (TYPE(n) == lambdef) {
5312 if (NCH(n) == 4)
5313 symtable_params(st, CHILD(n, 1));
5314 } else
5315 symtable_params(st, CHILD(n, 2));
5316 body = CHILD(n, NCH(n) - 1);
5317 symtable_node(st, body);
5318}
5319
5320/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00005321 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005322 which are references in the defining scope. symtable_params()
5323 parses the parameter names, which are defined in the function's
5324 body.
5325
5326 varargslist:
5327 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5328 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5329*/
5330
5331static void
5332symtable_default_args(struct symtable *st, node *n)
5333{
5334 node *c;
5335 int i;
5336
5337 if (TYPE(n) == parameters) {
5338 n = CHILD(n, 1);
5339 if (TYPE(n) == RPAR)
5340 return;
5341 }
5342 REQ(n, varargslist);
5343 for (i = 0; i < NCH(n); i += 2) {
5344 c = CHILD(n, i);
5345 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5346 break;
5347 }
5348 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5349 symtable_node(st, CHILD(n, i));
5350 }
5351}
5352
5353static void
5354symtable_params(struct symtable *st, node *n)
5355{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005356 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005357 node *c = NULL;
5358
5359 if (TYPE(n) == parameters) {
5360 n = CHILD(n, 1);
5361 if (TYPE(n) == RPAR)
5362 return;
5363 }
5364 REQ(n, varargslist);
5365 for (i = 0; i < NCH(n); i += 2) {
5366 c = CHILD(n, i);
5367 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5368 ext = 1;
5369 break;
5370 }
5371 if (TYPE(c) == test) {
5372 continue;
5373 }
5374 if (TYPE(CHILD(c, 0)) == NAME)
5375 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
5376 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005377 char nbuf[30];
5378 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005379 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005380 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005381 }
5382 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005383 if (ext) {
5384 c = CHILD(n, i);
5385 if (TYPE(c) == STAR) {
5386 i++;
5387 symtable_add_def(st, STR(CHILD(n, i)),
5388 DEF_PARAM | DEF_STAR);
5389 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005390 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005391 c = NULL;
5392 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005393 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005394 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005395 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005396 i++;
5397 symtable_add_def(st, STR(CHILD(n, i)),
5398 DEF_PARAM | DEF_DOUBLESTAR);
5399 }
5400 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005401 if (complex >= 0) {
5402 int j;
5403 for (j = 0; j <= complex; j++) {
5404 c = CHILD(n, j);
5405 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005406 c = CHILD(n, ++j);
5407 else if (TYPE(c) == EQUAL)
5408 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005409 if (TYPE(CHILD(c, 0)) == LPAR)
5410 symtable_params_fplist(st, CHILD(c, 1));
5411 }
5412 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005413}
5414
5415static void
5416symtable_params_fplist(struct symtable *st, node *n)
5417{
5418 int i;
5419 node *c;
5420
5421 REQ(n, fplist);
5422 for (i = 0; i < NCH(n); i += 2) {
5423 c = CHILD(n, i);
5424 REQ(c, fpdef);
5425 if (NCH(c) == 1)
5426 symtable_add_def(st, STR(CHILD(c, 0)),
5427 DEF_PARAM | DEF_INTUPLE);
5428 else
5429 symtable_params_fplist(st, CHILD(c, 1));
5430 }
5431
5432}
5433
5434static void
5435symtable_global(struct symtable *st, node *n)
5436{
5437 int i;
5438
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005439 /* XXX It might be helpful to warn about module-level global
5440 statements, but it's hard to tell the difference between
5441 module-level and a string passed to exec.
5442 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005443
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005444 for (i = 1; i < NCH(n); i += 2) {
5445 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005446 int flags;
5447
5448 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005449 if (flags < 0)
5450 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005451 if (flags && flags != DEF_GLOBAL) {
5452 char buf[500];
5453 if (flags & DEF_PARAM) {
5454 PyErr_Format(PyExc_SyntaxError,
5455 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005456 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005457 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005458 st->st_cur->ste_lineno);
5459 st->st_errors++;
5460 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005461 }
5462 else {
5463 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005464 PyOS_snprintf(buf, sizeof(buf),
5465 GLOBAL_AFTER_ASSIGN,
5466 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005467 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005468 PyOS_snprintf(buf, sizeof(buf),
5469 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005470 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005471 }
5472 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005473 symtable_add_def(st, name, DEF_GLOBAL);
5474 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005475}
5476
5477static void
5478symtable_list_comprehension(struct symtable *st, node *n)
5479{
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005480 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005481
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005482 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005483 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005484 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005485 symtable_node(st, CHILD(n, 3));
5486 if (NCH(n) == 5)
5487 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005488}
5489
5490static void
5491symtable_import(struct symtable *st, node *n)
5492{
5493 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005494 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005495 | 'from' dotted_name 'import'
5496 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005497 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005498 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005499 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005500 node *dotname = CHILD(n, 1);
5501 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5502 /* check for bogus imports */
5503 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5504 PyErr_SetString(PyExc_SyntaxError,
5505 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005506 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005507 n->n_lineno);
5508 st->st_errors++;
5509 return;
5510 }
5511 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005512 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005513 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005514 if (symtable_warn(st,
5515 "import * only allowed at module level") < 0)
5516 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005517 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005518 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005519 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005520 } else {
5521 for (i = 3; i < NCH(n); i += 2) {
5522 node *c = CHILD(n, i);
5523 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005524 symtable_assign(st, CHILD(c, 2),
5525 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005526 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005527 symtable_assign(st, CHILD(c, 0),
5528 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005529 }
5530 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005531 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005532 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005533 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005534 }
5535 }
5536}
5537
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005538/* The third argument to symatble_assign() is a flag to be passed to
5539 symtable_add_def() if it is eventually called. The flag is useful
5540 to specify the particular type of assignment that should be
5541 recorded, e.g. an assignment caused by import.
5542 */
5543
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005544static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005545symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005546{
5547 node *tmp;
5548 int i;
5549
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005550 loop:
5551 switch (TYPE(n)) {
5552 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005553 /* invalid assignment, e.g. lambda x:x=2. The next
5554 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005555 return;
5556 case power:
5557 if (NCH(n) > 2) {
5558 for (i = 2; i < NCH(n); ++i)
5559 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5560 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005561 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005562 if (NCH(n) > 1) {
5563 symtable_node(st, CHILD(n, 0));
5564 symtable_node(st, CHILD(n, 1));
5565 } else {
5566 n = CHILD(n, 0);
5567 goto loop;
5568 }
5569 return;
5570 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005571 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5572 /* XXX This is an error, but the next pass
5573 will catch it. */
5574 return;
5575 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005576 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005577 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005578 }
5579 return;
5580 case exprlist:
5581 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00005582 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005583 if (NCH(n) == 1) {
5584 n = CHILD(n, 0);
5585 goto loop;
5586 }
5587 else {
5588 int i;
5589 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005590 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005591 return;
5592 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005593 case atom:
5594 tmp = CHILD(n, 0);
5595 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5596 n = CHILD(n, 1);
5597 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005598 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00005599 if (strcmp(STR(tmp), "__debug__") == 0) {
5600 PyErr_SetString(PyExc_SyntaxError,
5601 ASSIGN_DEBUG);
5602 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton86424e32001-12-04 02:41:46 +00005603 n->n_lineno);
Jeremy Hylton778e2652001-11-09 19:50:08 +00005604 st->st_errors++;
5605 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005606 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005607 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005608 return;
5609 case dotted_as_name:
5610 if (NCH(n) == 3)
5611 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005612 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005613 else
5614 symtable_add_def(st,
5615 STR(CHILD(CHILD(n,
5616 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005617 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005618 return;
5619 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005620 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005621 return;
5622 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005623 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005624 return;
5625 default:
5626 if (NCH(n) == 0)
5627 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005628 if (NCH(n) == 1) {
5629 n = CHILD(n, 0);
5630 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005631 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005632 /* Should only occur for errors like x + 1 = 1,
5633 which will be caught in the next pass. */
5634 for (i = 0; i < NCH(n); ++i)
5635 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005636 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005637 }
5638}