blob: ab4b533b6baecde150b8aa61ad937c282e4f8d82 [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
Martin v. Löwisdd7eb142003-10-18 22:05:25 +000063#define PARAM_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;
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000107 PyObject *co;
Raymond Hettingercc1798e2003-09-16 04:27:52 +0000108 PyObject *empty = NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000109 PyObject *code;
110 PyObject *consts;
111 PyObject *names;
112 PyObject *varnames;
113 PyObject *freevars = NULL;
114 PyObject *cellvars = NULL;
115 PyObject *filename;
116 PyObject *name;
117 int firstlineno;
118 PyObject *lnotab;
119
120 if (!PyArg_ParseTuple(args, "iiiiSO!O!O!SSiS|O!O!:code",
121 &argcount, &nlocals, &stacksize, &flags,
122 &code,
123 &PyTuple_Type, &consts,
124 &PyTuple_Type, &names,
125 &PyTuple_Type, &varnames,
126 &filename, &name,
127 &firstlineno, &lnotab,
128 &PyTuple_Type, &freevars,
129 &PyTuple_Type, &cellvars))
130 return NULL;
131
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000132 if (!PyObject_CheckReadBuffer(code)) {
133 PyErr_SetString(PyExc_TypeError,
134 "bytecode object must be a single-segment read-only buffer");
135 return NULL;
136 }
137
Raymond Hettingercc1798e2003-09-16 04:27:52 +0000138 if (freevars == NULL || cellvars == NULL) {
139 empty = PyTuple_New(0);
140 if (empty == NULL)
141 return NULL;
142 if (freevars == NULL)
143 freevars = empty;
144 if (cellvars == NULL)
145 cellvars = empty;
146 }
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000147
148 co = (PyObject *) PyCode_New(argcount, nlocals, stacksize, flags,
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000149 code, consts, names, varnames,
150 freevars, cellvars, filename, name,
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000151 firstlineno, lnotab);
Raymond Hettingercc1798e2003-09-16 04:27:52 +0000152 Py_XDECREF(empty);
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000153 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000154}
155
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000156static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000157code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000158{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000159 Py_XDECREF(co->co_code);
160 Py_XDECREF(co->co_consts);
161 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000162 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000163 Py_XDECREF(co->co_freevars);
164 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000165 Py_XDECREF(co->co_filename);
166 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000167 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000168 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000169}
170
Guido van Rossum79f25d91997-04-29 20:08:16 +0000171static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000172code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000173{
174 char buf[500];
175 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000176 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000177 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000178
Guido van Rossuma396a882000-04-07 01:21:36 +0000179 if (co->co_firstlineno != 0)
180 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000181 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000182 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000183 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000184 name = PyString_AS_STRING(co->co_name);
Barry Warsaw8f6d8682001-11-28 21:10:39 +0000185 PyOS_snprintf(buf, sizeof(buf),
186 "<code object %.100s at %p, file \"%.300s\", line %d>",
187 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000188 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000189}
190
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000191static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000192code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000193{
194 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000195 cmp = PyObject_Compare(co->co_name, cp->co_name);
196 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000197 cmp = co->co_argcount - cp->co_argcount;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000198 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000199 cmp = co->co_nlocals - cp->co_nlocals;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000200 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000201 cmp = co->co_flags - cp->co_flags;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000202 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000203 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000204 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000205 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000206 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000207 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000208 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000209 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000210 if (cmp) return cmp;
211 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
212 if (cmp) return cmp;
213 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000214 return cmp;
215}
216
217static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000218code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000219{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000220 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000221 h0 = PyObject_Hash(co->co_name);
222 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000223 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000224 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000225 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000226 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000227 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000228 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000229 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000230 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000231 h5 = PyObject_Hash(co->co_freevars);
232 if (h5 == -1) return -1;
233 h6 = PyObject_Hash(co->co_cellvars);
234 if (h6 == -1) return -1;
235 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000236 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000237 if (h == -1) h = -2;
238 return h;
239}
240
Jeremy Hylton78891072001-03-01 06:09:34 +0000241/* XXX code objects need to participate in GC? */
242
Guido van Rossum79f25d91997-04-29 20:08:16 +0000243PyTypeObject PyCode_Type = {
244 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000245 0,
246 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000247 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000248 0,
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000249 (destructor)code_dealloc, /* tp_dealloc */
250 0, /* tp_print */
251 0, /* tp_getattr */
252 0, /* tp_setattr */
253 (cmpfunc)code_compare, /* tp_compare */
254 (reprfunc)code_repr, /* tp_repr */
255 0, /* tp_as_number */
256 0, /* tp_as_sequence */
257 0, /* tp_as_mapping */
258 (hashfunc)code_hash, /* tp_hash */
259 0, /* tp_call */
260 0, /* tp_str */
261 PyObject_GenericGetAttr, /* tp_getattro */
262 0, /* tp_setattro */
263 0, /* tp_as_buffer */
264 Py_TPFLAGS_DEFAULT, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000265 code_doc, /* tp_doc */
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000266 0, /* tp_traverse */
267 0, /* tp_clear */
268 0, /* tp_richcompare */
269 0, /* tp_weaklistoffset */
270 0, /* tp_iter */
271 0, /* tp_iternext */
272 0, /* tp_methods */
273 code_memberlist, /* tp_members */
274 0, /* tp_getset */
275 0, /* tp_base */
276 0, /* tp_dict */
277 0, /* tp_descr_get */
278 0, /* tp_descr_set */
279 0, /* tp_dictoffset */
280 0, /* tp_init */
281 0, /* tp_alloc */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000282 code_new, /* tp_new */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000283};
284
Guido van Rossum644a12b1997-04-09 19:24:53 +0000285#define NAME_CHARS \
286 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
287
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000288/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
289
290static int
291all_name_chars(unsigned char *s)
292{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000293 static char ok_name_char[256];
294 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000295
Guido van Rossumcd90c202001-02-09 15:06:42 +0000296 if (ok_name_char[*name_chars] == 0) {
297 unsigned char *p;
298 for (p = name_chars; *p; p++)
299 ok_name_char[*p] = 1;
300 }
301 while (*s) {
302 if (ok_name_char[*s++] == 0)
303 return 0;
304 }
305 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000306}
307
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000308static int
309intern_strings(PyObject *tuple)
310{
311 int i;
312
313 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
314 PyObject *v = PyTuple_GET_ITEM(tuple, i);
315 if (v == NULL || !PyString_Check(v)) {
316 Py_FatalError("non-string found in code slot");
317 PyErr_BadInternalCall();
318 return -1;
319 }
320 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
321 }
322 return 0;
323}
324
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000325#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
326#define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD)
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000327#define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE || op==CONTINUE_LOOP)
328#define GETJUMPTGT(arr, i) (GETARG(arr,i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+3))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000329#define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000330#define CODESIZE(op) (HAS_ARG(op) ? 3 : 1)
331#define ISBASICBLOCK(blocks, start, bytes) (blocks[start]==blocks[start+bytes-1])
332
333static unsigned int *
334markblocks(unsigned char *code, int len)
335{
336 unsigned int *blocks = PyMem_Malloc(len*sizeof(int));
337 int i,j, opcode, oldblock, newblock, blockcnt = 0;
338
339 if (blocks == NULL)
340 return NULL;
341 memset(blocks, 0, len*sizeof(int));
342 for (i=0 ; i<len ; i+=CODESIZE(opcode)) {
343 opcode = code[i];
344 switch (opcode) {
345 case FOR_ITER:
346 case JUMP_FORWARD:
347 case JUMP_IF_FALSE:
348 case JUMP_IF_TRUE:
349 case JUMP_ABSOLUTE:
350 case CONTINUE_LOOP:
351 case SETUP_LOOP:
352 case SETUP_EXCEPT:
353 case SETUP_FINALLY:
354 j = GETJUMPTGT(code, i);
355 oldblock = blocks[j];
356 newblock = ++blockcnt;
357 for (; j<len ; j++) {
358 if (blocks[j] != (unsigned)oldblock)
359 break;
360 blocks[j] = newblock;
361 }
362 break;
363 }
364 }
365 return blocks;
366}
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000367
368static PyObject *
369optimize_code(PyObject *code, PyObject* consts)
370{
371 int i, j, codelen;
372 int tgt, tgttgt, opcode;
373 unsigned char *codestr;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000374 unsigned int *blocks;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000375
376 /* Make a modifiable copy of the code string */
377 if (!PyString_Check(code))
378 goto exitUnchanged;
379 codelen = PyString_Size(code);
380 codestr = PyMem_Malloc(codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000381 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000382 goto exitUnchanged;
383 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000384 blocks = markblocks(codestr, codelen);
385 if (blocks == NULL) {
386 PyMem_Free(codestr);
387 goto exitUnchanged;
388 }
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000389 assert(PyTuple_Check(consts));
390
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000391 for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000392 opcode = codestr[i];
393 switch (opcode) {
394
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000395 /* Replace UNARY_NOT JUMP_IF_FALSE with NOP JUMP_IF_TRUE */
396 case UNARY_NOT:
397 if (codestr[i+1] != JUMP_IF_FALSE ||
398 codestr[i+4] != POP_TOP ||
399 !ISBASICBLOCK(blocks,i,5))
400 continue;
401 tgt = GETJUMPTGT(codestr, (i+1));
402 if (codestr[tgt] != POP_TOP)
403 continue;
404 codestr[i] = NOP;
405 codestr[i+1] = JUMP_IF_TRUE;
406 break;
407
408 /* not a is b --> a is not b
409 not a in b --> a not in b
410 not a is not b --> a is b
411 not a not in b --> a in b */
412 case COMPARE_OP:
413 j = GETARG(codestr, i);
414 if (j < 6 || j > 9 ||
415 codestr[i+3] != UNARY_NOT ||
416 !ISBASICBLOCK(blocks,i,4))
417 continue;
418 SETARG(codestr, i, (j^1));
419 codestr[i+3] = NOP;
420 break;
421
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000422 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP.
423 Note, only the first opcode is changed, the others still
424 perform normally if they happen to be jump targets. */
425 case LOAD_CONST:
426 j = GETARG(codestr, i);
427 if (codestr[i+3] != JUMP_IF_FALSE ||
428 codestr[i+6] != POP_TOP ||
429 !PyObject_IsTrue(PyTuple_GET_ITEM(consts, j)))
430 continue;
431 codestr[i] = JUMP_FORWARD;
432 SETARG(codestr, i, 4);
433 break;
434
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000435 /* Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2 JMP+2 NOP NOP.
436 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2 JMP+1 NOP. */
437 case BUILD_TUPLE:
438 case BUILD_LIST:
439 if (codestr[i+3] != UNPACK_SEQUENCE)
440 continue;
441 if (!ISBASICBLOCK(blocks,i,6))
442 continue;
443 if (GETARG(codestr, i) == 2 && \
444 GETARG(codestr, i+3) == 2) {
445 codestr[i] = ROT_TWO;
446 codestr[i+1] = JUMP_FORWARD;
447 SETARG(codestr, i+1, 2);
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000448 codestr[i+4] = NOP;
449 codestr[i+5] = NOP;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000450 continue;
451 }
452 if (GETARG(codestr, i) == 3 && \
453 GETARG(codestr, i+3) == 3) {
454 codestr[i] = ROT_THREE;
455 codestr[i+1] = ROT_TWO;
456 codestr[i+2] = JUMP_FORWARD;
457 SETARG(codestr, i+2, 1);
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000458 codestr[i+5] = NOP;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000459 }
460 break;
461
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000462 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000463 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000464 case JUMP_FORWARD:
465 case JUMP_IF_FALSE:
466 case JUMP_IF_TRUE:
467 case JUMP_ABSOLUTE:
468 case CONTINUE_LOOP:
469 case SETUP_LOOP:
470 case SETUP_EXCEPT:
471 case SETUP_FINALLY:
472 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000473 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000474 continue;
475 tgttgt = GETJUMPTGT(codestr, tgt);
476 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
477 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000478 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000479 tgttgt -= i + 3; /* Calc relative jump addr */
480 if (tgttgt < 0) /* No backward relative jumps */
481 continue;
482 codestr[i] = opcode;
483 SETARG(codestr, i, tgttgt);
484 break;
485
486 case EXTENDED_ARG:
487 PyMem_Free(codestr);
488 goto exitUnchanged;
489 }
490 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000491 code = PyString_FromStringAndSize((char *)codestr, codelen);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000492 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000493 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000494 return code;
495
496exitUnchanged:
497 Py_INCREF(code);
498 return code;
499}
500
Guido van Rossum79f25d91997-04-29 20:08:16 +0000501PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000502PyCode_New(int argcount, int nlocals, int stacksize, int flags,
503 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000504 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
505 PyObject *filename, PyObject *name, int firstlineno,
506 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000507{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000508 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000509 int i;
510 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000511 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000512 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000513 consts == NULL || !PyTuple_Check(consts) ||
514 names == NULL || !PyTuple_Check(names) ||
515 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000516 freevars == NULL || !PyTuple_Check(freevars) ||
517 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000518 name == NULL || !PyString_Check(name) ||
519 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000520 lnotab == NULL || !PyString_Check(lnotab) ||
521 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000522 PyErr_BadInternalCall();
523 return NULL;
524 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000525 intern_strings(names);
526 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000527 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000528 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000529 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000530 for (i = PyTuple_Size(consts); --i >= 0; ) {
531 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000532 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000533 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000534 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000535 continue;
536 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000537 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000538 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000539 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000540 co->co_argcount = argcount;
541 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000542 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000543 co->co_flags = flags;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000544 co->co_code = optimize_code(code, consts);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000545 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000546 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000547 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000548 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000549 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000550 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000551 Py_INCREF(freevars);
552 co->co_freevars = freevars;
553 Py_INCREF(cellvars);
554 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000555 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000556 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000557 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000558 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000559 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000560 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000561 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000562 if (PyTuple_GET_SIZE(freevars) == 0 &&
563 PyTuple_GET_SIZE(cellvars) == 0)
564 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000565 }
566 return co;
567}
568
569
570/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000571
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000572/* The compiler uses two passes to generate bytecodes. The first pass
573 builds the symbol table. The second pass generates the bytecode.
574
575 The first pass uses a single symtable struct. The second pass uses
576 a compiling struct for each code block. The compiling structs
577 share a reference to the symtable.
578
579 The two passes communicate via symtable_load_symbols() and via
580 is_local() and is_global(). The former initializes several slots
581 in the compiling struct: c_varnames, c_locals, c_nlocals,
582 c_argcount, c_globals, and c_flags.
583*/
584
Tim Peters2a7f3842001-06-09 09:26:21 +0000585/* All about c_lnotab.
586
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000587c_lnotab is an array of unsigned bytes disguised as a Python string. Since
588version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
589mapped to source code line #s via c_lnotab instead.
590
Tim Peters2a7f3842001-06-09 09:26:21 +0000591The array is conceptually a list of
592 (bytecode offset increment, line number increment)
593pairs. The details are important and delicate, best illustrated by example:
594
595 byte code offset source code line number
596 0 1
597 6 2
598 50 7
599 350 307
600 361 308
601
602The first trick is that these numbers aren't stored, only the increments
603from one row to the next (this doesn't really work, but it's a start):
604
605 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
606
607The second trick is that an unsigned byte can't hold negative values, or
608values larger than 255, so (a) there's a deep assumption that byte code
609offsets and their corresponding line #s both increase monotonically, and (b)
610if at least one column jumps by more than 255 from one row to the next, more
611than one pair is written to the table. In case #b, there's no way to know
612from looking at the table later how many were written. That's the delicate
613part. A user of c_lnotab desiring to find the source line number
614corresponding to a bytecode address A should do something like this
615
616 lineno = addr = 0
617 for addr_incr, line_incr in c_lnotab:
618 addr += addr_incr
619 if addr > A:
620 return lineno
621 lineno += line_incr
622
623In order for this to work, when the addr field increments by more than 255,
624the line # increment in each pair generated must be 0 until the remaining addr
625increment is < 256. So, in the example above, com_set_lineno should not (as
626was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
627255, 0, 45, 255, 0, 45.
628*/
629
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000630struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000631 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000632 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000633 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000634 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000635 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +0000636 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000637 PyObject *c_locals; /* dictionary (value=localID) */
638 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000639 PyObject *c_freevars; /* dictionary (value=None) */
640 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000641 int c_nlocals; /* index of next local */
642 int c_argcount; /* number of top-level arguments */
643 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000644 int c_nexti; /* index into c_code */
645 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000646 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000647 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000648 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000649 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000650 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000651 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +0000652 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000653 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000654 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000655 int c_stacklevel; /* Current stack level */
656 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000657 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000658 PyObject *c_lnotab; /* Table mapping address to line number */
Armin Rigo80d937e2004-03-22 17:52:53 +0000659 int c_last_addr; /* last op addr seen and recorded in lnotab */
660 int c_last_line; /* last line seen and recorded in lnotab */
661 int c_lnotab_next; /* current length of lnotab */
662 int c_lnotab_last; /* start of last lnotab record added */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000663 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000664 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000665 int c_nested; /* Is block nested funcdef or lamdef? */
666 int c_closure; /* Is nested w/freevars? */
667 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000668 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000669 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000670};
671
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000672static int
673is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000674{
675 if ((v & (USE | DEF_FREE))
676 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
677 return 1;
678 if (v & DEF_FREE_CLASS)
679 return 1;
680 return 0;
681}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000682
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000683static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000684com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000685{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000686 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
687
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000688 if (c == NULL) {
689 /* Error occurred via symtable call to
690 is_constant_false */
691 PyErr_SetString(exc, msg);
692 return;
693 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000694 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000695 if (c->c_lineno < 1 || c->c_interactive) {
696 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000697 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000698 return;
699 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000700 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000701 if (v == NULL)
702 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000703
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000704 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000705 if (line == NULL) {
706 Py_INCREF(Py_None);
707 line = Py_None;
708 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000709 if (exc == PyExc_SyntaxError) {
710 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
711 Py_None, line);
712 if (t == NULL)
713 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000714 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000715 if (w == NULL)
716 goto exit;
717 PyErr_SetObject(exc, w);
718 } else {
719 /* Make sure additional exceptions are printed with
720 file and line, also. */
721 PyErr_SetObject(exc, v);
722 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
723 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000724 exit:
725 Py_XDECREF(t);
726 Py_XDECREF(v);
727 Py_XDECREF(w);
728 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000729}
730
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000731/* Interface to the block stack */
732
733static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000734block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000735{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000736 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000737 com_error(c, PyExc_SystemError,
738 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000739 }
740 else {
741 c->c_block[c->c_nblocks++] = type;
742 }
743}
744
745static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000746block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000747{
748 if (c->c_nblocks > 0)
749 c->c_nblocks--;
750 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000751 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000752 }
753}
754
Guido van Rossum681d79a1995-07-18 14:51:37 +0000755/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000756
Martin v. Löwis95292d62002-12-11 14:04:59 +0000757static int issue_warning(const char *, const char *, int);
758static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000759static void com_free(struct compiling *);
760static void com_push(struct compiling *, int);
761static void com_pop(struct compiling *, int);
762static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000763static void com_node(struct compiling *, node *);
764static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000765static void com_addbyte(struct compiling *, int);
766static void com_addint(struct compiling *, int);
767static void com_addoparg(struct compiling *, int, int);
768static void com_addfwref(struct compiling *, int, int *);
769static void com_backpatch(struct compiling *, int);
770static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
771static int com_addconst(struct compiling *, PyObject *);
772static int com_addname(struct compiling *, PyObject *);
773static void com_addopname(struct compiling *, int, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000774static void com_test(struct compiling *c, node *n);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000775static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000776static void com_list_iter(struct compiling *, node *, node *, char *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000777static void com_gen_iter(struct compiling *, node *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000778static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000779static void com_assign(struct compiling *, node *, int, node *);
780static void com_assign_name(struct compiling *, node *, int);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000781static int com_make_closure(struct compiling *c, PyCodeObject *co);
782
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000783static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +0000784static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000785 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000786static PyObject *parsestrplus(struct compiling*, node *);
787static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000788static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000789
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000790static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000791
792/* symtable operations */
Raymond Hettinger354433a2004-05-19 08:20:33 +0000793static int symtable_lookup(struct symtable *st, char *name);
Jeremy Hylton1955fcf2003-07-15 20:23:26 +0000794static struct symtable *symtable_build(node *, PyFutureFeatures *,
795 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000796static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000797static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000798static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000799static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000800static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000801static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000802
803static void symtable_node(struct symtable *, node *);
804static void symtable_funcdef(struct symtable *, node *);
805static void symtable_default_args(struct symtable *, node *);
806static void symtable_params(struct symtable *, node *);
807static void symtable_params_fplist(struct symtable *, node *n);
808static void symtable_global(struct symtable *, node *);
809static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000810static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000811static void symtable_list_comprehension(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000812static void symtable_generator_expression(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +0000813static void symtable_list_for(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000814static void symtable_gen_for(struct symtable *, node *, int);
815static void symtable_gen_iter(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000816
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000817static int symtable_update_free_vars(struct symtable *);
818static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
819static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
820
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000821/* helper */
822static void
823do_pad(int pad)
824{
825 int i;
826 for (i = 0; i < pad; ++i)
827 fprintf(stderr, " ");
828}
829
830static void
831dump(node *n, int pad, int depth)
832{
833 int i;
834 if (depth == 0)
835 return;
836 do_pad(pad);
837 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
838 if (depth > 0)
839 depth--;
840 for (i = 0; i < NCH(n); ++i)
841 dump(CHILD(n, i), pad + 1, depth);
842}
843
844#define DUMP(N) dump(N, 0, -1)
845
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000846static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000847com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000848{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000849 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000850 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
851 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000852 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000853 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000854 goto fail;
855 if ((c->c_const_dict = PyDict_New()) == NULL)
856 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000857 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000858 goto fail;
859 if ((c->c_name_dict = PyDict_New()) == NULL)
860 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000861 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000862 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000863 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
864 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000865 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000866 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000867 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000868 c->c_freevars = NULL;
869 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000870 c->c_nlocals = 0;
871 c->c_argcount = 0;
872 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000873 c->c_nexti = 0;
874 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000875 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000876 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000877 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000878 c->c_begin = 0;
879 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000880 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000881 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000882 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000883 c->c_stacklevel = 0;
884 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000885 c->c_firstlineno = 0;
886 c->c_last_addr = 0;
887 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000888 c->c_lnotab_next = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +0000889 c->c_lnotab_last = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000890 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000891 c->c_nested = 0;
892 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000893 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000894 return 1;
895
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000896 fail:
897 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000898 return 0;
899}
900
901static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000902com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000903{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000904 Py_XDECREF(c->c_code);
905 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000906 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000907 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000908 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000909 Py_XDECREF(c->c_globals);
910 Py_XDECREF(c->c_locals);
911 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000912 Py_XDECREF(c->c_freevars);
913 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000914 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000915 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +0000916 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000917}
918
919static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000920com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000921{
922 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000923 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +0000924 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000925 /*
926 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
927 c->c_filename, c->c_name, c->c_lineno,
928 c->c_nexti, c->c_stacklevel, n);
929 */
930 }
Guido van Rossum8b993a91997-01-17 21:04:03 +0000931}
932
933static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000934com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000935{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000936 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000937 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000938 else
939 c->c_stacklevel -= n;
940}
941
942static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000943com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000944{
945 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000946 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000947 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000948 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000949}
950
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000951static int
952com_check_size(PyObject **s, int offset)
953{
954 int len = PyString_GET_SIZE(*s);
955 if (offset >= len)
956 return _PyString_Resize(s, len * 2);
957 return 0;
958}
959
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000960static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000961com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000962{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000963 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000964 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +0000965 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000966 if (com_check_size(&c->c_code, c->c_nexti)) {
967 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000968 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000969 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000970 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000971}
972
973static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000974com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000975{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000976 com_addbyte(c, x & 0xff);
977 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000978}
979
980static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000981com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000982{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000983 char *p;
984 if (c->c_lnotab == NULL)
985 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000986 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
987 c->c_errors++;
988 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000989 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000990 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000991 *p++ = addr;
992 *p++ = line;
993 c->c_lnotab_next += 2;
994}
995
996static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000997com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000998{
999 c->c_lineno = lineno;
1000 if (c->c_firstlineno == 0) {
1001 c->c_firstlineno = c->c_last_line = lineno;
1002 }
1003 else {
1004 int incr_addr = c->c_nexti - c->c_last_addr;
1005 int incr_line = lineno - c->c_last_line;
Armin Rigo80d937e2004-03-22 17:52:53 +00001006 c->c_lnotab_last = c->c_lnotab_next;
Tim Peters2a7f3842001-06-09 09:26:21 +00001007 while (incr_addr > 255) {
1008 com_add_lnotab(c, 255, 0);
1009 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001010 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001011 while (incr_line > 255) {
1012 com_add_lnotab(c, incr_addr, 255);
1013 incr_line -=255;
1014 incr_addr = 0;
1015 }
1016 if (incr_addr > 0 || incr_line > 0)
1017 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001018 c->c_last_addr = c->c_nexti;
1019 c->c_last_line = lineno;
1020 }
1021}
1022
1023static void
Armin Rigo80d937e2004-03-22 17:52:53 +00001024com_strip_lnotab(struct compiling *c)
1025{
1026 /* strip the last lnotab entry if no opcode were emitted.
1027 * This prevents a line number to be generated on a final
1028 * pass, like in the following example:
1029 *
1030 * if a:
1031 * print 5
1032 * else:
1033 * pass
1034 *
1035 * Without the fix, a line trace event would be generated
1036 * on the pass even if a is true (because of the implicit
1037 * return).
1038 */
1039 if (c->c_nexti == c->c_last_addr && c->c_lnotab_last > 0) {
1040 c->c_lnotab_next = c->c_lnotab_last;
1041 }
1042}
1043
1044static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001045com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001046{
Fred Drakeef8ace32000-08-24 00:32:09 +00001047 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +00001048 if (extended_arg){
1049 com_addbyte(c, EXTENDED_ARG);
1050 com_addint(c, extended_arg);
1051 arg &= 0xffff;
1052 }
Guido van Rossum8e793d91997-03-03 19:13:14 +00001053 com_addbyte(c, op);
1054 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001055}
1056
1057static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001058com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001059{
1060 /* Compile a forward reference for backpatching */
1061 int here;
1062 int anchor;
1063 com_addbyte(c, op);
1064 here = c->c_nexti;
1065 anchor = *p_anchor;
1066 *p_anchor = here;
1067 com_addint(c, anchor == 0 ? 0 : here - anchor);
1068}
1069
1070static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001071com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001072{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001073 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001074 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001075 int dist;
1076 int prev;
1077 for (;;) {
1078 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001079 prev = code[anchor] + (code[anchor+1] << 8);
1080 dist = target - (anchor+2);
1081 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001082 dist >>= 8;
1083 code[anchor+1] = dist;
1084 dist >>= 8;
1085 if (dist) {
1086 com_error(c, PyExc_SystemError,
1087 "com_backpatch: offset too large");
1088 break;
1089 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001090 if (!prev)
1091 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001092 anchor -= prev;
1093 }
1094}
1095
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001096/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001097
1098static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001099com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001100{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001101 PyObject *w, *t, *np=NULL;
1102 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001103
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001104 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001105 if (t == NULL)
1106 goto fail;
1107 w = PyDict_GetItem(dict, t);
1108 if (w != NULL) {
1109 n = PyInt_AsLong(w);
1110 } else {
1111 n = PyList_Size(list);
1112 np = PyInt_FromLong(n);
1113 if (np == NULL)
1114 goto fail;
1115 if (PyList_Append(list, v) != 0)
1116 goto fail;
1117 if (PyDict_SetItem(dict, t, np) != 0)
1118 goto fail;
1119 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001120 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001121 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001122 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001123 fail:
1124 Py_XDECREF(np);
1125 Py_XDECREF(t);
1126 c->c_errors++;
1127 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001128}
1129
1130static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001131com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001132{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001133 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001134}
1135
1136static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001137com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001138{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001139 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001140}
1141
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001142int
1143_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001144{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001145 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001146 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001147 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001148 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1149 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001150 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001151 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001152 return 0; /* Don't mangle __extremely_long_names */
1153 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1154 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001155 /* Strip leading underscores from class name */
1156 while (*p == '_')
1157 p++;
1158 if (*p == '\0')
1159 return 0; /* Don't mangle if class is just underscores */
1160 plen = strlen(p);
1161 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001162 plen = maxlen-nlen-2; /* Truncate class name if too long */
1163 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001164 buffer[0] = '_';
1165 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001166 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001167 return 1;
1168}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001169
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001170static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001171com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001172{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001173 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001174 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001175 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001176
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001177 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001178 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001179 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001180 c->c_errors++;
1181 i = 255;
1182 }
1183 else {
1184 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001185 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001186 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001187 com_addoparg(c, op, i);
1188}
1189
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001190#define NAME_LOCAL 0
1191#define NAME_GLOBAL 1
1192#define NAME_DEFAULT 2
1193#define NAME_CLOSURE 3
1194
1195static int
1196com_lookup_arg(PyObject *dict, PyObject *name)
1197{
1198 PyObject *v = PyDict_GetItem(dict, name);
1199 if (v == NULL)
1200 return -1;
1201 else
1202 return PyInt_AS_LONG(v);
1203}
1204
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001205static int
1206none_assignment_check(struct compiling *c, char *name, int assigning)
1207{
1208 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1209 char *msg;
1210 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001211 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001212 else
1213 msg = "deleting None";
1214 if (issue_warning(msg, c->c_filename, c->c_lineno) < 0) {
1215 c->c_errors++;
1216 return -1;
1217 }
1218 }
1219 return 0;
1220}
1221
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001222static void
1223com_addop_varname(struct compiling *c, int kind, char *name)
1224{
1225 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001226 int i, reftype;
1227 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001228 int op = STOP_CODE;
1229 char buffer[MANGLE_LEN];
1230
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001231 if (kind != VAR_LOAD &&
1232 none_assignment_check(c, name, kind == VAR_STORE))
1233 {
1234 c->c_errors++;
1235 i = 255;
1236 goto done;
1237 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001238 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001239 name = buffer;
1240 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1241 c->c_errors++;
1242 i = 255;
1243 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001244 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001245
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001246 reftype = get_ref_type(c, name);
1247 switch (reftype) {
1248 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001249 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001250 scope = NAME_LOCAL;
1251 break;
1252 case GLOBAL_EXPLICIT:
1253 scope = NAME_GLOBAL;
1254 break;
1255 case GLOBAL_IMPLICIT:
1256 if (c->c_flags & CO_OPTIMIZED)
1257 scope = NAME_GLOBAL;
1258 break;
1259 case FREE:
1260 case CELL:
1261 scope = NAME_CLOSURE;
1262 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001263 }
1264
1265 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001266 if (scope == NAME_LOCAL)
1267 i = com_lookup_arg(c->c_locals, v);
1268 else if (reftype == FREE)
1269 i = com_lookup_arg(c->c_freevars, v);
1270 else if (reftype == CELL)
1271 i = com_lookup_arg(c->c_cellvars, v);
1272 if (i == -1) {
1273 c->c_errors++; /* XXX no exception set */
1274 i = 255;
1275 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001276 }
1277 Py_DECREF(v);
1278
1279 switch (kind) {
1280 case VAR_LOAD:
1281 switch (scope) {
1282 case NAME_LOCAL:
1283 op = LOAD_FAST;
1284 break;
1285 case NAME_GLOBAL:
1286 op = LOAD_GLOBAL;
1287 break;
1288 case NAME_DEFAULT:
1289 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001290 break;
1291 case NAME_CLOSURE:
1292 op = LOAD_DEREF;
1293 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001294 }
1295 break;
1296 case VAR_STORE:
1297 switch (scope) {
1298 case NAME_LOCAL:
1299 op = STORE_FAST;
1300 break;
1301 case NAME_GLOBAL:
1302 op = STORE_GLOBAL;
1303 break;
1304 case NAME_DEFAULT:
1305 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001306 break;
1307 case NAME_CLOSURE:
1308 op = STORE_DEREF;
1309 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001310 }
1311 break;
1312 case VAR_DELETE:
1313 switch (scope) {
1314 case NAME_LOCAL:
1315 op = DELETE_FAST;
1316 break;
1317 case NAME_GLOBAL:
1318 op = DELETE_GLOBAL;
1319 break;
1320 case NAME_DEFAULT:
1321 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001322 break;
1323 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001324 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001325 PyOS_snprintf(buf, sizeof(buf),
1326 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001327 com_error(c, PyExc_SyntaxError, buf);
1328 i = 255;
1329 break;
1330 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001331 }
1332 break;
1333 }
1334done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001335 com_addoparg(c, op, i);
1336}
1337
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001338static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001339com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001340{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001341 char *name;
1342 char buffer[1000];
1343 /* XXX it is possible to write this code without the 1000
1344 chars on the total length of dotted names, I just can't be
1345 bothered right now */
1346 if (TYPE(n) == STAR)
1347 name = "*";
1348 else if (TYPE(n) == dotted_name) {
1349 char *p = buffer;
1350 int i;
1351 name = buffer;
1352 for (i = 0; i < NCH(n); i += 2) {
1353 char *s = STR(CHILD(n, i));
1354 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001355 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001356 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001357 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001358 break;
1359 }
1360 if (p != buffer)
1361 *p++ = '.';
1362 strcpy(p, s);
1363 p = strchr(p, '\0');
1364 }
1365 }
1366 else {
1367 REQ(n, NAME);
1368 name = STR(n);
1369 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001370 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001371}
1372
Guido van Rossum79f25d91997-04-29 20:08:16 +00001373static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001374parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001375{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001376 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001377 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001378 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001379#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001380 int imflag;
1381#endif
1382
Guido van Rossum282914b1991-04-04 10:42:56 +00001383 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001384 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001385#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001386 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001387#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001388 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001389 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001390 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001391 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001392 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001393 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001394 }
1395 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001396 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001397 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001398 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001399 if (errno != 0)
1400 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001401 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001402 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001403 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001404#ifndef WITHOUT_COMPLEX
1405 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001406 Py_complex z;
1407 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001408 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001409 z.imag = PyOS_ascii_atof(s);
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001410 PyFPE_END_PROTECT(z)
1411 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001412 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001413 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001414#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001415 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001416 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001417 dx = PyOS_ascii_atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001418 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001419 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001420 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001421}
1422
Guido van Rossum79f25d91997-04-29 20:08:16 +00001423static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001424decode_utf8(char **sPtr, char *end, char* encoding)
1425{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001426#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001427 Py_FatalError("decode_utf8 should not be called in this build.");
1428 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001429#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001430 PyObject *u, *v;
1431 char *s, *t;
1432 t = s = *sPtr;
1433 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1434 while (s < end && (*s & 0x80)) s++;
1435 *sPtr = s;
1436 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1437 if (u == NULL)
1438 return NULL;
1439 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1440 Py_DECREF(u);
1441 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001442#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001443}
1444
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001445/* compiler.transformer.Transformer.decode_literal depends on what
1446 might seem like minor details of this function -- changes here
1447 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001448static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001449parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001450{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001451 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001452 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001453 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001454 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001455 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001456 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001457 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001458
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001459 if (isalpha(quote) || quote == '_') {
1460 if (quote == 'u' || quote == 'U') {
1461 quote = *++s;
1462 unicode = 1;
1463 }
1464 if (quote == 'r' || quote == 'R') {
1465 quote = *++s;
1466 rawmode = 1;
1467 }
1468 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001469 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001470 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001471 return NULL;
1472 }
1473 s++;
1474 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001475 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001476 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001477 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001478 return NULL;
1479 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001480 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001481 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001482 return NULL;
1483 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001484 if (len >= 4 && s[0] == quote && s[1] == quote) {
1485 s += 2;
1486 len -= 2;
1487 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001488 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001489 return NULL;
1490 }
1491 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001492#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001493 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001494 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001495 char *buf;
1496 char *p;
1497 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001498 if (encoding == NULL) {
1499 buf = s;
1500 u = NULL;
1501 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1502 buf = s;
1503 u = NULL;
1504 } else {
1505 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1506 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1507 if (u == NULL)
1508 return NULL;
1509 p = buf = PyString_AsString(u);
1510 end = s + len;
1511 while (s < end) {
1512 if (*s == '\\') {
1513 *p++ = *s++;
1514 if (*s & 0x80) {
1515 strcpy(p, "u005c");
1516 p += 5;
1517 }
1518 }
1519 if (*s & 0x80) { /* XXX inefficient */
1520 char *r;
1521 int rn, i;
1522 w = decode_utf8(&s, end, "utf-16-be");
1523 if (w == NULL) {
1524 Py_DECREF(u);
1525 return NULL;
1526 }
1527 r = PyString_AsString(w);
1528 rn = PyString_Size(w);
1529 assert(rn % 2 == 0);
1530 for (i = 0; i < rn; i += 2) {
1531 sprintf(p, "\\u%02x%02x",
1532 r[i + 0] & 0xFF,
1533 r[i + 1] & 0xFF);
1534 p += 6;
1535 }
1536 Py_DECREF(w);
1537 } else {
1538 *p++ = *s++;
1539 }
1540 }
1541 len = p - buf;
1542 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001543 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001544 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001545 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001546 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1547 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001548 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001549 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001550 return v;
1551
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001552 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001553#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001554 need_encoding = (encoding != NULL &&
1555 strcmp(encoding, "utf-8") != 0 &&
1556 strcmp(encoding, "iso-8859-1") != 0);
1557 if (rawmode || strchr(s, '\\') == NULL) {
1558 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001559#ifndef Py_USING_UNICODE
1560 /* This should not happen - we never see any other
1561 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001562 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001563#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001564 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1565 if (u == NULL)
1566 return NULL;
1567 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1568 Py_DECREF(u);
1569 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001570#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001571 } else {
1572 return PyString_FromStringAndSize(s, len);
1573 }
1574 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001575
1576 v = PyString_DecodeEscape(s, len, NULL, unicode,
1577 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001578 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001579 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001580 return v;
1581}
1582
Guido van Rossum79f25d91997-04-29 20:08:16 +00001583static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001584parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001585{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001586 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001587 int i;
1588 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001589 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001590 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001591 for (i = 1; i < NCH(n); i++) {
1592 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001593 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001594 if (s == NULL)
1595 goto onError;
1596 if (PyString_Check(v) && PyString_Check(s)) {
1597 PyString_ConcatAndDel(&v, s);
1598 if (v == NULL)
1599 goto onError;
1600 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001601#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001602 else {
1603 PyObject *temp;
1604 temp = PyUnicode_Concat(v, s);
1605 Py_DECREF(s);
1606 if (temp == NULL)
1607 goto onError;
1608 Py_DECREF(v);
1609 v = temp;
1610 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001611#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001612 }
1613 }
1614 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001615
1616 onError:
1617 Py_XDECREF(v);
1618 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001619}
1620
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001621static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001622com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001623{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001624 int anchor = 0;
1625 int save_begin = c->c_begin;
1626
Raymond Hettinger354433a2004-05-19 08:20:33 +00001627 /* list_for: for v in expr [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001628 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001629 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001630 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001631 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001632 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001633 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001634 c->c_loops++;
1635 com_list_iter(c, n, e, t);
1636 c->c_loops--;
1637 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1638 c->c_begin = save_begin;
1639 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001640 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001641}
1642
1643static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001644com_gen_for(struct compiling *c, node *n, node *t, int is_outmost)
1645{
1646 int break_anchor = 0;
1647 int anchor = 0;
1648 int save_begin = c->c_begin;
1649
1650 REQ(n, gen_for);
1651 /* gen_for: for v in test [gen_iter] */
1652
1653 com_addfwref(c, SETUP_LOOP, &break_anchor);
1654 block_push(c, SETUP_LOOP);
1655
1656 if (is_outmost) {
1657 com_addop_varname(c, VAR_LOAD, "[outmost-iterable]");
1658 com_push(c, 1);
1659 }
1660 else {
1661 com_node(c, CHILD(n, 3));
1662 com_addbyte(c, GET_ITER);
1663 }
1664
1665 c->c_begin = c->c_nexti;
1666 com_set_lineno(c, c->c_last_line);
1667 com_addfwref(c, FOR_ITER, &anchor);
1668 com_push(c, 1);
1669 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
1670
1671 if (NCH(n) == 5)
1672 com_gen_iter(c, CHILD(n, 4), t);
1673 else {
1674 com_test(c, t);
1675 com_addbyte(c, YIELD_VALUE);
1676 com_pop(c, 1);
1677 }
1678
1679 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1680 c->c_begin = save_begin;
1681
1682 com_backpatch(c, anchor);
1683 com_pop(c, 1); /* FOR_ITER has popped this */
1684 com_addbyte(c, POP_BLOCK);
1685 block_pop(c, SETUP_LOOP);
1686 com_backpatch(c, break_anchor);
1687}
1688
1689static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001690com_list_if(struct compiling *c, node *n, node *e, char *t)
1691{
1692 int anchor = 0;
1693 int a = 0;
1694 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001695 com_node(c, CHILD(n, 1));
1696 com_addfwref(c, JUMP_IF_FALSE, &a);
1697 com_addbyte(c, POP_TOP);
1698 com_pop(c, 1);
1699 com_list_iter(c, n, e, t);
1700 com_addfwref(c, JUMP_FORWARD, &anchor);
1701 com_backpatch(c, a);
1702 /* We jump here with an extra entry which we now pop */
1703 com_addbyte(c, POP_TOP);
1704 com_backpatch(c, anchor);
1705}
1706
1707static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001708com_gen_if(struct compiling *c, node *n, node *t)
1709{
1710 /* gen_if: 'if' test [gen_iter] */
1711 int anchor = 0;
1712 int a=0;
1713
1714 com_node(c, CHILD(n, 1));
1715 com_addfwref(c, JUMP_IF_FALSE, &a);
1716 com_addbyte(c, POP_TOP);
1717 com_pop(c, 1);
1718
1719 if (NCH(n) == 3)
1720 com_gen_iter(c, CHILD(n, 2), t);
1721 else {
1722 com_test(c, t);
1723 com_addbyte(c, YIELD_VALUE);
1724 com_pop(c, 1);
1725 }
1726 com_addfwref(c, JUMP_FORWARD, &anchor);
1727 com_backpatch(c, a);
1728 /* We jump here with an extra entry which we now pop */
1729 com_addbyte(c, POP_TOP);
1730 com_backpatch(c, anchor);
1731}
1732
1733static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001734com_list_iter(struct compiling *c,
1735 node *p, /* parent of list_iter node */
1736 node *e, /* element expression node */
1737 char *t /* name of result list temp local */)
1738{
1739 /* list_iter is the last child in a listmaker, list_for, or list_if */
1740 node *n = CHILD(p, NCH(p)-1);
1741 if (TYPE(n) == list_iter) {
1742 n = CHILD(n, 0);
1743 switch (TYPE(n)) {
1744 case list_for:
1745 com_list_for(c, n, e, t);
1746 break;
1747 case list_if:
1748 com_list_if(c, n, e, t);
1749 break;
1750 default:
1751 com_error(c, PyExc_SystemError,
1752 "invalid list_iter node type");
1753 }
1754 }
1755 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001756 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001757 com_push(c, 1);
1758 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001759 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001760 com_pop(c, 2);
1761 }
1762}
1763
1764static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001765com_gen_iter(struct compiling *c, node *n, node *t)
1766{
1767 /* gen_iter: gen_for | gen_if */
1768 node *ch;
1769 REQ(n, gen_iter);
1770
1771 ch = CHILD(n, 0);
1772
1773 switch (TYPE(ch)) {
1774 case gen_for:
1775 com_gen_for(c, ch, t, 0);
1776 break;
1777 case gen_if:
1778 com_gen_if(c, ch, t);
1779 break;
1780 default:
1781 com_error(c, PyExc_SystemError,
1782 "invalid gen_iter node type");
1783 }
1784}
1785
1786static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001787com_list_comprehension(struct compiling *c, node *n)
1788{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001789 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001790 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001791
1792 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001793 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001794 com_addoparg(c, BUILD_LIST, 0);
1795 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1796 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001797 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001798 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001799 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001800 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001801 --c->c_tmpname;
1802}
1803
1804static void
1805com_listmaker(struct compiling *c, node *n)
1806{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001807 /* listmaker: test ( list_for | (',' test)* [','] ) */
1808 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001809 com_list_comprehension(c, n);
1810 else {
1811 int len = 0;
1812 int i;
1813 for (i = 0; i < NCH(n); i += 2, len++)
1814 com_node(c, CHILD(n, i));
1815 com_addoparg(c, BUILD_LIST, len);
1816 com_pop(c, len-1);
1817 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001818}
1819
1820static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001821com_generator_expression(struct compiling *c, node *n)
1822{
1823 /* testlist_gexp: test gen_for */
1824 /* argument: test gen_for */
1825 PyCodeObject *co;
1826
1827 REQ(CHILD(n, 0), test);
1828 REQ(CHILD(n, 1), gen_for);
1829
1830 symtable_enter_scope(c->c_symtable, "<genexpr>", TYPE(n),
1831 n->n_lineno);
1832 co = icompile(n, c);
1833 symtable_exit_scope(c->c_symtable);
1834
1835 if (co == NULL)
1836 c->c_errors++;
1837 else {
1838 int closure = com_make_closure(c, co);
1839 int i = com_addconst(c, (PyObject *)co);
1840
1841 com_addoparg(c, LOAD_CONST, i);
1842 com_push(c, 1);
1843 if (closure)
1844 com_addoparg(c, MAKE_CLOSURE, 0);
1845 else
1846 com_addoparg(c, MAKE_FUNCTION, 0);
1847
1848 com_test(c, CHILD(CHILD(n, 1), 3));
1849 com_addbyte(c, GET_ITER);
1850 com_addoparg(c, CALL_FUNCTION, 1);
1851 com_pop(c, 1);
1852
1853 Py_DECREF(co);
1854 }
1855}
1856
1857static void
1858com_testlist_gexp(struct compiling *c, node *n)
1859{
1860 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
1861 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
1862 com_generator_expression(c, n);
1863 else com_list(c, n, 0);
1864}
1865
1866static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001867com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001868{
1869 int i;
1870 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1871 for (i = 0; i+2 < NCH(n); i += 4) {
1872 /* We must arrange things just right for STORE_SUBSCR.
1873 It wants the stack to look like (value) (dict) (key) */
1874 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001875 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001876 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00001877 com_node(c, CHILD(n, i+2)); /* value */
1878 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001879 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001880 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001881 }
1882}
1883
1884static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001885com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001886{
1887 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001888 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001889 int i;
1890 REQ(n, atom);
1891 ch = CHILD(n, 0);
1892 switch (TYPE(ch)) {
1893 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001894 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001895 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001896 com_push(c, 1);
1897 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001898 else
Raymond Hettinger354433a2004-05-19 08:20:33 +00001899 com_testlist_gexp(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001900 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001901 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001902 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001903 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001904 com_push(c, 1);
1905 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001906 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001907 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001908 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001909 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001910 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001911 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001912 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001913 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001914 break;
1915 case BACKQUOTE:
1916 com_node(c, CHILD(n, 1));
1917 com_addbyte(c, UNARY_CONVERT);
1918 break;
1919 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001920 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001921 i = 255;
1922 }
1923 else {
1924 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001925 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001926 }
1927 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001928 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001929 break;
1930 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001931 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001932 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001933 c->c_errors++;
1934 i = 255;
1935 }
1936 else {
1937 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001938 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001939 }
1940 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001941 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001942 break;
1943 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001944 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001945 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001946 break;
1947 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001948 com_error(c, PyExc_SystemError,
1949 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001950 }
1951}
1952
1953static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001954com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001955{
1956 if (NCH(n) == 1) {
1957 com_addbyte(c, op);
1958 }
1959 else if (NCH(n) == 2) {
1960 if (TYPE(CHILD(n, 0)) != COLON) {
1961 com_node(c, CHILD(n, 0));
1962 com_addbyte(c, op+1);
1963 }
1964 else {
1965 com_node(c, CHILD(n, 1));
1966 com_addbyte(c, op+2);
1967 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001968 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001969 }
1970 else {
1971 com_node(c, CHILD(n, 0));
1972 com_node(c, CHILD(n, 2));
1973 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001974 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001975 }
1976}
1977
Guido van Rossum635abd21997-01-06 22:56:52 +00001978static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001979com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1980{
1981 if (NCH(n) == 1) {
1982 com_addbyte(c, DUP_TOP);
1983 com_push(c, 1);
1984 com_addbyte(c, SLICE);
1985 com_node(c, augn);
1986 com_addbyte(c, opcode);
1987 com_pop(c, 1);
1988 com_addbyte(c, ROT_TWO);
1989 com_addbyte(c, STORE_SLICE);
1990 com_pop(c, 2);
1991 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1992 com_node(c, CHILD(n, 0));
1993 com_addoparg(c, DUP_TOPX, 2);
1994 com_push(c, 2);
1995 com_addbyte(c, SLICE+1);
1996 com_pop(c, 1);
1997 com_node(c, augn);
1998 com_addbyte(c, opcode);
1999 com_pop(c, 1);
2000 com_addbyte(c, ROT_THREE);
2001 com_addbyte(c, STORE_SLICE+1);
2002 com_pop(c, 3);
2003 } else if (NCH(n) == 2) {
2004 com_node(c, CHILD(n, 1));
2005 com_addoparg(c, DUP_TOPX, 2);
2006 com_push(c, 2);
2007 com_addbyte(c, SLICE+2);
2008 com_pop(c, 1);
2009 com_node(c, augn);
2010 com_addbyte(c, opcode);
2011 com_pop(c, 1);
2012 com_addbyte(c, ROT_THREE);
2013 com_addbyte(c, STORE_SLICE+2);
2014 com_pop(c, 3);
2015 } else {
2016 com_node(c, CHILD(n, 0));
2017 com_node(c, CHILD(n, 2));
2018 com_addoparg(c, DUP_TOPX, 3);
2019 com_push(c, 3);
2020 com_addbyte(c, SLICE+3);
2021 com_pop(c, 2);
2022 com_node(c, augn);
2023 com_addbyte(c, opcode);
2024 com_pop(c, 1);
2025 com_addbyte(c, ROT_FOUR);
2026 com_addbyte(c, STORE_SLICE+3);
2027 com_pop(c, 4);
2028 }
2029}
2030
2031static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002032com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002033{
2034 node *m;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002035 REQ(n, argument); /* [test '='] test [gen_for]; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00002036 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00002037 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002038 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00002039 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002040 }
2041 else {
2042 com_node(c, CHILD(n, 0));
2043 }
Guido van Rossum635abd21997-01-06 22:56:52 +00002044 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002045 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00002046 if (NCH(n) == 2) {
2047 com_generator_expression(c, n);
2048 return;
2049 }
2050
Guido van Rossumf10570b1995-07-07 22:53:21 +00002051 m = n;
2052 do {
2053 m = CHILD(m, 0);
2054 } while (NCH(m) == 1);
2055 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00002056 /* f(lambda x: x[0] = 3) ends up getting parsed with
2057 * LHS test = lambda x: x[0], and RHS test = 3.
2058 * SF bug 132313 points out that complaining about a keyword
2059 * then is very confusing.
2060 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002061 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00002062 TYPE(m) == lambdef ?
2063 "lambda cannot contain assignment" :
2064 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002065 }
2066 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002067 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00002068 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00002069 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002070 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002071 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002072 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002073 else if (*pkeywords == NULL) {
2074 c->c_errors++;
2075 Py_DECREF(v);
2076 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002077 if (PyDict_GetItem(*pkeywords, v) != NULL)
2078 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00002079 "duplicate keyword argument");
2080 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002081 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00002082 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002083 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002084 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002085 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002086 }
2087 }
2088 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002089}
2090
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002091static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002092com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002093{
2094 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00002095 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002096 }
2097 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002098 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00002099 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00002100 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00002101 int star_flag = 0;
2102 int starstar_flag = 0;
2103 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002104 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002105 na = 0;
2106 nk = 0;
2107 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00002108 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00002109 if (TYPE(ch) == STAR ||
2110 TYPE(ch) == DOUBLESTAR)
2111 break;
Guido van Rossumca906051998-12-10 16:56:22 +00002112 if (ch->n_lineno != lineno) {
2113 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002114 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00002115 }
2116 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00002117 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002118 na++;
2119 else
2120 nk++;
2121 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002122 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00002123 while (i < NCH(n)) {
2124 node *tok = CHILD(n, i);
2125 node *ch = CHILD(n, i+1);
2126 i += 3;
2127 switch (TYPE(tok)) {
2128 case STAR: star_flag = 1; break;
2129 case DOUBLESTAR: starstar_flag = 1; break;
2130 }
2131 com_node(c, ch);
2132 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002133 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002134 com_error(c, PyExc_SyntaxError,
2135 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002136 }
Jeremy Hylton76901512000-03-28 23:49:17 +00002137 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00002138 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00002139 star_flag + (starstar_flag << 1);
2140 else
2141 opcode = CALL_FUNCTION;
2142 com_addoparg(c, opcode, na | (nk << 8));
2143 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002144 }
2145}
2146
2147static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002148com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002149{
2150 com_addopname(c, LOAD_ATTR, n);
2151}
2152
2153static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002154com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002155{
2156 int i=0;
2157 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00002158 node *ch;
2159
2160 /* first argument */
2161 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002162 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002163 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002164 i++;
2165 }
2166 else {
2167 com_node(c, CHILD(n,i));
2168 i++;
2169 REQ(CHILD(n,i),COLON);
2170 i++;
2171 }
2172 /* second argument */
2173 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
2174 com_node(c, CHILD(n,i));
2175 i++;
2176 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002177 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002178 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002179 com_push(c, 1);
2180 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002181 /* remaining arguments */
2182 for (; i < NCH(n); i++) {
2183 ns++;
2184 ch=CHILD(n,i);
2185 REQ(ch, sliceop);
2186 if (NCH(ch) == 1) {
2187 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002188 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002189 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002190 }
2191 else
2192 com_node(c, CHILD(ch,1));
2193 }
2194 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002195 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002196}
2197
2198static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002199com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002200{
2201 node *ch;
2202 REQ(n, subscript);
2203 ch = CHILD(n,0);
2204 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002205 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002206 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002207 com_push(c, 1);
2208 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002209 else {
2210 /* check for slice */
2211 if ((TYPE(ch) == COLON || NCH(n) > 1))
2212 com_sliceobj(c, n);
2213 else {
2214 REQ(ch, test);
2215 com_node(c, ch);
2216 }
2217 }
2218}
2219
2220static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002221com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002222{
2223 int i, op;
2224 REQ(n, subscriptlist);
2225 /* Check to make backward compatible slice behavior for '[i:j]' */
2226 if (NCH(n) == 1) {
2227 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002228 /* 'Basic' slice, should have exactly one colon. */
2229 if ((TYPE(CHILD(sub, 0)) == COLON
2230 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2231 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2232 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002233 switch (assigning) {
2234 case OP_DELETE:
2235 op = DELETE_SLICE;
2236 break;
2237 case OP_ASSIGN:
2238 op = STORE_SLICE;
2239 break;
2240 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002241 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002242 break;
2243 default:
2244 com_augassign_slice(c, sub, assigning, augn);
2245 return;
2246 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002247 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002248 if (op == STORE_SLICE)
2249 com_pop(c, 2);
2250 else if (op == DELETE_SLICE)
2251 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002252 return;
2253 }
2254 }
2255 /* Else normal subscriptlist. Compile each subscript. */
2256 for (i = 0; i < NCH(n); i += 2)
2257 com_subscript(c, CHILD(n, i));
2258 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002259 if (NCH(n) > 1) {
2260 i = (NCH(n)+1) / 2;
2261 com_addoparg(c, BUILD_TUPLE, i);
2262 com_pop(c, i-1);
2263 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002264 switch (assigning) {
2265 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002266 op = DELETE_SUBSCR;
2267 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002268 break;
2269 default:
2270 case OP_ASSIGN:
2271 op = STORE_SUBSCR;
2272 i = 3;
2273 break;
2274 case OP_APPLY:
2275 op = BINARY_SUBSCR;
2276 i = 1;
2277 break;
2278 }
2279 if (assigning > OP_APPLY) {
2280 com_addoparg(c, DUP_TOPX, 2);
2281 com_push(c, 2);
2282 com_addbyte(c, BINARY_SUBSCR);
2283 com_pop(c, 1);
2284 com_node(c, augn);
2285 com_addbyte(c, assigning);
2286 com_pop(c, 1);
2287 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002288 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002289 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002290 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002291}
2292
2293static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002294com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002295{
2296 REQ(n, trailer);
2297 switch (TYPE(CHILD(n, 0))) {
2298 case LPAR:
2299 com_call_function(c, CHILD(n, 1));
2300 break;
2301 case DOT:
2302 com_select_member(c, CHILD(n, 1));
2303 break;
2304 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002305 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002306 break;
2307 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002308 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002309 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002310 }
2311}
2312
2313static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002314com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002315{
2316 int i;
2317 REQ(n, power);
2318 com_atom(c, CHILD(n, 0));
2319 for (i = 1; i < NCH(n); i++) {
2320 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2321 com_factor(c, CHILD(n, i+1));
2322 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002323 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002324 break;
2325 }
2326 else
2327 com_apply_trailer(c, CHILD(n, i));
2328 }
2329}
2330
2331static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002332com_invert_constant(struct compiling *c, node *n)
2333{
2334 /* Compute the inverse of int and longs and use them directly,
2335 but be prepared to generate code for all other
2336 possibilities (invalid numbers, floats, complex).
2337 */
2338 PyObject *num, *inv = NULL;
2339 int i;
2340
2341 REQ(n, NUMBER);
2342 num = parsenumber(c, STR(n));
2343 if (num == NULL)
2344 i = 255;
2345 else {
2346 inv = PyNumber_Invert(num);
2347 if (inv == NULL) {
2348 PyErr_Clear();
2349 i = com_addconst(c, num);
2350 } else {
2351 i = com_addconst(c, inv);
2352 Py_DECREF(inv);
2353 }
2354 Py_DECREF(num);
2355 }
2356 com_addoparg(c, LOAD_CONST, i);
2357 com_push(c, 1);
2358 if (num != NULL && inv == NULL)
2359 com_addbyte(c, UNARY_INVERT);
2360}
2361
Tim Peters51e26512001-09-07 08:45:55 +00002362static int
2363is_float_zero(const char *p)
2364{
2365 int found_radix_point = 0;
2366 int ch;
2367 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2368 switch (ch) {
2369 case '0':
2370 /* no reason to believe it's not 0 -- continue */
2371 break;
2372
2373 case 'e': case 'E': case 'j': case 'J':
2374 /* If this was a hex constant, we already would have
2375 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2376 must be an exponent marker, and we haven't yet
2377 seen a non-zero digit, and it doesn't matter what
2378 the exponent is then. For 'j' or 'J' similarly,
2379 except that this is an imaginary 0 then. */
2380 return 1;
2381
2382 case '.':
2383 found_radix_point = 1;
2384 break;
2385
2386 default:
2387 return 0;
2388 }
2389 }
2390 return found_radix_point;
2391}
2392
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002393static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002394com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002395{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002396 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002397 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002398 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002399 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002400 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002401 approriate value as a constant. If the value is negative,
2402 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002403 negative in the 0th position -- unless we're doing unary minus
2404 of a floating zero! In that case the sign is significant, but
2405 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002406 */
2407 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002408 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002409 && TYPE((pfactor = CHILD(n, 1))) == factor
2410 && NCH(pfactor) == 1
2411 && TYPE((ppower = CHILD(pfactor, 0))) == power
2412 && NCH(ppower) == 1
2413 && TYPE((patom = CHILD(ppower, 0))) == atom
2414 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002415 && !(childtype == MINUS &&
2416 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002417 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002418 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002419 return;
2420 }
2421 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002422 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002423 if (s == NULL) {
2424 com_error(c, PyExc_MemoryError, "");
2425 com_addbyte(c, 255);
2426 return;
2427 }
2428 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002429 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002430 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002431 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002432 }
Tim Peters51e26512001-09-07 08:45:55 +00002433 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002434 }
2435 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002436 com_factor(c, CHILD(n, 1));
2437 com_addbyte(c, UNARY_POSITIVE);
2438 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002439 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002440 com_factor(c, CHILD(n, 1));
2441 com_addbyte(c, UNARY_NEGATIVE);
2442 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002443 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002444 com_factor(c, CHILD(n, 1));
2445 com_addbyte(c, UNARY_INVERT);
2446 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002447 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002448 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002449 }
2450}
2451
2452static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002453com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002454{
2455 int i;
2456 int op;
2457 REQ(n, term);
2458 com_factor(c, CHILD(n, 0));
2459 for (i = 2; i < NCH(n); i += 2) {
2460 com_factor(c, CHILD(n, i));
2461 switch (TYPE(CHILD(n, i-1))) {
2462 case STAR:
2463 op = BINARY_MULTIPLY;
2464 break;
2465 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002466 if (c->c_flags & CO_FUTURE_DIVISION)
2467 op = BINARY_TRUE_DIVIDE;
2468 else
2469 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002470 break;
2471 case PERCENT:
2472 op = BINARY_MODULO;
2473 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002474 case DOUBLESLASH:
2475 op = BINARY_FLOOR_DIVIDE;
2476 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002477 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002478 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002479 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002480 op = 255;
2481 }
2482 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002483 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002484 }
2485}
2486
2487static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002488com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002489{
2490 int i;
2491 int op;
2492 REQ(n, arith_expr);
2493 com_term(c, CHILD(n, 0));
2494 for (i = 2; i < NCH(n); i += 2) {
2495 com_term(c, CHILD(n, i));
2496 switch (TYPE(CHILD(n, i-1))) {
2497 case PLUS:
2498 op = BINARY_ADD;
2499 break;
2500 case MINUS:
2501 op = BINARY_SUBTRACT;
2502 break;
2503 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002504 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002505 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002506 op = 255;
2507 }
2508 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002509 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002510 }
2511}
2512
2513static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002514com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002515{
2516 int i;
2517 int op;
2518 REQ(n, shift_expr);
2519 com_arith_expr(c, CHILD(n, 0));
2520 for (i = 2; i < NCH(n); i += 2) {
2521 com_arith_expr(c, CHILD(n, i));
2522 switch (TYPE(CHILD(n, i-1))) {
2523 case LEFTSHIFT:
2524 op = BINARY_LSHIFT;
2525 break;
2526 case RIGHTSHIFT:
2527 op = BINARY_RSHIFT;
2528 break;
2529 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002530 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002531 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002532 op = 255;
2533 }
2534 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002535 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002536 }
2537}
2538
2539static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002540com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002541{
2542 int i;
2543 int op;
2544 REQ(n, and_expr);
2545 com_shift_expr(c, CHILD(n, 0));
2546 for (i = 2; i < NCH(n); i += 2) {
2547 com_shift_expr(c, CHILD(n, i));
2548 if (TYPE(CHILD(n, i-1)) == AMPER) {
2549 op = BINARY_AND;
2550 }
2551 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002552 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002553 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002554 op = 255;
2555 }
2556 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002557 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002558 }
2559}
2560
2561static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002562com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002563{
2564 int i;
2565 int op;
2566 REQ(n, xor_expr);
2567 com_and_expr(c, CHILD(n, 0));
2568 for (i = 2; i < NCH(n); i += 2) {
2569 com_and_expr(c, CHILD(n, i));
2570 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2571 op = BINARY_XOR;
2572 }
2573 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002574 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002575 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002576 op = 255;
2577 }
2578 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002579 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002580 }
2581}
2582
2583static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002584com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002585{
2586 int i;
2587 int op;
2588 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002589 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002590 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002591 com_xor_expr(c, CHILD(n, i));
2592 if (TYPE(CHILD(n, i-1)) == VBAR) {
2593 op = BINARY_OR;
2594 }
2595 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002596 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002597 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002598 op = 255;
2599 }
2600 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002601 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002602 }
2603}
2604
2605static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002606cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002607{
2608 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00002609 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002610 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2611 if (NCH(n) == 1) {
2612 n = CHILD(n, 0);
2613 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002614 case LESS: return PyCmp_LT;
2615 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00002616 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00002617 case LESSEQUAL: return PyCmp_LE;
2618 case GREATEREQUAL: return PyCmp_GE;
2619 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2620 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2621 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002622 }
2623 }
2624 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002625 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002626 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002627 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002628 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002629 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002630 }
2631 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002632 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002633}
2634
2635static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002636com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002637{
2638 int i;
2639 enum cmp_op op;
2640 int anchor;
2641 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2642 com_expr(c, CHILD(n, 0));
2643 if (NCH(n) == 1)
2644 return;
2645
2646 /****************************************************************
2647 The following code is generated for all but the last
2648 comparison in a chain:
2649
2650 label: on stack: opcode: jump to:
2651
2652 a <code to load b>
2653 a, b DUP_TOP
2654 a, b, b ROT_THREE
2655 b, a, b COMPARE_OP
2656 b, 0-or-1 JUMP_IF_FALSE L1
2657 b, 1 POP_TOP
2658 b
2659
2660 We are now ready to repeat this sequence for the next
2661 comparison in the chain.
2662
2663 For the last we generate:
2664
2665 b <code to load c>
2666 b, c COMPARE_OP
2667 0-or-1
2668
2669 If there were any jumps to L1 (i.e., there was more than one
2670 comparison), we generate:
2671
2672 0-or-1 JUMP_FORWARD L2
2673 L1: b, 0 ROT_TWO
2674 0, b POP_TOP
2675 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002676 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002677 ****************************************************************/
2678
2679 anchor = 0;
2680
2681 for (i = 2; i < NCH(n); i += 2) {
2682 com_expr(c, CHILD(n, i));
2683 if (i+2 < NCH(n)) {
2684 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002685 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002686 com_addbyte(c, ROT_THREE);
2687 }
2688 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002689 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002690 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002691 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002692 }
2693 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002694 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002695 if (i+2 < NCH(n)) {
2696 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2697 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002698 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002699 }
2700 }
2701
2702 if (anchor) {
2703 int anchor2 = 0;
2704 com_addfwref(c, JUMP_FORWARD, &anchor2);
2705 com_backpatch(c, anchor);
2706 com_addbyte(c, ROT_TWO);
2707 com_addbyte(c, POP_TOP);
2708 com_backpatch(c, anchor2);
2709 }
2710}
2711
2712static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002713com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002714{
2715 REQ(n, not_test); /* 'not' not_test | comparison */
2716 if (NCH(n) == 1) {
2717 com_comparison(c, CHILD(n, 0));
2718 }
2719 else {
2720 com_not_test(c, CHILD(n, 1));
2721 com_addbyte(c, UNARY_NOT);
2722 }
2723}
2724
2725static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002726com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002727{
2728 int i;
2729 int anchor;
2730 REQ(n, and_test); /* not_test ('and' not_test)* */
2731 anchor = 0;
2732 i = 0;
2733 for (;;) {
2734 com_not_test(c, CHILD(n, i));
2735 if ((i += 2) >= NCH(n))
2736 break;
2737 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2738 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002739 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002740 }
2741 if (anchor)
2742 com_backpatch(c, anchor);
2743}
2744
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002745static int
2746com_make_closure(struct compiling *c, PyCodeObject *co)
2747{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002748 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002749 if (free == 0)
2750 return 0;
2751 for (i = 0; i < free; ++i) {
2752 /* Bypass com_addop_varname because it will generate
2753 LOAD_DEREF but LOAD_CLOSURE is needed.
2754 */
2755 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2756 int arg, reftype;
2757
2758 /* Special case: If a class contains a method with a
2759 free variable that has the same name as a method,
2760 the name will be considered free *and* local in the
2761 class. It should be handled by the closure, as
2762 well as by the normal name loookup logic.
2763 */
2764 reftype = get_ref_type(c, PyString_AS_STRING(name));
2765 if (reftype == CELL)
2766 arg = com_lookup_arg(c->c_cellvars, name);
2767 else /* (reftype == FREE) */
2768 arg = com_lookup_arg(c->c_freevars, name);
2769 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002770 fprintf(stderr, "lookup %s in %s %d %d\n"
2771 "freevars of %s: %s\n",
2772 PyObject_REPR(name),
2773 c->c_name,
2774 reftype, arg,
2775 PyString_AS_STRING(co->co_name),
2776 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002777 Py_FatalError("com_make_closure()");
2778 }
2779 com_addoparg(c, LOAD_CLOSURE, arg);
2780
2781 }
2782 com_push(c, free);
2783 return 1;
2784}
2785
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002786static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002787com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002788{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002789 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002790 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002791 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002792 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002793 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002794 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2795 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002796 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002797 if (co == NULL) {
2798 c->c_errors++;
2799 return;
2800 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002801 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002802 i = com_addconst(c, (PyObject *)co);
2803 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002804 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002805 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002806 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002807 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002808 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002809 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002810 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002811 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002812 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002813 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002814 else {
2815 int anchor = 0;
2816 int i = 0;
2817 for (;;) {
2818 com_and_test(c, CHILD(n, i));
2819 if ((i += 2) >= NCH(n))
2820 break;
2821 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2822 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002823 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002824 }
2825 if (anchor)
2826 com_backpatch(c, anchor);
2827 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002828}
2829
2830static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002831com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002832{
2833 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002834 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002835 com_node(c, CHILD(n, 0));
2836 }
2837 else {
2838 int i;
2839 int len;
2840 len = (NCH(n) + 1) / 2;
2841 for (i = 0; i < NCH(n); i += 2)
2842 com_node(c, CHILD(n, i));
2843 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002844 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002845 }
2846}
2847
2848
2849/* Begin of assignment compilation */
2850
Thomas Wouters434d0822000-08-24 20:11:32 +00002851
2852static void
2853com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2854{
2855 com_addbyte(c, DUP_TOP);
2856 com_push(c, 1);
2857 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002858 com_node(c, augn);
2859 com_addbyte(c, opcode);
2860 com_pop(c, 1);
2861 com_addbyte(c, ROT_TWO);
2862 com_addopname(c, STORE_ATTR, n);
2863 com_pop(c, 2);
2864}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002865
2866static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002867com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002868{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00002869 if (none_assignment_check(c, STR(n), assigning))
2870 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002871 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002872 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002873}
2874
2875static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002876com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002877{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002878 REQ(n, trailer);
2879 switch (TYPE(CHILD(n, 0))) {
2880 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002881 if (assigning == OP_DELETE)
2882 com_error(c, PyExc_SyntaxError,
2883 "can't delete function call");
2884 else
2885 com_error(c, PyExc_SyntaxError,
2886 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002887 break;
2888 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002889 if (assigning > OP_APPLY)
2890 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2891 else
2892 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002893 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002894 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002895 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002896 break;
2897 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002898 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002899 }
2900}
2901
2902static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002903com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002904{
2905 int i;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002906 if (TYPE(n) != testlist && TYPE(n) != testlist_gexp &&
2907 TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002908 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002909 if (assigning) {
2910 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002911 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002912 com_push(c, i-1);
2913 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002914 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002915 com_assign(c, CHILD(n, i), assigning, NULL);
2916}
2917
2918static void
2919com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2920{
2921 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002922 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002923 com_push(c, 1);
2924 com_node(c, augn);
2925 com_addbyte(c, opcode);
2926 com_pop(c, 1);
2927 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002928}
2929
2930static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002931com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002932{
2933 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002934 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002935 if (assigning)
2936 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002937}
2938
2939static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002940com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002941{
2942 /* Loop to avoid trivial recursion */
2943 for (;;) {
2944 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002945
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002946 case exprlist:
2947 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002948 case testlist1:
Raymond Hettinger354433a2004-05-19 08:20:33 +00002949 case testlist_gexp:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002950 if (NCH(n) > 1) {
Raymond Hettinger354433a2004-05-19 08:20:33 +00002951 if (TYPE(CHILD(n, 1)) == gen_for) {
2952 com_error(c, PyExc_SystemError,
2953 "assign to generator expression not possible");
2954 return;
2955 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002956 if (assigning > OP_APPLY) {
2957 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002958 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002959 return;
2960 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002961 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002962 return;
2963 }
2964 n = CHILD(n, 0);
2965 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002966
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002967 case test:
2968 case and_test:
2969 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002970 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002971 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002972 case xor_expr:
2973 case and_expr:
2974 case shift_expr:
2975 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002976 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002977 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002978 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002979 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002980 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002981 return;
2982 }
2983 n = CHILD(n, 0);
2984 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002985
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002986 case power: /* atom trailer* ('**' power)*
2987 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002988 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002989 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002990 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002991 return;
2992 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002993 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002994 int i;
2995 com_node(c, CHILD(n, 0));
2996 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002997 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002998 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002999 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00003000 return;
3001 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003002 com_apply_trailer(c, CHILD(n, i));
3003 } /* NB i is still alive */
3004 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00003005 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003006 return;
3007 }
3008 n = CHILD(n, 0);
3009 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003010
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003011 case atom:
3012 switch (TYPE(CHILD(n, 0))) {
3013 case LPAR:
3014 n = CHILD(n, 1);
3015 if (TYPE(n) == RPAR) {
3016 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003017 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003018 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003019 return;
3020 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003021 if (assigning > OP_APPLY) {
3022 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003023 "augmented assign to tuple literal not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003024 return;
3025 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003026 break;
3027 case LSQB:
3028 n = CHILD(n, 1);
3029 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003030 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003031 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003032 return;
3033 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003034 if (assigning > OP_APPLY) {
3035 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003036 "augmented assign to list literal not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003037 return;
3038 }
3039 if (NCH(n) > 1
3040 && TYPE(CHILD(n, 1)) == list_for) {
3041 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003042 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00003043 return;
3044 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003045 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003046 return;
3047 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00003048 if (assigning > OP_APPLY)
3049 com_augassign_name(c, CHILD(n, 0),
3050 assigning, augn);
3051 else
3052 com_assign_name(c, CHILD(n, 0),
3053 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003054 return;
3055 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003056 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003057 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003058 return;
3059 }
3060 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003061
3062 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003063 com_error(c, PyExc_SyntaxError,
3064 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003065 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003066
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003067 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003068 com_error(c, PyExc_SystemError,
3069 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003070 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003071
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003072 }
3073 }
3074}
Guido van Rossum7c531111997-03-11 18:42:21 +00003075
Thomas Wouters434d0822000-08-24 20:11:32 +00003076static void
3077com_augassign(struct compiling *c, node *n)
3078{
3079 int opcode;
3080
3081 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
3082 case '+': opcode = INPLACE_ADD; break;
3083 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00003084 case '/':
3085 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
3086 opcode = INPLACE_FLOOR_DIVIDE;
3087 else if (c->c_flags & CO_FUTURE_DIVISION)
3088 opcode = INPLACE_TRUE_DIVIDE;
3089 else
3090 opcode = INPLACE_DIVIDE;
3091 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00003092 case '%': opcode = INPLACE_MODULO; break;
3093 case '<': opcode = INPLACE_LSHIFT; break;
3094 case '>': opcode = INPLACE_RSHIFT; break;
3095 case '&': opcode = INPLACE_AND; break;
3096 case '^': opcode = INPLACE_XOR; break;
3097 case '|': opcode = INPLACE_OR; break;
3098 case '*':
3099 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
3100 opcode = INPLACE_POWER;
3101 else
3102 opcode = INPLACE_MULTIPLY;
3103 break;
3104 default:
3105 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
3106 return;
3107 }
3108 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
3109}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003110
3111static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003112com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003113{
Thomas Wouters434d0822000-08-24 20:11:32 +00003114 REQ(n, expr_stmt);
3115 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003116 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00003117 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003118 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00003119 if (NCH(n) == 1) {
3120 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003121 if (c->c_interactive)
3122 com_addbyte(c, PRINT_EXPR);
3123 else
3124 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003125 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003126 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003127 else if (TYPE(CHILD(n,1)) == augassign)
3128 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003129 else {
3130 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00003131 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003132 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003133 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003134 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003135 com_push(c, 1);
3136 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003137 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003138 }
3139 }
3140}
3141
3142static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003143com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00003144{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003145 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003146 int i;
3147 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003148 if (Py_OptimizeFlag)
3149 return;
3150 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00003151
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003152 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00003153 raise AssertionError [, <message>]
3154
3155 where <message> is the second test, if present.
3156 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003157 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003158 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003159 com_addbyte(c, POP_TOP);
3160 com_pop(c, 1);
3161 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003162 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00003163 com_push(c, 1);
3164 i = NCH(n)/2; /* Either 2 or 4 */
3165 if (i > 1)
3166 com_node(c, CHILD(n, 3));
3167 com_addoparg(c, RAISE_VARARGS, i);
3168 com_pop(c, i);
3169 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003170 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003171 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003172 com_addbyte(c, POP_TOP);
3173}
3174
3175static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003176com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003177{
Barry Warsaw29c574e2000-08-21 15:38:56 +00003178 int i = 1;
3179 node* stream = NULL;
3180
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003181 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003182
3183 /* are we using the extended print form? */
3184 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
3185 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00003186 com_node(c, stream);
3187 /* stack: [...] => [... stream] */
3188 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003189 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3190 i = 4;
3191 else
3192 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003193 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003194 for (; i < NCH(n); i += 2) {
3195 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003196 com_addbyte(c, DUP_TOP);
3197 /* stack: [stream] => [stream stream] */
3198 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003199 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003200 /* stack: [stream stream] => [stream stream obj] */
3201 com_addbyte(c, ROT_TWO);
3202 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003203 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003204 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003205 com_pop(c, 2);
3206 }
3207 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003208 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003209 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003210 com_addbyte(c, PRINT_ITEM);
3211 com_pop(c, 1);
3212 }
3213 }
3214 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003215 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003216 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003217 /* must pop the extra stream object off the stack */
3218 com_addbyte(c, POP_TOP);
3219 /* stack: [... stream] => [...] */
3220 com_pop(c, 1);
3221 }
3222 }
3223 else {
3224 if (stream != NULL) {
3225 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003226 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003227 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003228 com_pop(c, 1);
3229 }
3230 else
3231 com_addbyte(c, PRINT_NEWLINE);
3232 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003233}
3234
3235static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003236com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003237{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003238 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003239 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003240 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003241 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003242 if (c->c_flags & CO_GENERATOR) {
3243 if (NCH(n) > 1) {
3244 com_error(c, PyExc_SyntaxError,
3245 "'return' with argument inside generator");
3246 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003247 }
3248 if (NCH(n) < 2) {
3249 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003250 com_push(c, 1);
3251 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003252 else
3253 com_node(c, CHILD(n, 1));
3254 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003255 com_pop(c, 1);
3256}
3257
3258static void
3259com_yield_stmt(struct compiling *c, node *n)
3260{
Tim Peters95c80f82001-06-23 02:07:08 +00003261 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003262 REQ(n, yield_stmt); /* 'yield' testlist */
3263 if (!c->c_infunction) {
3264 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3265 }
Tim Peters95c80f82001-06-23 02:07:08 +00003266
3267 for (i = 0; i < c->c_nblocks; ++i) {
3268 if (c->c_block[i] == SETUP_FINALLY) {
3269 com_error(c, PyExc_SyntaxError,
3270 "'yield' not allowed in a 'try' block "
3271 "with a 'finally' clause");
3272 return;
3273 }
3274 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003275 com_node(c, CHILD(n, 1));
3276 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003277 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003278}
3279
3280static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003281com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003282{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003283 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003284 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3285 if (NCH(n) > 1) {
3286 com_node(c, CHILD(n, 1));
3287 if (NCH(n) > 3) {
3288 com_node(c, CHILD(n, 3));
3289 if (NCH(n) > 5)
3290 com_node(c, CHILD(n, 5));
3291 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003292 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003293 i = NCH(n)/2;
3294 com_addoparg(c, RAISE_VARARGS, i);
3295 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003296}
3297
3298static void
Thomas Wouters52152252000-08-17 22:55:00 +00003299com_from_import(struct compiling *c, node *n)
3300{
3301 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3302 com_push(c, 1);
3303 if (NCH(n) > 1) {
3304 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3305 com_error(c, PyExc_SyntaxError, "invalid syntax");
3306 return;
3307 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003308 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003309 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003310 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003311 com_pop(c, 1);
3312}
3313
3314static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003315com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003316{
3317 int i;
3318 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003319 /* 'import' dotted_name (',' dotted_name)* |
3320 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003321 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00003322 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003323 /* 'from' dotted_name 'import' ... */
3324 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003325
3326 if (TYPE(CHILD(n, 3)) == STAR) {
3327 tup = Py_BuildValue("(s)", "*");
3328 } else {
3329 tup = PyTuple_New((NCH(n) - 2)/2);
3330 for (i = 3; i < NCH(n); i += 2) {
3331 PyTuple_SET_ITEM(tup, (i-3)/2,
Guido van Rossum633d90c2002-12-23 16:51:42 +00003332 PyString_FromString(STR(
3333 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003334 }
3335 }
3336 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003337 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003338 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003339 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00003340 if (TYPE(CHILD(n, 3)) == STAR)
3341 com_addbyte(c, IMPORT_STAR);
3342 else {
3343 for (i = 3; i < NCH(n); i += 2)
3344 com_from_import(c, CHILD(n, i));
3345 com_addbyte(c, POP_TOP);
3346 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003347 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003348 }
3349 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003350 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003351 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003352 node *subn = CHILD(n, i);
3353 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003354 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003355 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003356 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003357 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003358 int j;
3359 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003360 com_error(c, PyExc_SyntaxError,
3361 "invalid syntax");
3362 return;
3363 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003364 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3365 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003366 CHILD(CHILD(subn, 0),
3367 j));
3368 com_addop_varname(c, VAR_STORE,
3369 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003370 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003371 com_addop_varname(c, VAR_STORE,
3372 STR(CHILD(CHILD(subn, 0),
3373 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003374 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003375 }
3376 }
3377}
3378
3379static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003380com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003381{
3382 REQ(n, exec_stmt);
3383 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3384 com_node(c, CHILD(n, 1));
3385 if (NCH(n) >= 4)
3386 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003387 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003388 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003389 com_push(c, 1);
3390 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003391 if (NCH(n) >= 6)
3392 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003393 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003394 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003395 com_push(c, 1);
3396 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003397 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003398 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003399}
3400
Guido van Rossum7c531111997-03-11 18:42:21 +00003401static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003402is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003403{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003404 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003405 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003406 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003407
3408 /* Label to avoid tail recursion */
3409 next:
3410 switch (TYPE(n)) {
3411
3412 case suite:
3413 if (NCH(n) == 1) {
3414 n = CHILD(n, 0);
3415 goto next;
3416 }
3417 /* Fall through */
3418 case file_input:
3419 for (i = 0; i < NCH(n); i++) {
3420 node *ch = CHILD(n, i);
3421 if (TYPE(ch) == stmt) {
3422 n = ch;
3423 goto next;
3424 }
3425 }
3426 break;
3427
3428 case stmt:
3429 case simple_stmt:
3430 case small_stmt:
3431 n = CHILD(n, 0);
3432 goto next;
3433
3434 case expr_stmt:
3435 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003436 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003437 case test:
3438 case and_test:
3439 case not_test:
3440 case comparison:
3441 case expr:
3442 case xor_expr:
3443 case and_expr:
3444 case shift_expr:
3445 case arith_expr:
3446 case term:
3447 case factor:
3448 case power:
3449 case atom:
3450 if (NCH(n) == 1) {
3451 n = CHILD(n, 0);
3452 goto next;
3453 }
3454 break;
3455
3456 case NAME:
3457 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3458 return 1;
3459 break;
3460
3461 case NUMBER:
3462 v = parsenumber(c, STR(n));
3463 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003464 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003465 break;
3466 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003467 i = PyObject_IsTrue(v);
3468 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003469 return i == 0;
3470
3471 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003472 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003473 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003474 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003475 break;
3476 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003477 i = PyObject_IsTrue(v);
3478 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003479 return i == 0;
3480
3481 }
3482 return 0;
3483}
3484
Tim Peters08a898f2001-06-28 01:52:22 +00003485
3486/* Look under n for a return stmt with an expression.
3487 * This hack is used to find illegal returns under "if 0:" blocks in
3488 * functions already known to be generators (as determined by the symtable
3489 * pass).
3490 * Return the offending return node if found, else NULL.
3491 */
3492static node *
3493look_for_offending_return(node *n)
3494{
3495 int i;
3496
3497 for (i = 0; i < NCH(n); ++i) {
3498 node *kid = CHILD(n, i);
3499
3500 switch (TYPE(kid)) {
3501 case classdef:
3502 case funcdef:
3503 case lambdef:
3504 /* Stuff in nested functions & classes doesn't
3505 affect the code block we started in. */
3506 return NULL;
3507
3508 case return_stmt:
3509 if (NCH(kid) > 1)
3510 return kid;
3511 break;
3512
3513 default: {
3514 node *bad = look_for_offending_return(kid);
3515 if (bad != NULL)
3516 return bad;
3517 }
3518 }
3519 }
3520
3521 return NULL;
3522}
3523
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003524static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003525com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003526{
3527 int i;
3528 int anchor = 0;
3529 REQ(n, if_stmt);
3530 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3531 for (i = 0; i+3 < NCH(n); i+=4) {
3532 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003533 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003534 if (is_constant_false(c, ch)) {
3535 /* We're going to skip this block. However, if this
3536 is a generator, we have to check the dead code
3537 anyway to make sure there aren't any return stmts
3538 with expressions, in the same scope. */
3539 if (c->c_flags & CO_GENERATOR) {
3540 node *p = look_for_offending_return(n);
3541 if (p != NULL) {
3542 int savelineno = c->c_lineno;
3543 c->c_lineno = p->n_lineno;
3544 com_error(c, PyExc_SyntaxError,
3545 "'return' with argument "
3546 "inside generator");
3547 c->c_lineno = savelineno;
3548 }
3549 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003550 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003551 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003552 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003553 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003554 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003555 com_addfwref(c, JUMP_IF_FALSE, &a);
3556 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003557 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003558 com_node(c, CHILD(n, i+3));
3559 com_addfwref(c, JUMP_FORWARD, &anchor);
3560 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003561 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003562 com_addbyte(c, POP_TOP);
3563 }
3564 if (i+2 < NCH(n))
3565 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003566 if (anchor)
3567 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003568}
3569
3570static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003571com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003572{
3573 int break_anchor = 0;
3574 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003575 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003576 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3577 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003578 block_push(c, SETUP_LOOP);
3579 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003580 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003581 com_node(c, CHILD(n, 1));
3582 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3583 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003584 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003585 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003586 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003587 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003588 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3589 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003590 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003591 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003592 com_addbyte(c, POP_TOP);
3593 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003594 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003595 if (NCH(n) > 4)
3596 com_node(c, CHILD(n, 6));
3597 com_backpatch(c, break_anchor);
3598}
3599
3600static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003601com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003602{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003603 int break_anchor = 0;
3604 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003605 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003606 REQ(n, for_stmt);
3607 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3608 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003609 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003610 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003611 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003612 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00003613 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003614 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003615 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003616 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003617 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003618 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003619 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003620 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3621 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003622 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003623 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003624 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003625 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003626 if (NCH(n) > 8)
3627 com_node(c, CHILD(n, 8));
3628 com_backpatch(c, break_anchor);
3629}
3630
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003631/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003632
3633 SETUP_FINALLY L
3634 <code for S>
3635 POP_BLOCK
3636 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003637 L: <code for Sf>
3638 END_FINALLY
3639
3640 The special instructions use the block stack. Each block
3641 stack entry contains the instruction that created it (here
3642 SETUP_FINALLY), the level of the value stack at the time the
3643 block stack entry was created, and a label (here L).
3644
3645 SETUP_FINALLY:
3646 Pushes the current value stack level and the label
3647 onto the block stack.
3648 POP_BLOCK:
3649 Pops en entry from the block stack, and pops the value
3650 stack until its level is the same as indicated on the
3651 block stack. (The label is ignored.)
3652 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003653 Pops a variable number of entries from the *value* stack
3654 and re-raises the exception they specify. The number of
3655 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003656
3657 The block stack is unwound when an exception is raised:
3658 when a SETUP_FINALLY entry is found, the exception is pushed
3659 onto the value stack (and the exception condition is cleared),
3660 and the interpreter jumps to the label gotten from the block
3661 stack.
3662
3663 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003664 (The contents of the value stack is shown in [], with the top
3665 at the right; 'tb' is trace-back info, 'val' the exception's
3666 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003667
3668 Value stack Label Instruction Argument
3669 [] SETUP_EXCEPT L1
3670 [] <code for S>
3671 [] POP_BLOCK
3672 [] JUMP_FORWARD L0
3673
Guido van Rossum3f5da241990-12-20 15:06:42 +00003674 [tb, val, exc] L1: DUP )
3675 [tb, val, exc, exc] <evaluate E1> )
3676 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3677 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3678 [tb, val, exc, 1] POP )
3679 [tb, val, exc] POP
3680 [tb, val] <assign to V1> (or POP if no V1)
3681 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003682 [] <code for S1>
3683 JUMP_FORWARD L0
3684
Guido van Rossum3f5da241990-12-20 15:06:42 +00003685 [tb, val, exc, 0] L2: POP
3686 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003687 .............................etc.......................
3688
Guido van Rossum3f5da241990-12-20 15:06:42 +00003689 [tb, val, exc, 0] Ln+1: POP
3690 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003691
3692 [] L0: <next statement>
3693
3694 Of course, parts are not generated if Vi or Ei is not present.
3695*/
3696
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003697static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003698com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003699{
3700 int except_anchor = 0;
3701 int end_anchor = 0;
3702 int else_anchor = 0;
3703 int i;
3704 node *ch;
3705
3706 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3707 block_push(c, SETUP_EXCEPT);
3708 com_node(c, CHILD(n, 2));
3709 com_addbyte(c, POP_BLOCK);
3710 block_pop(c, SETUP_EXCEPT);
3711 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3712 com_backpatch(c, except_anchor);
3713 for (i = 3;
3714 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3715 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003716 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003717 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003718 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003719 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003720 break;
3721 }
3722 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003723 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003724 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003725 if (NCH(ch) > 1) {
3726 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003727 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003728 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003729 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003730 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003731 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3732 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003733 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003734 }
3735 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003736 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003737 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003738 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003739 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003740 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003741 com_pop(c, 1);
3742 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003743 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003744 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003745 com_node(c, CHILD(n, i+2));
3746 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3747 if (except_anchor) {
3748 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003749 /* We come in with [tb, val, exc, 0] on the
3750 stack; one pop and it's the same as
3751 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003752 com_addbyte(c, POP_TOP);
3753 }
3754 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003755 /* We actually come in here with [tb, val, exc] but the
3756 END_FINALLY will zap those and jump around.
3757 The c_stacklevel does not reflect them so we need not pop
3758 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003759 com_addbyte(c, END_FINALLY);
3760 com_backpatch(c, else_anchor);
3761 if (i < NCH(n))
3762 com_node(c, CHILD(n, i+2));
3763 com_backpatch(c, end_anchor);
3764}
3765
3766static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003767com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003768{
3769 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003770 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003771
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003772 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3773 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003774 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003775 com_addbyte(c, POP_BLOCK);
3776 block_pop(c, SETUP_FINALLY);
3777 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003778 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003779 /* While the generated code pushes only one item,
3780 the try-finally handling can enter here with
3781 up to three items. OK, here are the details:
3782 3 for an exception, 2 for RETURN, 1 for BREAK. */
3783 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003784 com_backpatch(c, finally_anchor);
3785 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003786 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003787 com_node(c, ch);
3788 com_addbyte(c, END_FINALLY);
3789 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003790 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003791}
3792
3793static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003794com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003795{
3796 REQ(n, try_stmt);
3797 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3798 | 'try' ':' suite 'finally' ':' suite */
3799 if (TYPE(CHILD(n, 3)) != except_clause)
3800 com_try_finally(c, n);
3801 else
3802 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003803}
3804
Guido van Rossum8b993a91997-01-17 21:04:03 +00003805static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003806get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003807{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003808 int i;
3809
Guido van Rossum8b993a91997-01-17 21:04:03 +00003810 /* Label to avoid tail recursion */
3811 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003812 switch (TYPE(n)) {
3813
3814 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003815 if (NCH(n) == 1) {
3816 n = CHILD(n, 0);
3817 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003818 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003819 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003820 case file_input:
3821 for (i = 0; i < NCH(n); i++) {
3822 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003823 if (TYPE(ch) == stmt) {
3824 n = ch;
3825 goto next;
3826 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003827 }
3828 break;
3829
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003830 case stmt:
3831 case simple_stmt:
3832 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003833 n = CHILD(n, 0);
3834 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003835
3836 case expr_stmt:
3837 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003838 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003839 case test:
3840 case and_test:
3841 case not_test:
3842 case comparison:
3843 case expr:
3844 case xor_expr:
3845 case and_expr:
3846 case shift_expr:
3847 case arith_expr:
3848 case term:
3849 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003850 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003851 if (NCH(n) == 1) {
3852 n = CHILD(n, 0);
3853 goto next;
3854 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003855 break;
3856
3857 case atom:
3858 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003859 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003860 break;
3861
3862 }
3863 return NULL;
3864}
3865
Guido van Rossum79f25d91997-04-29 20:08:16 +00003866static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003867get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003868{
Guido van Rossum541563e1999-01-28 15:08:09 +00003869 /* Don't generate doc-strings if run with -OO */
3870 if (Py_OptimizeFlag > 1)
3871 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003872 n = get_rawdocstring(n);
3873 if (n == NULL)
3874 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003875 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003876}
3877
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003878static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003879com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003880{
3881 REQ(n, suite);
3882 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3883 if (NCH(n) == 1) {
3884 com_node(c, CHILD(n, 0));
3885 }
3886 else {
3887 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003888 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003889 node *ch = CHILD(n, i);
3890 if (TYPE(ch) == stmt)
3891 com_node(c, ch);
3892 }
3893 }
3894}
3895
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003896/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003897static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003898com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003899{
3900 int i = c->c_nblocks;
3901 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3902 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3903 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003904 else if (i <= 0) {
3905 /* at the outer level */
3906 com_error(c, PyExc_SyntaxError,
3907 "'continue' not properly in loop");
3908 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003909 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003910 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003911 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003912 if (c->c_block[j] == SETUP_LOOP)
3913 break;
3914 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003915 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003916 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003917 for (; i > j; --i) {
3918 if (c->c_block[i] == SETUP_EXCEPT ||
3919 c->c_block[i] == SETUP_FINALLY) {
3920 com_addoparg(c, CONTINUE_LOOP,
3921 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003922 return;
3923 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003924 if (c->c_block[i] == END_FINALLY) {
3925 com_error(c, PyExc_SyntaxError,
3926 "'continue' not supported inside 'finally' clause");
3927 return;
3928 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003929 }
3930 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003931 com_error(c, PyExc_SyntaxError,
3932 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003933 }
3934 /* XXX Could allow it inside a 'finally' clause
3935 XXX if we could pop the exception still on the stack */
3936}
3937
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003938/* Return the number of default values in the argument list.
3939
3940 If a non-default argument follows a default argument, set an
3941 exception and return -1.
3942*/
3943
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003944static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003945com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003946{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003947 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003948 if (TYPE(n) == lambdef) {
3949 /* lambdef: 'lambda' [varargslist] ':' test */
3950 n = CHILD(n, 1);
3951 }
3952 else {
3953 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3954 n = CHILD(n, 2);
3955 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3956 n = CHILD(n, 1);
3957 }
3958 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003959 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003960 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003961 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003962 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3963 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003964 ndefs = 0;
3965 for (i = 0; i < nch; i++) {
3966 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003967 if (TYPE(CHILD(n, i)) == STAR ||
3968 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003969 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003970 i++;
3971 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003972 t = RPAR; /* Anything except EQUAL or COMMA */
3973 else
3974 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003975 if (t == EQUAL) {
3976 i++;
3977 ndefs++;
3978 com_node(c, CHILD(n, i));
3979 i++;
3980 if (i >= nch)
3981 break;
3982 t = TYPE(CHILD(n, i));
3983 }
3984 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003985 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003986 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003987 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003988 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003989 return -1;
3990 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003991 }
3992 if (t != COMMA)
3993 break;
3994 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003995 return ndefs;
3996}
3997
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003998static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003999com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004000{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004001 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004002 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004003 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004004 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004005 if (ndefs < 0)
4006 return;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004007 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
4008 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004009 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004010 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004011 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004012 c->c_errors++;
4013 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004014 int closure = com_make_closure(c, (PyCodeObject *)co);
4015 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004016 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004017 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004018 if (closure)
4019 com_addoparg(c, MAKE_CLOSURE, ndefs);
4020 else
4021 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004022 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004023 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004024 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004025 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004026 }
4027}
4028
4029static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004030com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004031{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004032 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004033 REQ(n, testlist);
4034 /* testlist: test (',' test)* [','] */
4035 for (i = 0; i < NCH(n); i += 2)
4036 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004037 i = (NCH(n)+1) / 2;
4038 com_addoparg(c, BUILD_TUPLE, i);
4039 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004040}
4041
4042static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004043com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004044{
Guido van Rossum25831651993-05-19 14:50:45 +00004045 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004046 PyObject *v;
4047 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004048 char *name;
4049
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004050 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004051 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004052 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004053 c->c_errors++;
4054 return;
4055 }
4056 /* Push the class name on the stack */
4057 i = com_addconst(c, v);
4058 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004059 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004060 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004061 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004062 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004063 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004064 com_push(c, 1);
4065 }
Guido van Rossum25831651993-05-19 14:50:45 +00004066 else
4067 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004068 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004069 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004070 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004071 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004072 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004073 c->c_errors++;
4074 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004075 int closure = com_make_closure(c, co);
4076 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004077 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004078 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004079 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004080 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004081 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004082 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004083 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004084 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004085 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004086 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004087 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004088 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004089 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004090 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004091}
4092
4093static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004094com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004095{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004096 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004097 if (c->c_errors)
4098 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004099 switch (TYPE(n)) {
4100
4101 /* Definition nodes */
4102
4103 case funcdef:
4104 com_funcdef(c, n);
4105 break;
4106 case classdef:
4107 com_classdef(c, n);
4108 break;
4109
4110 /* Trivial parse tree nodes */
4111
4112 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004113 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004114 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004115 n = CHILD(n, 0);
4116 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004117
4118 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004119 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004120 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004121 {
4122 int i;
4123 for (i = 0; i < NCH(n)-1; i += 2)
4124 com_node(c, CHILD(n, i));
4125 }
4126 break;
4127
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004128 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004129 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004130 n = CHILD(n, 0);
4131 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004132
4133 /* Statement nodes */
4134
4135 case expr_stmt:
4136 com_expr_stmt(c, n);
4137 break;
4138 case print_stmt:
4139 com_print_stmt(c, n);
4140 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004141 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004142 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004143 break;
4144 case pass_stmt:
4145 break;
4146 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004147 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004148 com_error(c, PyExc_SyntaxError,
4149 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004150 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004151 com_addbyte(c, BREAK_LOOP);
4152 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004153 case continue_stmt:
4154 com_continue_stmt(c, n);
4155 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004156 case return_stmt:
4157 com_return_stmt(c, n);
4158 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004159 case yield_stmt:
4160 com_yield_stmt(c, n);
4161 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004162 case raise_stmt:
4163 com_raise_stmt(c, n);
4164 break;
4165 case import_stmt:
4166 com_import_stmt(c, n);
4167 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004168 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004169 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004170 case exec_stmt:
4171 com_exec_stmt(c, n);
4172 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004173 case assert_stmt:
4174 com_assert_stmt(c, n);
4175 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004176 case if_stmt:
4177 com_if_stmt(c, n);
4178 break;
4179 case while_stmt:
4180 com_while_stmt(c, n);
4181 break;
4182 case for_stmt:
4183 com_for_stmt(c, n);
4184 break;
4185 case try_stmt:
4186 com_try_stmt(c, n);
4187 break;
4188 case suite:
4189 com_suite(c, n);
4190 break;
4191
4192 /* Expression nodes */
4193
4194 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004195 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004196 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004197 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004198 break;
4199 case test:
4200 com_test(c, n);
4201 break;
4202 case and_test:
4203 com_and_test(c, n);
4204 break;
4205 case not_test:
4206 com_not_test(c, n);
4207 break;
4208 case comparison:
4209 com_comparison(c, n);
4210 break;
4211 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004212 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004213 break;
4214 case expr:
4215 com_expr(c, n);
4216 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004217 case xor_expr:
4218 com_xor_expr(c, n);
4219 break;
4220 case and_expr:
4221 com_and_expr(c, n);
4222 break;
4223 case shift_expr:
4224 com_shift_expr(c, n);
4225 break;
4226 case arith_expr:
4227 com_arith_expr(c, n);
4228 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004229 case term:
4230 com_term(c, n);
4231 break;
4232 case factor:
4233 com_factor(c, n);
4234 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004235 case power:
4236 com_power(c, n);
4237 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004238 case atom:
4239 com_atom(c, n);
4240 break;
4241
4242 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004243 com_error(c, PyExc_SystemError,
4244 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004245 }
4246}
4247
Tim Petersdbd9ba62000-07-09 03:09:57 +00004248static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004249
4250static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004251com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004252{
4253 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4254 if (TYPE(CHILD(n, 0)) == LPAR)
4255 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004256 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004257 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004258 com_pop(c, 1);
4259 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004260}
4261
4262static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004263com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004264{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004265 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004266 if (NCH(n) == 1) {
4267 com_fpdef(c, CHILD(n, 0));
4268 }
4269 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004270 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004271 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004272 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004273 for (i = 0; i < NCH(n); i += 2)
4274 com_fpdef(c, CHILD(n, i));
4275 }
4276}
4277
4278static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004279com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004280{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004281 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004282 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004283 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004284 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004285 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004286 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004287 nch = NCH(n);
4288 /* Enter all arguments in table of locals */
4289 for (i = 0, narg = 0; i < nch; i++) {
4290 node *ch = CHILD(n, i);
4291 node *fp;
4292 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004293 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004294 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4295 fp = CHILD(ch, 0);
4296 if (TYPE(fp) != NAME) {
4297 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4298 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004299 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004300 narg++;
4301 /* all name updates handled by symtable */
4302 if (++i >= nch)
4303 break;
4304 ch = CHILD(n, i);
4305 if (TYPE(ch) == EQUAL)
4306 i += 2;
4307 else
4308 REQ(ch, COMMA);
4309 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004310 if (complex) {
4311 /* Generate code for complex arguments only after
4312 having counted the simple arguments */
4313 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004314 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004315 node *ch = CHILD(n, i);
4316 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004317 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004318 break;
4319 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4320 fp = CHILD(ch, 0);
4321 if (TYPE(fp) != NAME) {
4322 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004323 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004324 com_fpdef(c, ch);
4325 }
4326 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004327 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004328 break;
4329 ch = CHILD(n, i);
4330 if (TYPE(ch) == EQUAL)
4331 i += 2;
4332 else
4333 REQ(ch, COMMA);
4334 }
4335 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004336}
4337
4338static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004339com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004340{
4341 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004342 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004343 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004344 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004345 if (doc != NULL) {
4346 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004347 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004348 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004349 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004350 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004351 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004352 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004353 for (i = 0; i < NCH(n); i++) {
4354 node *ch = CHILD(n, i);
4355 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4356 com_node(c, ch);
4357 }
4358}
4359
4360/* Top-level compile-node interface */
4361
4362static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004363compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004364{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004365 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004366 node *ch;
4367 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00004368 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004369 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004370 if (doc != NULL) {
4371 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004372 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004373 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004374 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004375 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004376 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
4377 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004378 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004379 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004380 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004381 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004382 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004383 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004384 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4385 com_push(c, 1);
4386 com_addbyte(c, RETURN_VALUE);
4387 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004388}
4389
4390static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004391compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004392{
Guido van Rossum590baa41993-11-30 13:40:46 +00004393 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004394 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004395 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004396
4397 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004398 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004399 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004400 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004401 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004402 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004403 else
4404 ch = CHILD(n, 2);
4405 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004406 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004407 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004408}
4409
4410static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004411compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004412{
4413 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004414 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004415 REQ(n, classdef);
4416 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4417 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004418 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004419 /* Initialize local __module__ from global __name__ */
4420 com_addop_name(c, LOAD_GLOBAL, "__name__");
4421 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004422 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004423 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004424 if (doc != NULL) {
4425 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004426 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004427 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004428 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004429 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004430 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004431 }
4432 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004433 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004434 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00004435 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004436 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004437 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004438 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004439 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004440}
4441
4442static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00004443compile_generator_expression(struct compiling *c, node *n)
4444{
4445 /* testlist_gexp: test gen_for */
4446 /* argument: test gen_for */
4447 REQ(CHILD(n, 0), test);
4448 REQ(CHILD(n, 1), gen_for);
4449
4450 c->c_name = "<generator expression>";
4451 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
4452
4453 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4454 com_push(c, 1);
4455 com_addbyte(c, RETURN_VALUE);
4456 com_pop(c, 1);
4457}
4458
4459static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004460compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004461{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004462 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004463
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004464 switch (TYPE(n)) {
4465
Guido van Rossum4c417781991-01-21 16:09:22 +00004466 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004467 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004468 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004469 n = CHILD(n, 0);
4470 if (TYPE(n) != NEWLINE)
4471 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004472 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004473 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4474 com_push(c, 1);
4475 com_addbyte(c, RETURN_VALUE);
4476 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004477 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004478 break;
4479
Guido van Rossum4c417781991-01-21 16:09:22 +00004480 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004481 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004482 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004483 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4484 com_push(c, 1);
4485 com_addbyte(c, RETURN_VALUE);
4486 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004487 break;
4488
Guido van Rossum590baa41993-11-30 13:40:46 +00004489 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004490 com_node(c, CHILD(n, 0));
4491 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004492 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004493 break;
4494
Guido van Rossum590baa41993-11-30 13:40:46 +00004495 case lambdef: /* anonymous function definition */
4496 compile_lambdef(c, n);
4497 break;
4498
Guido van Rossum4c417781991-01-21 16:09:22 +00004499 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004500 compile_funcdef(c, n);
4501 break;
4502
Guido van Rossum4c417781991-01-21 16:09:22 +00004503 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004504 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004505 break;
4506
Raymond Hettinger354433a2004-05-19 08:20:33 +00004507 case testlist_gexp: /* A generator expression */
4508 case argument: /* A generator expression */
4509 compile_generator_expression(c, n);
4510 break;
4511
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004512 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004513 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004514 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004515 }
4516}
4517
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004518static PyObject *
4519dict_keys_inorder(PyObject *dict, int offset)
4520{
4521 PyObject *tuple, *k, *v;
4522 int i, pos = 0, size = PyDict_Size(dict);
4523
4524 tuple = PyTuple_New(size);
4525 if (tuple == NULL)
4526 return NULL;
4527 while (PyDict_Next(dict, &pos, &k, &v)) {
4528 i = PyInt_AS_LONG(v);
4529 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004530 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004531 PyTuple_SET_ITEM(tuple, i - offset, k);
4532 }
4533 return tuple;
4534}
4535
Guido van Rossum79f25d91997-04-29 20:08:16 +00004536PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004537PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004538{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004539 return PyNode_CompileFlags(n, filename, NULL);
4540}
4541
4542PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004543PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004544{
4545 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004546}
4547
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004548struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004549PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004550{
4551 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004552 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004553
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004554 ff = PyNode_Future(n, filename);
4555 if (ff == NULL)
4556 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004557 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00004558 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004559 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004560 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004561 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004562 return st;
4563}
4564
Guido van Rossum79f25d91997-04-29 20:08:16 +00004565static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004566icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004567{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004568 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004569}
4570
Guido van Rossum79f25d91997-04-29 20:08:16 +00004571static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004572jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004573 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004574{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004575 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004576 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004577 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004578 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004579 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4580 sc.c_encoding = "utf-8";
4581 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004582 sc.c_encoding = STR(n);
4583 n = CHILD(n, 0);
4584 } else {
4585 sc.c_encoding = NULL;
4586 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004587 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004588 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004589 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004590 /* c_symtable still points to parent's symbols */
4591 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004592 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004593 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004594 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004595 if (base->c_encoding != NULL) {
4596 assert(sc.c_encoding == NULL);
4597 sc.c_encoding = base->c_encoding;
4598 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004599 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004600 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004601 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004602 if (sc.c_future == NULL) {
4603 com_free(&sc);
4604 return NULL;
4605 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004606 if (flags) {
4607 int merged = sc.c_future->ff_features |
4608 flags->cf_flags;
4609 sc.c_future->ff_features = merged;
4610 flags->cf_flags = merged;
4611 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004612 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
4613 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004614 com_free(&sc);
4615 return NULL;
4616 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004617 /* reset symbol table for second pass */
4618 sc.c_symtable->st_nscopes = 1;
4619 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004620 }
4621 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004622 if (symtable_load_symbols(&sc) < 0) {
4623 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004624 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004625 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004626 compile_node(&sc, n);
4627 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004628 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004629 PyObject *consts, *names, *varnames, *filename, *name,
4630 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004631 consts = PyList_AsTuple(sc.c_consts);
4632 names = PyList_AsTuple(sc.c_names);
4633 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004634 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4635 freevars = dict_keys_inorder(sc.c_freevars,
4636 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004637 filename = PyString_InternFromString(sc.c_filename);
4638 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004639 if (!PyErr_Occurred())
4640 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004641 sc.c_nlocals,
4642 sc.c_maxstacklevel,
4643 sc.c_flags,
4644 sc.c_code,
4645 consts,
4646 names,
4647 varnames,
4648 freevars,
4649 cellvars,
4650 filename,
4651 name,
4652 sc.c_firstlineno,
4653 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004654 Py_XDECREF(consts);
4655 Py_XDECREF(names);
4656 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004657 Py_XDECREF(freevars);
4658 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004659 Py_XDECREF(filename);
4660 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004661 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004662 else if (!PyErr_Occurred()) {
4663 /* This could happen if someone called PyErr_Clear() after an
4664 error was reported above. That's not supposed to happen,
4665 but I just plugged one case and I'm not sure there can't be
4666 others. In that case, raise SystemError so that at least
4667 it gets reported instead dumping core. */
4668 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4669 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004670 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004671 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004672 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004673 sc.c_symtable = NULL;
4674 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004675 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004676 return co;
4677}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004678
4679int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004680PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004681{
4682 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004683 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004684 int line = co->co_firstlineno;
4685 int addr = 0;
4686 while (--size >= 0) {
4687 addr += *p++;
4688 if (addr > addrq)
4689 break;
4690 line += *p++;
4691 }
4692 return line;
4693}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004694
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004695/* The test for LOCAL must come before the test for FREE in order to
4696 handle classes where name is both local and free. The local var is
4697 a method and the free var is a free var referenced within a method.
4698*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004699
4700static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004701get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004702{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004703 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004704 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004705
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004706 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4707 return CELL;
4708 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4709 return LOCAL;
4710 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4711 return FREE;
4712 v = PyDict_GetItemString(c->c_globals, name);
4713 if (v) {
4714 if (v == Py_None)
4715 return GLOBAL_EXPLICIT;
4716 else {
4717 return GLOBAL_IMPLICIT;
4718 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004719 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004720 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004721 "unknown scope for %.100s in %.100s(%s) "
4722 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4723 name, c->c_name,
4724 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4725 c->c_filename,
4726 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4727 PyObject_REPR(c->c_locals),
4728 PyObject_REPR(c->c_globals)
4729 );
4730
4731 Py_FatalError(buf);
4732 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004733}
4734
Guido van Rossum207fda62001-03-02 03:30:41 +00004735/* Helper functions to issue warnings */
4736
4737static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004738issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004739{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004740 if (PyErr_Occurred()) {
4741 /* This can happen because symtable_node continues
4742 processing even after raising a SyntaxError.
4743 Calling PyErr_WarnExplicit now would clobber the
4744 pending exception; instead we fail and let that
4745 exception propagate.
4746 */
4747 return -1;
4748 }
Guido van Rossum207fda62001-03-02 03:30:41 +00004749 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4750 lineno, NULL, NULL) < 0) {
4751 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4752 PyErr_SetString(PyExc_SyntaxError, msg);
4753 PyErr_SyntaxLocation(filename, lineno);
4754 }
4755 return -1;
4756 }
4757 return 0;
4758}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004759
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004760static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004761symtable_warn(struct symtable *st, char *msg)
4762{
Guido van Rossum207fda62001-03-02 03:30:41 +00004763 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004764 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004765 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004766 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004767 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004768}
4769
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004770/* Helper function for setting lineno and filename */
4771
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004772static struct symtable *
4773symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004774{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004775 struct symtable *st;
4776
4777 st = symtable_init();
4778 if (st == NULL)
4779 return NULL;
4780 st->st_future = ff;
4781 st->st_filename = filename;
4782 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
4783 if (st->st_errors > 0)
4784 goto fail;
4785 symtable_node(st, n);
4786 if (st->st_errors > 0)
4787 goto fail;
4788 return st;
4789 fail:
4790 if (!PyErr_Occurred()) {
4791 /* This could happen because after a syntax error is
4792 detected, the symbol-table-building continues for
4793 a while, and PyErr_Clear() might erroneously be
4794 called during that process. One such case has been
4795 fixed, but there might be more (now or later).
4796 */
4797 PyErr_SetString(PyExc_SystemError, "lost exception");
4798 }
4799 st->st_future = NULL;
4800 st->st_filename = NULL;
4801 PySymtable_Free(st);
4802 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004803}
4804
4805static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004806symtable_init_compiling_symbols(struct compiling *c)
4807{
4808 PyObject *varnames;
4809
4810 varnames = c->c_symtable->st_cur->ste_varnames;
4811 if (varnames == NULL) {
4812 varnames = PyList_New(0);
4813 if (varnames == NULL)
4814 return -1;
4815 c->c_symtable->st_cur->ste_varnames = varnames;
4816 Py_INCREF(varnames);
4817 } else
4818 Py_INCREF(varnames);
4819 c->c_varnames = varnames;
4820
4821 c->c_globals = PyDict_New();
4822 if (c->c_globals == NULL)
4823 return -1;
4824 c->c_freevars = PyDict_New();
4825 if (c->c_freevars == NULL)
4826 return -1;
4827 c->c_cellvars = PyDict_New();
4828 if (c->c_cellvars == NULL)
4829 return -1;
4830 return 0;
4831}
4832
4833struct symbol_info {
4834 int si_nlocals;
4835 int si_ncells;
4836 int si_nfrees;
4837 int si_nimplicit;
4838};
4839
4840static void
4841symtable_init_info(struct symbol_info *si)
4842{
4843 si->si_nlocals = 0;
4844 si->si_ncells = 0;
4845 si->si_nfrees = 0;
4846 si->si_nimplicit = 0;
4847}
4848
4849static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004850symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004851 struct symbol_info *si)
4852{
4853 PyObject *dict, *v;
4854
4855 /* Seperate logic for DEF_FREE. If it occurs in a function,
4856 it indicates a local that we must allocate storage for (a
4857 cell var). If it occurs in a class, then the class has a
4858 method and a free variable with the same name.
4859 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004860 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004861 /* If it isn't declared locally, it can't be a cell. */
4862 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4863 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004864 v = PyInt_FromLong(si->si_ncells++);
4865 dict = c->c_cellvars;
4866 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004867 /* If it is free anyway, then there is no need to do
4868 anything here.
4869 */
4870 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004871 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004872 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004873 v = PyInt_FromLong(si->si_nfrees++);
4874 dict = c->c_freevars;
4875 }
4876 if (v == NULL)
4877 return -1;
4878 if (PyDict_SetItem(dict, name, v) < 0) {
4879 Py_DECREF(v);
4880 return -1;
4881 }
4882 Py_DECREF(v);
4883 return 0;
4884}
4885
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004886/* If a variable is a cell and an argument, make sure that appears in
4887 co_cellvars before any variable to its right in varnames.
4888*/
4889
4890
4891static int
4892symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4893 PyObject *varnames, int flags)
4894{
Tim Petersb39903b2003-03-24 17:22:24 +00004895 PyObject *v = NULL;
4896 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004897 int i, pos;
4898
4899 if (flags & CO_VARARGS)
4900 argcount++;
4901 if (flags & CO_VARKEYWORDS)
4902 argcount++;
4903 for (i = argcount; --i >= 0; ) {
4904 v = PyList_GET_ITEM(varnames, i);
4905 if (PyDict_GetItem(*cellvars, v)) {
4906 if (list == NULL) {
4907 list = PyList_New(1);
4908 if (list == NULL)
4909 return -1;
4910 PyList_SET_ITEM(list, 0, v);
4911 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004912 } else {
4913 if (PyList_Insert(list, 0, v) < 0) {
4914 Py_DECREF(list);
4915 return -1;
4916 }
4917 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004918 }
4919 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00004920 if (list == NULL)
4921 return 0;
4922
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004923 /* There are cellvars that are also arguments. Create a dict
4924 to replace cellvars and put the args at the front.
4925 */
4926 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004927 if (d == NULL)
4928 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004929 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4930 v = PyInt_FromLong(i);
4931 if (v == NULL)
4932 goto fail;
4933 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4934 goto fail;
4935 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4936 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00004937 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004938 }
4939 pos = 0;
4940 i = PyList_GET_SIZE(list);
4941 Py_DECREF(list);
4942 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4943 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004944 if (w == NULL)
4945 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004946 if (PyDict_SetItem(d, v, w) < 0) {
4947 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00004948 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004949 goto fail;
4950 }
4951 Py_DECREF(w);
4952 }
4953 Py_DECREF(*cellvars);
4954 *cellvars = d;
4955 return 1;
4956 fail:
4957 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00004958 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004959 return -1;
4960}
4961
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004962static int
4963symtable_freevar_offsets(PyObject *freevars, int offset)
4964{
4965 PyObject *name, *v;
4966 int pos;
4967
4968 /* The cell vars are the first elements of the closure,
4969 followed by the free vars. Update the offsets in
4970 c_freevars to account for number of cellvars. */
4971 pos = 0;
4972 while (PyDict_Next(freevars, &pos, &name, &v)) {
4973 int i = PyInt_AS_LONG(v) + offset;
4974 PyObject *o = PyInt_FromLong(i);
4975 if (o == NULL)
4976 return -1;
4977 if (PyDict_SetItem(freevars, name, o) < 0) {
4978 Py_DECREF(o);
4979 return -1;
4980 }
4981 Py_DECREF(o);
4982 }
4983 return 0;
4984}
4985
4986static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004987symtable_check_unoptimized(struct compiling *c,
4988 PySymtableEntryObject *ste,
4989 struct symbol_info *si)
4990{
4991 char buf[300];
4992
4993 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4994 || (ste->ste_nested && si->si_nimplicit)))
4995 return 0;
4996
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004997#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4998
4999#define ILLEGAL_IS "is a nested function"
5000
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005001#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005002"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005003
5004#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005005"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005006
5007#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005008"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005009"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005010
5011 /* XXX perhaps the linenos for these opt-breaking statements
5012 should be stored so the exception can point to them. */
5013
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005014 if (ste->ste_child_free) {
5015 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005016 PyOS_snprintf(buf, sizeof(buf),
5017 ILLEGAL_IMPORT_STAR,
5018 PyString_AS_STRING(ste->ste_name),
5019 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005020 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005021 PyOS_snprintf(buf, sizeof(buf),
5022 ILLEGAL_BARE_EXEC,
5023 PyString_AS_STRING(ste->ste_name),
5024 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005025 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005026 PyOS_snprintf(buf, sizeof(buf),
5027 ILLEGAL_EXEC_AND_IMPORT_STAR,
5028 PyString_AS_STRING(ste->ste_name),
5029 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005030 }
5031 } else {
5032 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005033 PyOS_snprintf(buf, sizeof(buf),
5034 ILLEGAL_IMPORT_STAR,
5035 PyString_AS_STRING(ste->ste_name),
5036 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005037 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005038 PyOS_snprintf(buf, sizeof(buf),
5039 ILLEGAL_BARE_EXEC,
5040 PyString_AS_STRING(ste->ste_name),
5041 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005042 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005043 PyOS_snprintf(buf, sizeof(buf),
5044 ILLEGAL_EXEC_AND_IMPORT_STAR,
5045 PyString_AS_STRING(ste->ste_name),
5046 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005047 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005048 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005049
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005050 PyErr_SetString(PyExc_SyntaxError, buf);
5051 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5052 ste->ste_opt_lineno);
5053 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005054}
5055
5056static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005057symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5058 struct symbol_info *si)
5059{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005060 if (c->c_future)
5061 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005062 if (ste->ste_generator)
5063 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005064 if (ste->ste_type != TYPE_MODULE)
5065 c->c_flags |= CO_NEWLOCALS;
5066 if (ste->ste_type == TYPE_FUNCTION) {
5067 c->c_nlocals = si->si_nlocals;
5068 if (ste->ste_optimized == 0)
5069 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005070 else if (ste->ste_optimized != OPT_EXEC)
5071 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005072 }
5073 return 0;
5074}
5075
5076static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005077symtable_error(struct symtable *st, int lineno)
5078{
5079 if (lineno == 0)
5080 lineno = st->st_cur->ste_lineno;
5081 PyErr_SyntaxLocation(st->st_filename, lineno);
5082 st->st_errors++;
5083 return -1;
5084}
5085
5086static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005087symtable_load_symbols(struct compiling *c)
5088{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005089 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005090 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005091 PyObject *name, *varnames, *v;
5092 int i, flags, pos;
5093 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005094
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005095 v = NULL;
5096
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005097 if (symtable_init_compiling_symbols(c) < 0)
5098 goto fail;
5099 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005100 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005101 si.si_nlocals = PyList_GET_SIZE(varnames);
5102 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005103
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005104 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005105 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005106 if (v == NULL)
5107 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005108 if (PyDict_SetItem(c->c_locals,
5109 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005110 goto fail;
5111 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005112 }
5113
5114 /* XXX The cases below define the rules for whether a name is
5115 local or global. The logic could probably be clearer. */
5116 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005117 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5118 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005119
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005120 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005121 /* undo the original DEF_FREE */
5122 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005123
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005124 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005125 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005126 2. Free variables in methods that are also class
5127 variables or declared global.
5128 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005129 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005130 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005131
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005132 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005133 c->c_argcount--;
5134 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005135 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005136 c->c_argcount--;
5137 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005138 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005139 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005140 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005141 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005142 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005143 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005144 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005145 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005146 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005147 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5148 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005149 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005150 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005151 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005152 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005153 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005154 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005155 if (v == NULL)
5156 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005157 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005158 goto fail;
5159 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005160 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005161 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005162 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005163 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005164 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005165 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005166 if (v == NULL)
5167 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005168 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005169 goto fail;
5170 Py_DECREF(v);
5171 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005172 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005173 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005174 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005175 goto fail;
5176 if (st->st_nscopes != 1) {
5177 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005178 if (v == NULL)
5179 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005180 if (PyDict_SetItem(st->st_global,
5181 name, v))
5182 goto fail;
5183 Py_DECREF(v);
5184 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005185 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005186 }
5187 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005188 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5189
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005190 if (si.si_ncells > 1) { /* one cell is always in order */
5191 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5192 c->c_varnames, c->c_flags) < 0)
5193 return -1;
5194 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005195 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5196 return -1;
5197 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005198 fail:
5199 /* is this always the right thing to do? */
5200 Py_XDECREF(v);
5201 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005202}
5203
5204static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005205symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005206{
5207 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005208
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005209 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005210 if (st == NULL)
5211 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005212 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005213
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005214 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005215 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005216 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005217 goto fail;
5218 if ((st->st_symbols = PyDict_New()) == NULL)
5219 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005220 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005221 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005222 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005223 st->st_private = NULL;
5224 return st;
5225 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005226 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005227 return NULL;
5228}
5229
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005230void
5231PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005232{
5233 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005234 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005235 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005236 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005237}
5238
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005239/* When the compiler exits a scope, it must should update the scope's
5240 free variable information with the list of free variables in its
5241 children.
5242
5243 Variables that are free in children and defined in the current
5244 scope are cellvars.
5245
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005246 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005247 false), free variables in children that are not defined here are
5248 implicit globals.
5249
5250*/
5251
5252static int
5253symtable_update_free_vars(struct symtable *st)
5254{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005255 int i, j, def;
5256 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005257 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005258
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005259 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005260 def = DEF_FREE_CLASS;
5261 else
5262 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005263 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005264 int pos = 0;
5265
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005266 if (list && PyList_SetSlice(list, 0,
5267 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005268 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005269 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005270 PyList_GET_ITEM(ste->ste_children, i);
5271 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005272 int flags = PyInt_AS_LONG(o);
5273 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005274 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005275 if (list == NULL) {
5276 list = PyList_New(0);
5277 if (list == NULL)
5278 return -1;
5279 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005280 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005281 if (PyList_Append(list, name) < 0) {
5282 Py_DECREF(list);
5283 return -1;
5284 }
5285 }
5286 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005287 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005288 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005289 v = PyDict_GetItem(ste->ste_symbols, name);
5290 /* If a name N is declared global in scope A and
5291 referenced in scope B contained (perhaps
5292 indirectly) in A and there are no scopes
5293 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005294 is global in B. Unless A is a class scope,
5295 because class scopes are not considered for
5296 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005297 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005298 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005299 int flags = PyInt_AS_LONG(v);
5300 if (flags & DEF_GLOBAL) {
5301 symtable_undo_free(st, child->ste_id,
5302 name);
5303 continue;
5304 }
5305 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005306 if (ste->ste_nested) {
5307 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005308 name, def) < 0) {
5309 Py_DECREF(list);
5310 return -1;
5311 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005312 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005313 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005314 name) < 0) {
5315 Py_DECREF(list);
5316 return -1;
5317 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005318 }
5319 }
5320 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005321
5322 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005323 return 0;
5324}
5325
5326/* If the current scope is a non-nested class or if name is not
5327 defined in the current, non-nested scope, then it is an implicit
5328 global in all nested scopes.
5329*/
5330
5331static int
5332symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5333{
5334 PyObject *o;
5335 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005336 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005337
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005338 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005339 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005340 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005341 if (o == NULL)
5342 return symtable_undo_free(st, child, name);
5343 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005344
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005345 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005346 return symtable_undo_free(st, child, name);
5347 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005348 return symtable_add_def_o(st, ste->ste_symbols,
5349 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005350}
5351
5352static int
5353symtable_undo_free(struct symtable *st, PyObject *id,
5354 PyObject *name)
5355{
5356 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005357 PyObject *info;
5358 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005359
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005360 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5361 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005362 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005363
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005364 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005365 if (info == NULL)
5366 return 0;
5367 v = PyInt_AS_LONG(info);
5368 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005369 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005370 DEF_FREE_GLOBAL) < 0)
5371 return -1;
5372 } else
5373 /* If the name is defined here or declared global,
5374 then the recursion stops. */
5375 return 0;
5376
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005377 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5378 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005379 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005380 PyList_GET_ITEM(ste->ste_children, i);
5381 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005382 if (x < 0)
5383 return x;
5384 }
5385 return 0;
5386}
5387
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005388/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5389 This reference is released when the scope is exited, via the DECREF
5390 in symtable_exit_scope().
5391*/
5392
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005393static int
5394symtable_exit_scope(struct symtable *st)
5395{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005396 int end;
5397
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005398 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005399 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005400 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005401 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005402 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5403 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005404 if (PySequence_DelItem(st->st_stack, end) < 0)
5405 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005406 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005407}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005408
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005409static void
5410symtable_enter_scope(struct symtable *st, char *name, int type,
5411 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005412{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005413 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005414
5415 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005416 prev = st->st_cur;
5417 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005418 st->st_errors++;
5419 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005420 }
5421 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005422 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005423 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005424 if (st->st_cur == NULL) {
5425 st->st_errors++;
5426 return;
5427 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005428 if (strcmp(name, TOP) == 0)
5429 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005430 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005431 if (PyList_Append(prev->ste_children,
5432 (PyObject *)st->st_cur) < 0)
5433 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005434 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005435}
5436
5437static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005438symtable_lookup(struct symtable *st, char *name)
5439{
5440 char buffer[MANGLE_LEN];
5441 PyObject *v;
5442 int flags;
5443
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005444 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005445 name = buffer;
5446 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5447 if (v == NULL) {
5448 if (PyErr_Occurred())
5449 return -1;
5450 else
5451 return 0;
5452 }
5453
5454 flags = PyInt_AS_LONG(v);
5455 return flags;
5456}
5457
5458static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005459symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005460{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005461 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005462 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005463 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005464
Guido van Rossumb7164622002-08-16 02:48:11 +00005465 /* Warn about None, except inside a tuple (where the assignment
5466 code already issues a warning). */
5467 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5468 *name == 'N' && strcmp(name, "None") == 0)
5469 {
5470 if (symtable_warn(st, "argument named None"))
5471 return -1;
5472 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005473 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005474 name = buffer;
5475 if ((s = PyString_InternFromString(name)) == NULL)
5476 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005477 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5478 Py_DECREF(s);
5479 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005480}
5481
5482/* Must only be called with mangled names */
5483
5484static int
5485symtable_add_def_o(struct symtable *st, PyObject *dict,
5486 PyObject *name, int flag)
5487{
5488 PyObject *o;
5489 int val;
5490
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005491 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005492 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005493 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005494 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005495 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005496 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005497 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005498 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005499 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005500 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005501 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005502 if (o == NULL)
5503 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005504 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005505 Py_DECREF(o);
5506 return -1;
5507 }
5508 Py_DECREF(o);
5509
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005510 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005511 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005512 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005513 } else if (flag & DEF_GLOBAL) {
5514 /* XXX need to update DEF_GLOBAL for other flags too;
5515 perhaps only DEF_FREE_GLOBAL */
5516 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005517 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005518 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005519 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005520 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005521 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005522 if (o == NULL)
5523 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005524 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005525 Py_DECREF(o);
5526 return -1;
5527 }
5528 Py_DECREF(o);
5529 }
5530 return 0;
5531}
5532
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005533#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005534
Tim Peters08a898f2001-06-28 01:52:22 +00005535/* Look for a yield stmt under n. Return 1 if found, else 0.
5536 This hack is used to look inside "if 0:" blocks (which are normally
5537 ignored) in case those are the only places a yield occurs (so that this
5538 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005539static int
5540look_for_yield(node *n)
5541{
5542 int i;
5543
5544 for (i = 0; i < NCH(n); ++i) {
5545 node *kid = CHILD(n, i);
5546
5547 switch (TYPE(kid)) {
5548
5549 case classdef:
5550 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005551 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005552 /* Stuff in nested functions and classes can't make
5553 the parent a generator. */
5554 return 0;
5555
5556 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00005557 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005558
5559 default:
5560 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00005561 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005562 }
5563 }
5564 return 0;
5565}
5566
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005567static void
5568symtable_node(struct symtable *st, node *n)
5569{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005570 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005571
5572 loop:
5573 switch (TYPE(n)) {
5574 case funcdef: {
5575 char *func_name = STR(CHILD(n, 1));
5576 symtable_add_def(st, func_name, DEF_LOCAL);
5577 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005578 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005579 symtable_funcdef(st, n);
5580 symtable_exit_scope(st);
5581 break;
5582 }
5583 case lambdef:
5584 if (NCH(n) == 4)
5585 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005586 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005587 symtable_funcdef(st, n);
5588 symtable_exit_scope(st);
5589 break;
5590 case classdef: {
5591 char *tmp, *class_name = STR(CHILD(n, 1));
5592 symtable_add_def(st, class_name, DEF_LOCAL);
5593 if (TYPE(CHILD(n, 2)) == LPAR) {
5594 node *bases = CHILD(n, 3);
5595 int i;
5596 for (i = 0; i < NCH(bases); i += 2) {
5597 symtable_node(st, CHILD(bases, i));
5598 }
5599 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005600 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005601 tmp = st->st_private;
5602 st->st_private = class_name;
5603 symtable_node(st, CHILD(n, NCH(n) - 1));
5604 st->st_private = tmp;
5605 symtable_exit_scope(st);
5606 break;
5607 }
5608 case if_stmt:
5609 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005610 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5611 if (st->st_cur->ste_generator == 0)
5612 st->st_cur->ste_generator =
5613 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005614 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005615 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005616 symtable_node(st, CHILD(n, i + 1));
5617 symtable_node(st, CHILD(n, i + 3));
5618 }
5619 if (i + 2 < NCH(n))
5620 symtable_node(st, CHILD(n, i + 2));
5621 break;
5622 case global_stmt:
5623 symtable_global(st, n);
5624 break;
5625 case import_stmt:
5626 symtable_import(st, n);
5627 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005628 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005629 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005630 symtable_node(st, CHILD(n, 1));
5631 if (NCH(n) > 2)
5632 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005633 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005634 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005635 st->st_cur->ste_opt_lineno = n->n_lineno;
5636 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005637 if (NCH(n) > 4)
5638 symtable_node(st, CHILD(n, 5));
5639 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005640
5641 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005642 case assert_stmt:
5643 if (Py_OptimizeFlag)
5644 return;
5645 if (NCH(n) == 2) {
5646 n = CHILD(n, 1);
5647 goto loop;
5648 } else {
5649 symtable_node(st, CHILD(n, 1));
5650 n = CHILD(n, 3);
5651 goto loop;
5652 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005653 case except_clause:
5654 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005655 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005656 if (NCH(n) > 1) {
5657 n = CHILD(n, 1);
5658 goto loop;
5659 }
5660 break;
5661 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005662 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005663 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005664 case yield_stmt:
5665 st->st_cur->ste_generator = 1;
5666 n = CHILD(n, 1);
5667 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005668 case expr_stmt:
5669 if (NCH(n) == 1)
5670 n = CHILD(n, 0);
5671 else {
5672 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005673 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005674 symtable_node(st, CHILD(n, 2));
5675 break;
5676 } else {
5677 int i;
5678 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005679 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005680 n = CHILD(n, NCH(n) - 1);
5681 }
5682 }
5683 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005684 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005685 /* only occurs when there are multiple for loops
5686 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005687 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005688 if (TYPE(n) == list_for)
5689 symtable_list_for(st, n);
5690 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005691 REQ(n, list_if);
5692 symtable_node(st, CHILD(n, 1));
5693 if (NCH(n) == 3) {
5694 n = CHILD(n, 2);
5695 goto loop;
5696 }
5697 }
5698 break;
5699 case for_stmt:
5700 symtable_assign(st, CHILD(n, 1), 0);
5701 for (i = 3; i < NCH(n); ++i)
5702 if (TYPE(CHILD(n, i)) >= single_input)
5703 symtable_node(st, CHILD(n, i));
5704 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00005705 case arglist:
5706 if (NCH(n) > 1)
5707 for (i = 0; i < NCH(n); ++i) {
5708 node *ch = CHILD(n, i);
5709 if (TYPE(ch) == argument && NCH(ch) == 2 &&
5710 TYPE(CHILD(ch, 1)) == gen_for) {
5711 PyErr_SetString(PyExc_SyntaxError,
5712 "invalid syntax");
5713 symtable_error(st, n->n_lineno);
5714 return;
5715 }
5716 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005717 /* The remaining cases fall through to default except in
5718 special circumstances. This requires the individual cases
5719 to be coded with great care, even though they look like
5720 rather innocuous. Each case must double-check TYPE(n).
5721 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005722 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005723 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005724 n = CHILD(n, 2);
5725 goto loop;
5726 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00005727 else if (TYPE(n) == argument && NCH(n) == 2 &&
5728 TYPE(CHILD(n, 1)) == gen_for) {
5729 symtable_generator_expression(st, n);
5730 break;
5731 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005732 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005733 case listmaker:
5734 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005735 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005736 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005737 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005738 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00005739 case testlist_gexp:
5740 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
5741 symtable_generator_expression(st, n);
5742 break;
5743 }
5744 /* fall through */
5745
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005746 case atom:
5747 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5748 symtable_add_use(st, STR(CHILD(n, 0)));
5749 break;
5750 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005751 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005752 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005753 /* Walk over every non-token child with a special case
5754 for one child.
5755 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005756 if (NCH(n) == 1) {
5757 n = CHILD(n, 0);
5758 goto loop;
5759 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005760 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005761 if (TYPE(CHILD(n, i)) >= single_input)
5762 symtable_node(st, CHILD(n, i));
5763 }
5764}
5765
5766static void
5767symtable_funcdef(struct symtable *st, node *n)
5768{
5769 node *body;
5770
5771 if (TYPE(n) == lambdef) {
5772 if (NCH(n) == 4)
5773 symtable_params(st, CHILD(n, 1));
5774 } else
5775 symtable_params(st, CHILD(n, 2));
5776 body = CHILD(n, NCH(n) - 1);
5777 symtable_node(st, body);
5778}
5779
5780/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00005781 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005782 which are references in the defining scope. symtable_params()
5783 parses the parameter names, which are defined in the function's
5784 body.
5785
5786 varargslist:
5787 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5788 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5789*/
5790
5791static void
5792symtable_default_args(struct symtable *st, node *n)
5793{
5794 node *c;
5795 int i;
5796
5797 if (TYPE(n) == parameters) {
5798 n = CHILD(n, 1);
5799 if (TYPE(n) == RPAR)
5800 return;
5801 }
5802 REQ(n, varargslist);
5803 for (i = 0; i < NCH(n); i += 2) {
5804 c = CHILD(n, i);
5805 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5806 break;
5807 }
5808 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5809 symtable_node(st, CHILD(n, i));
5810 }
5811}
5812
5813static void
5814symtable_params(struct symtable *st, node *n)
5815{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005816 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00005817 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005818
5819 if (TYPE(n) == parameters) {
5820 n = CHILD(n, 1);
5821 if (TYPE(n) == RPAR)
5822 return;
5823 }
5824 REQ(n, varargslist);
5825 for (i = 0; i < NCH(n); i += 2) {
5826 c = CHILD(n, i);
5827 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5828 ext = 1;
5829 break;
5830 }
5831 if (TYPE(c) == test) {
5832 continue;
5833 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00005834 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005835 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00005836 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005837 char nbuf[30];
5838 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005839 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005840 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005841 }
5842 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005843 if (ext) {
5844 c = CHILD(n, i);
5845 if (TYPE(c) == STAR) {
5846 i++;
5847 symtable_add_def(st, STR(CHILD(n, i)),
5848 DEF_PARAM | DEF_STAR);
5849 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005850 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005851 c = NULL;
5852 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005853 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005854 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005855 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005856 i++;
5857 symtable_add_def(st, STR(CHILD(n, i)),
5858 DEF_PARAM | DEF_DOUBLESTAR);
5859 }
5860 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005861 if (complex >= 0) {
5862 int j;
5863 for (j = 0; j <= complex; j++) {
5864 c = CHILD(n, j);
5865 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005866 c = CHILD(n, ++j);
5867 else if (TYPE(c) == EQUAL)
5868 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005869 if (TYPE(CHILD(c, 0)) == LPAR)
5870 symtable_params_fplist(st, CHILD(c, 1));
5871 }
5872 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005873}
5874
5875static void
5876symtable_params_fplist(struct symtable *st, node *n)
5877{
5878 int i;
5879 node *c;
5880
5881 REQ(n, fplist);
5882 for (i = 0; i < NCH(n); i += 2) {
5883 c = CHILD(n, i);
5884 REQ(c, fpdef);
5885 if (NCH(c) == 1)
5886 symtable_add_def(st, STR(CHILD(c, 0)),
5887 DEF_PARAM | DEF_INTUPLE);
5888 else
5889 symtable_params_fplist(st, CHILD(c, 1));
5890 }
5891
5892}
5893
5894static void
5895symtable_global(struct symtable *st, node *n)
5896{
5897 int i;
5898
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005899 /* XXX It might be helpful to warn about module-level global
5900 statements, but it's hard to tell the difference between
5901 module-level and a string passed to exec.
5902 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005903
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005904 for (i = 1; i < NCH(n); i += 2) {
5905 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005906 int flags;
5907
5908 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005909 if (flags < 0)
5910 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005911 if (flags && flags != DEF_GLOBAL) {
5912 char buf[500];
5913 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005914 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005915 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00005916 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005917 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005918 }
5919 else {
5920 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005921 PyOS_snprintf(buf, sizeof(buf),
5922 GLOBAL_AFTER_ASSIGN,
5923 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005924 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005925 PyOS_snprintf(buf, sizeof(buf),
5926 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005927 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005928 }
5929 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005930 symtable_add_def(st, name, DEF_GLOBAL);
5931 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005932}
5933
5934static void
5935symtable_list_comprehension(struct symtable *st, node *n)
5936{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005937 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005938 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005939
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005940 REQ(n, listmaker);
5941 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
5942 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005943 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005944 symtable_list_for(st, CHILD(n, 1));
5945 symtable_node(st, CHILD(n, 0));
5946 --st->st_cur->ste_tmpname;
5947}
5948
5949static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00005950symtable_generator_expression(struct symtable *st, node *n)
5951{
5952 /* testlist_gexp: test gen_for */
5953 REQ(CHILD(n, 0), test);
5954 REQ(CHILD(n, 1), gen_for);
5955
5956 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
5957 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
5958
5959 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
5960
5961 symtable_gen_for(st, CHILD(n, 1), 1);
5962 symtable_node(st, CHILD(n, 0));
5963 symtable_exit_scope(st);
5964
5965 /* for outmost iterable precomputation */
5966 symtable_node(st, CHILD(CHILD(n, 1), 3));
5967}
5968
5969static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005970symtable_list_for(struct symtable *st, node *n)
5971{
5972 REQ(n, list_for);
5973 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005974 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005975 symtable_node(st, CHILD(n, 3));
5976 if (NCH(n) == 5)
5977 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005978}
5979
5980static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00005981symtable_gen_for(struct symtable *st, node *n, int is_outmost)
5982{
5983 REQ(n, gen_for);
5984
5985 /* gen_for: for v in test [gen_iter] */
5986 symtable_assign(st, CHILD(n, 1), 0);
5987 if (is_outmost)
5988 symtable_add_use(st, "[outmost-iterable]");
5989 else
5990 symtable_node(st, CHILD(n, 3));
5991
5992 if (NCH(n) == 5)
5993 symtable_gen_iter(st, CHILD(n, 4));
5994}
5995
5996static void
5997symtable_gen_iter(struct symtable *st, node *n)
5998{
5999 REQ(n, gen_iter);
6000
6001 n = CHILD(n, 0);
6002 if (TYPE(n) == gen_for)
6003 symtable_gen_for(st, n, 0);
6004 else {
6005 REQ(n, gen_if);
6006 symtable_node(st, CHILD(n, 1));
6007
6008 if (NCH(n) == 3)
6009 symtable_gen_iter(st, CHILD(n, 2));
6010 }
6011}
6012
6013static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006014symtable_import(struct symtable *st, node *n)
6015{
6016 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006017 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006018 | 'from' dotted_name 'import'
6019 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00006020 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006021 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006022 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006023 node *dotname = CHILD(n, 1);
6024 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6025 /* check for bogus imports */
6026 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6027 PyErr_SetString(PyExc_SyntaxError,
6028 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006029 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006030 return;
6031 }
6032 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006033 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006034 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006035 if (symtable_warn(st,
6036 "import * only allowed at module level") < 0)
6037 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006038 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006039 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006040 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006041 } else {
6042 for (i = 3; i < NCH(n); i += 2) {
6043 node *c = CHILD(n, i);
6044 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006045 symtable_assign(st, CHILD(c, 2),
6046 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006047 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006048 symtable_assign(st, CHILD(c, 0),
6049 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006050 }
6051 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006052 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006053 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006054 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006055 }
6056 }
6057}
6058
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006059/* The third argument to symatble_assign() is a flag to be passed to
6060 symtable_add_def() if it is eventually called. The flag is useful
6061 to specify the particular type of assignment that should be
6062 recorded, e.g. an assignment caused by import.
6063 */
6064
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006065static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006066symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006067{
6068 node *tmp;
6069 int i;
6070
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006071 loop:
6072 switch (TYPE(n)) {
6073 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006074 /* invalid assignment, e.g. lambda x:x=2. The next
6075 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006076 return;
6077 case power:
6078 if (NCH(n) > 2) {
6079 for (i = 2; i < NCH(n); ++i)
6080 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6081 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006082 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006083 if (NCH(n) > 1) {
6084 symtable_node(st, CHILD(n, 0));
6085 symtable_node(st, CHILD(n, 1));
6086 } else {
6087 n = CHILD(n, 0);
6088 goto loop;
6089 }
6090 return;
6091 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006092 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6093 /* XXX This is an error, but the next pass
6094 will catch it. */
6095 return;
6096 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006097 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006098 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006099 }
6100 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006101 case testlist_gexp:
6102 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6103 /* XXX This is an error, but the next pass
6104 will catch it. */
6105 return;
6106 } else {
6107 for (i = 0; i < NCH(n); i += 2)
6108 symtable_assign(st, CHILD(n, i), def_flag);
6109 }
6110 return;
6111
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006112 case exprlist:
6113 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006114 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006115 if (NCH(n) == 1) {
6116 n = CHILD(n, 0);
6117 goto loop;
6118 }
6119 else {
6120 int i;
6121 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006122 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006123 return;
6124 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006125 case atom:
6126 tmp = CHILD(n, 0);
6127 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6128 n = CHILD(n, 1);
6129 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006130 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006131 if (strcmp(STR(tmp), "__debug__") == 0) {
6132 PyErr_SetString(PyExc_SyntaxError,
6133 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006134 symtable_error(st, n->n_lineno);
6135 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006136 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006137 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006138 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006139 return;
6140 case dotted_as_name:
6141 if (NCH(n) == 3)
6142 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006143 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006144 else
6145 symtable_add_def(st,
6146 STR(CHILD(CHILD(n,
6147 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006148 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006149 return;
6150 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006151 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006152 return;
6153 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006154 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006155 return;
6156 default:
6157 if (NCH(n) == 0)
6158 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006159 if (NCH(n) == 1) {
6160 n = CHILD(n, 0);
6161 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006162 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006163 /* Should only occur for errors like x + 1 = 1,
6164 which will be caught in the next pass. */
6165 for (i = 0; i < NCH(n); ++i)
6166 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006167 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006168 }
6169}