blob: a98b905fd6e8450c99e560f3b221c8bba572bfd8 [file] [log] [blame]
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001/* Compile an expression node to intermediate code */
2
Guido van Rossum3f5da241990-12-20 15:06:42 +00003/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004 XXX add __doc__ attribute == co_doc to code object attributes?
5 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +00006 XXX Generate simple jump for break/return outside 'try...finally'
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00007 XXX Allow 'continue' inside finally clause of try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +00008 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +00009 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000010*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011
Guido van Rossum79f25d91997-04-29 20:08:16 +000012#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000013
Guido van Rossum10dc2e81990-11-18 17:27:39 +000014#include "node.h"
15#include "token.h"
16#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000017#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000018#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000019#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000020#include "structmember.h"
21
22#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000023
Guido van Rossumb05a5c71997-05-07 17:46:13 +000024/* Three symbols from graminit.h are also defined in Python.h, with
25 Py_ prefixes to their names. Python.h can't include graminit.h
26 (which defines too many confusing symbols), but we can check here
27 that they haven't changed (which is very unlikely, but possible). */
28#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000029 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000030#endif
31#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000032 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000033#endif
34#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000035 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000036#endif
37
Guido van Rossum8e793d91997-03-03 19:13:14 +000038int Py_OptimizeFlag = 0;
39
Guido van Rossum8861b741996-07-30 16:49:37 +000040#define OP_DELETE 0
41#define OP_ASSIGN 1
42#define OP_APPLY 2
43
Jeremy Hyltone36f7782001-01-19 03:21:30 +000044#define VAR_LOAD 0
45#define VAR_STORE 1
46#define VAR_DELETE 2
47
Jeremy Hylton64949cb2001-01-25 20:06:59 +000048#define DEL_CLOSURE_ERROR \
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000049"can not delete variable '%.400s' referenced in nested scope"
50
51#define DUPLICATE_ARGUMENT \
52"duplicate argument '%s' in function definition"
53
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000054#define ILLEGAL_DYNAMIC_SCOPE \
55"%.100s: exec or 'import *' makes names ambiguous in nested scope"
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000056
Jeremy Hylton29906ee2001-02-27 04:23:34 +000057#define GLOBAL_AFTER_ASSIGN \
58"name '%.400s' is assigned to before global declaration"
59
60#define GLOBAL_AFTER_USE \
61"name '%.400s' is used prior to global declaration"
62
63#define LOCAL_GLOBAL \
Neal Norwitz2a47c0f2002-01-29 00:53:41 +000064"name '%.400s' is a function parameter and declared global"
Jeremy Hylton29906ee2001-02-27 04:23:34 +000065
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +000066#define LATE_FUTURE \
67"from __future__ imports must occur at the beginning of the file"
68
Jeremy Hylton897b8212001-03-23 14:08:38 +000069#define ASSIGN_DEBUG \
70"can not assign to __debug__"
71
Jeremy Hyltone36f7782001-01-19 03:21:30 +000072#define MANGLE_LEN 256
73
Guido van Rossum79f25d91997-04-29 20:08:16 +000074#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000075
Guido van Rossum6f799372001-09-20 20:46:19 +000076static PyMemberDef code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000077 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
78 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000079 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000080 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000081 {"co_code", T_OBJECT, OFF(co_code), READONLY},
82 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
83 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000084 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000085 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
86 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000087 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000088 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000089 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
90 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000091 {NULL} /* Sentinel */
92};
93
Guido van Rossumbea18cc2002-06-14 20:41:17 +000094PyDoc_STRVAR(code_doc,
95"code(argcount, nlocals, stacksize, flags, codestring, constants, names,\n\
96 varnames, filename, name, firstlineno, lnotab[, freevars[, cellvars]])\n\
97\n\
98Create a code object. Not for the faint of heart.");
99
100static PyObject *
101code_new(PyTypeObject *type, PyObject *args, PyObject *kw)
102{
103 int argcount;
104 int nlocals;
105 int stacksize;
106 int flags;
107 PyObject *code;
108 PyObject *consts;
109 PyObject *names;
110 PyObject *varnames;
111 PyObject *freevars = NULL;
112 PyObject *cellvars = NULL;
113 PyObject *filename;
114 PyObject *name;
115 int firstlineno;
116 PyObject *lnotab;
117
118 if (!PyArg_ParseTuple(args, "iiiiSO!O!O!SSiS|O!O!:code",
119 &argcount, &nlocals, &stacksize, &flags,
120 &code,
121 &PyTuple_Type, &consts,
122 &PyTuple_Type, &names,
123 &PyTuple_Type, &varnames,
124 &filename, &name,
125 &firstlineno, &lnotab,
126 &PyTuple_Type, &freevars,
127 &PyTuple_Type, &cellvars))
128 return NULL;
129
130 if (freevars == NULL || cellvars == NULL) {
131 PyObject *empty = PyTuple_New(0);
132 if (empty == NULL)
133 return NULL;
134 if (freevars == NULL) {
135 freevars = empty;
136 Py_INCREF(freevars);
137 }
138 if (cellvars == NULL) {
139 cellvars = empty;
140 Py_INCREF(cellvars);
141 }
142 Py_DECREF(empty);
143 }
144
145 if (!PyObject_CheckReadBuffer(code)) {
146 PyErr_SetString(PyExc_TypeError,
147 "bytecode object must be a single-segment read-only buffer");
148 return NULL;
149 }
150
151 return (PyObject *)PyCode_New(argcount, nlocals, stacksize, flags,
152 code, consts, names, varnames,
153 freevars, cellvars, filename, name,
154 firstlineno, lnotab);
155}
156
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000157static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000158code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000159{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000160 Py_XDECREF(co->co_code);
161 Py_XDECREF(co->co_consts);
162 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000163 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000164 Py_XDECREF(co->co_freevars);
165 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000166 Py_XDECREF(co->co_filename);
167 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000168 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000169 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000170}
171
Guido van Rossum79f25d91997-04-29 20:08:16 +0000172static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000173code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000174{
175 char buf[500];
176 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000177 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000178 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000179
Guido van Rossuma396a882000-04-07 01:21:36 +0000180 if (co->co_firstlineno != 0)
181 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000182 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000183 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000184 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000185 name = PyString_AS_STRING(co->co_name);
Barry Warsaw8f6d8682001-11-28 21:10:39 +0000186 PyOS_snprintf(buf, sizeof(buf),
187 "<code object %.100s at %p, file \"%.300s\", line %d>",
188 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000189 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000190}
191
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000192static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000193code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000194{
195 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000196 cmp = PyObject_Compare(co->co_name, cp->co_name);
197 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000198 cmp = co->co_argcount - cp->co_argcount;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000199 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000200 cmp = co->co_nlocals - cp->co_nlocals;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000201 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000202 cmp = co->co_flags - cp->co_flags;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000203 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000204 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000205 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000206 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000207 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000208 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000209 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000210 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000211 if (cmp) return cmp;
212 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
213 if (cmp) return cmp;
214 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000215 return cmp;
216}
217
218static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000219code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000220{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000221 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000222 h0 = PyObject_Hash(co->co_name);
223 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000224 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000225 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000227 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000228 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000229 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000230 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000231 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000232 h5 = PyObject_Hash(co->co_freevars);
233 if (h5 == -1) return -1;
234 h6 = PyObject_Hash(co->co_cellvars);
235 if (h6 == -1) return -1;
236 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000237 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000238 if (h == -1) h = -2;
239 return h;
240}
241
Jeremy Hylton78891072001-03-01 06:09:34 +0000242/* XXX code objects need to participate in GC? */
243
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244PyTypeObject PyCode_Type = {
245 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000246 0,
247 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000248 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000249 0,
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000250 (destructor)code_dealloc, /* tp_dealloc */
251 0, /* tp_print */
252 0, /* tp_getattr */
253 0, /* tp_setattr */
254 (cmpfunc)code_compare, /* tp_compare */
255 (reprfunc)code_repr, /* tp_repr */
256 0, /* tp_as_number */
257 0, /* tp_as_sequence */
258 0, /* tp_as_mapping */
259 (hashfunc)code_hash, /* tp_hash */
260 0, /* tp_call */
261 0, /* tp_str */
262 PyObject_GenericGetAttr, /* tp_getattro */
263 0, /* tp_setattro */
264 0, /* tp_as_buffer */
265 Py_TPFLAGS_DEFAULT, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000266 code_doc, /* tp_doc */
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000267 0, /* tp_traverse */
268 0, /* tp_clear */
269 0, /* tp_richcompare */
270 0, /* tp_weaklistoffset */
271 0, /* tp_iter */
272 0, /* tp_iternext */
273 0, /* tp_methods */
274 code_memberlist, /* tp_members */
275 0, /* tp_getset */
276 0, /* tp_base */
277 0, /* tp_dict */
278 0, /* tp_descr_get */
279 0, /* tp_descr_set */
280 0, /* tp_dictoffset */
281 0, /* tp_init */
282 0, /* tp_alloc */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000283 code_new, /* tp_new */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000284};
285
Guido van Rossum644a12b1997-04-09 19:24:53 +0000286#define NAME_CHARS \
287 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
288
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000289/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
290
291static int
292all_name_chars(unsigned char *s)
293{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000294 static char ok_name_char[256];
295 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000296
Guido van Rossumcd90c202001-02-09 15:06:42 +0000297 if (ok_name_char[*name_chars] == 0) {
298 unsigned char *p;
299 for (p = name_chars; *p; p++)
300 ok_name_char[*p] = 1;
301 }
302 while (*s) {
303 if (ok_name_char[*s++] == 0)
304 return 0;
305 }
306 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000307}
308
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000309static int
310intern_strings(PyObject *tuple)
311{
312 int i;
313
314 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
315 PyObject *v = PyTuple_GET_ITEM(tuple, i);
316 if (v == NULL || !PyString_Check(v)) {
317 Py_FatalError("non-string found in code slot");
318 PyErr_BadInternalCall();
319 return -1;
320 }
321 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
322 }
323 return 0;
324}
325
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000326#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
327#define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD)
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000328#define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE || op==CONTINUE_LOOP)
329#define GETJUMPTGT(arr, i) (GETARG(arr,i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+3))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000330#define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255
331
332static PyObject *
333optimize_code(PyObject *code, PyObject* consts)
334{
335 int i, j, codelen;
336 int tgt, tgttgt, opcode;
337 unsigned char *codestr;
338
339 /* Make a modifiable copy of the code string */
340 if (!PyString_Check(code))
341 goto exitUnchanged;
342 codelen = PyString_Size(code);
343 codestr = PyMem_Malloc(codelen);
Raymond Hettingerf4cf76d2003-04-24 05:45:23 +0000344 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000345 goto exitUnchanged;
346 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
347 assert(PyTuple_Check(consts));
348
Raymond Hettingerf4cf76d2003-04-24 05:45:23 +0000349 for (i=0 ; i<codelen-7 ; i += HAS_ARG(codestr[i]) ? 3 : 1) {
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000350 opcode = codestr[i];
351 switch (opcode) {
352
353 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP.
354 Note, only the first opcode is changed, the others still
355 perform normally if they happen to be jump targets. */
356 case LOAD_CONST:
357 j = GETARG(codestr, i);
358 if (codestr[i+3] != JUMP_IF_FALSE ||
359 codestr[i+6] != POP_TOP ||
360 !PyObject_IsTrue(PyTuple_GET_ITEM(consts, j)))
361 continue;
362 codestr[i] = JUMP_FORWARD;
363 SETARG(codestr, i, 4);
364 break;
365
Raymond Hettingerf4cf76d2003-04-24 05:45:23 +0000366 /* Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2 JMP+2.
367 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2 JMP+1.
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000368 Note, these opcodes occur together only in assignment
369 statements. Accordingly, the unpack opcode is never
370 a jump target. */
371 case BUILD_TUPLE:
372 case BUILD_LIST:
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000373 if (codestr[i+3] != UNPACK_SEQUENCE)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000374 continue;
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000375 if (GETARG(codestr, i) == 2 && \
376 GETARG(codestr, i+3) == 2) {
377 codestr[i] = ROT_TWO;
378 codestr[i+1] = JUMP_FORWARD;
379 SETARG(codestr, i+1, 2);
Raymond Hettingerf4cf76d2003-04-24 05:45:23 +0000380 codestr[i+4] = DUP_TOP; /* Filler codes used as NOPs */
381 codestr[i+5] = POP_TOP;
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000382 continue;
383 }
384 if (GETARG(codestr, i) == 3 && \
385 GETARG(codestr, i+3) == 3) {
386 codestr[i] = ROT_THREE;
387 codestr[i+1] = ROT_TWO;
388 codestr[i+2] = JUMP_FORWARD;
Raymond Hettingerf4cf76d2003-04-24 05:45:23 +0000389 SETARG(codestr, i+2, 1);
390 codestr[i+5] = DUP_TOP;
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000391 }
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000392 break;
393
394 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000395 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000396 case JUMP_FORWARD:
397 case JUMP_IF_FALSE:
398 case JUMP_IF_TRUE:
399 case JUMP_ABSOLUTE:
400 case CONTINUE_LOOP:
401 case SETUP_LOOP:
402 case SETUP_EXCEPT:
403 case SETUP_FINALLY:
404 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerf4cf76d2003-04-24 05:45:23 +0000405 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000406 continue;
407 tgttgt = GETJUMPTGT(codestr, tgt);
408 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
409 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000410 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000411 tgttgt -= i + 3; /* Calc relative jump addr */
412 if (tgttgt < 0) /* No backward relative jumps */
413 continue;
414 codestr[i] = opcode;
415 SETARG(codestr, i, tgttgt);
416 break;
417
418 case EXTENDED_ARG:
419 PyMem_Free(codestr);
420 goto exitUnchanged;
421 }
422 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000423 code = PyString_FromStringAndSize((char *)codestr, codelen);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000424 PyMem_Free(codestr);
425 return code;
426
427exitUnchanged:
428 Py_INCREF(code);
429 return code;
430}
431
Guido van Rossum79f25d91997-04-29 20:08:16 +0000432PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000433PyCode_New(int argcount, int nlocals, int stacksize, int flags,
434 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000435 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
436 PyObject *filename, PyObject *name, int firstlineno,
437 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000438{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000439 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000440 int i;
441 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000442 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000443 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000444 consts == NULL || !PyTuple_Check(consts) ||
445 names == NULL || !PyTuple_Check(names) ||
446 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000447 freevars == NULL || !PyTuple_Check(freevars) ||
448 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000449 name == NULL || !PyString_Check(name) ||
450 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000451 lnotab == NULL || !PyString_Check(lnotab) ||
452 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000453 PyErr_BadInternalCall();
454 return NULL;
455 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000456 intern_strings(names);
457 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000458 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000459 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000460 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000461 for (i = PyTuple_Size(consts); --i >= 0; ) {
462 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000463 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000464 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000465 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000466 continue;
467 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000468 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000469 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000470 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000471 co->co_argcount = argcount;
472 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000473 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000474 co->co_flags = flags;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000475 co->co_code = optimize_code(code, consts);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000476 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000477 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000478 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000479 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000480 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000481 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000482 Py_INCREF(freevars);
483 co->co_freevars = freevars;
484 Py_INCREF(cellvars);
485 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000486 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000487 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000488 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000489 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000490 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000491 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000492 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000493 if (PyTuple_GET_SIZE(freevars) == 0 &&
494 PyTuple_GET_SIZE(cellvars) == 0)
495 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000496 }
497 return co;
498}
499
500
501/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000502
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000503/* The compiler uses two passes to generate bytecodes. The first pass
504 builds the symbol table. The second pass generates the bytecode.
505
506 The first pass uses a single symtable struct. The second pass uses
507 a compiling struct for each code block. The compiling structs
508 share a reference to the symtable.
509
510 The two passes communicate via symtable_load_symbols() and via
511 is_local() and is_global(). The former initializes several slots
512 in the compiling struct: c_varnames, c_locals, c_nlocals,
513 c_argcount, c_globals, and c_flags.
514*/
515
Tim Peters2a7f3842001-06-09 09:26:21 +0000516/* All about c_lnotab.
517
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000518c_lnotab is an array of unsigned bytes disguised as a Python string. Since
519version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
520mapped to source code line #s via c_lnotab instead.
521
Tim Peters2a7f3842001-06-09 09:26:21 +0000522The array is conceptually a list of
523 (bytecode offset increment, line number increment)
524pairs. The details are important and delicate, best illustrated by example:
525
526 byte code offset source code line number
527 0 1
528 6 2
529 50 7
530 350 307
531 361 308
532
533The first trick is that these numbers aren't stored, only the increments
534from one row to the next (this doesn't really work, but it's a start):
535
536 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
537
538The second trick is that an unsigned byte can't hold negative values, or
539values larger than 255, so (a) there's a deep assumption that byte code
540offsets and their corresponding line #s both increase monotonically, and (b)
541if at least one column jumps by more than 255 from one row to the next, more
542than one pair is written to the table. In case #b, there's no way to know
543from looking at the table later how many were written. That's the delicate
544part. A user of c_lnotab desiring to find the source line number
545corresponding to a bytecode address A should do something like this
546
547 lineno = addr = 0
548 for addr_incr, line_incr in c_lnotab:
549 addr += addr_incr
550 if addr > A:
551 return lineno
552 lineno += line_incr
553
554In order for this to work, when the addr field increments by more than 255,
555the line # increment in each pair generated must be 0 until the remaining addr
556increment is < 256. So, in the example above, com_set_lineno should not (as
557was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
558255, 0, 45, 255, 0, 45.
559*/
560
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000561struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000562 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000563 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000564 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000565 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000566 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +0000567 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000568 PyObject *c_locals; /* dictionary (value=localID) */
569 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000570 PyObject *c_freevars; /* dictionary (value=None) */
571 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000572 int c_nlocals; /* index of next local */
573 int c_argcount; /* number of top-level arguments */
574 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000575 int c_nexti; /* index into c_code */
576 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000577 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000578 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000579 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000580 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000581 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000582 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +0000583 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000584 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000585 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000586 int c_stacklevel; /* Current stack level */
587 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000588 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000589 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000590 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000591 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000592 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000593 int c_nested; /* Is block nested funcdef or lamdef? */
594 int c_closure; /* Is nested w/freevars? */
595 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000596 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000597 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000598};
599
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000600static int
601is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000602{
603 if ((v & (USE | DEF_FREE))
604 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
605 return 1;
606 if (v & DEF_FREE_CLASS)
607 return 1;
608 return 0;
609}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000610
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000611static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000612com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000613{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000614 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
615
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000616 if (c == NULL) {
617 /* Error occurred via symtable call to
618 is_constant_false */
619 PyErr_SetString(exc, msg);
620 return;
621 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000622 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000623 if (c->c_lineno < 1 || c->c_interactive) {
624 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000625 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000626 return;
627 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000628 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000629 if (v == NULL)
630 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000631
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000632 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000633 if (line == NULL) {
634 Py_INCREF(Py_None);
635 line = Py_None;
636 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000637 if (exc == PyExc_SyntaxError) {
638 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
639 Py_None, line);
640 if (t == NULL)
641 goto exit;
642 w = Py_BuildValue("(OO)", v, t);
643 if (w == NULL)
644 goto exit;
645 PyErr_SetObject(exc, w);
646 } else {
647 /* Make sure additional exceptions are printed with
648 file and line, also. */
649 PyErr_SetObject(exc, v);
650 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
651 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000652 exit:
653 Py_XDECREF(t);
654 Py_XDECREF(v);
655 Py_XDECREF(w);
656 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000657}
658
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000659/* Interface to the block stack */
660
661static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000662block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000663{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000664 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000665 com_error(c, PyExc_SystemError,
666 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000667 }
668 else {
669 c->c_block[c->c_nblocks++] = type;
670 }
671}
672
673static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000674block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000675{
676 if (c->c_nblocks > 0)
677 c->c_nblocks--;
678 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000679 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000680 }
681}
682
Guido van Rossum681d79a1995-07-18 14:51:37 +0000683/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000684
Martin v. Löwis95292d62002-12-11 14:04:59 +0000685static int issue_warning(const char *, const char *, int);
686static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000687static void com_free(struct compiling *);
688static void com_push(struct compiling *, int);
689static void com_pop(struct compiling *, int);
690static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000691static void com_node(struct compiling *, node *);
692static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000693static void com_addbyte(struct compiling *, int);
694static void com_addint(struct compiling *, int);
695static void com_addoparg(struct compiling *, int, int);
696static void com_addfwref(struct compiling *, int, int *);
697static void com_backpatch(struct compiling *, int);
698static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
699static int com_addconst(struct compiling *, PyObject *);
700static int com_addname(struct compiling *, PyObject *);
701static void com_addopname(struct compiling *, int, node *);
702static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000703static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000704static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000705static void com_assign(struct compiling *, node *, int, node *);
706static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000707static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +0000708static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000709 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000710static PyObject *parsestrplus(struct compiling*, node *);
711static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000712static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000713
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000714static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000715
716/* symtable operations */
717static int symtable_build(struct compiling *, node *);
718static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000719static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000720static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000721static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000722static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000723static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000724
725static void symtable_node(struct symtable *, node *);
726static void symtable_funcdef(struct symtable *, node *);
727static void symtable_default_args(struct symtable *, node *);
728static void symtable_params(struct symtable *, node *);
729static void symtable_params_fplist(struct symtable *, node *n);
730static void symtable_global(struct symtable *, node *);
731static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000732static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000733static void symtable_list_comprehension(struct symtable *, node *);
734
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000735static int symtable_update_free_vars(struct symtable *);
736static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
737static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
738
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000739/* helper */
740static void
741do_pad(int pad)
742{
743 int i;
744 for (i = 0; i < pad; ++i)
745 fprintf(stderr, " ");
746}
747
748static void
749dump(node *n, int pad, int depth)
750{
751 int i;
752 if (depth == 0)
753 return;
754 do_pad(pad);
755 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
756 if (depth > 0)
757 depth--;
758 for (i = 0; i < NCH(n); ++i)
759 dump(CHILD(n, i), pad + 1, depth);
760}
761
762#define DUMP(N) dump(N, 0, -1)
763
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000764static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000765com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000766{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000767 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000768 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
769 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000770 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000771 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000772 goto fail;
773 if ((c->c_const_dict = PyDict_New()) == NULL)
774 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000775 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000776 goto fail;
777 if ((c->c_name_dict = PyDict_New()) == NULL)
778 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000779 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000780 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000781 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
782 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000783 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000784 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000785 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000786 c->c_freevars = NULL;
787 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000788 c->c_nlocals = 0;
789 c->c_argcount = 0;
790 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000791 c->c_nexti = 0;
792 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000793 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000794 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000795 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000796 c->c_begin = 0;
797 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000798 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000799 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000800 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000801 c->c_stacklevel = 0;
802 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000803 c->c_firstlineno = 0;
804 c->c_last_addr = 0;
805 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000806 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000807 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000808 c->c_nested = 0;
809 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000810 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000811 return 1;
812
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000813 fail:
814 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000815 return 0;
816}
817
818static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000819com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000820{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000821 Py_XDECREF(c->c_code);
822 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000823 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000824 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000825 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000826 Py_XDECREF(c->c_globals);
827 Py_XDECREF(c->c_locals);
828 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000829 Py_XDECREF(c->c_freevars);
830 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000831 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000832 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +0000833 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000834}
835
836static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000837com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000838{
839 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000840 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +0000841 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000842 /*
843 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
844 c->c_filename, c->c_name, c->c_lineno,
845 c->c_nexti, c->c_stacklevel, n);
846 */
847 }
Guido van Rossum8b993a91997-01-17 21:04:03 +0000848}
849
850static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000851com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000852{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000853 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000854 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000855 else
856 c->c_stacklevel -= n;
857}
858
859static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000860com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000861{
862 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000863 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000864 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000865 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000866}
867
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000868static int
869com_check_size(PyObject **s, int offset)
870{
871 int len = PyString_GET_SIZE(*s);
872 if (offset >= len)
873 return _PyString_Resize(s, len * 2);
874 return 0;
875}
876
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000877static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000878com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000879{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000880 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000881 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +0000882 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000883 if (com_check_size(&c->c_code, c->c_nexti)) {
884 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000885 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000886 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000887 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000888}
889
890static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000891com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000892{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000893 com_addbyte(c, x & 0xff);
894 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000895}
896
897static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000898com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000899{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000900 char *p;
901 if (c->c_lnotab == NULL)
902 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000903 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
904 c->c_errors++;
905 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000906 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000907 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000908 *p++ = addr;
909 *p++ = line;
910 c->c_lnotab_next += 2;
911}
912
913static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000914com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000915{
916 c->c_lineno = lineno;
917 if (c->c_firstlineno == 0) {
918 c->c_firstlineno = c->c_last_line = lineno;
919 }
920 else {
921 int incr_addr = c->c_nexti - c->c_last_addr;
922 int incr_line = lineno - c->c_last_line;
Tim Peters2a7f3842001-06-09 09:26:21 +0000923 while (incr_addr > 255) {
924 com_add_lnotab(c, 255, 0);
925 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000926 }
Tim Peters2a7f3842001-06-09 09:26:21 +0000927 while (incr_line > 255) {
928 com_add_lnotab(c, incr_addr, 255);
929 incr_line -=255;
930 incr_addr = 0;
931 }
932 if (incr_addr > 0 || incr_line > 0)
933 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000934 c->c_last_addr = c->c_nexti;
935 c->c_last_line = lineno;
936 }
937}
938
939static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000940com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000941{
Fred Drakeef8ace32000-08-24 00:32:09 +0000942 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +0000943 if (extended_arg){
944 com_addbyte(c, EXTENDED_ARG);
945 com_addint(c, extended_arg);
946 arg &= 0xffff;
947 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000948 com_addbyte(c, op);
949 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000950}
951
952static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000953com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000954{
955 /* Compile a forward reference for backpatching */
956 int here;
957 int anchor;
958 com_addbyte(c, op);
959 here = c->c_nexti;
960 anchor = *p_anchor;
961 *p_anchor = here;
962 com_addint(c, anchor == 0 ? 0 : here - anchor);
963}
964
965static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000966com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000967{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000968 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000969 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000970 int dist;
971 int prev;
972 for (;;) {
973 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000974 prev = code[anchor] + (code[anchor+1] << 8);
975 dist = target - (anchor+2);
976 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000977 dist >>= 8;
978 code[anchor+1] = dist;
979 dist >>= 8;
980 if (dist) {
981 com_error(c, PyExc_SystemError,
982 "com_backpatch: offset too large");
983 break;
984 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000985 if (!prev)
986 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000987 anchor -= prev;
988 }
989}
990
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000991/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000992
993static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000994com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000995{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000996 PyObject *w, *t, *np=NULL;
997 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000998
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000999 t = Py_BuildValue("(OO)", v, v->ob_type);
1000 if (t == NULL)
1001 goto fail;
1002 w = PyDict_GetItem(dict, t);
1003 if (w != NULL) {
1004 n = PyInt_AsLong(w);
1005 } else {
1006 n = PyList_Size(list);
1007 np = PyInt_FromLong(n);
1008 if (np == NULL)
1009 goto fail;
1010 if (PyList_Append(list, v) != 0)
1011 goto fail;
1012 if (PyDict_SetItem(dict, t, np) != 0)
1013 goto fail;
1014 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001015 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001016 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001017 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001018 fail:
1019 Py_XDECREF(np);
1020 Py_XDECREF(t);
1021 c->c_errors++;
1022 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001023}
1024
1025static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001026com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001027{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001028 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001029}
1030
1031static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001032com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001033{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001034 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001035}
1036
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001037int
1038_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001039{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001040 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001041 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001042 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001043 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1044 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001045 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001046 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001047 return 0; /* Don't mangle __extremely_long_names */
1048 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1049 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001050 /* Strip leading underscores from class name */
1051 while (*p == '_')
1052 p++;
1053 if (*p == '\0')
1054 return 0; /* Don't mangle if class is just underscores */
1055 plen = strlen(p);
1056 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001057 plen = maxlen-nlen-2; /* Truncate class name if too long */
1058 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001059 buffer[0] = '_';
1060 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001061 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001062 return 1;
1063}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001064
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001065static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001066com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001067{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001068 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001069 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001070 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001071
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001072 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001073 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001074 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001075 c->c_errors++;
1076 i = 255;
1077 }
1078 else {
1079 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001080 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001081 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001082 com_addoparg(c, op, i);
1083}
1084
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001085#define NAME_LOCAL 0
1086#define NAME_GLOBAL 1
1087#define NAME_DEFAULT 2
1088#define NAME_CLOSURE 3
1089
1090static int
1091com_lookup_arg(PyObject *dict, PyObject *name)
1092{
1093 PyObject *v = PyDict_GetItem(dict, name);
1094 if (v == NULL)
1095 return -1;
1096 else
1097 return PyInt_AS_LONG(v);
1098}
1099
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001100static int
1101none_assignment_check(struct compiling *c, char *name, int assigning)
1102{
1103 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1104 char *msg;
1105 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001106 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001107 else
1108 msg = "deleting None";
1109 if (issue_warning(msg, c->c_filename, c->c_lineno) < 0) {
1110 c->c_errors++;
1111 return -1;
1112 }
1113 }
1114 return 0;
1115}
1116
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001117static void
1118com_addop_varname(struct compiling *c, int kind, char *name)
1119{
1120 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001121 int i, reftype;
1122 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001123 int op = STOP_CODE;
1124 char buffer[MANGLE_LEN];
1125
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001126 if (kind != VAR_LOAD &&
1127 none_assignment_check(c, name, kind == VAR_STORE))
1128 {
1129 c->c_errors++;
1130 i = 255;
1131 goto done;
1132 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001133 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001134 name = buffer;
1135 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1136 c->c_errors++;
1137 i = 255;
1138 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001139 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001140
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001141 reftype = get_ref_type(c, name);
1142 switch (reftype) {
1143 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001144 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001145 scope = NAME_LOCAL;
1146 break;
1147 case GLOBAL_EXPLICIT:
1148 scope = NAME_GLOBAL;
1149 break;
1150 case GLOBAL_IMPLICIT:
1151 if (c->c_flags & CO_OPTIMIZED)
1152 scope = NAME_GLOBAL;
1153 break;
1154 case FREE:
1155 case CELL:
1156 scope = NAME_CLOSURE;
1157 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001158 }
1159
1160 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001161 if (scope == NAME_LOCAL)
1162 i = com_lookup_arg(c->c_locals, v);
1163 else if (reftype == FREE)
1164 i = com_lookup_arg(c->c_freevars, v);
1165 else if (reftype == CELL)
1166 i = com_lookup_arg(c->c_cellvars, v);
1167 if (i == -1) {
1168 c->c_errors++; /* XXX no exception set */
1169 i = 255;
1170 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001171 }
1172 Py_DECREF(v);
1173
1174 switch (kind) {
1175 case VAR_LOAD:
1176 switch (scope) {
1177 case NAME_LOCAL:
1178 op = LOAD_FAST;
1179 break;
1180 case NAME_GLOBAL:
1181 op = LOAD_GLOBAL;
1182 break;
1183 case NAME_DEFAULT:
1184 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001185 break;
1186 case NAME_CLOSURE:
1187 op = LOAD_DEREF;
1188 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001189 }
1190 break;
1191 case VAR_STORE:
1192 switch (scope) {
1193 case NAME_LOCAL:
1194 op = STORE_FAST;
1195 break;
1196 case NAME_GLOBAL:
1197 op = STORE_GLOBAL;
1198 break;
1199 case NAME_DEFAULT:
1200 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001201 break;
1202 case NAME_CLOSURE:
1203 op = STORE_DEREF;
1204 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001205 }
1206 break;
1207 case VAR_DELETE:
1208 switch (scope) {
1209 case NAME_LOCAL:
1210 op = DELETE_FAST;
1211 break;
1212 case NAME_GLOBAL:
1213 op = DELETE_GLOBAL;
1214 break;
1215 case NAME_DEFAULT:
1216 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001217 break;
1218 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001219 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001220 PyOS_snprintf(buf, sizeof(buf),
1221 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001222 com_error(c, PyExc_SyntaxError, buf);
1223 i = 255;
1224 break;
1225 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001226 }
1227 break;
1228 }
1229done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001230 com_addoparg(c, op, i);
1231}
1232
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001233static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001234com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001235{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001236 char *name;
1237 char buffer[1000];
1238 /* XXX it is possible to write this code without the 1000
1239 chars on the total length of dotted names, I just can't be
1240 bothered right now */
1241 if (TYPE(n) == STAR)
1242 name = "*";
1243 else if (TYPE(n) == dotted_name) {
1244 char *p = buffer;
1245 int i;
1246 name = buffer;
1247 for (i = 0; i < NCH(n); i += 2) {
1248 char *s = STR(CHILD(n, i));
1249 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001250 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001251 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001252 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001253 break;
1254 }
1255 if (p != buffer)
1256 *p++ = '.';
1257 strcpy(p, s);
1258 p = strchr(p, '\0');
1259 }
1260 }
1261 else {
1262 REQ(n, NAME);
1263 name = STR(n);
1264 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001265 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001266}
1267
Guido van Rossum79f25d91997-04-29 20:08:16 +00001268static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001269parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001270{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001271 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001272 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001273 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001274#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001275 int imflag;
1276#endif
1277
Guido van Rossum282914b1991-04-04 10:42:56 +00001278 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001279 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001280#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001281 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001282#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001283 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001284 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001285 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001286 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001287 if (x < 0 && errno == 0) {
Guido van Rossum715eca92002-08-12 21:54:46 +00001288 if (PyErr_WarnExplicit(
Barry Warsaw9f007392002-08-14 15:51:29 +00001289 PyExc_FutureWarning,
Guido van Rossum715eca92002-08-12 21:54:46 +00001290 "hex/oct constants > sys.maxint "
1291 "will return positive values "
1292 "in Python 2.4 and up",
Martin v. Löwis95292d62002-12-11 14:04:59 +00001293 /* XXX: Give WarnExplicit
1294 a const char* argument. */
1295 (char*)c->c_filename,
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001296 c->c_lineno,
Guido van Rossum715eca92002-08-12 21:54:46 +00001297 NULL,
1298 NULL) < 0)
Guido van Rossum078151d2002-08-11 04:24:12 +00001299 return NULL;
Guido van Rossum3cb8e542002-08-11 14:06:15 +00001300 errno = 0; /* Might be changed by PyErr_Warn() */
Guido van Rossum078151d2002-08-11 04:24:12 +00001301 }
1302 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001303 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001304 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001305 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001306 if (errno != 0)
1307 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001308 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001309 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001310 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001311#ifndef WITHOUT_COMPLEX
1312 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001313 Py_complex z;
1314 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001315 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001316 z.imag = atof(s);
1317 PyFPE_END_PROTECT(z)
1318 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001319 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001320 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001321#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001322 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001323 PyFPE_START_PROTECT("atof", return 0)
1324 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001325 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001326 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001327 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001328}
1329
Guido van Rossum79f25d91997-04-29 20:08:16 +00001330static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001331decode_utf8(char **sPtr, char *end, char* encoding)
1332{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001333#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001334 Py_FatalError("decode_utf8 should not be called in this build.");
1335 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001336#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001337 PyObject *u, *v;
1338 char *s, *t;
1339 t = s = *sPtr;
1340 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1341 while (s < end && (*s & 0x80)) s++;
1342 *sPtr = s;
1343 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1344 if (u == NULL)
1345 return NULL;
1346 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1347 Py_DECREF(u);
1348 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001349#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001350}
1351
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001352/* compiler.transformer.Transformer.decode_literal depends on what
1353 might seem like minor details of this function -- changes here
1354 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001355static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001356parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001357{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001358 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001359 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001360 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001361 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001362 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001363 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001364 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001365
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001366 if (isalpha(quote) || quote == '_') {
1367 if (quote == 'u' || quote == 'U') {
1368 quote = *++s;
1369 unicode = 1;
1370 }
1371 if (quote == 'r' || quote == 'R') {
1372 quote = *++s;
1373 rawmode = 1;
1374 }
1375 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001376 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001377 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001378 return NULL;
1379 }
1380 s++;
1381 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001382 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001383 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001384 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001385 return NULL;
1386 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001387 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001388 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001389 return NULL;
1390 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001391 if (len >= 4 && s[0] == quote && s[1] == quote) {
1392 s += 2;
1393 len -= 2;
1394 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001395 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001396 return NULL;
1397 }
1398 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001399#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001400 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001401 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001402 char *buf;
1403 char *p;
1404 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001405 if (encoding == NULL) {
1406 buf = s;
1407 u = NULL;
1408 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1409 buf = s;
1410 u = NULL;
1411 } else {
1412 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1413 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1414 if (u == NULL)
1415 return NULL;
1416 p = buf = PyString_AsString(u);
1417 end = s + len;
1418 while (s < end) {
1419 if (*s == '\\') {
1420 *p++ = *s++;
1421 if (*s & 0x80) {
1422 strcpy(p, "u005c");
1423 p += 5;
1424 }
1425 }
1426 if (*s & 0x80) { /* XXX inefficient */
1427 char *r;
1428 int rn, i;
1429 w = decode_utf8(&s, end, "utf-16-be");
1430 if (w == NULL) {
1431 Py_DECREF(u);
1432 return NULL;
1433 }
1434 r = PyString_AsString(w);
1435 rn = PyString_Size(w);
1436 assert(rn % 2 == 0);
1437 for (i = 0; i < rn; i += 2) {
1438 sprintf(p, "\\u%02x%02x",
1439 r[i + 0] & 0xFF,
1440 r[i + 1] & 0xFF);
1441 p += 6;
1442 }
1443 Py_DECREF(w);
1444 } else {
1445 *p++ = *s++;
1446 }
1447 }
1448 len = p - buf;
1449 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001450 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001451 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001452 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001453 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1454 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001455 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001456 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001457 return v;
1458
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001459 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001460#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001461 need_encoding = (encoding != NULL &&
1462 strcmp(encoding, "utf-8") != 0 &&
1463 strcmp(encoding, "iso-8859-1") != 0);
1464 if (rawmode || strchr(s, '\\') == NULL) {
1465 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001466#ifndef Py_USING_UNICODE
1467 /* This should not happen - we never see any other
1468 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001469 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001470#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001471 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1472 if (u == NULL)
1473 return NULL;
1474 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1475 Py_DECREF(u);
1476 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001477#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001478 } else {
1479 return PyString_FromStringAndSize(s, len);
1480 }
1481 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001482
1483 v = PyString_DecodeEscape(s, len, NULL, unicode,
1484 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001485 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001486 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001487 return v;
1488}
1489
Guido van Rossum79f25d91997-04-29 20:08:16 +00001490static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001491parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001492{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001493 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001494 int i;
1495 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001496 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001497 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001498 for (i = 1; i < NCH(n); i++) {
1499 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001500 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001501 if (s == NULL)
1502 goto onError;
1503 if (PyString_Check(v) && PyString_Check(s)) {
1504 PyString_ConcatAndDel(&v, s);
1505 if (v == NULL)
1506 goto onError;
1507 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001508#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001509 else {
1510 PyObject *temp;
1511 temp = PyUnicode_Concat(v, s);
1512 Py_DECREF(s);
1513 if (temp == NULL)
1514 goto onError;
1515 Py_DECREF(v);
1516 v = temp;
1517 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001518#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001519 }
1520 }
1521 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001522
1523 onError:
1524 Py_XDECREF(v);
1525 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001526}
1527
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001528static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001529com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001530{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001531 int anchor = 0;
1532 int save_begin = c->c_begin;
1533
1534 /* list_iter: for v in expr [list_iter] */
1535 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001536 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001537 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001538 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001539 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001540 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001541 c->c_loops++;
1542 com_list_iter(c, n, e, t);
1543 c->c_loops--;
1544 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1545 c->c_begin = save_begin;
1546 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001547 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001548}
1549
1550static void
1551com_list_if(struct compiling *c, node *n, node *e, char *t)
1552{
1553 int anchor = 0;
1554 int a = 0;
1555 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001556 com_node(c, CHILD(n, 1));
1557 com_addfwref(c, JUMP_IF_FALSE, &a);
1558 com_addbyte(c, POP_TOP);
1559 com_pop(c, 1);
1560 com_list_iter(c, n, e, t);
1561 com_addfwref(c, JUMP_FORWARD, &anchor);
1562 com_backpatch(c, a);
1563 /* We jump here with an extra entry which we now pop */
1564 com_addbyte(c, POP_TOP);
1565 com_backpatch(c, anchor);
1566}
1567
1568static void
1569com_list_iter(struct compiling *c,
1570 node *p, /* parent of list_iter node */
1571 node *e, /* element expression node */
1572 char *t /* name of result list temp local */)
1573{
1574 /* list_iter is the last child in a listmaker, list_for, or list_if */
1575 node *n = CHILD(p, NCH(p)-1);
1576 if (TYPE(n) == list_iter) {
1577 n = CHILD(n, 0);
1578 switch (TYPE(n)) {
1579 case list_for:
1580 com_list_for(c, n, e, t);
1581 break;
1582 case list_if:
1583 com_list_if(c, n, e, t);
1584 break;
1585 default:
1586 com_error(c, PyExc_SystemError,
1587 "invalid list_iter node type");
1588 }
1589 }
1590 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001591 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001592 com_push(c, 1);
1593 com_node(c, e);
1594 com_addoparg(c, CALL_FUNCTION, 1);
1595 com_addbyte(c, POP_TOP);
1596 com_pop(c, 2);
1597 }
1598}
1599
1600static void
1601com_list_comprehension(struct compiling *c, node *n)
1602{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001603 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001604 char tmpname[30];
1605 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001606 com_addoparg(c, BUILD_LIST, 0);
1607 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1608 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001609 com_addop_name(c, LOAD_ATTR, "append");
1610 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001611 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001612 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001613 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001614 --c->c_tmpname;
1615}
1616
1617static void
1618com_listmaker(struct compiling *c, node *n)
1619{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001620 /* listmaker: test ( list_for | (',' test)* [','] ) */
1621 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001622 com_list_comprehension(c, n);
1623 else {
1624 int len = 0;
1625 int i;
1626 for (i = 0; i < NCH(n); i += 2, len++)
1627 com_node(c, CHILD(n, i));
1628 com_addoparg(c, BUILD_LIST, len);
1629 com_pop(c, len-1);
1630 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001631}
1632
1633static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001634com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001635{
1636 int i;
1637 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1638 for (i = 0; i+2 < NCH(n); i += 4) {
1639 /* We must arrange things just right for STORE_SUBSCR.
1640 It wants the stack to look like (value) (dict) (key) */
1641 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001642 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001643 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00001644 com_node(c, CHILD(n, i+2)); /* value */
1645 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001646 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001647 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001648 }
1649}
1650
1651static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001652com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001653{
1654 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001655 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001656 int i;
1657 REQ(n, atom);
1658 ch = CHILD(n, 0);
1659 switch (TYPE(ch)) {
1660 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001661 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001662 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001663 com_push(c, 1);
1664 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001665 else
1666 com_node(c, CHILD(n, 1));
1667 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001668 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001669 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001670 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001671 com_push(c, 1);
1672 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001673 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001674 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001675 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001676 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001677 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001678 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001679 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001680 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001681 break;
1682 case BACKQUOTE:
1683 com_node(c, CHILD(n, 1));
1684 com_addbyte(c, UNARY_CONVERT);
1685 break;
1686 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001687 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001688 i = 255;
1689 }
1690 else {
1691 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001692 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001693 }
1694 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001695 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001696 break;
1697 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001698 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001699 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001700 c->c_errors++;
1701 i = 255;
1702 }
1703 else {
1704 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001705 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001706 }
1707 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001708 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001709 break;
1710 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001711 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001712 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001713 break;
1714 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001715 com_error(c, PyExc_SystemError,
1716 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001717 }
1718}
1719
1720static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001721com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001722{
1723 if (NCH(n) == 1) {
1724 com_addbyte(c, op);
1725 }
1726 else if (NCH(n) == 2) {
1727 if (TYPE(CHILD(n, 0)) != COLON) {
1728 com_node(c, CHILD(n, 0));
1729 com_addbyte(c, op+1);
1730 }
1731 else {
1732 com_node(c, CHILD(n, 1));
1733 com_addbyte(c, op+2);
1734 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001735 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001736 }
1737 else {
1738 com_node(c, CHILD(n, 0));
1739 com_node(c, CHILD(n, 2));
1740 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001741 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001742 }
1743}
1744
Guido van Rossum635abd21997-01-06 22:56:52 +00001745static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001746com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1747{
1748 if (NCH(n) == 1) {
1749 com_addbyte(c, DUP_TOP);
1750 com_push(c, 1);
1751 com_addbyte(c, SLICE);
1752 com_node(c, augn);
1753 com_addbyte(c, opcode);
1754 com_pop(c, 1);
1755 com_addbyte(c, ROT_TWO);
1756 com_addbyte(c, STORE_SLICE);
1757 com_pop(c, 2);
1758 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1759 com_node(c, CHILD(n, 0));
1760 com_addoparg(c, DUP_TOPX, 2);
1761 com_push(c, 2);
1762 com_addbyte(c, SLICE+1);
1763 com_pop(c, 1);
1764 com_node(c, augn);
1765 com_addbyte(c, opcode);
1766 com_pop(c, 1);
1767 com_addbyte(c, ROT_THREE);
1768 com_addbyte(c, STORE_SLICE+1);
1769 com_pop(c, 3);
1770 } else if (NCH(n) == 2) {
1771 com_node(c, CHILD(n, 1));
1772 com_addoparg(c, DUP_TOPX, 2);
1773 com_push(c, 2);
1774 com_addbyte(c, SLICE+2);
1775 com_pop(c, 1);
1776 com_node(c, augn);
1777 com_addbyte(c, opcode);
1778 com_pop(c, 1);
1779 com_addbyte(c, ROT_THREE);
1780 com_addbyte(c, STORE_SLICE+2);
1781 com_pop(c, 3);
1782 } else {
1783 com_node(c, CHILD(n, 0));
1784 com_node(c, CHILD(n, 2));
1785 com_addoparg(c, DUP_TOPX, 3);
1786 com_push(c, 3);
1787 com_addbyte(c, SLICE+3);
1788 com_pop(c, 2);
1789 com_node(c, augn);
1790 com_addbyte(c, opcode);
1791 com_pop(c, 1);
1792 com_addbyte(c, ROT_FOUR);
1793 com_addbyte(c, STORE_SLICE+3);
1794 com_pop(c, 4);
1795 }
1796}
1797
1798static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001799com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001800{
1801 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001802 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001803 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001804 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001805 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001806 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001807 }
1808 else {
1809 com_node(c, CHILD(n, 0));
1810 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001811 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001812 }
1813 m = n;
1814 do {
1815 m = CHILD(m, 0);
1816 } while (NCH(m) == 1);
1817 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001818 /* f(lambda x: x[0] = 3) ends up getting parsed with
1819 * LHS test = lambda x: x[0], and RHS test = 3.
1820 * SF bug 132313 points out that complaining about a keyword
1821 * then is very confusing.
1822 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001823 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001824 TYPE(m) == lambdef ?
1825 "lambda cannot contain assignment" :
1826 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001827 }
1828 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001829 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00001830 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00001831 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001832 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001833 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001834 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001835 else if (*pkeywords == NULL) {
1836 c->c_errors++;
1837 Py_DECREF(v);
1838 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001839 if (PyDict_GetItem(*pkeywords, v) != NULL)
1840 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001841 "duplicate keyword argument");
1842 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001843 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001844 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001845 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001846 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001847 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001848 }
1849 }
1850 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001851}
1852
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001853static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001854com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001855{
1856 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001857 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001858 }
1859 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001860 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001861 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001862 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001863 int star_flag = 0;
1864 int starstar_flag = 0;
1865 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001866 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001867 na = 0;
1868 nk = 0;
1869 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001870 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001871 if (TYPE(ch) == STAR ||
1872 TYPE(ch) == DOUBLESTAR)
1873 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001874 if (ch->n_lineno != lineno) {
1875 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001876 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00001877 }
1878 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001879 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001880 na++;
1881 else
1882 nk++;
1883 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001884 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001885 while (i < NCH(n)) {
1886 node *tok = CHILD(n, i);
1887 node *ch = CHILD(n, i+1);
1888 i += 3;
1889 switch (TYPE(tok)) {
1890 case STAR: star_flag = 1; break;
1891 case DOUBLESTAR: starstar_flag = 1; break;
1892 }
1893 com_node(c, ch);
1894 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001895 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001896 com_error(c, PyExc_SyntaxError,
1897 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001898 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001899 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001900 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001901 star_flag + (starstar_flag << 1);
1902 else
1903 opcode = CALL_FUNCTION;
1904 com_addoparg(c, opcode, na | (nk << 8));
1905 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001906 }
1907}
1908
1909static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001910com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001911{
1912 com_addopname(c, LOAD_ATTR, n);
1913}
1914
1915static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001916com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001917{
1918 int i=0;
1919 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001920 node *ch;
1921
1922 /* first argument */
1923 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001924 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001925 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001926 i++;
1927 }
1928 else {
1929 com_node(c, CHILD(n,i));
1930 i++;
1931 REQ(CHILD(n,i),COLON);
1932 i++;
1933 }
1934 /* second argument */
1935 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1936 com_node(c, CHILD(n,i));
1937 i++;
1938 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001939 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001940 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001941 com_push(c, 1);
1942 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001943 /* remaining arguments */
1944 for (; i < NCH(n); i++) {
1945 ns++;
1946 ch=CHILD(n,i);
1947 REQ(ch, sliceop);
1948 if (NCH(ch) == 1) {
1949 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001950 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001951 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001952 }
1953 else
1954 com_node(c, CHILD(ch,1));
1955 }
1956 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001957 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001958}
1959
1960static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001961com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001962{
1963 node *ch;
1964 REQ(n, subscript);
1965 ch = CHILD(n,0);
1966 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001967 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001968 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001969 com_push(c, 1);
1970 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001971 else {
1972 /* check for slice */
1973 if ((TYPE(ch) == COLON || NCH(n) > 1))
1974 com_sliceobj(c, n);
1975 else {
1976 REQ(ch, test);
1977 com_node(c, ch);
1978 }
1979 }
1980}
1981
1982static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001983com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001984{
1985 int i, op;
1986 REQ(n, subscriptlist);
1987 /* Check to make backward compatible slice behavior for '[i:j]' */
1988 if (NCH(n) == 1) {
1989 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001990 /* 'Basic' slice, should have exactly one colon. */
1991 if ((TYPE(CHILD(sub, 0)) == COLON
1992 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1993 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1994 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001995 switch (assigning) {
1996 case OP_DELETE:
1997 op = DELETE_SLICE;
1998 break;
1999 case OP_ASSIGN:
2000 op = STORE_SLICE;
2001 break;
2002 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002003 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002004 break;
2005 default:
2006 com_augassign_slice(c, sub, assigning, augn);
2007 return;
2008 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002009 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002010 if (op == STORE_SLICE)
2011 com_pop(c, 2);
2012 else if (op == DELETE_SLICE)
2013 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002014 return;
2015 }
2016 }
2017 /* Else normal subscriptlist. Compile each subscript. */
2018 for (i = 0; i < NCH(n); i += 2)
2019 com_subscript(c, CHILD(n, i));
2020 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002021 if (NCH(n) > 1) {
2022 i = (NCH(n)+1) / 2;
2023 com_addoparg(c, BUILD_TUPLE, i);
2024 com_pop(c, i-1);
2025 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002026 switch (assigning) {
2027 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002028 op = DELETE_SUBSCR;
2029 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002030 break;
2031 default:
2032 case OP_ASSIGN:
2033 op = STORE_SUBSCR;
2034 i = 3;
2035 break;
2036 case OP_APPLY:
2037 op = BINARY_SUBSCR;
2038 i = 1;
2039 break;
2040 }
2041 if (assigning > OP_APPLY) {
2042 com_addoparg(c, DUP_TOPX, 2);
2043 com_push(c, 2);
2044 com_addbyte(c, BINARY_SUBSCR);
2045 com_pop(c, 1);
2046 com_node(c, augn);
2047 com_addbyte(c, assigning);
2048 com_pop(c, 1);
2049 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002050 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002051 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002052 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002053}
2054
2055static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002056com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002057{
2058 REQ(n, trailer);
2059 switch (TYPE(CHILD(n, 0))) {
2060 case LPAR:
2061 com_call_function(c, CHILD(n, 1));
2062 break;
2063 case DOT:
2064 com_select_member(c, CHILD(n, 1));
2065 break;
2066 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002067 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002068 break;
2069 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002070 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002071 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002072 }
2073}
2074
2075static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002076com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002077{
2078 int i;
2079 REQ(n, power);
2080 com_atom(c, CHILD(n, 0));
2081 for (i = 1; i < NCH(n); i++) {
2082 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2083 com_factor(c, CHILD(n, i+1));
2084 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002085 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002086 break;
2087 }
2088 else
2089 com_apply_trailer(c, CHILD(n, i));
2090 }
2091}
2092
2093static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002094com_invert_constant(struct compiling *c, node *n)
2095{
2096 /* Compute the inverse of int and longs and use them directly,
2097 but be prepared to generate code for all other
2098 possibilities (invalid numbers, floats, complex).
2099 */
2100 PyObject *num, *inv = NULL;
2101 int i;
2102
2103 REQ(n, NUMBER);
2104 num = parsenumber(c, STR(n));
2105 if (num == NULL)
2106 i = 255;
2107 else {
2108 inv = PyNumber_Invert(num);
2109 if (inv == NULL) {
2110 PyErr_Clear();
2111 i = com_addconst(c, num);
2112 } else {
2113 i = com_addconst(c, inv);
2114 Py_DECREF(inv);
2115 }
2116 Py_DECREF(num);
2117 }
2118 com_addoparg(c, LOAD_CONST, i);
2119 com_push(c, 1);
2120 if (num != NULL && inv == NULL)
2121 com_addbyte(c, UNARY_INVERT);
2122}
2123
Tim Peters51e26512001-09-07 08:45:55 +00002124static int
2125is_float_zero(const char *p)
2126{
2127 int found_radix_point = 0;
2128 int ch;
2129 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2130 switch (ch) {
2131 case '0':
2132 /* no reason to believe it's not 0 -- continue */
2133 break;
2134
2135 case 'e': case 'E': case 'j': case 'J':
2136 /* If this was a hex constant, we already would have
2137 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2138 must be an exponent marker, and we haven't yet
2139 seen a non-zero digit, and it doesn't matter what
2140 the exponent is then. For 'j' or 'J' similarly,
2141 except that this is an imaginary 0 then. */
2142 return 1;
2143
2144 case '.':
2145 found_radix_point = 1;
2146 break;
2147
2148 default:
2149 return 0;
2150 }
2151 }
2152 return found_radix_point;
2153}
2154
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002155static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002156com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002157{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002158 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002159 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002160 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002161 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002162 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002163 approriate value as a constant. If the value is negative,
2164 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002165 negative in the 0th position -- unless we're doing unary minus
2166 of a floating zero! In that case the sign is significant, but
2167 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002168 */
2169 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002170 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002171 && TYPE((pfactor = CHILD(n, 1))) == factor
2172 && NCH(pfactor) == 1
2173 && TYPE((ppower = CHILD(pfactor, 0))) == power
2174 && NCH(ppower) == 1
2175 && TYPE((patom = CHILD(ppower, 0))) == atom
2176 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002177 && !(childtype == MINUS &&
2178 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002179 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002180 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002181 return;
2182 }
2183 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002184 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002185 if (s == NULL) {
2186 com_error(c, PyExc_MemoryError, "");
2187 com_addbyte(c, 255);
2188 return;
2189 }
2190 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002191 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002192 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002193 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002194 }
Tim Peters51e26512001-09-07 08:45:55 +00002195 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002196 }
2197 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002198 com_factor(c, CHILD(n, 1));
2199 com_addbyte(c, UNARY_POSITIVE);
2200 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002201 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002202 com_factor(c, CHILD(n, 1));
2203 com_addbyte(c, UNARY_NEGATIVE);
2204 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002205 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002206 com_factor(c, CHILD(n, 1));
2207 com_addbyte(c, UNARY_INVERT);
2208 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002209 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002210 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002211 }
2212}
2213
2214static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002215com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002216{
2217 int i;
2218 int op;
2219 REQ(n, term);
2220 com_factor(c, CHILD(n, 0));
2221 for (i = 2; i < NCH(n); i += 2) {
2222 com_factor(c, CHILD(n, i));
2223 switch (TYPE(CHILD(n, i-1))) {
2224 case STAR:
2225 op = BINARY_MULTIPLY;
2226 break;
2227 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002228 if (c->c_flags & CO_FUTURE_DIVISION)
2229 op = BINARY_TRUE_DIVIDE;
2230 else
2231 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002232 break;
2233 case PERCENT:
2234 op = BINARY_MODULO;
2235 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002236 case DOUBLESLASH:
2237 op = BINARY_FLOOR_DIVIDE;
2238 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002239 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002240 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002241 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002242 op = 255;
2243 }
2244 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002245 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002246 }
2247}
2248
2249static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002250com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002251{
2252 int i;
2253 int op;
2254 REQ(n, arith_expr);
2255 com_term(c, CHILD(n, 0));
2256 for (i = 2; i < NCH(n); i += 2) {
2257 com_term(c, CHILD(n, i));
2258 switch (TYPE(CHILD(n, i-1))) {
2259 case PLUS:
2260 op = BINARY_ADD;
2261 break;
2262 case MINUS:
2263 op = BINARY_SUBTRACT;
2264 break;
2265 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002266 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002267 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002268 op = 255;
2269 }
2270 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002271 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002272 }
2273}
2274
2275static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002276com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002277{
2278 int i;
2279 int op;
2280 REQ(n, shift_expr);
2281 com_arith_expr(c, CHILD(n, 0));
2282 for (i = 2; i < NCH(n); i += 2) {
2283 com_arith_expr(c, CHILD(n, i));
2284 switch (TYPE(CHILD(n, i-1))) {
2285 case LEFTSHIFT:
2286 op = BINARY_LSHIFT;
2287 break;
2288 case RIGHTSHIFT:
2289 op = BINARY_RSHIFT;
2290 break;
2291 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002292 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002293 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002294 op = 255;
2295 }
2296 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002297 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002298 }
2299}
2300
2301static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002302com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002303{
2304 int i;
2305 int op;
2306 REQ(n, and_expr);
2307 com_shift_expr(c, CHILD(n, 0));
2308 for (i = 2; i < NCH(n); i += 2) {
2309 com_shift_expr(c, CHILD(n, i));
2310 if (TYPE(CHILD(n, i-1)) == AMPER) {
2311 op = BINARY_AND;
2312 }
2313 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002314 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002315 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002316 op = 255;
2317 }
2318 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002319 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002320 }
2321}
2322
2323static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002324com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002325{
2326 int i;
2327 int op;
2328 REQ(n, xor_expr);
2329 com_and_expr(c, CHILD(n, 0));
2330 for (i = 2; i < NCH(n); i += 2) {
2331 com_and_expr(c, CHILD(n, i));
2332 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2333 op = BINARY_XOR;
2334 }
2335 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002336 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002337 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002338 op = 255;
2339 }
2340 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002341 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002342 }
2343}
2344
2345static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002346com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002347{
2348 int i;
2349 int op;
2350 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002351 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002352 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002353 com_xor_expr(c, CHILD(n, i));
2354 if (TYPE(CHILD(n, i-1)) == VBAR) {
2355 op = BINARY_OR;
2356 }
2357 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002358 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002359 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002360 op = 255;
2361 }
2362 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002363 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002364 }
2365}
2366
2367static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002368cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002369{
2370 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00002371 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002372 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2373 if (NCH(n) == 1) {
2374 n = CHILD(n, 0);
2375 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002376 case LESS: return PyCmp_LT;
2377 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00002378 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00002379 case LESSEQUAL: return PyCmp_LE;
2380 case GREATEREQUAL: return PyCmp_GE;
2381 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2382 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2383 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002384 }
2385 }
2386 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002387 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002388 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002389 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002390 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002391 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002392 }
2393 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002394 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002395}
2396
2397static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002398com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002399{
2400 int i;
2401 enum cmp_op op;
2402 int anchor;
2403 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2404 com_expr(c, CHILD(n, 0));
2405 if (NCH(n) == 1)
2406 return;
2407
2408 /****************************************************************
2409 The following code is generated for all but the last
2410 comparison in a chain:
2411
2412 label: on stack: opcode: jump to:
2413
2414 a <code to load b>
2415 a, b DUP_TOP
2416 a, b, b ROT_THREE
2417 b, a, b COMPARE_OP
2418 b, 0-or-1 JUMP_IF_FALSE L1
2419 b, 1 POP_TOP
2420 b
2421
2422 We are now ready to repeat this sequence for the next
2423 comparison in the chain.
2424
2425 For the last we generate:
2426
2427 b <code to load c>
2428 b, c COMPARE_OP
2429 0-or-1
2430
2431 If there were any jumps to L1 (i.e., there was more than one
2432 comparison), we generate:
2433
2434 0-or-1 JUMP_FORWARD L2
2435 L1: b, 0 ROT_TWO
2436 0, b POP_TOP
2437 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002438 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002439 ****************************************************************/
2440
2441 anchor = 0;
2442
2443 for (i = 2; i < NCH(n); i += 2) {
2444 com_expr(c, CHILD(n, i));
2445 if (i+2 < NCH(n)) {
2446 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002447 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002448 com_addbyte(c, ROT_THREE);
2449 }
2450 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002451 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002452 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002453 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002454 }
2455 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002456 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002457 if (i+2 < NCH(n)) {
2458 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2459 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002460 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002461 }
2462 }
2463
2464 if (anchor) {
2465 int anchor2 = 0;
2466 com_addfwref(c, JUMP_FORWARD, &anchor2);
2467 com_backpatch(c, anchor);
2468 com_addbyte(c, ROT_TWO);
2469 com_addbyte(c, POP_TOP);
2470 com_backpatch(c, anchor2);
2471 }
2472}
2473
2474static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002475com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002476{
2477 REQ(n, not_test); /* 'not' not_test | comparison */
2478 if (NCH(n) == 1) {
2479 com_comparison(c, CHILD(n, 0));
2480 }
2481 else {
2482 com_not_test(c, CHILD(n, 1));
2483 com_addbyte(c, UNARY_NOT);
2484 }
2485}
2486
2487static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002488com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002489{
2490 int i;
2491 int anchor;
2492 REQ(n, and_test); /* not_test ('and' not_test)* */
2493 anchor = 0;
2494 i = 0;
2495 for (;;) {
2496 com_not_test(c, CHILD(n, i));
2497 if ((i += 2) >= NCH(n))
2498 break;
2499 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2500 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002501 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002502 }
2503 if (anchor)
2504 com_backpatch(c, anchor);
2505}
2506
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002507static int
2508com_make_closure(struct compiling *c, PyCodeObject *co)
2509{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002510 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002511 if (free == 0)
2512 return 0;
2513 for (i = 0; i < free; ++i) {
2514 /* Bypass com_addop_varname because it will generate
2515 LOAD_DEREF but LOAD_CLOSURE is needed.
2516 */
2517 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2518 int arg, reftype;
2519
2520 /* Special case: If a class contains a method with a
2521 free variable that has the same name as a method,
2522 the name will be considered free *and* local in the
2523 class. It should be handled by the closure, as
2524 well as by the normal name loookup logic.
2525 */
2526 reftype = get_ref_type(c, PyString_AS_STRING(name));
2527 if (reftype == CELL)
2528 arg = com_lookup_arg(c->c_cellvars, name);
2529 else /* (reftype == FREE) */
2530 arg = com_lookup_arg(c->c_freevars, name);
2531 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002532 fprintf(stderr, "lookup %s in %s %d %d\n"
2533 "freevars of %s: %s\n",
2534 PyObject_REPR(name),
2535 c->c_name,
2536 reftype, arg,
2537 PyString_AS_STRING(co->co_name),
2538 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002539 Py_FatalError("com_make_closure()");
2540 }
2541 com_addoparg(c, LOAD_CLOSURE, arg);
2542
2543 }
2544 com_push(c, free);
2545 return 1;
2546}
2547
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002548static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002549com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002550{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002551 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002552 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002553 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002554 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002555 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002556 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2557 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002558 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002559 if (co == NULL) {
2560 c->c_errors++;
2561 return;
2562 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002563 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002564 i = com_addconst(c, (PyObject *)co);
2565 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002566 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002567 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002568 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002569 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002570 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002571 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002572 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002573 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002574 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002575 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002576 else {
2577 int anchor = 0;
2578 int i = 0;
2579 for (;;) {
2580 com_and_test(c, CHILD(n, i));
2581 if ((i += 2) >= NCH(n))
2582 break;
2583 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2584 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002585 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002586 }
2587 if (anchor)
2588 com_backpatch(c, anchor);
2589 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002590}
2591
2592static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002593com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002594{
2595 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002596 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002597 com_node(c, CHILD(n, 0));
2598 }
2599 else {
2600 int i;
2601 int len;
2602 len = (NCH(n) + 1) / 2;
2603 for (i = 0; i < NCH(n); i += 2)
2604 com_node(c, CHILD(n, i));
2605 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002606 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002607 }
2608}
2609
2610
2611/* Begin of assignment compilation */
2612
Thomas Wouters434d0822000-08-24 20:11:32 +00002613
2614static void
2615com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2616{
2617 com_addbyte(c, DUP_TOP);
2618 com_push(c, 1);
2619 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002620 com_node(c, augn);
2621 com_addbyte(c, opcode);
2622 com_pop(c, 1);
2623 com_addbyte(c, ROT_TWO);
2624 com_addopname(c, STORE_ATTR, n);
2625 com_pop(c, 2);
2626}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002627
2628static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002629com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002630{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00002631 if (none_assignment_check(c, STR(n), assigning))
2632 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002633 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002634 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002635}
2636
2637static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002638com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002639{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002640 REQ(n, trailer);
2641 switch (TYPE(CHILD(n, 0))) {
2642 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002643 if (assigning == OP_DELETE)
2644 com_error(c, PyExc_SyntaxError,
2645 "can't delete function call");
2646 else
2647 com_error(c, PyExc_SyntaxError,
2648 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002649 break;
2650 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002651 if (assigning > OP_APPLY)
2652 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2653 else
2654 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002655 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002656 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002657 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002658 break;
2659 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002660 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002661 }
2662}
2663
2664static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002665com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002666{
2667 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002668 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002669 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002670 if (assigning) {
2671 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002672 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002673 com_push(c, i-1);
2674 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002675 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002676 com_assign(c, CHILD(n, i), assigning, NULL);
2677}
2678
2679static void
2680com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2681{
2682 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002683 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002684 com_push(c, 1);
2685 com_node(c, augn);
2686 com_addbyte(c, opcode);
2687 com_pop(c, 1);
2688 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002689}
2690
2691static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002692com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002693{
2694 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002695 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002696 if (assigning)
2697 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002698}
2699
2700static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002701com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002702{
2703 /* Loop to avoid trivial recursion */
2704 for (;;) {
2705 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002706
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002707 case exprlist:
2708 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002709 case testlist1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002710 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002711 if (assigning > OP_APPLY) {
2712 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002713 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002714 return;
2715 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002716 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002717 return;
2718 }
2719 n = CHILD(n, 0);
2720 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002721
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002722 case test:
2723 case and_test:
2724 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002725 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002726 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002727 case xor_expr:
2728 case and_expr:
2729 case shift_expr:
2730 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002731 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002732 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002733 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002734 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002735 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002736 return;
2737 }
2738 n = CHILD(n, 0);
2739 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002740
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002741 case power: /* atom trailer* ('**' power)*
2742 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002743 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002744 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002745 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002746 return;
2747 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002748 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002749 int i;
2750 com_node(c, CHILD(n, 0));
2751 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002752 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002753 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002754 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002755 return;
2756 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002757 com_apply_trailer(c, CHILD(n, i));
2758 } /* NB i is still alive */
2759 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002760 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002761 return;
2762 }
2763 n = CHILD(n, 0);
2764 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002765
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002766 case atom:
2767 switch (TYPE(CHILD(n, 0))) {
2768 case LPAR:
2769 n = CHILD(n, 1);
2770 if (TYPE(n) == RPAR) {
2771 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002772 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002773 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002774 return;
2775 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002776 if (assigning > OP_APPLY) {
2777 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002778 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002779 return;
2780 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002781 break;
2782 case LSQB:
2783 n = CHILD(n, 1);
2784 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002785 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002786 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002787 return;
2788 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002789 if (assigning > OP_APPLY) {
2790 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002791 "augmented assign to list not possible");
2792 return;
2793 }
2794 if (NCH(n) > 1
2795 && TYPE(CHILD(n, 1)) == list_for) {
2796 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002797 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002798 return;
2799 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002800 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002801 return;
2802 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002803 if (assigning > OP_APPLY)
2804 com_augassign_name(c, CHILD(n, 0),
2805 assigning, augn);
2806 else
2807 com_assign_name(c, CHILD(n, 0),
2808 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002809 return;
2810 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002811 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002812 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002813 return;
2814 }
2815 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002816
2817 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002818 com_error(c, PyExc_SyntaxError,
2819 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002820 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002821
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002822 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002823 com_error(c, PyExc_SystemError,
2824 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002825 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002826
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002827 }
2828 }
2829}
Guido van Rossum7c531111997-03-11 18:42:21 +00002830
Thomas Wouters434d0822000-08-24 20:11:32 +00002831static void
2832com_augassign(struct compiling *c, node *n)
2833{
2834 int opcode;
2835
2836 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2837 case '+': opcode = INPLACE_ADD; break;
2838 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002839 case '/':
2840 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
2841 opcode = INPLACE_FLOOR_DIVIDE;
2842 else if (c->c_flags & CO_FUTURE_DIVISION)
2843 opcode = INPLACE_TRUE_DIVIDE;
2844 else
2845 opcode = INPLACE_DIVIDE;
2846 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00002847 case '%': opcode = INPLACE_MODULO; break;
2848 case '<': opcode = INPLACE_LSHIFT; break;
2849 case '>': opcode = INPLACE_RSHIFT; break;
2850 case '&': opcode = INPLACE_AND; break;
2851 case '^': opcode = INPLACE_XOR; break;
2852 case '|': opcode = INPLACE_OR; break;
2853 case '*':
2854 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2855 opcode = INPLACE_POWER;
2856 else
2857 opcode = INPLACE_MULTIPLY;
2858 break;
2859 default:
2860 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2861 return;
2862 }
2863 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2864}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002865
2866static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002867com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002868{
Thomas Wouters434d0822000-08-24 20:11:32 +00002869 REQ(n, expr_stmt);
2870 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002871 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002872 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002873 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002874 if (NCH(n) == 1) {
2875 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002876 if (c->c_interactive)
2877 com_addbyte(c, PRINT_EXPR);
2878 else
2879 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002880 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002881 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002882 else if (TYPE(CHILD(n,1)) == augassign)
2883 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002884 else {
2885 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002886 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002887 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002888 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002889 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002890 com_push(c, 1);
2891 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002892 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002893 }
2894 }
2895}
2896
2897static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002898com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002899{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002900 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002901 int i;
2902 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002903 if (Py_OptimizeFlag)
2904 return;
2905 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00002906
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002907 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00002908 raise AssertionError [, <message>]
2909
2910 where <message> is the second test, if present.
2911 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002912 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002913 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002914 com_addbyte(c, POP_TOP);
2915 com_pop(c, 1);
2916 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002917 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002918 com_push(c, 1);
2919 i = NCH(n)/2; /* Either 2 or 4 */
2920 if (i > 1)
2921 com_node(c, CHILD(n, 3));
2922 com_addoparg(c, RAISE_VARARGS, i);
2923 com_pop(c, i);
2924 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002925 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002926 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002927 com_addbyte(c, POP_TOP);
2928}
2929
2930static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002931com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002932{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002933 int i = 1;
2934 node* stream = NULL;
2935
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002936 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002937
2938 /* are we using the extended print form? */
2939 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2940 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002941 com_node(c, stream);
2942 /* stack: [...] => [... stream] */
2943 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002944 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2945 i = 4;
2946 else
2947 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002948 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002949 for (; i < NCH(n); i += 2) {
2950 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002951 com_addbyte(c, DUP_TOP);
2952 /* stack: [stream] => [stream stream] */
2953 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002954 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002955 /* stack: [stream stream] => [stream stream obj] */
2956 com_addbyte(c, ROT_TWO);
2957 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002958 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002959 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002960 com_pop(c, 2);
2961 }
2962 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002963 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002964 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002965 com_addbyte(c, PRINT_ITEM);
2966 com_pop(c, 1);
2967 }
2968 }
2969 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002970 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002971 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002972 /* must pop the extra stream object off the stack */
2973 com_addbyte(c, POP_TOP);
2974 /* stack: [... stream] => [...] */
2975 com_pop(c, 1);
2976 }
2977 }
2978 else {
2979 if (stream != NULL) {
2980 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002981 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002982 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002983 com_pop(c, 1);
2984 }
2985 else
2986 com_addbyte(c, PRINT_NEWLINE);
2987 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002988}
2989
2990static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002991com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002992{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002993 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002994 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002995 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002996 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002997 if (c->c_flags & CO_GENERATOR) {
2998 if (NCH(n) > 1) {
2999 com_error(c, PyExc_SyntaxError,
3000 "'return' with argument inside generator");
3001 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003002 }
3003 if (NCH(n) < 2) {
3004 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003005 com_push(c, 1);
3006 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003007 else
3008 com_node(c, CHILD(n, 1));
3009 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003010 com_pop(c, 1);
3011}
3012
3013static void
3014com_yield_stmt(struct compiling *c, node *n)
3015{
Tim Peters95c80f82001-06-23 02:07:08 +00003016 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003017 REQ(n, yield_stmt); /* 'yield' testlist */
3018 if (!c->c_infunction) {
3019 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3020 }
Tim Peters95c80f82001-06-23 02:07:08 +00003021
3022 for (i = 0; i < c->c_nblocks; ++i) {
3023 if (c->c_block[i] == SETUP_FINALLY) {
3024 com_error(c, PyExc_SyntaxError,
3025 "'yield' not allowed in a 'try' block "
3026 "with a 'finally' clause");
3027 return;
3028 }
3029 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003030 com_node(c, CHILD(n, 1));
3031 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003032 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003033}
3034
3035static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003036com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003037{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003038 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003039 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3040 if (NCH(n) > 1) {
3041 com_node(c, CHILD(n, 1));
3042 if (NCH(n) > 3) {
3043 com_node(c, CHILD(n, 3));
3044 if (NCH(n) > 5)
3045 com_node(c, CHILD(n, 5));
3046 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003047 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003048 i = NCH(n)/2;
3049 com_addoparg(c, RAISE_VARARGS, i);
3050 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003051}
3052
3053static void
Thomas Wouters52152252000-08-17 22:55:00 +00003054com_from_import(struct compiling *c, node *n)
3055{
3056 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3057 com_push(c, 1);
3058 if (NCH(n) > 1) {
3059 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3060 com_error(c, PyExc_SyntaxError, "invalid syntax");
3061 return;
3062 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003063 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003064 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003065 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003066 com_pop(c, 1);
3067}
3068
3069static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003070com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003071{
3072 int i;
3073 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003074 /* 'import' dotted_name (',' dotted_name)* |
3075 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003076 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00003077 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003078 /* 'from' dotted_name 'import' ... */
3079 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003080
3081 if (TYPE(CHILD(n, 3)) == STAR) {
3082 tup = Py_BuildValue("(s)", "*");
3083 } else {
3084 tup = PyTuple_New((NCH(n) - 2)/2);
3085 for (i = 3; i < NCH(n); i += 2) {
3086 PyTuple_SET_ITEM(tup, (i-3)/2,
Guido van Rossum633d90c2002-12-23 16:51:42 +00003087 PyString_FromString(STR(
3088 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003089 }
3090 }
3091 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003092 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003093 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003094 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00003095 if (TYPE(CHILD(n, 3)) == STAR)
3096 com_addbyte(c, IMPORT_STAR);
3097 else {
3098 for (i = 3; i < NCH(n); i += 2)
3099 com_from_import(c, CHILD(n, i));
3100 com_addbyte(c, POP_TOP);
3101 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003102 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003103 }
3104 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003105 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003106 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003107 node *subn = CHILD(n, i);
3108 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003109 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003110 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003111 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003112 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003113 int j;
3114 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003115 com_error(c, PyExc_SyntaxError,
3116 "invalid syntax");
3117 return;
3118 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003119 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3120 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003121 CHILD(CHILD(subn, 0),
3122 j));
3123 com_addop_varname(c, VAR_STORE,
3124 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003125 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003126 com_addop_varname(c, VAR_STORE,
3127 STR(CHILD(CHILD(subn, 0),
3128 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003129 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003130 }
3131 }
3132}
3133
3134static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003135com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003136{
3137 REQ(n, exec_stmt);
3138 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3139 com_node(c, CHILD(n, 1));
3140 if (NCH(n) >= 4)
3141 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003142 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003143 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003144 com_push(c, 1);
3145 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003146 if (NCH(n) >= 6)
3147 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003148 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003149 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003150 com_push(c, 1);
3151 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003152 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003153 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003154}
3155
Guido van Rossum7c531111997-03-11 18:42:21 +00003156static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003157is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003158{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003159 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003160 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003161 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003162
3163 /* Label to avoid tail recursion */
3164 next:
3165 switch (TYPE(n)) {
3166
3167 case suite:
3168 if (NCH(n) == 1) {
3169 n = CHILD(n, 0);
3170 goto next;
3171 }
3172 /* Fall through */
3173 case file_input:
3174 for (i = 0; i < NCH(n); i++) {
3175 node *ch = CHILD(n, i);
3176 if (TYPE(ch) == stmt) {
3177 n = ch;
3178 goto next;
3179 }
3180 }
3181 break;
3182
3183 case stmt:
3184 case simple_stmt:
3185 case small_stmt:
3186 n = CHILD(n, 0);
3187 goto next;
3188
3189 case expr_stmt:
3190 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003191 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003192 case test:
3193 case and_test:
3194 case not_test:
3195 case comparison:
3196 case expr:
3197 case xor_expr:
3198 case and_expr:
3199 case shift_expr:
3200 case arith_expr:
3201 case term:
3202 case factor:
3203 case power:
3204 case atom:
3205 if (NCH(n) == 1) {
3206 n = CHILD(n, 0);
3207 goto next;
3208 }
3209 break;
3210
3211 case NAME:
3212 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3213 return 1;
3214 break;
3215
3216 case NUMBER:
3217 v = parsenumber(c, STR(n));
3218 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003219 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003220 break;
3221 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003222 i = PyObject_IsTrue(v);
3223 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003224 return i == 0;
3225
3226 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003227 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003228 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003229 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003230 break;
3231 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003232 i = PyObject_IsTrue(v);
3233 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003234 return i == 0;
3235
3236 }
3237 return 0;
3238}
3239
Tim Peters08a898f2001-06-28 01:52:22 +00003240
3241/* Look under n for a return stmt with an expression.
3242 * This hack is used to find illegal returns under "if 0:" blocks in
3243 * functions already known to be generators (as determined by the symtable
3244 * pass).
3245 * Return the offending return node if found, else NULL.
3246 */
3247static node *
3248look_for_offending_return(node *n)
3249{
3250 int i;
3251
3252 for (i = 0; i < NCH(n); ++i) {
3253 node *kid = CHILD(n, i);
3254
3255 switch (TYPE(kid)) {
3256 case classdef:
3257 case funcdef:
3258 case lambdef:
3259 /* Stuff in nested functions & classes doesn't
3260 affect the code block we started in. */
3261 return NULL;
3262
3263 case return_stmt:
3264 if (NCH(kid) > 1)
3265 return kid;
3266 break;
3267
3268 default: {
3269 node *bad = look_for_offending_return(kid);
3270 if (bad != NULL)
3271 return bad;
3272 }
3273 }
3274 }
3275
3276 return NULL;
3277}
3278
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003279static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003280com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003281{
3282 int i;
3283 int anchor = 0;
3284 REQ(n, if_stmt);
3285 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3286 for (i = 0; i+3 < NCH(n); i+=4) {
3287 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003288 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003289 if (is_constant_false(c, ch)) {
3290 /* We're going to skip this block. However, if this
3291 is a generator, we have to check the dead code
3292 anyway to make sure there aren't any return stmts
3293 with expressions, in the same scope. */
3294 if (c->c_flags & CO_GENERATOR) {
3295 node *p = look_for_offending_return(n);
3296 if (p != NULL) {
3297 int savelineno = c->c_lineno;
3298 c->c_lineno = p->n_lineno;
3299 com_error(c, PyExc_SyntaxError,
3300 "'return' with argument "
3301 "inside generator");
3302 c->c_lineno = savelineno;
3303 }
3304 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003305 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003306 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003307 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003308 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003309 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003310 com_addfwref(c, JUMP_IF_FALSE, &a);
3311 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003312 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003313 com_node(c, CHILD(n, i+3));
3314 com_addfwref(c, JUMP_FORWARD, &anchor);
3315 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003316 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003317 com_addbyte(c, POP_TOP);
3318 }
3319 if (i+2 < NCH(n))
3320 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003321 if (anchor)
3322 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003323}
3324
3325static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003326com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003327{
3328 int break_anchor = 0;
3329 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003330 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003331 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3332 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003333 block_push(c, SETUP_LOOP);
3334 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003335 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003336 com_node(c, CHILD(n, 1));
3337 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3338 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003339 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003340 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003341 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003342 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003343 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3344 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003345 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003346 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003347 com_addbyte(c, POP_TOP);
3348 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003349 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003350 if (NCH(n) > 4)
3351 com_node(c, CHILD(n, 6));
3352 com_backpatch(c, break_anchor);
3353}
3354
3355static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003356com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003357{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003358 int break_anchor = 0;
3359 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003360 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003361 REQ(n, for_stmt);
3362 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3363 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003364 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003365 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003366 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003367 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00003368 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003369 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003370 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003371 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003372 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003373 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003374 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003375 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3376 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003377 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003378 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003379 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003380 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003381 if (NCH(n) > 8)
3382 com_node(c, CHILD(n, 8));
3383 com_backpatch(c, break_anchor);
3384}
3385
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003386/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003387
3388 SETUP_FINALLY L
3389 <code for S>
3390 POP_BLOCK
3391 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003392 L: <code for Sf>
3393 END_FINALLY
3394
3395 The special instructions use the block stack. Each block
3396 stack entry contains the instruction that created it (here
3397 SETUP_FINALLY), the level of the value stack at the time the
3398 block stack entry was created, and a label (here L).
3399
3400 SETUP_FINALLY:
3401 Pushes the current value stack level and the label
3402 onto the block stack.
3403 POP_BLOCK:
3404 Pops en entry from the block stack, and pops the value
3405 stack until its level is the same as indicated on the
3406 block stack. (The label is ignored.)
3407 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003408 Pops a variable number of entries from the *value* stack
3409 and re-raises the exception they specify. The number of
3410 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003411
3412 The block stack is unwound when an exception is raised:
3413 when a SETUP_FINALLY entry is found, the exception is pushed
3414 onto the value stack (and the exception condition is cleared),
3415 and the interpreter jumps to the label gotten from the block
3416 stack.
3417
3418 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003419 (The contents of the value stack is shown in [], with the top
3420 at the right; 'tb' is trace-back info, 'val' the exception's
3421 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003422
3423 Value stack Label Instruction Argument
3424 [] SETUP_EXCEPT L1
3425 [] <code for S>
3426 [] POP_BLOCK
3427 [] JUMP_FORWARD L0
3428
Guido van Rossum3f5da241990-12-20 15:06:42 +00003429 [tb, val, exc] L1: DUP )
3430 [tb, val, exc, exc] <evaluate E1> )
3431 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3432 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3433 [tb, val, exc, 1] POP )
3434 [tb, val, exc] POP
3435 [tb, val] <assign to V1> (or POP if no V1)
3436 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003437 [] <code for S1>
3438 JUMP_FORWARD L0
3439
Guido van Rossum3f5da241990-12-20 15:06:42 +00003440 [tb, val, exc, 0] L2: POP
3441 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003442 .............................etc.......................
3443
Guido van Rossum3f5da241990-12-20 15:06:42 +00003444 [tb, val, exc, 0] Ln+1: POP
3445 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003446
3447 [] L0: <next statement>
3448
3449 Of course, parts are not generated if Vi or Ei is not present.
3450*/
3451
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003452static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003453com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003454{
3455 int except_anchor = 0;
3456 int end_anchor = 0;
3457 int else_anchor = 0;
3458 int i;
3459 node *ch;
3460
3461 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3462 block_push(c, SETUP_EXCEPT);
3463 com_node(c, CHILD(n, 2));
3464 com_addbyte(c, POP_BLOCK);
3465 block_pop(c, SETUP_EXCEPT);
3466 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3467 com_backpatch(c, except_anchor);
3468 for (i = 3;
3469 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3470 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003471 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003472 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003473 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003474 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003475 break;
3476 }
3477 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003478 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003479 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003480 if (NCH(ch) > 1) {
3481 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003482 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003483 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003484 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003485 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003486 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3487 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003488 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003489 }
3490 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003491 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003492 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003493 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003494 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003495 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003496 com_pop(c, 1);
3497 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003498 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003499 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003500 com_node(c, CHILD(n, i+2));
3501 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3502 if (except_anchor) {
3503 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003504 /* We come in with [tb, val, exc, 0] on the
3505 stack; one pop and it's the same as
3506 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003507 com_addbyte(c, POP_TOP);
3508 }
3509 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003510 /* We actually come in here with [tb, val, exc] but the
3511 END_FINALLY will zap those and jump around.
3512 The c_stacklevel does not reflect them so we need not pop
3513 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003514 com_addbyte(c, END_FINALLY);
3515 com_backpatch(c, else_anchor);
3516 if (i < NCH(n))
3517 com_node(c, CHILD(n, i+2));
3518 com_backpatch(c, end_anchor);
3519}
3520
3521static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003522com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003523{
3524 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003525 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003526
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003527 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3528 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003529 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003530 com_addbyte(c, POP_BLOCK);
3531 block_pop(c, SETUP_FINALLY);
3532 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003533 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003534 /* While the generated code pushes only one item,
3535 the try-finally handling can enter here with
3536 up to three items. OK, here are the details:
3537 3 for an exception, 2 for RETURN, 1 for BREAK. */
3538 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003539 com_backpatch(c, finally_anchor);
3540 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003541 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003542 com_node(c, ch);
3543 com_addbyte(c, END_FINALLY);
3544 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003545 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003546}
3547
3548static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003549com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003550{
3551 REQ(n, try_stmt);
3552 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3553 | 'try' ':' suite 'finally' ':' suite */
3554 if (TYPE(CHILD(n, 3)) != except_clause)
3555 com_try_finally(c, n);
3556 else
3557 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003558}
3559
Guido van Rossum8b993a91997-01-17 21:04:03 +00003560static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003561get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003562{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003563 int i;
3564
Guido van Rossum8b993a91997-01-17 21:04:03 +00003565 /* Label to avoid tail recursion */
3566 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003567 switch (TYPE(n)) {
3568
3569 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003570 if (NCH(n) == 1) {
3571 n = CHILD(n, 0);
3572 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003573 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003574 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003575 case file_input:
3576 for (i = 0; i < NCH(n); i++) {
3577 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003578 if (TYPE(ch) == stmt) {
3579 n = ch;
3580 goto next;
3581 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003582 }
3583 break;
3584
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003585 case stmt:
3586 case simple_stmt:
3587 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003588 n = CHILD(n, 0);
3589 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003590
3591 case expr_stmt:
3592 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003593 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003594 case test:
3595 case and_test:
3596 case not_test:
3597 case comparison:
3598 case expr:
3599 case xor_expr:
3600 case and_expr:
3601 case shift_expr:
3602 case arith_expr:
3603 case term:
3604 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003605 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003606 if (NCH(n) == 1) {
3607 n = CHILD(n, 0);
3608 goto next;
3609 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003610 break;
3611
3612 case atom:
3613 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003614 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003615 break;
3616
3617 }
3618 return NULL;
3619}
3620
Guido van Rossum79f25d91997-04-29 20:08:16 +00003621static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003622get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003623{
Guido van Rossum541563e1999-01-28 15:08:09 +00003624 /* Don't generate doc-strings if run with -OO */
3625 if (Py_OptimizeFlag > 1)
3626 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003627 n = get_rawdocstring(n);
3628 if (n == NULL)
3629 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003630 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003631}
3632
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003633static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003634com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003635{
3636 REQ(n, suite);
3637 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3638 if (NCH(n) == 1) {
3639 com_node(c, CHILD(n, 0));
3640 }
3641 else {
3642 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003643 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003644 node *ch = CHILD(n, i);
3645 if (TYPE(ch) == stmt)
3646 com_node(c, ch);
3647 }
3648 }
3649}
3650
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003651/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003652static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003653com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003654{
3655 int i = c->c_nblocks;
3656 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3657 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3658 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003659 else if (i <= 0) {
3660 /* at the outer level */
3661 com_error(c, PyExc_SyntaxError,
3662 "'continue' not properly in loop");
3663 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003664 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003665 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003666 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003667 if (c->c_block[j] == SETUP_LOOP)
3668 break;
3669 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003670 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003671 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003672 for (; i > j; --i) {
3673 if (c->c_block[i] == SETUP_EXCEPT ||
3674 c->c_block[i] == SETUP_FINALLY) {
3675 com_addoparg(c, CONTINUE_LOOP,
3676 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003677 return;
3678 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003679 if (c->c_block[i] == END_FINALLY) {
3680 com_error(c, PyExc_SyntaxError,
3681 "'continue' not supported inside 'finally' clause");
3682 return;
3683 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003684 }
3685 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003686 com_error(c, PyExc_SyntaxError,
3687 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003688 }
3689 /* XXX Could allow it inside a 'finally' clause
3690 XXX if we could pop the exception still on the stack */
3691}
3692
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003693static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003694com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003695{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003696 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003697 if (TYPE(n) == lambdef) {
3698 /* lambdef: 'lambda' [varargslist] ':' test */
3699 n = CHILD(n, 1);
3700 }
3701 else {
3702 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3703 n = CHILD(n, 2);
3704 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3705 n = CHILD(n, 1);
3706 }
3707 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003708 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003709 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003710 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003711 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3712 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003713 nargs = 0;
3714 ndefs = 0;
3715 for (i = 0; i < nch; i++) {
3716 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003717 if (TYPE(CHILD(n, i)) == STAR ||
3718 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003719 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003720 nargs++;
3721 i++;
3722 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003723 t = RPAR; /* Anything except EQUAL or COMMA */
3724 else
3725 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003726 if (t == EQUAL) {
3727 i++;
3728 ndefs++;
3729 com_node(c, CHILD(n, i));
3730 i++;
3731 if (i >= nch)
3732 break;
3733 t = TYPE(CHILD(n, i));
3734 }
3735 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003736 /* Treat "(a=1, b)" as an error */
3737 if (ndefs)
3738 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003739 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003740 }
3741 if (t != COMMA)
3742 break;
3743 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003744 return ndefs;
3745}
3746
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003747static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003748com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003749{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003750 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003751 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003752 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003753 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003754 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3755 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003756 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003757 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003758 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003759 c->c_errors++;
3760 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003761 int closure = com_make_closure(c, (PyCodeObject *)co);
3762 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003763 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003764 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003765 if (closure)
3766 com_addoparg(c, MAKE_CLOSURE, ndefs);
3767 else
3768 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003769 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003770 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003771 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003772 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003773 }
3774}
3775
3776static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003777com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003778{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003779 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003780 REQ(n, testlist);
3781 /* testlist: test (',' test)* [','] */
3782 for (i = 0; i < NCH(n); i += 2)
3783 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003784 i = (NCH(n)+1) / 2;
3785 com_addoparg(c, BUILD_TUPLE, i);
3786 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003787}
3788
3789static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003790com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003791{
Guido van Rossum25831651993-05-19 14:50:45 +00003792 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003793 PyObject *v;
3794 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003795 char *name;
3796
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003797 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003798 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003799 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003800 c->c_errors++;
3801 return;
3802 }
3803 /* Push the class name on the stack */
3804 i = com_addconst(c, v);
3805 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003806 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003807 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003808 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003809 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003810 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003811 com_push(c, 1);
3812 }
Guido van Rossum25831651993-05-19 14:50:45 +00003813 else
3814 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003815 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003816 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003817 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003818 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003819 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003820 c->c_errors++;
3821 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003822 int closure = com_make_closure(c, co);
3823 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003824 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003825 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003826 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003827 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003828 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003829 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003830 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003831 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003832 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003833 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003834 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003835 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003836 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003837 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003838}
3839
3840static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003841com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003842{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003843 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003844 if (c->c_errors)
3845 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003846 switch (TYPE(n)) {
3847
3848 /* Definition nodes */
3849
3850 case funcdef:
3851 com_funcdef(c, n);
3852 break;
3853 case classdef:
3854 com_classdef(c, n);
3855 break;
3856
3857 /* Trivial parse tree nodes */
3858
3859 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003860 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003861 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003862 n = CHILD(n, 0);
3863 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003864
3865 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003866 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003867 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003868 {
3869 int i;
3870 for (i = 0; i < NCH(n)-1; i += 2)
3871 com_node(c, CHILD(n, i));
3872 }
3873 break;
3874
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003875 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003876 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003877 n = CHILD(n, 0);
3878 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003879
3880 /* Statement nodes */
3881
3882 case expr_stmt:
3883 com_expr_stmt(c, n);
3884 break;
3885 case print_stmt:
3886 com_print_stmt(c, n);
3887 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003888 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003889 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003890 break;
3891 case pass_stmt:
3892 break;
3893 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003894 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003895 com_error(c, PyExc_SyntaxError,
3896 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003897 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003898 com_addbyte(c, BREAK_LOOP);
3899 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003900 case continue_stmt:
3901 com_continue_stmt(c, n);
3902 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003903 case return_stmt:
3904 com_return_stmt(c, n);
3905 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003906 case yield_stmt:
3907 com_yield_stmt(c, n);
3908 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003909 case raise_stmt:
3910 com_raise_stmt(c, n);
3911 break;
3912 case import_stmt:
3913 com_import_stmt(c, n);
3914 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003915 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003916 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003917 case exec_stmt:
3918 com_exec_stmt(c, n);
3919 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003920 case assert_stmt:
3921 com_assert_stmt(c, n);
3922 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003923 case if_stmt:
3924 com_if_stmt(c, n);
3925 break;
3926 case while_stmt:
3927 com_while_stmt(c, n);
3928 break;
3929 case for_stmt:
3930 com_for_stmt(c, n);
3931 break;
3932 case try_stmt:
3933 com_try_stmt(c, n);
3934 break;
3935 case suite:
3936 com_suite(c, n);
3937 break;
3938
3939 /* Expression nodes */
3940
3941 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003942 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00003943 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003944 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003945 break;
3946 case test:
3947 com_test(c, n);
3948 break;
3949 case and_test:
3950 com_and_test(c, n);
3951 break;
3952 case not_test:
3953 com_not_test(c, n);
3954 break;
3955 case comparison:
3956 com_comparison(c, n);
3957 break;
3958 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003959 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003960 break;
3961 case expr:
3962 com_expr(c, n);
3963 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003964 case xor_expr:
3965 com_xor_expr(c, n);
3966 break;
3967 case and_expr:
3968 com_and_expr(c, n);
3969 break;
3970 case shift_expr:
3971 com_shift_expr(c, n);
3972 break;
3973 case arith_expr:
3974 com_arith_expr(c, n);
3975 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003976 case term:
3977 com_term(c, n);
3978 break;
3979 case factor:
3980 com_factor(c, n);
3981 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003982 case power:
3983 com_power(c, n);
3984 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003985 case atom:
3986 com_atom(c, n);
3987 break;
3988
3989 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003990 com_error(c, PyExc_SystemError,
3991 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003992 }
3993}
3994
Tim Petersdbd9ba62000-07-09 03:09:57 +00003995static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003996
3997static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003998com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003999{
4000 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4001 if (TYPE(CHILD(n, 0)) == LPAR)
4002 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004003 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004004 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004005 com_pop(c, 1);
4006 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004007}
4008
4009static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004010com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004011{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004012 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004013 if (NCH(n) == 1) {
4014 com_fpdef(c, CHILD(n, 0));
4015 }
4016 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004017 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004018 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004019 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004020 for (i = 0; i < NCH(n); i += 2)
4021 com_fpdef(c, CHILD(n, i));
4022 }
4023}
4024
4025static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004026com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004027{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004028 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004029 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004030 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004031 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004032 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004033 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004034 nch = NCH(n);
4035 /* Enter all arguments in table of locals */
4036 for (i = 0, narg = 0; i < nch; i++) {
4037 node *ch = CHILD(n, i);
4038 node *fp;
4039 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004040 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004041 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4042 fp = CHILD(ch, 0);
4043 if (TYPE(fp) != NAME) {
4044 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4045 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004046 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004047 narg++;
4048 /* all name updates handled by symtable */
4049 if (++i >= nch)
4050 break;
4051 ch = CHILD(n, i);
4052 if (TYPE(ch) == EQUAL)
4053 i += 2;
4054 else
4055 REQ(ch, COMMA);
4056 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004057 if (complex) {
4058 /* Generate code for complex arguments only after
4059 having counted the simple arguments */
4060 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004061 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004062 node *ch = CHILD(n, i);
4063 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004064 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004065 break;
4066 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4067 fp = CHILD(ch, 0);
4068 if (TYPE(fp) != NAME) {
4069 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004070 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004071 com_fpdef(c, ch);
4072 }
4073 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004074 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004075 break;
4076 ch = CHILD(n, i);
4077 if (TYPE(ch) == EQUAL)
4078 i += 2;
4079 else
4080 REQ(ch, COMMA);
4081 }
4082 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004083}
4084
4085static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004086com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004087{
4088 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004089 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004090 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004091 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004092 if (doc != NULL) {
4093 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004094 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004095 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004096 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004097 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004098 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004099 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004100 for (i = 0; i < NCH(n); i++) {
4101 node *ch = CHILD(n, i);
4102 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4103 com_node(c, ch);
4104 }
4105}
4106
4107/* Top-level compile-node interface */
4108
4109static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004110compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004111{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004112 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004113 node *ch;
4114 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00004115 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004116 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004117 if (doc != NULL) {
4118 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004119 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004120 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004121 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004122 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004123 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
4124 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004125 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004126 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004127 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004128 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004129 c->c_infunction = 0;
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004130 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4131 com_push(c, 1);
4132 com_addbyte(c, RETURN_VALUE);
4133 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004134}
4135
4136static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004137compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004138{
Guido van Rossum590baa41993-11-30 13:40:46 +00004139 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004140 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004141 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004142
4143 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004144 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004145 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004146 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004147 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004148 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004149 else
4150 ch = CHILD(n, 2);
4151 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004152 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004153 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004154}
4155
4156static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004157compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004158{
4159 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004160 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004161 REQ(n, classdef);
4162 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4163 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004164 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004165 /* Initialize local __module__ from global __name__ */
4166 com_addop_name(c, LOAD_GLOBAL, "__name__");
4167 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004168 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004169 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004170 if (doc != NULL) {
4171 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004172 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004173 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004174 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004175 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004176 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004177 }
4178 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004179 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004180 com_node(c, ch);
4181 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004182 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004183 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004184 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004185}
4186
4187static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004188compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004189{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004190 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004191
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004192 switch (TYPE(n)) {
4193
Guido van Rossum4c417781991-01-21 16:09:22 +00004194 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004195 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004196 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004197 n = CHILD(n, 0);
4198 if (TYPE(n) != NEWLINE)
4199 com_node(c, n);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004200 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4201 com_push(c, 1);
4202 com_addbyte(c, RETURN_VALUE);
4203 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004204 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004205 break;
4206
Guido van Rossum4c417781991-01-21 16:09:22 +00004207 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004208 com_file_input(c, n);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004209 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4210 com_push(c, 1);
4211 com_addbyte(c, RETURN_VALUE);
4212 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004213 break;
4214
Guido van Rossum590baa41993-11-30 13:40:46 +00004215 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004216 com_node(c, CHILD(n, 0));
4217 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004218 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004219 break;
4220
Guido van Rossum590baa41993-11-30 13:40:46 +00004221 case lambdef: /* anonymous function definition */
4222 compile_lambdef(c, n);
4223 break;
4224
Guido van Rossum4c417781991-01-21 16:09:22 +00004225 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004226 compile_funcdef(c, n);
4227 break;
4228
Guido van Rossum4c417781991-01-21 16:09:22 +00004229 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004230 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004231 break;
4232
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004233 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004234 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004235 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004236 }
4237}
4238
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004239static PyObject *
4240dict_keys_inorder(PyObject *dict, int offset)
4241{
4242 PyObject *tuple, *k, *v;
4243 int i, pos = 0, size = PyDict_Size(dict);
4244
4245 tuple = PyTuple_New(size);
4246 if (tuple == NULL)
4247 return NULL;
4248 while (PyDict_Next(dict, &pos, &k, &v)) {
4249 i = PyInt_AS_LONG(v);
4250 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004251 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004252 PyTuple_SET_ITEM(tuple, i - offset, k);
4253 }
4254 return tuple;
4255}
4256
Guido van Rossum79f25d91997-04-29 20:08:16 +00004257PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004258PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004259{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004260 return PyNode_CompileFlags(n, filename, NULL);
4261}
4262
4263PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004264PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004265{
4266 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004267}
4268
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004269struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004270PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004271{
4272 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004273 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004274
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004275 ff = PyNode_Future(n, filename);
4276 if (ff == NULL)
4277 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004278
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004279 st = symtable_init();
Tim Peters8c5e4152001-11-04 19:26:58 +00004280 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004281 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004282 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004283 }
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004284 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004285 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004286 if (st->st_errors > 0)
4287 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004288 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004289 if (st->st_errors > 0)
4290 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004291
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004292 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004293 fail:
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004294 PyObject_FREE((void *)ff);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004295 st->st_future = NULL;
4296 PySymtable_Free(st);
4297 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004298}
4299
Guido van Rossum79f25d91997-04-29 20:08:16 +00004300static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004301icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004302{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004303 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004304}
4305
Guido van Rossum79f25d91997-04-29 20:08:16 +00004306static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004307jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004308 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004309{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004310 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004311 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004312 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004313 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004314 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4315 sc.c_encoding = "utf-8";
4316 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004317 sc.c_encoding = STR(n);
4318 n = CHILD(n, 0);
4319 } else {
4320 sc.c_encoding = NULL;
4321 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004322 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004323 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004324 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004325 /* c_symtable still points to parent's symbols */
4326 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004327 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004328 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004329 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004330 if (base->c_encoding != NULL) {
4331 assert(sc.c_encoding == NULL);
4332 sc.c_encoding = base->c_encoding;
4333 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004334 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004335 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004336 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004337 if (sc.c_future == NULL) {
4338 com_free(&sc);
4339 return NULL;
4340 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004341 if (flags) {
4342 int merged = sc.c_future->ff_features |
4343 flags->cf_flags;
4344 sc.c_future->ff_features = merged;
4345 flags->cf_flags = merged;
4346 }
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004347 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004348 com_free(&sc);
4349 return NULL;
4350 }
4351 }
4352 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004353 if (symtable_load_symbols(&sc) < 0) {
4354 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004355 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004356 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004357 compile_node(&sc, n);
4358 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004359 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004360 PyObject *consts, *names, *varnames, *filename, *name,
4361 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004362 consts = PyList_AsTuple(sc.c_consts);
4363 names = PyList_AsTuple(sc.c_names);
4364 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004365 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4366 freevars = dict_keys_inorder(sc.c_freevars,
4367 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004368 filename = PyString_InternFromString(sc.c_filename);
4369 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004370 if (!PyErr_Occurred())
4371 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004372 sc.c_nlocals,
4373 sc.c_maxstacklevel,
4374 sc.c_flags,
4375 sc.c_code,
4376 consts,
4377 names,
4378 varnames,
4379 freevars,
4380 cellvars,
4381 filename,
4382 name,
4383 sc.c_firstlineno,
4384 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004385 Py_XDECREF(consts);
4386 Py_XDECREF(names);
4387 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004388 Py_XDECREF(freevars);
4389 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004390 Py_XDECREF(filename);
4391 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004392 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004393 else if (!PyErr_Occurred()) {
4394 /* This could happen if someone called PyErr_Clear() after an
4395 error was reported above. That's not supposed to happen,
4396 but I just plugged one case and I'm not sure there can't be
4397 others. In that case, raise SystemError so that at least
4398 it gets reported instead dumping core. */
4399 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4400 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004401 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004402 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004403 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004404 sc.c_symtable = NULL;
4405 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004406 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004407 return co;
4408}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004409
4410int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004411PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004412{
4413 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004414 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004415 int line = co->co_firstlineno;
4416 int addr = 0;
4417 while (--size >= 0) {
4418 addr += *p++;
4419 if (addr > addrq)
4420 break;
4421 line += *p++;
4422 }
4423 return line;
4424}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004425
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004426/* The test for LOCAL must come before the test for FREE in order to
4427 handle classes where name is both local and free. The local var is
4428 a method and the free var is a free var referenced within a method.
4429*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004430
4431static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004432get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004433{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004434 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004435 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004436
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004437 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4438 return CELL;
4439 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4440 return LOCAL;
4441 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4442 return FREE;
4443 v = PyDict_GetItemString(c->c_globals, name);
4444 if (v) {
4445 if (v == Py_None)
4446 return GLOBAL_EXPLICIT;
4447 else {
4448 return GLOBAL_IMPLICIT;
4449 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004450 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004451 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004452 "unknown scope for %.100s in %.100s(%s) "
4453 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4454 name, c->c_name,
4455 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4456 c->c_filename,
4457 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4458 PyObject_REPR(c->c_locals),
4459 PyObject_REPR(c->c_globals)
4460 );
4461
4462 Py_FatalError(buf);
4463 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004464}
4465
Guido van Rossum207fda62001-03-02 03:30:41 +00004466/* Helper functions to issue warnings */
4467
4468static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004469issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004470{
4471 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4472 lineno, NULL, NULL) < 0) {
4473 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4474 PyErr_SetString(PyExc_SyntaxError, msg);
4475 PyErr_SyntaxLocation(filename, lineno);
4476 }
4477 return -1;
4478 }
4479 return 0;
4480}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004481
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004482static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004483symtable_warn(struct symtable *st, char *msg)
4484{
Guido van Rossum207fda62001-03-02 03:30:41 +00004485 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004486 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004487 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004488 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004489 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004490}
4491
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004492/* Helper function for setting lineno and filename */
4493
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004494static int
4495symtable_build(struct compiling *c, node *n)
4496{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004497 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004498 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004499 c->c_symtable->st_future = c->c_future;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004500 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004501 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4502 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004503 return -1;
4504 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004505 if (c->c_symtable->st_errors > 0)
4506 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004507 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004508 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004509 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004510 return 0;
4511}
4512
4513static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004514symtable_init_compiling_symbols(struct compiling *c)
4515{
4516 PyObject *varnames;
4517
4518 varnames = c->c_symtable->st_cur->ste_varnames;
4519 if (varnames == NULL) {
4520 varnames = PyList_New(0);
4521 if (varnames == NULL)
4522 return -1;
4523 c->c_symtable->st_cur->ste_varnames = varnames;
4524 Py_INCREF(varnames);
4525 } else
4526 Py_INCREF(varnames);
4527 c->c_varnames = varnames;
4528
4529 c->c_globals = PyDict_New();
4530 if (c->c_globals == NULL)
4531 return -1;
4532 c->c_freevars = PyDict_New();
4533 if (c->c_freevars == NULL)
4534 return -1;
4535 c->c_cellvars = PyDict_New();
4536 if (c->c_cellvars == NULL)
4537 return -1;
4538 return 0;
4539}
4540
4541struct symbol_info {
4542 int si_nlocals;
4543 int si_ncells;
4544 int si_nfrees;
4545 int si_nimplicit;
4546};
4547
4548static void
4549symtable_init_info(struct symbol_info *si)
4550{
4551 si->si_nlocals = 0;
4552 si->si_ncells = 0;
4553 si->si_nfrees = 0;
4554 si->si_nimplicit = 0;
4555}
4556
4557static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004558symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004559 struct symbol_info *si)
4560{
4561 PyObject *dict, *v;
4562
4563 /* Seperate logic for DEF_FREE. If it occurs in a function,
4564 it indicates a local that we must allocate storage for (a
4565 cell var). If it occurs in a class, then the class has a
4566 method and a free variable with the same name.
4567 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004568 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004569 /* If it isn't declared locally, it can't be a cell. */
4570 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4571 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004572 v = PyInt_FromLong(si->si_ncells++);
4573 dict = c->c_cellvars;
4574 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004575 /* If it is free anyway, then there is no need to do
4576 anything here.
4577 */
4578 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004579 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004580 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004581 v = PyInt_FromLong(si->si_nfrees++);
4582 dict = c->c_freevars;
4583 }
4584 if (v == NULL)
4585 return -1;
4586 if (PyDict_SetItem(dict, name, v) < 0) {
4587 Py_DECREF(v);
4588 return -1;
4589 }
4590 Py_DECREF(v);
4591 return 0;
4592}
4593
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004594/* If a variable is a cell and an argument, make sure that appears in
4595 co_cellvars before any variable to its right in varnames.
4596*/
4597
4598
4599static int
4600symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4601 PyObject *varnames, int flags)
4602{
Tim Petersb39903b2003-03-24 17:22:24 +00004603 PyObject *v = NULL;
4604 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004605 int i, pos;
4606
4607 if (flags & CO_VARARGS)
4608 argcount++;
4609 if (flags & CO_VARKEYWORDS)
4610 argcount++;
4611 for (i = argcount; --i >= 0; ) {
4612 v = PyList_GET_ITEM(varnames, i);
4613 if (PyDict_GetItem(*cellvars, v)) {
4614 if (list == NULL) {
4615 list = PyList_New(1);
4616 if (list == NULL)
4617 return -1;
4618 PyList_SET_ITEM(list, 0, v);
4619 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004620 } else {
4621 if (PyList_Insert(list, 0, v) < 0) {
4622 Py_DECREF(list);
4623 return -1;
4624 }
4625 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004626 }
4627 }
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004628 if (list == NULL) /* There used to be a check here for the size of */
4629 return 0; /* the list being 0, which would have leaked the */
4630 /* list if that condition was ever possible. JRH */
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004631 /* There are cellvars that are also arguments. Create a dict
4632 to replace cellvars and put the args at the front.
4633 */
4634 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004635 if (d == NULL)
4636 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004637 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4638 v = PyInt_FromLong(i);
4639 if (v == NULL)
4640 goto fail;
4641 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4642 goto fail;
4643 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4644 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00004645 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004646 }
4647 pos = 0;
4648 i = PyList_GET_SIZE(list);
4649 Py_DECREF(list);
4650 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4651 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004652 if (w == NULL)
4653 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004654 if (PyDict_SetItem(d, v, w) < 0) {
4655 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00004656 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004657 goto fail;
4658 }
4659 Py_DECREF(w);
4660 }
4661 Py_DECREF(*cellvars);
4662 *cellvars = d;
4663 return 1;
4664 fail:
4665 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00004666 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004667 return -1;
4668}
4669
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004670static int
4671symtable_freevar_offsets(PyObject *freevars, int offset)
4672{
4673 PyObject *name, *v;
4674 int pos;
4675
4676 /* The cell vars are the first elements of the closure,
4677 followed by the free vars. Update the offsets in
4678 c_freevars to account for number of cellvars. */
4679 pos = 0;
4680 while (PyDict_Next(freevars, &pos, &name, &v)) {
4681 int i = PyInt_AS_LONG(v) + offset;
4682 PyObject *o = PyInt_FromLong(i);
4683 if (o == NULL)
4684 return -1;
4685 if (PyDict_SetItem(freevars, name, o) < 0) {
4686 Py_DECREF(o);
4687 return -1;
4688 }
4689 Py_DECREF(o);
4690 }
4691 return 0;
4692}
4693
4694static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004695symtable_check_unoptimized(struct compiling *c,
4696 PySymtableEntryObject *ste,
4697 struct symbol_info *si)
4698{
4699 char buf[300];
4700
4701 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4702 || (ste->ste_nested && si->si_nimplicit)))
4703 return 0;
4704
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004705#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4706
4707#define ILLEGAL_IS "is a nested function"
4708
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004709#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004710"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004711
4712#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004713"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004714
4715#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00004716"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004717"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004718
4719 /* XXX perhaps the linenos for these opt-breaking statements
4720 should be stored so the exception can point to them. */
4721
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004722 if (ste->ste_child_free) {
4723 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004724 PyOS_snprintf(buf, sizeof(buf),
4725 ILLEGAL_IMPORT_STAR,
4726 PyString_AS_STRING(ste->ste_name),
4727 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004728 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004729 PyOS_snprintf(buf, sizeof(buf),
4730 ILLEGAL_BARE_EXEC,
4731 PyString_AS_STRING(ste->ste_name),
4732 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004733 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004734 PyOS_snprintf(buf, sizeof(buf),
4735 ILLEGAL_EXEC_AND_IMPORT_STAR,
4736 PyString_AS_STRING(ste->ste_name),
4737 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004738 }
4739 } else {
4740 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004741 PyOS_snprintf(buf, sizeof(buf),
4742 ILLEGAL_IMPORT_STAR,
4743 PyString_AS_STRING(ste->ste_name),
4744 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004745 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004746 PyOS_snprintf(buf, sizeof(buf),
4747 ILLEGAL_BARE_EXEC,
4748 PyString_AS_STRING(ste->ste_name),
4749 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004750 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004751 PyOS_snprintf(buf, sizeof(buf),
4752 ILLEGAL_EXEC_AND_IMPORT_STAR,
4753 PyString_AS_STRING(ste->ste_name),
4754 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004755 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004756 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004757
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004758 PyErr_SetString(PyExc_SyntaxError, buf);
4759 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4760 ste->ste_opt_lineno);
4761 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004762}
4763
4764static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004765symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4766 struct symbol_info *si)
4767{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004768 if (c->c_future)
4769 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004770 if (ste->ste_generator)
4771 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004772 if (ste->ste_type != TYPE_MODULE)
4773 c->c_flags |= CO_NEWLOCALS;
4774 if (ste->ste_type == TYPE_FUNCTION) {
4775 c->c_nlocals = si->si_nlocals;
4776 if (ste->ste_optimized == 0)
4777 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004778 else if (ste->ste_optimized != OPT_EXEC)
4779 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004780 }
4781 return 0;
4782}
4783
4784static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004785symtable_load_symbols(struct compiling *c)
4786{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004787 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004788 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004789 PyObject *name, *varnames, *v;
4790 int i, flags, pos;
4791 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004792
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004793 v = NULL;
4794
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004795 if (symtable_init_compiling_symbols(c) < 0)
4796 goto fail;
4797 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004798 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004799 si.si_nlocals = PyList_GET_SIZE(varnames);
4800 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004801
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004802 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004803 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004804 if (v == NULL)
4805 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004806 if (PyDict_SetItem(c->c_locals,
4807 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004808 goto fail;
4809 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004810 }
4811
4812 /* XXX The cases below define the rules for whether a name is
4813 local or global. The logic could probably be clearer. */
4814 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004815 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4816 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004817
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004818 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004819 /* undo the original DEF_FREE */
4820 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004821
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004822 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004823 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004824 2. Free variables in methods that are also class
4825 variables or declared global.
4826 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004827 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004828 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004829
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004830 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004831 c->c_argcount--;
4832 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004833 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004834 c->c_argcount--;
4835 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004836 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004837 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004838 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004839 if (flags & DEF_PARAM) {
4840 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004841 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004842 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004843 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004844 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004845 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004846 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004847 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4848 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004849 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004850 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00004851 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004852 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004853 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004854 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004855 if (v == NULL)
4856 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004857 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004858 goto fail;
4859 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004860 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004861 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004862 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004863 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004864 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004865 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004866 if (v == NULL)
4867 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004868 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004869 goto fail;
4870 Py_DECREF(v);
4871 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004872 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004873 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00004874 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004875 goto fail;
4876 if (st->st_nscopes != 1) {
4877 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004878 if (v == NULL)
4879 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004880 if (PyDict_SetItem(st->st_global,
4881 name, v))
4882 goto fail;
4883 Py_DECREF(v);
4884 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004885 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004886 }
4887 }
4888
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004889 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4890
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004891 if (si.si_ncells > 1) { /* one cell is always in order */
4892 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4893 c->c_varnames, c->c_flags) < 0)
4894 return -1;
4895 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004896 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4897 return -1;
4898 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004899 fail:
4900 /* is this always the right thing to do? */
4901 Py_XDECREF(v);
4902 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004903}
4904
4905static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004906symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004907{
4908 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004909
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004910 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004911 if (st == NULL)
4912 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004913 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00004914
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004915 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004916 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004917 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004918 goto fail;
4919 if ((st->st_symbols = PyDict_New()) == NULL)
4920 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004921 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004922 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004923 st->st_errors = 0;
4924 st->st_tmpname = 0;
4925 st->st_private = NULL;
4926 return st;
4927 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004928 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004929 return NULL;
4930}
4931
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004932void
4933PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004934{
4935 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004936 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004937 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004938 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004939}
4940
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004941/* When the compiler exits a scope, it must should update the scope's
4942 free variable information with the list of free variables in its
4943 children.
4944
4945 Variables that are free in children and defined in the current
4946 scope are cellvars.
4947
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004948 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004949 false), free variables in children that are not defined here are
4950 implicit globals.
4951
4952*/
4953
4954static int
4955symtable_update_free_vars(struct symtable *st)
4956{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004957 int i, j, def;
4958 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004959 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004960
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004961 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004962 def = DEF_FREE_CLASS;
4963 else
4964 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004965 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004966 int pos = 0;
4967
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004968 if (list)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00004969 if (PyList_SetSlice(list, 0,
4970 ((PyVarObject*)list)->ob_size, 0) < 0)
4971 return -1;
4972 /* Yes, the above call CAN fail, even though it's reducing
4973 the size of the list. The current implementation will
4974 allocate temp memory equal to the size of the list: this
4975 is avoidable in this specific case, but probably not
4976 worth the effort of special-casing it. - JRH */
Barry Warsaw0372af72001-02-23 18:22:59 +00004977 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004978 PyList_GET_ITEM(ste->ste_children, i);
4979 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004980 int flags = PyInt_AS_LONG(o);
4981 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004982 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004983 if (list == NULL) {
4984 list = PyList_New(0);
4985 if (list == NULL)
4986 return -1;
4987 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004988 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004989 if (PyList_Append(list, name) < 0) {
4990 Py_DECREF(list);
4991 return -1;
4992 }
4993 }
4994 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004995 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004996 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004997 v = PyDict_GetItem(ste->ste_symbols, name);
4998 /* If a name N is declared global in scope A and
4999 referenced in scope B contained (perhaps
5000 indirectly) in A and there are no scopes
5001 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005002 is global in B. Unless A is a class scope,
5003 because class scopes are not considered for
5004 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005005 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005006 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005007 int flags = PyInt_AS_LONG(v);
5008 if (flags & DEF_GLOBAL) {
5009 symtable_undo_free(st, child->ste_id,
5010 name);
5011 continue;
5012 }
5013 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005014 if (ste->ste_nested) {
5015 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005016 name, def) < 0) {
5017 Py_DECREF(list);
5018 return -1;
5019 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005020 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005021 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005022 name) < 0) {
5023 Py_DECREF(list);
5024 return -1;
5025 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005026 }
5027 }
5028 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005029
5030 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005031 return 0;
5032}
5033
5034/* If the current scope is a non-nested class or if name is not
5035 defined in the current, non-nested scope, then it is an implicit
5036 global in all nested scopes.
5037*/
5038
5039static int
5040symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5041{
5042 PyObject *o;
5043 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005044 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005045
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005046 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005047 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005048 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005049 if (o == NULL)
5050 return symtable_undo_free(st, child, name);
5051 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005052
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005053 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005054 return symtable_undo_free(st, child, name);
5055 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005056 return symtable_add_def_o(st, ste->ste_symbols,
5057 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005058}
5059
5060static int
5061symtable_undo_free(struct symtable *st, PyObject *id,
5062 PyObject *name)
5063{
5064 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005065 PyObject *info;
5066 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005067
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005068 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5069 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005070 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005071
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005072 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005073 if (info == NULL)
5074 return 0;
5075 v = PyInt_AS_LONG(info);
5076 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005077 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005078 DEF_FREE_GLOBAL) < 0)
5079 return -1;
5080 } else
5081 /* If the name is defined here or declared global,
5082 then the recursion stops. */
5083 return 0;
5084
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005085 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5086 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005087 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005088 PyList_GET_ITEM(ste->ste_children, i);
5089 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005090 if (x < 0)
5091 return x;
5092 }
5093 return 0;
5094}
5095
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005096/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5097 This reference is released when the scope is exited, via the DECREF
5098 in symtable_exit_scope().
5099*/
5100
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005101static int
5102symtable_exit_scope(struct symtable *st)
5103{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005104 int end;
5105
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005106 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005107 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005108 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005109 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005110 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5111 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005112 if (PySequence_DelItem(st->st_stack, end) < 0)
5113 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005114 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005115}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005116
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005117static void
5118symtable_enter_scope(struct symtable *st, char *name, int type,
5119 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005120{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005121 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005122
5123 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005124 prev = st->st_cur;
5125 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005126 /* Py_DECREF(st->st_cur); */
5127 /* I believe the previous line would lead to a
5128 double-DECREF when st is disposed - JRH */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005129 st->st_errors++;
5130 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005131 }
5132 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005133 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005134 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005135 if (st->st_cur == NULL) {
5136 st->st_errors++;
5137 return;
5138 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005139 if (strcmp(name, TOP) == 0)
5140 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005141 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005142 if (PyList_Append(prev->ste_children,
5143 (PyObject *)st->st_cur) < 0)
5144 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005145 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005146}
5147
5148static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005149symtable_lookup(struct symtable *st, char *name)
5150{
5151 char buffer[MANGLE_LEN];
5152 PyObject *v;
5153 int flags;
5154
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005155 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005156 name = buffer;
5157 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5158 if (v == NULL) {
5159 if (PyErr_Occurred())
5160 return -1;
5161 else
5162 return 0;
5163 }
5164
5165 flags = PyInt_AS_LONG(v);
5166 return flags;
5167}
5168
5169static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005170symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005171{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005172 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005173 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005174 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005175
Guido van Rossumb7164622002-08-16 02:48:11 +00005176 /* Warn about None, except inside a tuple (where the assignment
5177 code already issues a warning). */
5178 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5179 *name == 'N' && strcmp(name, "None") == 0)
5180 {
5181 if (symtable_warn(st, "argument named None"))
5182 return -1;
5183 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005184 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005185 name = buffer;
5186 if ((s = PyString_InternFromString(name)) == NULL)
5187 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005188 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5189 Py_DECREF(s);
5190 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005191}
5192
5193/* Must only be called with mangled names */
5194
5195static int
5196symtable_add_def_o(struct symtable *st, PyObject *dict,
5197 PyObject *name, int flag)
5198{
5199 PyObject *o;
5200 int val;
5201
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005202 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005203 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005204 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005205 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005206 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005207 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005208 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005209 return -1;
5210 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005211 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005212 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005213 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005214 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005215 if (o == NULL)
5216 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005217 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005218 Py_DECREF(o);
5219 return -1;
5220 }
5221 Py_DECREF(o);
5222
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005223 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005224 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005225 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005226 } else if (flag & DEF_GLOBAL) {
5227 /* XXX need to update DEF_GLOBAL for other flags too;
5228 perhaps only DEF_FREE_GLOBAL */
5229 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005230 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005231 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005232 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005233 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005234 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005235 if (o == NULL)
5236 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005237 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005238 Py_DECREF(o);
5239 return -1;
5240 }
5241 Py_DECREF(o);
5242 }
5243 return 0;
5244}
5245
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005246#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005247
Tim Peters08a898f2001-06-28 01:52:22 +00005248/* Look for a yield stmt under n. Return 1 if found, else 0.
5249 This hack is used to look inside "if 0:" blocks (which are normally
5250 ignored) in case those are the only places a yield occurs (so that this
5251 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005252static int
5253look_for_yield(node *n)
5254{
5255 int i;
5256
5257 for (i = 0; i < NCH(n); ++i) {
5258 node *kid = CHILD(n, i);
5259
5260 switch (TYPE(kid)) {
5261
5262 case classdef:
5263 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005264 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005265 /* Stuff in nested functions and classes can't make
5266 the parent a generator. */
5267 return 0;
5268
5269 case yield_stmt:
5270 return 1;
5271
5272 default:
5273 if (look_for_yield(kid))
5274 return 1;
5275 }
5276 }
5277 return 0;
5278}
5279
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005280static void
5281symtable_node(struct symtable *st, node *n)
5282{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005283 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005284
5285 loop:
5286 switch (TYPE(n)) {
5287 case funcdef: {
5288 char *func_name = STR(CHILD(n, 1));
5289 symtable_add_def(st, func_name, DEF_LOCAL);
5290 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005291 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005292 symtable_funcdef(st, n);
5293 symtable_exit_scope(st);
5294 break;
5295 }
5296 case lambdef:
5297 if (NCH(n) == 4)
5298 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005299 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005300 symtable_funcdef(st, n);
5301 symtable_exit_scope(st);
5302 break;
5303 case classdef: {
5304 char *tmp, *class_name = STR(CHILD(n, 1));
5305 symtable_add_def(st, class_name, DEF_LOCAL);
5306 if (TYPE(CHILD(n, 2)) == LPAR) {
5307 node *bases = CHILD(n, 3);
5308 int i;
5309 for (i = 0; i < NCH(bases); i += 2) {
5310 symtable_node(st, CHILD(bases, i));
5311 }
5312 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005313 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005314 tmp = st->st_private;
5315 st->st_private = class_name;
5316 symtable_node(st, CHILD(n, NCH(n) - 1));
5317 st->st_private = tmp;
5318 symtable_exit_scope(st);
5319 break;
5320 }
5321 case if_stmt:
5322 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005323 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5324 if (st->st_cur->ste_generator == 0)
5325 st->st_cur->ste_generator =
5326 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005327 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005328 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005329 symtable_node(st, CHILD(n, i + 1));
5330 symtable_node(st, CHILD(n, i + 3));
5331 }
5332 if (i + 2 < NCH(n))
5333 symtable_node(st, CHILD(n, i + 2));
5334 break;
5335 case global_stmt:
5336 symtable_global(st, n);
5337 break;
5338 case import_stmt:
5339 symtable_import(st, n);
5340 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005341 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005342 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005343 symtable_node(st, CHILD(n, 1));
5344 if (NCH(n) > 2)
5345 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005346 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005347 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005348 st->st_cur->ste_opt_lineno = n->n_lineno;
5349 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005350 if (NCH(n) > 4)
5351 symtable_node(st, CHILD(n, 5));
5352 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005353
5354 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005355 case assert_stmt:
5356 if (Py_OptimizeFlag)
5357 return;
5358 if (NCH(n) == 2) {
5359 n = CHILD(n, 1);
5360 goto loop;
5361 } else {
5362 symtable_node(st, CHILD(n, 1));
5363 n = CHILD(n, 3);
5364 goto loop;
5365 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005366 case except_clause:
5367 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005368 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005369 if (NCH(n) > 1) {
5370 n = CHILD(n, 1);
5371 goto loop;
5372 }
5373 break;
5374 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005375 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005376 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005377 case yield_stmt:
5378 st->st_cur->ste_generator = 1;
5379 n = CHILD(n, 1);
5380 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005381 case expr_stmt:
5382 if (NCH(n) == 1)
5383 n = CHILD(n, 0);
5384 else {
5385 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005386 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005387 symtable_node(st, CHILD(n, 2));
5388 break;
5389 } else {
5390 int i;
5391 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005392 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005393 n = CHILD(n, NCH(n) - 1);
5394 }
5395 }
5396 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005397 case list_iter:
5398 n = CHILD(n, 0);
5399 if (TYPE(n) == list_for) {
5400 st->st_tmpname++;
5401 symtable_list_comprehension(st, n);
5402 st->st_tmpname--;
5403 } else {
5404 REQ(n, list_if);
5405 symtable_node(st, CHILD(n, 1));
5406 if (NCH(n) == 3) {
5407 n = CHILD(n, 2);
5408 goto loop;
5409 }
5410 }
5411 break;
5412 case for_stmt:
5413 symtable_assign(st, CHILD(n, 1), 0);
5414 for (i = 3; i < NCH(n); ++i)
5415 if (TYPE(CHILD(n, i)) >= single_input)
5416 symtable_node(st, CHILD(n, i));
5417 break;
5418 /* The remaining cases fall through to default except in
5419 special circumstances. This requires the individual cases
5420 to be coded with great care, even though they look like
5421 rather innocuous. Each case must double-check TYPE(n).
5422 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005423 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005424 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005425 n = CHILD(n, 2);
5426 goto loop;
5427 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005428 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005429 case listmaker:
5430 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00005431 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005432 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00005433 symtable_node(st, CHILD(n, 0));
5434 st->st_tmpname--;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005435 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005436 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005437 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005438 case atom:
5439 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5440 symtable_add_use(st, STR(CHILD(n, 0)));
5441 break;
5442 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005443 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005444 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005445 /* Walk over every non-token child with a special case
5446 for one child.
5447 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005448 if (NCH(n) == 1) {
5449 n = CHILD(n, 0);
5450 goto loop;
5451 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005452 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005453 if (TYPE(CHILD(n, i)) >= single_input)
5454 symtable_node(st, CHILD(n, i));
5455 }
5456}
5457
5458static void
5459symtable_funcdef(struct symtable *st, node *n)
5460{
5461 node *body;
5462
5463 if (TYPE(n) == lambdef) {
5464 if (NCH(n) == 4)
5465 symtable_params(st, CHILD(n, 1));
5466 } else
5467 symtable_params(st, CHILD(n, 2));
5468 body = CHILD(n, NCH(n) - 1);
5469 symtable_node(st, body);
5470}
5471
5472/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00005473 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005474 which are references in the defining scope. symtable_params()
5475 parses the parameter names, which are defined in the function's
5476 body.
5477
5478 varargslist:
5479 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5480 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5481*/
5482
5483static void
5484symtable_default_args(struct symtable *st, node *n)
5485{
5486 node *c;
5487 int i;
5488
5489 if (TYPE(n) == parameters) {
5490 n = CHILD(n, 1);
5491 if (TYPE(n) == RPAR)
5492 return;
5493 }
5494 REQ(n, varargslist);
5495 for (i = 0; i < NCH(n); i += 2) {
5496 c = CHILD(n, i);
5497 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5498 break;
5499 }
5500 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5501 symtable_node(st, CHILD(n, i));
5502 }
5503}
5504
5505static void
5506symtable_params(struct symtable *st, node *n)
5507{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005508 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00005509 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005510
5511 if (TYPE(n) == parameters) {
5512 n = CHILD(n, 1);
5513 if (TYPE(n) == RPAR)
5514 return;
5515 }
5516 REQ(n, varargslist);
5517 for (i = 0; i < NCH(n); i += 2) {
5518 c = CHILD(n, i);
5519 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5520 ext = 1;
5521 break;
5522 }
5523 if (TYPE(c) == test) {
5524 continue;
5525 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00005526 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005527 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00005528 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005529 char nbuf[30];
5530 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005531 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005532 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005533 }
5534 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005535 if (ext) {
5536 c = CHILD(n, i);
5537 if (TYPE(c) == STAR) {
5538 i++;
5539 symtable_add_def(st, STR(CHILD(n, i)),
5540 DEF_PARAM | DEF_STAR);
5541 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005542 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005543 c = NULL;
5544 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005545 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005546 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005547 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005548 i++;
5549 symtable_add_def(st, STR(CHILD(n, i)),
5550 DEF_PARAM | DEF_DOUBLESTAR);
5551 }
5552 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005553 if (complex >= 0) {
5554 int j;
5555 for (j = 0; j <= complex; j++) {
5556 c = CHILD(n, j);
5557 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005558 c = CHILD(n, ++j);
5559 else if (TYPE(c) == EQUAL)
5560 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005561 if (TYPE(CHILD(c, 0)) == LPAR)
5562 symtable_params_fplist(st, CHILD(c, 1));
5563 }
5564 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005565}
5566
5567static void
5568symtable_params_fplist(struct symtable *st, node *n)
5569{
5570 int i;
5571 node *c;
5572
5573 REQ(n, fplist);
5574 for (i = 0; i < NCH(n); i += 2) {
5575 c = CHILD(n, i);
5576 REQ(c, fpdef);
5577 if (NCH(c) == 1)
5578 symtable_add_def(st, STR(CHILD(c, 0)),
5579 DEF_PARAM | DEF_INTUPLE);
5580 else
5581 symtable_params_fplist(st, CHILD(c, 1));
5582 }
5583
5584}
5585
5586static void
5587symtable_global(struct symtable *st, node *n)
5588{
5589 int i;
5590
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005591 /* XXX It might be helpful to warn about module-level global
5592 statements, but it's hard to tell the difference between
5593 module-level and a string passed to exec.
5594 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005595
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005596 for (i = 1; i < NCH(n); i += 2) {
5597 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005598 int flags;
5599
5600 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005601 if (flags < 0)
5602 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005603 if (flags && flags != DEF_GLOBAL) {
5604 char buf[500];
5605 if (flags & DEF_PARAM) {
5606 PyErr_Format(PyExc_SyntaxError,
5607 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005608 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005609 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005610 st->st_cur->ste_lineno);
5611 st->st_errors++;
5612 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005613 }
5614 else {
5615 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005616 PyOS_snprintf(buf, sizeof(buf),
5617 GLOBAL_AFTER_ASSIGN,
5618 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005619 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005620 PyOS_snprintf(buf, sizeof(buf),
5621 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005622 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005623 }
5624 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005625 symtable_add_def(st, name, DEF_GLOBAL);
5626 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005627}
5628
5629static void
5630symtable_list_comprehension(struct symtable *st, node *n)
5631{
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005632 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005633
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005634 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005635 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005636 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005637 symtable_node(st, CHILD(n, 3));
5638 if (NCH(n) == 5)
5639 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005640}
5641
5642static void
5643symtable_import(struct symtable *st, node *n)
5644{
5645 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005646 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005647 | 'from' dotted_name 'import'
5648 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005649 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005650 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005651 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005652 node *dotname = CHILD(n, 1);
5653 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5654 /* check for bogus imports */
5655 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5656 PyErr_SetString(PyExc_SyntaxError,
5657 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005658 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005659 n->n_lineno);
5660 st->st_errors++;
5661 return;
5662 }
5663 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005664 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005665 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005666 if (symtable_warn(st,
5667 "import * only allowed at module level") < 0)
5668 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005669 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005670 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005671 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005672 } else {
5673 for (i = 3; i < NCH(n); i += 2) {
5674 node *c = CHILD(n, i);
5675 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005676 symtable_assign(st, CHILD(c, 2),
5677 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005678 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005679 symtable_assign(st, CHILD(c, 0),
5680 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005681 }
5682 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005683 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005684 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005685 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005686 }
5687 }
5688}
5689
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005690/* The third argument to symatble_assign() is a flag to be passed to
5691 symtable_add_def() if it is eventually called. The flag is useful
5692 to specify the particular type of assignment that should be
5693 recorded, e.g. an assignment caused by import.
5694 */
5695
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005696static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005697symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005698{
5699 node *tmp;
5700 int i;
5701
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005702 loop:
5703 switch (TYPE(n)) {
5704 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005705 /* invalid assignment, e.g. lambda x:x=2. The next
5706 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005707 return;
5708 case power:
5709 if (NCH(n) > 2) {
5710 for (i = 2; i < NCH(n); ++i)
5711 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5712 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005713 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005714 if (NCH(n) > 1) {
5715 symtable_node(st, CHILD(n, 0));
5716 symtable_node(st, CHILD(n, 1));
5717 } else {
5718 n = CHILD(n, 0);
5719 goto loop;
5720 }
5721 return;
5722 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005723 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5724 /* XXX This is an error, but the next pass
5725 will catch it. */
5726 return;
5727 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005728 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005729 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005730 }
5731 return;
5732 case exprlist:
5733 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00005734 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005735 if (NCH(n) == 1) {
5736 n = CHILD(n, 0);
5737 goto loop;
5738 }
5739 else {
5740 int i;
5741 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005742 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005743 return;
5744 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005745 case atom:
5746 tmp = CHILD(n, 0);
5747 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5748 n = CHILD(n, 1);
5749 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005750 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00005751 if (strcmp(STR(tmp), "__debug__") == 0) {
5752 PyErr_SetString(PyExc_SyntaxError,
5753 ASSIGN_DEBUG);
5754 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton86424e32001-12-04 02:41:46 +00005755 n->n_lineno);
Jeremy Hylton778e2652001-11-09 19:50:08 +00005756 st->st_errors++;
5757 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005758 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005759 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005760 return;
5761 case dotted_as_name:
5762 if (NCH(n) == 3)
5763 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005764 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005765 else
5766 symtable_add_def(st,
5767 STR(CHILD(CHILD(n,
5768 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005769 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005770 return;
5771 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005772 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005773 return;
5774 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005775 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005776 return;
5777 default:
5778 if (NCH(n) == 0)
5779 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005780 if (NCH(n) == 1) {
5781 n = CHILD(n, 0);
5782 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005783 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005784 /* Should only occur for errors like x + 1 = 1,
5785 which will be caught in the next pass. */
5786 for (i = 0; i < NCH(n); ++i)
5787 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005788 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005789 }
5790}