blob: 56b3a3e5927b4952942c03ea42489c06f279de73 [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 Hylton29906ee2001-02-27 04:23:34 +000054#define GLOBAL_AFTER_ASSIGN \
55"name '%.400s' is assigned to before global declaration"
56
57#define GLOBAL_AFTER_USE \
58"name '%.400s' is used prior to global declaration"
59
Martin v. Löwisdd7eb142003-10-18 22:05:25 +000060#define PARAM_GLOBAL \
Neal Norwitz2a47c0f2002-01-29 00:53:41 +000061"name '%.400s' is a function parameter and declared global"
Jeremy Hylton29906ee2001-02-27 04:23:34 +000062
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +000063#define LATE_FUTURE \
64"from __future__ imports must occur at the beginning of the file"
65
Jeremy Hylton897b8212001-03-23 14:08:38 +000066#define ASSIGN_DEBUG \
67"can not assign to __debug__"
68
Jeremy Hyltone36f7782001-01-19 03:21:30 +000069#define MANGLE_LEN 256
70
Guido van Rossum79f25d91997-04-29 20:08:16 +000071#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000072
Guido van Rossum6f799372001-09-20 20:46:19 +000073static PyMemberDef code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000074 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
75 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000076 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000077 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000078 {"co_code", T_OBJECT, OFF(co_code), READONLY},
79 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
80 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000081 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000082 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
83 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000084 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000085 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000086 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
87 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000088 {NULL} /* Sentinel */
89};
90
Michael W. Hudson60934622004-08-12 17:56:29 +000091/* Helper for code_new: return a shallow copy of a tuple that is
92 guaranteed to contain exact strings, by converting string subclasses
93 to exact strings and complaining if a non-string is found. */
94static PyObject*
95validate_and_copy_tuple(PyObject *tup)
96{
97 PyObject *newtuple;
98 PyObject *item;
99 int i, len;
100
101 len = PyTuple_GET_SIZE(tup);
102 newtuple = PyTuple_New(len);
103 if (newtuple == NULL)
104 return NULL;
105
106 for (i = 0; i < len; i++) {
107 item = PyTuple_GET_ITEM(tup, i);
108 if (PyString_CheckExact(item)) {
109 Py_INCREF(item);
110 }
111 else if (!PyString_Check(item)) {
112 PyErr_Format(
113 PyExc_TypeError,
114 "name tuples must contain only "
115 "strings, not '%.500s'",
116 item->ob_type->tp_name);
117 Py_DECREF(newtuple);
118 return NULL;
119 }
120 else {
121 item = PyString_FromStringAndSize(
122 PyString_AS_STRING(item),
123 PyString_GET_SIZE(item));
124 if (item == NULL) {
125 Py_DECREF(newtuple);
126 return NULL;
127 }
128 }
129 PyTuple_SET_ITEM(newtuple, i, item);
130 }
131
132 return newtuple;
133}
134
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000135PyDoc_STRVAR(code_doc,
136"code(argcount, nlocals, stacksize, flags, codestring, constants, names,\n\
137 varnames, filename, name, firstlineno, lnotab[, freevars[, cellvars]])\n\
138\n\
139Create a code object. Not for the faint of heart.");
140
141static PyObject *
142code_new(PyTypeObject *type, PyObject *args, PyObject *kw)
143{
144 int argcount;
145 int nlocals;
146 int stacksize;
147 int flags;
Tim Petersd459f532004-08-12 18:16:43 +0000148 PyObject *co = NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000149 PyObject *code;
150 PyObject *consts;
Michael W. Hudson60934622004-08-12 17:56:29 +0000151 PyObject *names, *ournames = NULL;
152 PyObject *varnames, *ourvarnames = NULL;
153 PyObject *freevars = NULL, *ourfreevars = NULL;
154 PyObject *cellvars = NULL, *ourcellvars = NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000155 PyObject *filename;
156 PyObject *name;
157 int firstlineno;
158 PyObject *lnotab;
159
160 if (!PyArg_ParseTuple(args, "iiiiSO!O!O!SSiS|O!O!:code",
161 &argcount, &nlocals, &stacksize, &flags,
162 &code,
163 &PyTuple_Type, &consts,
164 &PyTuple_Type, &names,
165 &PyTuple_Type, &varnames,
166 &filename, &name,
167 &firstlineno, &lnotab,
168 &PyTuple_Type, &freevars,
169 &PyTuple_Type, &cellvars))
170 return NULL;
171
Michael W. Hudson60934622004-08-12 17:56:29 +0000172 if (argcount < 0) {
173 PyErr_SetString(
174 PyExc_ValueError,
175 "code: argcount must not be negative");
176 goto cleanup;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000177 }
178
Michael W. Hudson60934622004-08-12 17:56:29 +0000179 if (nlocals < 0) {
180 PyErr_SetString(
181 PyExc_ValueError,
182 "code: nlocals must not be negative");
183 goto cleanup;
Raymond Hettingercc1798e2003-09-16 04:27:52 +0000184 }
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000185
Michael W. Hudson60934622004-08-12 17:56:29 +0000186 ournames = validate_and_copy_tuple(names);
187 if (ournames == NULL)
188 goto cleanup;
189 ourvarnames = validate_and_copy_tuple(varnames);
190 if (ourvarnames == NULL)
191 goto cleanup;
192 if (freevars)
193 ourfreevars = validate_and_copy_tuple(freevars);
194 else
195 ourfreevars = PyTuple_New(0);
196 if (ourfreevars == NULL)
197 goto cleanup;
198 if (cellvars)
199 ourcellvars = validate_and_copy_tuple(cellvars);
200 else
201 ourcellvars = PyTuple_New(0);
202 if (ourcellvars == NULL)
203 goto cleanup;
204
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000205 co = (PyObject *) PyCode_New(argcount, nlocals, stacksize, flags,
Michael W. Hudson60934622004-08-12 17:56:29 +0000206 code, consts, ournames, ourvarnames,
207 ourfreevars, ourcellvars, filename,
208 name, firstlineno, lnotab);
209 cleanup:
210 Py_XDECREF(ournames);
211 Py_XDECREF(ourvarnames);
212 Py_XDECREF(ourfreevars);
213 Py_XDECREF(ourcellvars);
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000214 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000215}
216
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000217static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000218code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000219{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000220 Py_XDECREF(co->co_code);
221 Py_XDECREF(co->co_consts);
222 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000223 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000224 Py_XDECREF(co->co_freevars);
225 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 Py_XDECREF(co->co_filename);
227 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000228 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000229 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000230}
231
Guido van Rossum79f25d91997-04-29 20:08:16 +0000232static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000233code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000234{
235 char buf[500];
236 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000237 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000238 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000239
Guido van Rossuma396a882000-04-07 01:21:36 +0000240 if (co->co_firstlineno != 0)
241 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000242 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000243 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000245 name = PyString_AS_STRING(co->co_name);
Barry Warsaw8f6d8682001-11-28 21:10:39 +0000246 PyOS_snprintf(buf, sizeof(buf),
247 "<code object %.100s at %p, file \"%.300s\", line %d>",
248 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000249 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000250}
251
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000252static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000253code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000254{
255 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000256 cmp = PyObject_Compare(co->co_name, cp->co_name);
257 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000258 cmp = co->co_argcount - cp->co_argcount;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000259 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000260 cmp = co->co_nlocals - cp->co_nlocals;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000261 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000262 cmp = co->co_flags - cp->co_flags;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000263 if (cmp) return (cmp<0)?-1:1;
Raymond Hettinger9047c8f2004-10-24 00:10:06 +0000264 cmp = co->co_firstlineno - cp->co_firstlineno;
265 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000266 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000267 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000268 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000269 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000270 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000271 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000272 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000273 if (cmp) return cmp;
274 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
275 if (cmp) return cmp;
276 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000277 return cmp;
278}
279
280static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000281code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000282{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000283 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000284 h0 = PyObject_Hash(co->co_name);
285 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000286 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000287 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000288 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000289 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000290 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000291 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000292 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000293 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000294 h5 = PyObject_Hash(co->co_freevars);
295 if (h5 == -1) return -1;
296 h6 = PyObject_Hash(co->co_cellvars);
297 if (h6 == -1) return -1;
298 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000299 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000300 if (h == -1) h = -2;
301 return h;
302}
303
Jeremy Hylton78891072001-03-01 06:09:34 +0000304/* XXX code objects need to participate in GC? */
305
Guido van Rossum79f25d91997-04-29 20:08:16 +0000306PyTypeObject PyCode_Type = {
307 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000308 0,
309 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000310 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000311 0,
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000312 (destructor)code_dealloc, /* tp_dealloc */
313 0, /* tp_print */
314 0, /* tp_getattr */
315 0, /* tp_setattr */
316 (cmpfunc)code_compare, /* tp_compare */
317 (reprfunc)code_repr, /* tp_repr */
318 0, /* tp_as_number */
319 0, /* tp_as_sequence */
320 0, /* tp_as_mapping */
321 (hashfunc)code_hash, /* tp_hash */
322 0, /* tp_call */
323 0, /* tp_str */
324 PyObject_GenericGetAttr, /* tp_getattro */
325 0, /* tp_setattro */
326 0, /* tp_as_buffer */
327 Py_TPFLAGS_DEFAULT, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000328 code_doc, /* tp_doc */
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000329 0, /* tp_traverse */
330 0, /* tp_clear */
331 0, /* tp_richcompare */
332 0, /* tp_weaklistoffset */
333 0, /* tp_iter */
334 0, /* tp_iternext */
335 0, /* tp_methods */
336 code_memberlist, /* tp_members */
337 0, /* tp_getset */
338 0, /* tp_base */
339 0, /* tp_dict */
340 0, /* tp_descr_get */
341 0, /* tp_descr_set */
342 0, /* tp_dictoffset */
343 0, /* tp_init */
344 0, /* tp_alloc */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000345 code_new, /* tp_new */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000346};
347
Guido van Rossum644a12b1997-04-09 19:24:53 +0000348#define NAME_CHARS \
349 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
350
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000351/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
352
353static int
354all_name_chars(unsigned char *s)
355{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000356 static char ok_name_char[256];
357 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000358
Guido van Rossumcd90c202001-02-09 15:06:42 +0000359 if (ok_name_char[*name_chars] == 0) {
360 unsigned char *p;
361 for (p = name_chars; *p; p++)
362 ok_name_char[*p] = 1;
363 }
364 while (*s) {
365 if (ok_name_char[*s++] == 0)
366 return 0;
367 }
368 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000369}
370
Michael W. Hudson60934622004-08-12 17:56:29 +0000371static void
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000372intern_strings(PyObject *tuple)
373{
374 int i;
375
376 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
377 PyObject *v = PyTuple_GET_ITEM(tuple, i);
Michael W. Hudson60934622004-08-12 17:56:29 +0000378 if (v == NULL || !PyString_CheckExact(v)) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000379 Py_FatalError("non-string found in code slot");
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000380 }
381 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
382 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000383}
384
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000385/* Begin: Peephole optimizations ----------------------------------------- */
386
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000387#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
388#define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD)
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000389#define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE || op==CONTINUE_LOOP)
390#define GETJUMPTGT(arr, i) (GETARG(arr,i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+3))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000391#define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000392#define CODESIZE(op) (HAS_ARG(op) ? 3 : 1)
393#define ISBASICBLOCK(blocks, start, bytes) (blocks[start]==blocks[start+bytes-1])
394
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000395/* Replace LOAD_CONST c1. LOAD_CONST c2 ... LOAD_CONST cn BUILD_TUPLE n
396 with LOAD_CONST (c1, c2, ... cn).
397 The consts table must still be in list form so that the
398 new constant (c1, c2, ... cn) can be appended.
399 Called with codestr pointing to the first LOAD_CONST.
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000400 Bails out with no change if one or more of the LOAD_CONSTs is missing.
401 Also works for BUILD_LIST when followed by an "in" or "not in" test.
402*/
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000403static int
404tuple_of_constants(unsigned char *codestr, int n, PyObject *consts)
405{
406 PyObject *newconst, *constant;
407 int i, arg, len_consts;
408
409 /* Pre-conditions */
410 assert(PyList_CheckExact(consts));
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000411 assert(codestr[n*3] == BUILD_TUPLE || codestr[n*3] == BUILD_LIST);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000412 assert(GETARG(codestr, (n*3)) == n);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000413 for (i=0 ; i<n ; i++)
Raymond Hettingereffb3932004-10-30 08:55:08 +0000414 assert(codestr[i*3] == LOAD_CONST);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000415
416 /* Buildup new tuple of constants */
417 newconst = PyTuple_New(n);
418 if (newconst == NULL)
419 return 0;
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000420 len_consts = PyList_GET_SIZE(consts);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000421 for (i=0 ; i<n ; i++) {
422 arg = GETARG(codestr, (i*3));
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000423 assert(arg < len_consts);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000424 constant = PyList_GET_ITEM(consts, arg);
425 Py_INCREF(constant);
426 PyTuple_SET_ITEM(newconst, i, constant);
427 }
428
429 /* Append folded constant onto consts */
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000430 if (PyList_Append(consts, newconst)) {
431 Py_DECREF(newconst);
432 return 0;
433 }
434 Py_DECREF(newconst);
435
436 /* Write NOPs over old LOAD_CONSTS and
437 add a new LOAD_CONST newconst on top of the BUILD_TUPLE n */
438 memset(codestr, NOP, n*3);
439 codestr[n*3] = LOAD_CONST;
440 SETARG(codestr, (n*3), len_consts);
441 return 1;
442}
443
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000444/* Replace LOAD_CONST c1. LOAD_CONST c2 BINOP
445 with LOAD_CONST binop(c1,c2)
446 The consts table must still be in list form so that the
447 new constant can be appended.
448 Called with codestr pointing to the first LOAD_CONST.
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000449 Abandons the transformation if the folding fails (i.e. 1+'a').
450 If the new constant is a sequence, only folds when the size
451 is below a threshold value. That keeps pyc files from
452 becoming large in the presence of code like: (None,)*1000.
453*/
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000454static int
455fold_binops_on_constants(unsigned char *codestr, PyObject *consts)
456{
457 PyObject *newconst, *v, *w;
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000458 int len_consts, opcode, size;
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000459
460 /* Pre-conditions */
461 assert(PyList_CheckExact(consts));
462 assert(codestr[0] == LOAD_CONST);
463 assert(codestr[3] == LOAD_CONST);
464
465 /* Create new constant */
466 v = PyList_GET_ITEM(consts, GETARG(codestr, 0));
467 w = PyList_GET_ITEM(consts, GETARG(codestr, 3));
468 opcode = codestr[6];
469 switch (opcode) {
470 case BINARY_POWER:
471 newconst = PyNumber_Power(v, w, Py_None);
472 break;
473 case BINARY_MULTIPLY:
474 newconst = PyNumber_Multiply(v, w);
475 break;
476 case BINARY_DIVIDE:
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000477 /* Cannot fold this operation statically since
478 the result can depend on the run-time presence of the -Qnew flag */
Armin Rigo664b43b2005-01-07 18:10:51 +0000479 return 0;
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000480 case BINARY_TRUE_DIVIDE:
481 newconst = PyNumber_TrueDivide(v, w);
482 break;
483 case BINARY_FLOOR_DIVIDE:
484 newconst = PyNumber_FloorDivide(v, w);
485 break;
486 case BINARY_MODULO:
487 newconst = PyNumber_Remainder(v, w);
488 break;
489 case BINARY_ADD:
490 newconst = PyNumber_Add(v, w);
491 break;
492 case BINARY_SUBTRACT:
493 newconst = PyNumber_Subtract(v, w);
494 break;
495 case BINARY_SUBSCR:
496 newconst = PyObject_GetItem(v, w);
497 break;
498 case BINARY_LSHIFT:
499 newconst = PyNumber_Lshift(v, w);
500 break;
501 case BINARY_RSHIFT:
502 newconst = PyNumber_Rshift(v, w);
503 break;
504 case BINARY_AND:
505 newconst = PyNumber_And(v, w);
506 break;
507 case BINARY_XOR:
508 newconst = PyNumber_Xor(v, w);
509 break;
510 case BINARY_OR:
511 newconst = PyNumber_Or(v, w);
512 break;
513 default:
514 /* Called with an unknown opcode */
515 assert(0);
516 return 0;
517 }
518 if (newconst == NULL) {
519 PyErr_Clear();
520 return 0;
521 }
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000522 size = PyObject_Size(newconst);
523 if (size == -1)
524 PyErr_Clear();
525 else if (size > 20) {
526 Py_DECREF(newconst);
527 return 0;
528 }
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000529
530 /* Append folded constant into consts table */
531 len_consts = PyList_GET_SIZE(consts);
532 if (PyList_Append(consts, newconst)) {
533 Py_DECREF(newconst);
534 return 0;
535 }
536 Py_DECREF(newconst);
537
538 /* Write NOP NOP NOP NOP LOAD_CONST newconst */
539 memset(codestr, NOP, 4);
540 codestr[4] = LOAD_CONST;
541 SETARG(codestr, 4, len_consts);
542 return 1;
543}
544
Raymond Hettinger80121492005-02-20 12:41:32 +0000545static int
546fold_unaryops_on_constants(unsigned char *codestr, PyObject *consts)
547{
Raymond Hettingere63a0782005-02-23 13:37:55 +0000548 PyObject *newconst=NULL, *v;
Raymond Hettinger80121492005-02-20 12:41:32 +0000549 int len_consts, opcode;
550
551 /* Pre-conditions */
552 assert(PyList_CheckExact(consts));
553 assert(codestr[0] == LOAD_CONST);
554
555 /* Create new constant */
556 v = PyList_GET_ITEM(consts, GETARG(codestr, 0));
557 opcode = codestr[3];
558 switch (opcode) {
559 case UNARY_NEGATIVE:
Raymond Hettingere63a0782005-02-23 13:37:55 +0000560 /* Preserve the sign of -0.0 */
561 if (PyObject_IsTrue(v) == 1)
562 newconst = PyNumber_Negative(v);
Raymond Hettinger80121492005-02-20 12:41:32 +0000563 break;
564 case UNARY_CONVERT:
565 newconst = PyObject_Repr(v);
566 break;
567 case UNARY_INVERT:
568 newconst = PyNumber_Invert(v);
569 break;
570 default:
571 /* Called with an unknown opcode */
572 assert(0);
573 return 0;
574 }
575 if (newconst == NULL) {
576 PyErr_Clear();
577 return 0;
578 }
579
580 /* Append folded constant into consts table */
581 len_consts = PyList_GET_SIZE(consts);
582 if (PyList_Append(consts, newconst)) {
583 Py_DECREF(newconst);
584 return 0;
585 }
586 Py_DECREF(newconst);
587
588 /* Write NOP LOAD_CONST newconst */
589 codestr[0] = NOP;
590 codestr[1] = LOAD_CONST;
591 SETARG(codestr, 1, len_consts);
592 return 1;
593}
594
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000595static unsigned int *
596markblocks(unsigned char *code, int len)
597{
598 unsigned int *blocks = PyMem_Malloc(len*sizeof(int));
Raymond Hettingereffb3932004-10-30 08:55:08 +0000599 int i,j, opcode, blockcnt = 0;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000600
601 if (blocks == NULL)
602 return NULL;
603 memset(blocks, 0, len*sizeof(int));
Raymond Hettingereffb3932004-10-30 08:55:08 +0000604
605 /* Mark labels in the first pass */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000606 for (i=0 ; i<len ; i+=CODESIZE(opcode)) {
607 opcode = code[i];
608 switch (opcode) {
609 case FOR_ITER:
610 case JUMP_FORWARD:
611 case JUMP_IF_FALSE:
612 case JUMP_IF_TRUE:
613 case JUMP_ABSOLUTE:
614 case CONTINUE_LOOP:
615 case SETUP_LOOP:
616 case SETUP_EXCEPT:
617 case SETUP_FINALLY:
618 j = GETJUMPTGT(code, i);
Raymond Hettingereffb3932004-10-30 08:55:08 +0000619 blocks[j] = 1;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000620 break;
621 }
622 }
Raymond Hettingereffb3932004-10-30 08:55:08 +0000623 /* Build block numbers in the second pass */
624 for (i=0 ; i<len ; i++) {
625 blockcnt += blocks[i]; /* increment blockcnt over labels */
626 blocks[i] = blockcnt;
627 }
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000628 return blocks;
629}
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000630
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000631/* Perform basic peephole optimizations to components of a code object.
632 The consts object should still be in list form to allow new constants
633 to be appended.
634
635 To keep the optimizer simple, it bails out (does nothing) for code
636 containing extended arguments or that has a length over 32,700. That
637 allows us to avoid overflow and sign issues. Likewise, it bails when
638 the lineno table has complex encoding for gaps >= 255.
639
640 Optimizations are restricted to simple transformations occuring within a
641 single basic block. All transformations keep the code size the same or
642 smaller. For those that reduce size, the gaps are initially filled with
643 NOPs. Later those NOPs are removed and the jump addresses retargeted in
644 a single pass. Line numbering is adjusted accordingly. */
645
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000646static PyObject *
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000647optimize_code(PyObject *code, PyObject* consts, PyObject *names, PyObject *lineno_obj)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000648{
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000649 int i, j, codelen, nops, h, adj;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000650 int tgt, tgttgt, opcode;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000651 unsigned char *codestr = NULL;
652 unsigned char *lineno;
653 int *addrmap = NULL;
654 int new_line, cum_orig_line, last_line, tabsiz;
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000655 int cumlc=0, lastlc=0; /* Count runs of consecutive LOAD_CONST codes */
Raymond Hettingereffb3932004-10-30 08:55:08 +0000656 unsigned int *blocks = NULL;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000657 char *name;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000658
Raymond Hettingereffb3932004-10-30 08:55:08 +0000659 /* Bail out if an exception is set */
660 if (PyErr_Occurred())
661 goto exitUnchanged;
662
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000663 /* Bypass optimization when the lineno table is too complex */
664 assert(PyString_Check(lineno_obj));
Brett Cannonc9371d42005-06-25 08:23:41 +0000665 lineno = (unsigned char*)PyString_AS_STRING(lineno_obj);
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000666 tabsiz = PyString_GET_SIZE(lineno_obj);
667 if (memchr(lineno, 255, tabsiz) != NULL)
668 goto exitUnchanged;
669
Raymond Hettingera12fa142004-08-24 04:34:16 +0000670 /* Avoid situations where jump retargeting could overflow */
Raymond Hettinger06cc9732004-09-28 17:22:12 +0000671 assert(PyString_Check(code));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000672 codelen = PyString_Size(code);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000673 if (codelen > 32700)
Raymond Hettingera12fa142004-08-24 04:34:16 +0000674 goto exitUnchanged;
675
676 /* Make a modifiable copy of the code string */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000677 codestr = PyMem_Malloc(codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000678 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000679 goto exitUnchanged;
680 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
Raymond Hettinger98bd1812004-08-06 19:46:34 +0000681
Raymond Hettinger07359a72005-02-21 20:03:14 +0000682 /* Verify that RETURN_VALUE terminates the codestring. This allows
683 the various transformation patterns to look ahead several
684 instructions without additional checks to make sure they are not
685 looking beyond the end of the code string.
686 */
687 if (codestr[codelen-1] != RETURN_VALUE)
688 goto exitUnchanged;
689
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000690 /* Mapping to new jump targets after NOPs are removed */
691 addrmap = PyMem_Malloc(codelen * sizeof(int));
692 if (addrmap == NULL)
693 goto exitUnchanged;
694
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000695 blocks = markblocks(codestr, codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000696 if (blocks == NULL)
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000697 goto exitUnchanged;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000698 assert(PyList_Check(consts));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000699
Raymond Hettinger099ecfb2004-11-01 15:19:11 +0000700 for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000701 opcode = codestr[i];
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000702
703 lastlc = cumlc;
704 cumlc = 0;
705
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000706 switch (opcode) {
707
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000708 /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000709 with JUMP_IF_TRUE POP_TOP */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000710 case UNARY_NOT:
711 if (codestr[i+1] != JUMP_IF_FALSE ||
712 codestr[i+4] != POP_TOP ||
713 !ISBASICBLOCK(blocks,i,5))
714 continue;
715 tgt = GETJUMPTGT(codestr, (i+1));
716 if (codestr[tgt] != POP_TOP)
717 continue;
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000718 j = GETARG(codestr, i+1) + 1;
719 codestr[i] = JUMP_IF_TRUE;
720 SETARG(codestr, i, j);
721 codestr[i+3] = POP_TOP;
722 codestr[i+4] = NOP;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000723 break;
724
725 /* not a is b --> a is not b
726 not a in b --> a not in b
727 not a is not b --> a is b
Raymond Hettingerb615bf02005-02-10 01:42:32 +0000728 not a not in b --> a in b
Raymond Hettingera1645742005-02-06 22:05:42 +0000729 */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000730 case COMPARE_OP:
731 j = GETARG(codestr, i);
732 if (j < 6 || j > 9 ||
733 codestr[i+3] != UNARY_NOT ||
734 !ISBASICBLOCK(blocks,i,4))
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000735 continue;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000736 SETARG(codestr, i, (j^1));
737 codestr[i+3] = NOP;
Tim Petersdb5860b2004-07-17 05:00:52 +0000738 break;
739
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000740 /* Replace LOAD_GLOBAL/LOAD_NAME None with LOAD_CONST None */
741 case LOAD_NAME:
742 case LOAD_GLOBAL:
743 j = GETARG(codestr, i);
744 name = PyString_AsString(PyTuple_GET_ITEM(names, j));
745 if (name == NULL || strcmp(name, "None") != 0)
746 continue;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000747 for (j=0 ; j < PyList_GET_SIZE(consts) ; j++) {
748 if (PyList_GET_ITEM(consts, j) == Py_None) {
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000749 codestr[i] = LOAD_CONST;
750 SETARG(codestr, i, j);
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000751 cumlc = lastlc + 1;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000752 break;
753 }
754 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000755 break;
756
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000757 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000758 case LOAD_CONST:
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000759 cumlc = lastlc + 1;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000760 j = GETARG(codestr, i);
761 if (codestr[i+3] != JUMP_IF_FALSE ||
762 codestr[i+6] != POP_TOP ||
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000763 !ISBASICBLOCK(blocks,i,7) ||
764 !PyObject_IsTrue(PyList_GET_ITEM(consts, j)))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000765 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000766 memset(codestr+i, NOP, 7);
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000767 cumlc = 0;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000768 break;
769
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000770 /* Try to fold tuples of constants (includes a case for lists
771 which are only used for "in" and "not in" tests).
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000772 Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000773 Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
774 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000775 case BUILD_TUPLE:
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000776 case BUILD_LIST:
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000777 j = GETARG(codestr, i);
778 h = i - 3 * j;
779 if (h >= 0 &&
Raymond Hettingereffb3932004-10-30 08:55:08 +0000780 j <= lastlc &&
Brett Cannon5dc8ced2005-03-03 07:01:48 +0000781 ((opcode == BUILD_TUPLE &&
782 ISBASICBLOCK(blocks, h, 3*(j+1))) ||
783 (opcode == BUILD_LIST &&
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000784 codestr[i+3]==COMPARE_OP &&
785 ISBASICBLOCK(blocks, h, 3*(j+2)) &&
Brett Cannon5dc8ced2005-03-03 07:01:48 +0000786 (GETARG(codestr,i+3)==6 ||
787 GETARG(codestr,i+3)==7))) &&
788 tuple_of_constants(&codestr[h], j, consts)) {
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000789 assert(codestr[i] == LOAD_CONST);
790 cumlc = 1;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000791 break;
792 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000793 if (codestr[i+3] != UNPACK_SEQUENCE ||
794 !ISBASICBLOCK(blocks,i,6) ||
795 j != GETARG(codestr, i+3))
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000796 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000797 if (j == 1) {
798 memset(codestr+i, NOP, 6);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000799 } else if (j == 2) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000800 codestr[i] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000801 memset(codestr+i+1, NOP, 5);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000802 } else if (j == 3) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000803 codestr[i] = ROT_THREE;
804 codestr[i+1] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000805 memset(codestr+i+2, NOP, 4);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000806 }
807 break;
808
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000809 /* Fold binary ops on constants.
810 LOAD_CONST c1 LOAD_CONST c2 BINOP --> LOAD_CONST binop(c1,c2) */
811 case BINARY_POWER:
812 case BINARY_MULTIPLY:
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000813 case BINARY_TRUE_DIVIDE:
814 case BINARY_FLOOR_DIVIDE:
815 case BINARY_MODULO:
816 case BINARY_ADD:
817 case BINARY_SUBTRACT:
818 case BINARY_SUBSCR:
819 case BINARY_LSHIFT:
820 case BINARY_RSHIFT:
821 case BINARY_AND:
822 case BINARY_XOR:
823 case BINARY_OR:
824 if (lastlc >= 2 &&
825 ISBASICBLOCK(blocks, i-6, 7) &&
826 fold_binops_on_constants(&codestr[i-6], consts)) {
827 i -= 2;
828 assert(codestr[i] == LOAD_CONST);
829 cumlc = 1;
830 }
831 break;
832
Raymond Hettinger80121492005-02-20 12:41:32 +0000833 /* Fold unary ops on constants.
834 LOAD_CONST c1 UNARY_OP --> LOAD_CONST unary_op(c) */
835 case UNARY_NEGATIVE:
836 case UNARY_CONVERT:
837 case UNARY_INVERT:
838 if (lastlc >= 1 &&
839 ISBASICBLOCK(blocks, i-3, 4) &&
840 fold_unaryops_on_constants(&codestr[i-3], consts)) {
841 i -= 2;
842 assert(codestr[i] == LOAD_CONST);
843 cumlc = 1;
844 }
845 break;
846
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000847 /* Simplify conditional jump to conditional jump where the
848 result of the first test implies the success of a similar
849 test or the failure of the opposite test.
850 Arises in code like:
Raymond Hettingereffb3932004-10-30 08:55:08 +0000851 "if a and b:"
852 "if a or b:"
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000853 "a and b or c"
Armin Rigod7bcf4d2004-10-30 21:08:59 +0000854 "(a and b) and c"
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000855 x:JUMP_IF_FALSE y y:JUMP_IF_FALSE z --> x:JUMP_IF_FALSE z
Raymond Hettinger65d3c052004-08-25 15:15:56 +0000856 x:JUMP_IF_FALSE y y:JUMP_IF_TRUE z --> x:JUMP_IF_FALSE y+3
857 where y+3 is the instruction following the second test.
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000858 */
859 case JUMP_IF_FALSE:
860 case JUMP_IF_TRUE:
861 tgt = GETJUMPTGT(codestr, i);
862 j = codestr[tgt];
863 if (j == JUMP_IF_FALSE || j == JUMP_IF_TRUE) {
864 if (j == opcode) {
865 tgttgt = GETJUMPTGT(codestr, tgt) - i - 3;
866 SETARG(codestr, i, tgttgt);
867 } else {
868 tgt -= i;
869 SETARG(codestr, i, tgt);
870 }
871 break;
872 }
873 /* Intentional fallthrough */
874
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000875 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000876 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000877 case JUMP_FORWARD:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000878 case JUMP_ABSOLUTE:
879 case CONTINUE_LOOP:
880 case SETUP_LOOP:
881 case SETUP_EXCEPT:
882 case SETUP_FINALLY:
883 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000884 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000885 continue;
886 tgttgt = GETJUMPTGT(codestr, tgt);
887 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
888 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000889 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000890 tgttgt -= i + 3; /* Calc relative jump addr */
891 if (tgttgt < 0) /* No backward relative jumps */
892 continue;
893 codestr[i] = opcode;
894 SETARG(codestr, i, tgttgt);
895 break;
896
897 case EXTENDED_ARG:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000898 goto exitUnchanged;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000899
900 /* Replace RETURN LOAD_CONST None RETURN with just RETURN */
901 case RETURN_VALUE:
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000902 if (i+4 >= codelen ||
903 codestr[i+4] != RETURN_VALUE ||
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000904 !ISBASICBLOCK(blocks,i,5))
905 continue;
906 memset(codestr+i+1, NOP, 4);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000907 break;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000908 }
909 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000910
911 /* Fixup linenotab */
Raymond Hettinger099ecfb2004-11-01 15:19:11 +0000912 for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
913 addrmap[i] = i - nops;
914 if (codestr[i] == NOP)
915 nops++;
916 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000917 cum_orig_line = 0;
918 last_line = 0;
919 for (i=0 ; i < tabsiz ; i+=2) {
920 cum_orig_line += lineno[i];
921 new_line = addrmap[cum_orig_line];
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000922 assert (new_line - last_line < 255);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000923 lineno[i] =((unsigned char)(new_line - last_line));
924 last_line = new_line;
925 }
926
927 /* Remove NOPs and fixup jump targets */
928 for (i=0, h=0 ; i<codelen ; ) {
929 opcode = codestr[i];
930 switch (opcode) {
931 case NOP:
932 i++;
933 continue;
934
935 case JUMP_ABSOLUTE:
936 case CONTINUE_LOOP:
937 j = addrmap[GETARG(codestr, i)];
938 SETARG(codestr, i, j);
939 break;
940
941 case FOR_ITER:
942 case JUMP_FORWARD:
943 case JUMP_IF_FALSE:
944 case JUMP_IF_TRUE:
945 case SETUP_LOOP:
946 case SETUP_EXCEPT:
947 case SETUP_FINALLY:
948 j = addrmap[GETARG(codestr, i) + i + 3] - addrmap[i] - 3;
949 SETARG(codestr, i, j);
950 break;
951 }
952 adj = CODESIZE(opcode);
953 while (adj--)
954 codestr[h++] = codestr[i++];
955 }
Raymond Hettingera12fa142004-08-24 04:34:16 +0000956 assert(h + nops == codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000957
958 code = PyString_FromStringAndSize((char *)codestr, h);
959 PyMem_Free(addrmap);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000960 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000961 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000962 return code;
963
964exitUnchanged:
Raymond Hettingereffb3932004-10-30 08:55:08 +0000965 if (blocks != NULL)
966 PyMem_Free(blocks);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000967 if (addrmap != NULL)
968 PyMem_Free(addrmap);
969 if (codestr != NULL)
970 PyMem_Free(codestr);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000971 Py_INCREF(code);
972 return code;
973}
974
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000975/* End: Peephole optimizations ----------------------------------------- */
976
Guido van Rossum79f25d91997-04-29 20:08:16 +0000977PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000978PyCode_New(int argcount, int nlocals, int stacksize, int flags,
979 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000980 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
981 PyObject *filename, PyObject *name, int firstlineno,
982 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000983{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000984 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000985 int i;
986 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000987 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000988 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000989 consts == NULL || !PyTuple_Check(consts) ||
990 names == NULL || !PyTuple_Check(names) ||
991 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000992 freevars == NULL || !PyTuple_Check(freevars) ||
993 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000994 name == NULL || !PyString_Check(name) ||
995 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000996 lnotab == NULL || !PyString_Check(lnotab) ||
997 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000998 PyErr_BadInternalCall();
999 return NULL;
1000 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001001 intern_strings(names);
1002 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001003 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001004 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001005 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001006 for (i = PyTuple_Size(consts); --i >= 0; ) {
1007 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001008 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001009 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001010 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001011 continue;
1012 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001013 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001014 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001015 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001016 co->co_argcount = argcount;
1017 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001018 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001019 co->co_flags = flags;
Raymond Hettinger1a789292004-08-18 05:22:06 +00001020 Py_INCREF(code);
1021 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001022 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001023 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001024 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001025 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001026 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001027 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001028 Py_INCREF(freevars);
1029 co->co_freevars = freevars;
1030 Py_INCREF(cellvars);
1031 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001032 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +00001033 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001034 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001035 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001036 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001037 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001038 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +00001039 if (PyTuple_GET_SIZE(freevars) == 0 &&
1040 PyTuple_GET_SIZE(cellvars) == 0)
1041 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001042 }
1043 return co;
1044}
1045
1046
1047/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001048
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001049/* The compiler uses two passes to generate bytecodes. The first pass
1050 builds the symbol table. The second pass generates the bytecode.
1051
1052 The first pass uses a single symtable struct. The second pass uses
1053 a compiling struct for each code block. The compiling structs
1054 share a reference to the symtable.
1055
1056 The two passes communicate via symtable_load_symbols() and via
1057 is_local() and is_global(). The former initializes several slots
1058 in the compiling struct: c_varnames, c_locals, c_nlocals,
1059 c_argcount, c_globals, and c_flags.
1060*/
1061
Tim Peters2a7f3842001-06-09 09:26:21 +00001062/* All about c_lnotab.
1063
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001064c_lnotab is an array of unsigned bytes disguised as a Python string. Since
1065version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
1066mapped to source code line #s via c_lnotab instead.
1067
Tim Peters2a7f3842001-06-09 09:26:21 +00001068The array is conceptually a list of
1069 (bytecode offset increment, line number increment)
1070pairs. The details are important and delicate, best illustrated by example:
1071
1072 byte code offset source code line number
1073 0 1
1074 6 2
1075 50 7
1076 350 307
1077 361 308
1078
1079The first trick is that these numbers aren't stored, only the increments
1080from one row to the next (this doesn't really work, but it's a start):
1081
1082 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
1083
1084The second trick is that an unsigned byte can't hold negative values, or
1085values larger than 255, so (a) there's a deep assumption that byte code
1086offsets and their corresponding line #s both increase monotonically, and (b)
1087if at least one column jumps by more than 255 from one row to the next, more
1088than one pair is written to the table. In case #b, there's no way to know
1089from looking at the table later how many were written. That's the delicate
1090part. A user of c_lnotab desiring to find the source line number
1091corresponding to a bytecode address A should do something like this
1092
1093 lineno = addr = 0
1094 for addr_incr, line_incr in c_lnotab:
1095 addr += addr_incr
1096 if addr > A:
1097 return lineno
1098 lineno += line_incr
1099
1100In order for this to work, when the addr field increments by more than 255,
1101the line # increment in each pair generated must be 0 until the remaining addr
1102increment is < 256. So, in the example above, com_set_lineno should not (as
1103was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
1104255, 0, 45, 255, 0, 45.
1105*/
1106
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001107struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +00001108 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001109 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001110 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001111 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001112 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +00001113 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001114 PyObject *c_locals; /* dictionary (value=localID) */
1115 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001116 PyObject *c_freevars; /* dictionary (value=None) */
Brett Cannon31f83502004-08-15 01:15:01 +00001117 PyObject *c_cellvars; /* dictionary */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001118 int c_nlocals; /* index of next local */
1119 int c_argcount; /* number of top-level arguments */
1120 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001121 int c_nexti; /* index into c_code */
1122 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001123 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001124 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001125 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001126 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001127 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001128 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +00001129 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +00001130 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +00001131 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001132 int c_stacklevel; /* Current stack level */
1133 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001134 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001135 PyObject *c_lnotab; /* Table mapping address to line number */
Armin Rigo80d937e2004-03-22 17:52:53 +00001136 int c_last_addr; /* last op addr seen and recorded in lnotab */
1137 int c_last_line; /* last line seen and recorded in lnotab */
1138 int c_lnotab_next; /* current length of lnotab */
1139 int c_lnotab_last; /* start of last lnotab record added */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001140 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001141 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +00001142 int c_nested; /* Is block nested funcdef or lamdef? */
1143 int c_closure; /* Is nested w/freevars? */
1144 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +00001145 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001146 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001147};
1148
Guido van Rossumf68d8e52001-04-14 17:55:09 +00001149static int
1150is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001151{
1152 if ((v & (USE | DEF_FREE))
1153 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
1154 return 1;
1155 if (v & DEF_FREE_CLASS)
1156 return 1;
1157 return 0;
1158}
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001159
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00001160static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001161com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +00001162{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001163 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
1164
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001165 if (c == NULL) {
1166 /* Error occurred via symtable call to
1167 is_constant_false */
1168 PyErr_SetString(exc, msg);
1169 return;
1170 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001171 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001172 if (c->c_lineno < 1 || c->c_interactive) {
1173 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001174 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +00001175 return;
1176 }
Fred Drakedcf08e02000-08-15 15:49:44 +00001177 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +00001178 if (v == NULL)
1179 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +00001180
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001181 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001182 if (line == NULL) {
1183 Py_INCREF(Py_None);
1184 line = Py_None;
1185 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001186 if (exc == PyExc_SyntaxError) {
1187 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
1188 Py_None, line);
1189 if (t == NULL)
1190 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001191 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001192 if (w == NULL)
1193 goto exit;
1194 PyErr_SetObject(exc, w);
1195 } else {
1196 /* Make sure additional exceptions are printed with
1197 file and line, also. */
1198 PyErr_SetObject(exc, v);
1199 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
1200 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001201 exit:
1202 Py_XDECREF(t);
1203 Py_XDECREF(v);
1204 Py_XDECREF(w);
1205 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +00001206}
1207
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001208/* Interface to the block stack */
1209
1210static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001211block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001212{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001213 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001214 com_error(c, PyExc_SystemError,
1215 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001216 }
1217 else {
1218 c->c_block[c->c_nblocks++] = type;
1219 }
1220}
1221
1222static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001223block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001224{
1225 if (c->c_nblocks > 0)
1226 c->c_nblocks--;
1227 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001228 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001229 }
1230}
1231
Guido van Rossum681d79a1995-07-18 14:51:37 +00001232/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001233
Martin v. Löwis95292d62002-12-11 14:04:59 +00001234static int issue_warning(const char *, const char *, int);
1235static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001236static void com_free(struct compiling *);
1237static void com_push(struct compiling *, int);
1238static void com_pop(struct compiling *, int);
1239static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001240static void com_node(struct compiling *, node *);
1241static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001242static void com_addbyte(struct compiling *, int);
1243static void com_addint(struct compiling *, int);
1244static void com_addoparg(struct compiling *, int, int);
1245static void com_addfwref(struct compiling *, int, int *);
1246static void com_backpatch(struct compiling *, int);
1247static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
1248static int com_addconst(struct compiling *, PyObject *);
1249static int com_addname(struct compiling *, PyObject *);
1250static void com_addopname(struct compiling *, int, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001251static void com_test(struct compiling *c, node *n);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001252static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001253static void com_list_iter(struct compiling *, node *, node *, char *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001254static void com_gen_iter(struct compiling *, node *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001255static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +00001256static void com_assign(struct compiling *, node *, int, node *);
1257static void com_assign_name(struct compiling *, node *, int);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001258static int com_make_closure(struct compiling *c, PyCodeObject *co);
1259
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001260static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +00001261static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001262 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001263static PyObject *parsestrplus(struct compiling*, node *);
1264static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +00001265static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001266
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001267static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001268
1269/* symtable operations */
Raymond Hettinger354433a2004-05-19 08:20:33 +00001270static int symtable_lookup(struct symtable *st, char *name);
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00001271static struct symtable *symtable_build(node *, PyFutureFeatures *,
1272 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001273static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001274static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001275static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001276static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001277static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001278static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001279
1280static void symtable_node(struct symtable *, node *);
1281static void symtable_funcdef(struct symtable *, node *);
1282static void symtable_default_args(struct symtable *, node *);
1283static void symtable_params(struct symtable *, node *);
1284static void symtable_params_fplist(struct symtable *, node *n);
1285static void symtable_global(struct symtable *, node *);
1286static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001287static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001288static void symtable_list_comprehension(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001289static void symtable_generator_expression(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001290static void symtable_list_for(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001291static void symtable_gen_for(struct symtable *, node *, int);
1292static void symtable_gen_iter(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001293
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001294static int symtable_update_free_vars(struct symtable *);
1295static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
1296static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
1297
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001298/* helper */
1299static void
1300do_pad(int pad)
1301{
1302 int i;
1303 for (i = 0; i < pad; ++i)
1304 fprintf(stderr, " ");
1305}
1306
1307static void
1308dump(node *n, int pad, int depth)
1309{
1310 int i;
1311 if (depth == 0)
1312 return;
1313 do_pad(pad);
1314 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
1315 if (depth > 0)
1316 depth--;
1317 for (i = 0; i < NCH(n); ++i)
1318 dump(CHILD(n, i), pad + 1, depth);
1319}
1320
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001321static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001322com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001323{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001324 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001325 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
1326 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001327 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001328 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001329 goto fail;
1330 if ((c->c_const_dict = PyDict_New()) == NULL)
1331 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001332 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001333 goto fail;
1334 if ((c->c_name_dict = PyDict_New()) == NULL)
1335 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001336 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001337 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001338 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
1339 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001340 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001341 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001342 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001343 c->c_freevars = NULL;
1344 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001345 c->c_nlocals = 0;
1346 c->c_argcount = 0;
1347 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001348 c->c_nexti = 0;
1349 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001350 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001351 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001352 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001353 c->c_begin = 0;
1354 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001355 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001356 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +00001357 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001358 c->c_stacklevel = 0;
1359 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001360 c->c_firstlineno = 0;
1361 c->c_last_addr = 0;
1362 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +00001363 c->c_lnotab_next = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00001364 c->c_lnotab_last = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001365 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001366 c->c_nested = 0;
1367 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001368 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001369 return 1;
1370
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001371 fail:
1372 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001373 return 0;
1374}
1375
1376static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001377com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001378{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001379 Py_XDECREF(c->c_code);
1380 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001381 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001382 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001383 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001384 Py_XDECREF(c->c_globals);
1385 Py_XDECREF(c->c_locals);
1386 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001387 Py_XDECREF(c->c_freevars);
1388 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001389 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001390 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00001391 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001392}
1393
1394static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001395com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001396{
1397 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001398 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001399 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001400 /*
1401 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
1402 c->c_filename, c->c_name, c->c_lineno,
1403 c->c_nexti, c->c_stacklevel, n);
1404 */
1405 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001406}
1407
1408static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001409com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001410{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001411 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001412 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001413 else
1414 c->c_stacklevel -= n;
1415}
1416
1417static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001418com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001419{
1420 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001421 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001422 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001423 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001424}
1425
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001426static int
1427com_check_size(PyObject **s, int offset)
1428{
1429 int len = PyString_GET_SIZE(*s);
1430 if (offset >= len)
1431 return _PyString_Resize(s, len * 2);
1432 return 0;
1433}
1434
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001435static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001436com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001437{
Guido van Rossum681d79a1995-07-18 14:51:37 +00001438 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001439 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +00001440 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001441 if (com_check_size(&c->c_code, c->c_nexti)) {
1442 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001443 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001444 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001445 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001446}
1447
1448static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001449com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001450{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001451 com_addbyte(c, x & 0xff);
1452 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001453}
1454
1455static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001456com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001457{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001458 char *p;
1459 if (c->c_lnotab == NULL)
1460 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001461 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
1462 c->c_errors++;
1463 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001464 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001465 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001466 *p++ = addr;
1467 *p++ = line;
1468 c->c_lnotab_next += 2;
1469}
1470
1471static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001472com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001473{
1474 c->c_lineno = lineno;
1475 if (c->c_firstlineno == 0) {
1476 c->c_firstlineno = c->c_last_line = lineno;
1477 }
1478 else {
1479 int incr_addr = c->c_nexti - c->c_last_addr;
1480 int incr_line = lineno - c->c_last_line;
Armin Rigo80d937e2004-03-22 17:52:53 +00001481 c->c_lnotab_last = c->c_lnotab_next;
Tim Peters2a7f3842001-06-09 09:26:21 +00001482 while (incr_addr > 255) {
1483 com_add_lnotab(c, 255, 0);
1484 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001485 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001486 while (incr_line > 255) {
1487 com_add_lnotab(c, incr_addr, 255);
1488 incr_line -=255;
1489 incr_addr = 0;
1490 }
1491 if (incr_addr > 0 || incr_line > 0)
1492 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001493 c->c_last_addr = c->c_nexti;
1494 c->c_last_line = lineno;
1495 }
1496}
1497
1498static void
Armin Rigo80d937e2004-03-22 17:52:53 +00001499com_strip_lnotab(struct compiling *c)
1500{
1501 /* strip the last lnotab entry if no opcode were emitted.
1502 * This prevents a line number to be generated on a final
1503 * pass, like in the following example:
1504 *
1505 * if a:
1506 * print 5
1507 * else:
1508 * pass
1509 *
1510 * Without the fix, a line trace event would be generated
1511 * on the pass even if a is true (because of the implicit
1512 * return).
1513 */
1514 if (c->c_nexti == c->c_last_addr && c->c_lnotab_last > 0) {
1515 c->c_lnotab_next = c->c_lnotab_last;
1516 }
1517}
1518
1519static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001520com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001521{
Fred Drakeef8ace32000-08-24 00:32:09 +00001522 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +00001523 if (extended_arg){
1524 com_addbyte(c, EXTENDED_ARG);
1525 com_addint(c, extended_arg);
1526 arg &= 0xffff;
1527 }
Guido van Rossum8e793d91997-03-03 19:13:14 +00001528 com_addbyte(c, op);
1529 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001530}
1531
1532static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001533com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001534{
1535 /* Compile a forward reference for backpatching */
1536 int here;
1537 int anchor;
1538 com_addbyte(c, op);
1539 here = c->c_nexti;
1540 anchor = *p_anchor;
1541 *p_anchor = here;
1542 com_addint(c, anchor == 0 ? 0 : here - anchor);
1543}
1544
1545static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001546com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001547{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001548 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001549 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001550 int dist;
1551 int prev;
1552 for (;;) {
1553 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001554 prev = code[anchor] + (code[anchor+1] << 8);
1555 dist = target - (anchor+2);
1556 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001557 dist >>= 8;
1558 code[anchor+1] = dist;
1559 dist >>= 8;
1560 if (dist) {
1561 com_error(c, PyExc_SystemError,
1562 "com_backpatch: offset too large");
1563 break;
1564 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001565 if (!prev)
1566 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001567 anchor -= prev;
1568 }
1569}
1570
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001571/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001572
1573static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001574com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001575{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001576 PyObject *w, *t, *np=NULL;
1577 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001578
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001579 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001580 if (t == NULL)
1581 goto fail;
1582 w = PyDict_GetItem(dict, t);
1583 if (w != NULL) {
1584 n = PyInt_AsLong(w);
1585 } else {
1586 n = PyList_Size(list);
1587 np = PyInt_FromLong(n);
1588 if (np == NULL)
1589 goto fail;
1590 if (PyList_Append(list, v) != 0)
1591 goto fail;
1592 if (PyDict_SetItem(dict, t, np) != 0)
1593 goto fail;
1594 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001595 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001596 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001597 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001598 fail:
1599 Py_XDECREF(np);
1600 Py_XDECREF(t);
1601 c->c_errors++;
1602 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001603}
1604
1605static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001606com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001607{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001608 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001609}
1610
1611static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001612com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001613{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001614 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001615}
1616
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001617int
1618_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001619{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001620 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001621 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001622 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001623 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1624 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001625 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001626 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001627 return 0; /* Don't mangle __extremely_long_names */
1628 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1629 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001630 /* Strip leading underscores from class name */
1631 while (*p == '_')
1632 p++;
1633 if (*p == '\0')
1634 return 0; /* Don't mangle if class is just underscores */
1635 plen = strlen(p);
1636 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001637 plen = maxlen-nlen-2; /* Truncate class name if too long */
1638 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001639 buffer[0] = '_';
1640 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001641 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001642 return 1;
1643}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001644
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001645static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001646com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001647{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001648 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001649 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001650 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001651
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001652 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001653 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001654 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001655 c->c_errors++;
1656 i = 255;
1657 }
1658 else {
1659 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001660 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001661 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001662 com_addoparg(c, op, i);
1663}
1664
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001665#define NAME_LOCAL 0
1666#define NAME_GLOBAL 1
1667#define NAME_DEFAULT 2
1668#define NAME_CLOSURE 3
1669
1670static int
1671com_lookup_arg(PyObject *dict, PyObject *name)
1672{
1673 PyObject *v = PyDict_GetItem(dict, name);
1674 if (v == NULL)
1675 return -1;
1676 else
1677 return PyInt_AS_LONG(v);
1678}
1679
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001680static int
1681none_assignment_check(struct compiling *c, char *name, int assigning)
1682{
1683 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1684 char *msg;
1685 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001686 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001687 else
1688 msg = "deleting None";
Raymond Hettinger11a70c72004-07-17 21:46:25 +00001689 com_error(c, PyExc_SyntaxError, msg);
1690 return -1;
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001691 }
1692 return 0;
1693}
1694
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001695static void
1696com_addop_varname(struct compiling *c, int kind, char *name)
1697{
1698 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001699 int i, reftype;
1700 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001701 int op = STOP_CODE;
1702 char buffer[MANGLE_LEN];
1703
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001704 if (kind != VAR_LOAD &&
1705 none_assignment_check(c, name, kind == VAR_STORE))
1706 {
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001707 i = 255;
1708 goto done;
1709 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001710 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001711 name = buffer;
1712 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1713 c->c_errors++;
1714 i = 255;
1715 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001716 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001717
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001718 reftype = get_ref_type(c, name);
1719 switch (reftype) {
1720 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001721 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001722 scope = NAME_LOCAL;
1723 break;
1724 case GLOBAL_EXPLICIT:
1725 scope = NAME_GLOBAL;
1726 break;
1727 case GLOBAL_IMPLICIT:
1728 if (c->c_flags & CO_OPTIMIZED)
1729 scope = NAME_GLOBAL;
1730 break;
1731 case FREE:
1732 case CELL:
1733 scope = NAME_CLOSURE;
1734 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001735 }
1736
1737 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001738 if (scope == NAME_LOCAL)
1739 i = com_lookup_arg(c->c_locals, v);
1740 else if (reftype == FREE)
1741 i = com_lookup_arg(c->c_freevars, v);
1742 else if (reftype == CELL)
1743 i = com_lookup_arg(c->c_cellvars, v);
1744 if (i == -1) {
1745 c->c_errors++; /* XXX no exception set */
1746 i = 255;
1747 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001748 }
1749 Py_DECREF(v);
1750
1751 switch (kind) {
1752 case VAR_LOAD:
1753 switch (scope) {
1754 case NAME_LOCAL:
1755 op = LOAD_FAST;
1756 break;
1757 case NAME_GLOBAL:
1758 op = LOAD_GLOBAL;
1759 break;
1760 case NAME_DEFAULT:
1761 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001762 break;
1763 case NAME_CLOSURE:
1764 op = LOAD_DEREF;
1765 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001766 }
1767 break;
1768 case VAR_STORE:
1769 switch (scope) {
1770 case NAME_LOCAL:
1771 op = STORE_FAST;
1772 break;
1773 case NAME_GLOBAL:
1774 op = STORE_GLOBAL;
1775 break;
1776 case NAME_DEFAULT:
1777 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001778 break;
1779 case NAME_CLOSURE:
1780 op = STORE_DEREF;
1781 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001782 }
1783 break;
1784 case VAR_DELETE:
1785 switch (scope) {
1786 case NAME_LOCAL:
1787 op = DELETE_FAST;
1788 break;
1789 case NAME_GLOBAL:
1790 op = DELETE_GLOBAL;
1791 break;
1792 case NAME_DEFAULT:
1793 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001794 break;
1795 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001796 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001797 PyOS_snprintf(buf, sizeof(buf),
1798 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001799 com_error(c, PyExc_SyntaxError, buf);
1800 i = 255;
1801 break;
1802 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001803 }
1804 break;
1805 }
1806done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001807 com_addoparg(c, op, i);
1808}
1809
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001810static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001811com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001812{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001813 char *name;
1814 char buffer[1000];
1815 /* XXX it is possible to write this code without the 1000
1816 chars on the total length of dotted names, I just can't be
1817 bothered right now */
1818 if (TYPE(n) == STAR)
1819 name = "*";
1820 else if (TYPE(n) == dotted_name) {
1821 char *p = buffer;
1822 int i;
1823 name = buffer;
1824 for (i = 0; i < NCH(n); i += 2) {
1825 char *s = STR(CHILD(n, i));
1826 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001827 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001828 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001829 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001830 break;
1831 }
1832 if (p != buffer)
1833 *p++ = '.';
1834 strcpy(p, s);
1835 p = strchr(p, '\0');
1836 }
1837 }
1838 else {
1839 REQ(n, NAME);
1840 name = STR(n);
1841 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001842 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001843}
1844
Guido van Rossum79f25d91997-04-29 20:08:16 +00001845static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001846parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001847{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001848 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001849 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001850 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001851#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001852 int imflag;
1853#endif
1854
Guido van Rossum282914b1991-04-04 10:42:56 +00001855 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001856 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001857#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001858 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001859#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001860 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001861 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001862 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001863 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001864 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001865 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001866 }
1867 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001868 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001869 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001870 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001871 if (errno != 0)
1872 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001873 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001874 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001875 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001876#ifndef WITHOUT_COMPLEX
1877 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001878 Py_complex z;
1879 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001880 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001881 z.imag = PyOS_ascii_atof(s);
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001882 PyFPE_END_PROTECT(z)
1883 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001884 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001885 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001886#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001887 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001888 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001889 dx = PyOS_ascii_atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001890 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001891 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001892 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001893}
1894
Guido van Rossum79f25d91997-04-29 20:08:16 +00001895static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001896decode_utf8(char **sPtr, char *end, char* encoding)
1897{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001898#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001899 Py_FatalError("decode_utf8 should not be called in this build.");
1900 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001901#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001902 PyObject *u, *v;
1903 char *s, *t;
1904 t = s = *sPtr;
1905 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1906 while (s < end && (*s & 0x80)) s++;
1907 *sPtr = s;
1908 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1909 if (u == NULL)
1910 return NULL;
1911 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1912 Py_DECREF(u);
1913 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001914#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001915}
1916
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001917/* compiler.transformer.Transformer.decode_literal depends on what
1918 might seem like minor details of this function -- changes here
1919 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001920static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001921parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001922{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001923 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001924 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001925 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001926 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001927 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001928 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001929 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001930
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001931 if (isalpha(quote) || quote == '_') {
1932 if (quote == 'u' || quote == 'U') {
1933 quote = *++s;
1934 unicode = 1;
1935 }
1936 if (quote == 'r' || quote == 'R') {
1937 quote = *++s;
1938 rawmode = 1;
1939 }
1940 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001941 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001942 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001943 return NULL;
1944 }
1945 s++;
1946 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001947 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001948 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001949 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001950 return NULL;
1951 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001952 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001953 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001954 return NULL;
1955 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001956 if (len >= 4 && s[0] == quote && s[1] == quote) {
1957 s += 2;
1958 len -= 2;
1959 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001960 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001961 return NULL;
1962 }
1963 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001964#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001965 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001966 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001967 char *buf;
1968 char *p;
1969 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001970 if (encoding == NULL) {
1971 buf = s;
1972 u = NULL;
1973 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1974 buf = s;
1975 u = NULL;
1976 } else {
1977 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1978 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1979 if (u == NULL)
1980 return NULL;
1981 p = buf = PyString_AsString(u);
1982 end = s + len;
1983 while (s < end) {
1984 if (*s == '\\') {
1985 *p++ = *s++;
1986 if (*s & 0x80) {
1987 strcpy(p, "u005c");
1988 p += 5;
1989 }
1990 }
1991 if (*s & 0x80) { /* XXX inefficient */
1992 char *r;
1993 int rn, i;
1994 w = decode_utf8(&s, end, "utf-16-be");
1995 if (w == NULL) {
1996 Py_DECREF(u);
1997 return NULL;
1998 }
1999 r = PyString_AsString(w);
2000 rn = PyString_Size(w);
2001 assert(rn % 2 == 0);
2002 for (i = 0; i < rn; i += 2) {
2003 sprintf(p, "\\u%02x%02x",
2004 r[i + 0] & 0xFF,
2005 r[i + 1] & 0xFF);
2006 p += 6;
2007 }
2008 Py_DECREF(w);
2009 } else {
2010 *p++ = *s++;
2011 }
2012 }
2013 len = p - buf;
2014 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00002015 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00002016 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00002017 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00002018 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
2019 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00002020 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00002021 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00002022 return v;
2023
Guido van Rossum5aa88f02000-03-10 23:01:36 +00002024 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002025#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00002026 need_encoding = (encoding != NULL &&
2027 strcmp(encoding, "utf-8") != 0 &&
2028 strcmp(encoding, "iso-8859-1") != 0);
2029 if (rawmode || strchr(s, '\\') == NULL) {
2030 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00002031#ifndef Py_USING_UNICODE
2032 /* This should not happen - we never see any other
2033 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00002034 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00002035#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00002036 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
2037 if (u == NULL)
2038 return NULL;
2039 v = PyUnicode_AsEncodedString(u, encoding, NULL);
2040 Py_DECREF(u);
2041 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00002042#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00002043 } else {
2044 return PyString_FromStringAndSize(s, len);
2045 }
2046 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00002047
2048 v = PyString_DecodeEscape(s, len, NULL, unicode,
2049 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00002050 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00002051 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002052 return v;
2053}
2054
Guido van Rossum79f25d91997-04-29 20:08:16 +00002055static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002056parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002057{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002058 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002059 int i;
2060 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002061 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002062 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00002063 for (i = 1; i < NCH(n); i++) {
2064 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002065 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00002066 if (s == NULL)
2067 goto onError;
2068 if (PyString_Check(v) && PyString_Check(s)) {
2069 PyString_ConcatAndDel(&v, s);
2070 if (v == NULL)
2071 goto onError;
2072 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002073#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00002074 else {
2075 PyObject *temp;
2076 temp = PyUnicode_Concat(v, s);
2077 Py_DECREF(s);
2078 if (temp == NULL)
2079 goto onError;
2080 Py_DECREF(v);
2081 v = temp;
2082 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002083#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002084 }
2085 }
2086 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00002087
2088 onError:
2089 Py_XDECREF(v);
2090 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002091}
2092
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002093static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002094com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002095{
Skip Montanaro803d6e52000-08-12 18:09:51 +00002096 int anchor = 0;
2097 int save_begin = c->c_begin;
2098
Raymond Hettinger354433a2004-05-19 08:20:33 +00002099 /* list_for: for v in expr [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00002100 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002101 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002102 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002103 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002104 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002105 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002106 c->c_loops++;
2107 com_list_iter(c, n, e, t);
2108 c->c_loops--;
2109 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2110 c->c_begin = save_begin;
2111 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002112 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00002113}
2114
2115static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002116com_gen_for(struct compiling *c, node *n, node *t, int is_outmost)
2117{
2118 int break_anchor = 0;
2119 int anchor = 0;
2120 int save_begin = c->c_begin;
2121
2122 REQ(n, gen_for);
2123 /* gen_for: for v in test [gen_iter] */
2124
2125 com_addfwref(c, SETUP_LOOP, &break_anchor);
2126 block_push(c, SETUP_LOOP);
2127
2128 if (is_outmost) {
2129 com_addop_varname(c, VAR_LOAD, "[outmost-iterable]");
2130 com_push(c, 1);
2131 }
2132 else {
2133 com_node(c, CHILD(n, 3));
2134 com_addbyte(c, GET_ITER);
2135 }
2136
2137 c->c_begin = c->c_nexti;
2138 com_set_lineno(c, c->c_last_line);
2139 com_addfwref(c, FOR_ITER, &anchor);
2140 com_push(c, 1);
2141 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
2142
2143 if (NCH(n) == 5)
2144 com_gen_iter(c, CHILD(n, 4), t);
2145 else {
2146 com_test(c, t);
2147 com_addbyte(c, YIELD_VALUE);
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00002148 com_addbyte(c, POP_TOP);
Raymond Hettinger354433a2004-05-19 08:20:33 +00002149 com_pop(c, 1);
2150 }
2151
2152 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2153 c->c_begin = save_begin;
2154
2155 com_backpatch(c, anchor);
2156 com_pop(c, 1); /* FOR_ITER has popped this */
2157 com_addbyte(c, POP_BLOCK);
2158 block_pop(c, SETUP_LOOP);
2159 com_backpatch(c, break_anchor);
2160}
2161
2162static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002163com_list_if(struct compiling *c, node *n, node *e, char *t)
2164{
2165 int anchor = 0;
2166 int a = 0;
2167 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00002168 com_node(c, CHILD(n, 1));
2169 com_addfwref(c, JUMP_IF_FALSE, &a);
2170 com_addbyte(c, POP_TOP);
2171 com_pop(c, 1);
2172 com_list_iter(c, n, e, t);
2173 com_addfwref(c, JUMP_FORWARD, &anchor);
2174 com_backpatch(c, a);
2175 /* We jump here with an extra entry which we now pop */
2176 com_addbyte(c, POP_TOP);
2177 com_backpatch(c, anchor);
2178}
2179
2180static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002181com_gen_if(struct compiling *c, node *n, node *t)
2182{
2183 /* gen_if: 'if' test [gen_iter] */
2184 int anchor = 0;
2185 int a=0;
2186
2187 com_node(c, CHILD(n, 1));
2188 com_addfwref(c, JUMP_IF_FALSE, &a);
2189 com_addbyte(c, POP_TOP);
2190 com_pop(c, 1);
2191
2192 if (NCH(n) == 3)
2193 com_gen_iter(c, CHILD(n, 2), t);
2194 else {
2195 com_test(c, t);
2196 com_addbyte(c, YIELD_VALUE);
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00002197 com_addbyte(c, POP_TOP);
Raymond Hettinger354433a2004-05-19 08:20:33 +00002198 com_pop(c, 1);
2199 }
2200 com_addfwref(c, JUMP_FORWARD, &anchor);
2201 com_backpatch(c, a);
2202 /* We jump here with an extra entry which we now pop */
2203 com_addbyte(c, POP_TOP);
2204 com_backpatch(c, anchor);
2205}
2206
2207static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002208com_list_iter(struct compiling *c,
2209 node *p, /* parent of list_iter node */
2210 node *e, /* element expression node */
2211 char *t /* name of result list temp local */)
2212{
2213 /* list_iter is the last child in a listmaker, list_for, or list_if */
2214 node *n = CHILD(p, NCH(p)-1);
2215 if (TYPE(n) == list_iter) {
2216 n = CHILD(n, 0);
2217 switch (TYPE(n)) {
2218 case list_for:
2219 com_list_for(c, n, e, t);
2220 break;
2221 case list_if:
2222 com_list_if(c, n, e, t);
2223 break;
2224 default:
2225 com_error(c, PyExc_SystemError,
2226 "invalid list_iter node type");
2227 }
2228 }
2229 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002230 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002231 com_push(c, 1);
2232 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00002233 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002234 com_pop(c, 2);
2235 }
2236}
2237
2238static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002239com_gen_iter(struct compiling *c, node *n, node *t)
2240{
2241 /* gen_iter: gen_for | gen_if */
2242 node *ch;
2243 REQ(n, gen_iter);
2244
2245 ch = CHILD(n, 0);
2246
2247 switch (TYPE(ch)) {
2248 case gen_for:
2249 com_gen_for(c, ch, t, 0);
2250 break;
2251 case gen_if:
2252 com_gen_if(c, ch, t);
2253 break;
2254 default:
2255 com_error(c, PyExc_SystemError,
2256 "invalid gen_iter node type");
2257 }
2258}
2259
2260static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002261com_list_comprehension(struct compiling *c, node *n)
2262{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002263 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00002264 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00002265
2266 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00002267 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002268 com_addoparg(c, BUILD_LIST, 0);
2269 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
2270 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002271 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002272 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002273 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002274 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002275 --c->c_tmpname;
2276}
2277
2278static void
2279com_listmaker(struct compiling *c, node *n)
2280{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002281 /* listmaker: test ( list_for | (',' test)* [','] ) */
2282 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00002283 com_list_comprehension(c, n);
2284 else {
2285 int len = 0;
2286 int i;
2287 for (i = 0; i < NCH(n); i += 2, len++)
2288 com_node(c, CHILD(n, i));
2289 com_addoparg(c, BUILD_LIST, len);
2290 com_pop(c, len-1);
2291 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002292}
2293
2294static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002295com_generator_expression(struct compiling *c, node *n)
2296{
2297 /* testlist_gexp: test gen_for */
2298 /* argument: test gen_for */
2299 PyCodeObject *co;
2300
2301 REQ(CHILD(n, 0), test);
2302 REQ(CHILD(n, 1), gen_for);
2303
2304 symtable_enter_scope(c->c_symtable, "<genexpr>", TYPE(n),
2305 n->n_lineno);
2306 co = icompile(n, c);
2307 symtable_exit_scope(c->c_symtable);
2308
2309 if (co == NULL)
2310 c->c_errors++;
2311 else {
2312 int closure = com_make_closure(c, co);
2313 int i = com_addconst(c, (PyObject *)co);
2314
2315 com_addoparg(c, LOAD_CONST, i);
2316 com_push(c, 1);
2317 if (closure)
2318 com_addoparg(c, MAKE_CLOSURE, 0);
2319 else
2320 com_addoparg(c, MAKE_FUNCTION, 0);
2321
2322 com_test(c, CHILD(CHILD(n, 1), 3));
2323 com_addbyte(c, GET_ITER);
2324 com_addoparg(c, CALL_FUNCTION, 1);
2325 com_pop(c, 1);
2326
2327 Py_DECREF(co);
2328 }
2329}
2330
2331static void
2332com_testlist_gexp(struct compiling *c, node *n)
2333{
2334 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
2335 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
2336 com_generator_expression(c, n);
2337 else com_list(c, n, 0);
2338}
2339
Anthony Baxterc2a5a632004-08-02 06:10:11 +00002340
Raymond Hettinger354433a2004-05-19 08:20:33 +00002341static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002342com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002343{
2344 int i;
2345 /* dictmaker: test ':' test (',' test ':' value)* [','] */
2346 for (i = 0; i+2 < NCH(n); i += 4) {
2347 /* We must arrange things just right for STORE_SUBSCR.
2348 It wants the stack to look like (value) (dict) (key) */
2349 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002350 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002351 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00002352 com_node(c, CHILD(n, i+2)); /* value */
2353 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002354 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002355 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002356 }
2357}
2358
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00002359
2360/* forward reference */
2361static void com_yield_expr(struct compiling *c, node *n);
2362
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002363static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002364com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002365{
2366 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002367 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002368 int i;
2369 REQ(n, atom);
2370 ch = CHILD(n, 0);
2371 switch (TYPE(ch)) {
2372 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002373 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002374 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002375 com_push(c, 1);
2376 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002377 else
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00002378 if (TYPE(CHILD(n, 1)) == yield_expr)
2379 com_yield_expr(c, CHILD(n, 1));
2380 else
2381 com_testlist_gexp(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002382 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00002383 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002384 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002385 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002386 com_push(c, 1);
2387 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002388 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00002389 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002390 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002391 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002392 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002393 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002394 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002395 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002396 break;
2397 case BACKQUOTE:
2398 com_node(c, CHILD(n, 1));
2399 com_addbyte(c, UNARY_CONVERT);
2400 break;
2401 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00002402 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002403 i = 255;
2404 }
2405 else {
2406 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002407 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002408 }
2409 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002410 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002411 break;
2412 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002413 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002414 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002415 c->c_errors++;
2416 i = 255;
2417 }
2418 else {
2419 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002420 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002421 }
2422 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002423 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002424 break;
2425 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002426 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002427 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002428 break;
2429 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002430 com_error(c, PyExc_SystemError,
2431 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002432 }
2433}
2434
2435static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002436com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002437{
2438 if (NCH(n) == 1) {
2439 com_addbyte(c, op);
2440 }
2441 else if (NCH(n) == 2) {
2442 if (TYPE(CHILD(n, 0)) != COLON) {
2443 com_node(c, CHILD(n, 0));
2444 com_addbyte(c, op+1);
2445 }
2446 else {
2447 com_node(c, CHILD(n, 1));
2448 com_addbyte(c, op+2);
2449 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002450 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002451 }
2452 else {
2453 com_node(c, CHILD(n, 0));
2454 com_node(c, CHILD(n, 2));
2455 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002456 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002457 }
2458}
2459
Guido van Rossum635abd21997-01-06 22:56:52 +00002460static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002461com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
2462{
2463 if (NCH(n) == 1) {
2464 com_addbyte(c, DUP_TOP);
2465 com_push(c, 1);
2466 com_addbyte(c, SLICE);
2467 com_node(c, augn);
2468 com_addbyte(c, opcode);
2469 com_pop(c, 1);
2470 com_addbyte(c, ROT_TWO);
2471 com_addbyte(c, STORE_SLICE);
2472 com_pop(c, 2);
2473 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
2474 com_node(c, CHILD(n, 0));
2475 com_addoparg(c, DUP_TOPX, 2);
2476 com_push(c, 2);
2477 com_addbyte(c, SLICE+1);
2478 com_pop(c, 1);
2479 com_node(c, augn);
2480 com_addbyte(c, opcode);
2481 com_pop(c, 1);
2482 com_addbyte(c, ROT_THREE);
2483 com_addbyte(c, STORE_SLICE+1);
2484 com_pop(c, 3);
2485 } else if (NCH(n) == 2) {
2486 com_node(c, CHILD(n, 1));
2487 com_addoparg(c, DUP_TOPX, 2);
2488 com_push(c, 2);
2489 com_addbyte(c, SLICE+2);
2490 com_pop(c, 1);
2491 com_node(c, augn);
2492 com_addbyte(c, opcode);
2493 com_pop(c, 1);
2494 com_addbyte(c, ROT_THREE);
2495 com_addbyte(c, STORE_SLICE+2);
2496 com_pop(c, 3);
2497 } else {
2498 com_node(c, CHILD(n, 0));
2499 com_node(c, CHILD(n, 2));
2500 com_addoparg(c, DUP_TOPX, 3);
2501 com_push(c, 3);
2502 com_addbyte(c, SLICE+3);
2503 com_pop(c, 2);
2504 com_node(c, augn);
2505 com_addbyte(c, opcode);
2506 com_pop(c, 1);
2507 com_addbyte(c, ROT_FOUR);
2508 com_addbyte(c, STORE_SLICE+3);
2509 com_pop(c, 4);
2510 }
2511}
2512
2513static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002514com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002515{
2516 node *m;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002517 REQ(n, argument); /* [test '='] test [gen_for]; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00002518 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00002519 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002520 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00002521 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002522 }
2523 else {
2524 com_node(c, CHILD(n, 0));
2525 }
Guido van Rossum635abd21997-01-06 22:56:52 +00002526 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002527 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00002528 if (NCH(n) == 2) {
2529 com_generator_expression(c, n);
2530 return;
2531 }
2532
Guido van Rossumf10570b1995-07-07 22:53:21 +00002533 m = n;
2534 do {
2535 m = CHILD(m, 0);
2536 } while (NCH(m) == 1);
2537 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00002538 /* f(lambda x: x[0] = 3) ends up getting parsed with
2539 * LHS test = lambda x: x[0], and RHS test = 3.
2540 * SF bug 132313 points out that complaining about a keyword
2541 * then is very confusing.
2542 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002543 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00002544 TYPE(m) == lambdef ?
2545 "lambda cannot contain assignment" :
2546 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002547 }
2548 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002549 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00002550 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00002551 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002552 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002553 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002554 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002555 else if (*pkeywords == NULL) {
2556 c->c_errors++;
2557 Py_DECREF(v);
2558 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002559 if (PyDict_GetItem(*pkeywords, v) != NULL)
2560 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00002561 "duplicate keyword argument");
2562 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002563 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00002564 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002565 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002566 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002567 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002568 }
2569 }
2570 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002571}
2572
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002573static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002574com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002575{
2576 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00002577 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002578 }
2579 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002580 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00002581 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00002582 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00002583 int star_flag = 0;
2584 int starstar_flag = 0;
2585 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002586 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002587 na = 0;
2588 nk = 0;
2589 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00002590 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00002591 if (TYPE(ch) == STAR ||
2592 TYPE(ch) == DOUBLESTAR)
2593 break;
Guido van Rossumca906051998-12-10 16:56:22 +00002594 if (ch->n_lineno != lineno) {
2595 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002596 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00002597 }
2598 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00002599 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002600 na++;
2601 else
2602 nk++;
2603 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002604 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00002605 while (i < NCH(n)) {
2606 node *tok = CHILD(n, i);
2607 node *ch = CHILD(n, i+1);
2608 i += 3;
2609 switch (TYPE(tok)) {
2610 case STAR: star_flag = 1; break;
2611 case DOUBLESTAR: starstar_flag = 1; break;
2612 }
2613 com_node(c, ch);
2614 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002615 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002616 com_error(c, PyExc_SyntaxError,
2617 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002618 }
Jeremy Hylton76901512000-03-28 23:49:17 +00002619 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00002620 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00002621 star_flag + (starstar_flag << 1);
2622 else
2623 opcode = CALL_FUNCTION;
2624 com_addoparg(c, opcode, na | (nk << 8));
2625 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002626 }
2627}
2628
2629static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002630com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002631{
2632 com_addopname(c, LOAD_ATTR, n);
2633}
2634
2635static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002636com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002637{
2638 int i=0;
2639 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00002640 node *ch;
2641
2642 /* first argument */
2643 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002644 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002645 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002646 i++;
2647 }
2648 else {
2649 com_node(c, CHILD(n,i));
2650 i++;
2651 REQ(CHILD(n,i),COLON);
2652 i++;
2653 }
2654 /* second argument */
2655 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
2656 com_node(c, CHILD(n,i));
2657 i++;
2658 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002659 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002660 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002661 com_push(c, 1);
2662 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002663 /* remaining arguments */
2664 for (; i < NCH(n); i++) {
2665 ns++;
2666 ch=CHILD(n,i);
2667 REQ(ch, sliceop);
2668 if (NCH(ch) == 1) {
2669 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002670 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002671 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002672 }
2673 else
2674 com_node(c, CHILD(ch,1));
2675 }
2676 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002677 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002678}
2679
2680static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002681com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002682{
2683 node *ch;
2684 REQ(n, subscript);
2685 ch = CHILD(n,0);
2686 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002687 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002688 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002689 com_push(c, 1);
2690 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002691 else {
2692 /* check for slice */
2693 if ((TYPE(ch) == COLON || NCH(n) > 1))
2694 com_sliceobj(c, n);
2695 else {
2696 REQ(ch, test);
2697 com_node(c, ch);
2698 }
2699 }
2700}
2701
2702static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002703com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002704{
2705 int i, op;
2706 REQ(n, subscriptlist);
2707 /* Check to make backward compatible slice behavior for '[i:j]' */
2708 if (NCH(n) == 1) {
2709 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002710 /* 'Basic' slice, should have exactly one colon. */
2711 if ((TYPE(CHILD(sub, 0)) == COLON
2712 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2713 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2714 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002715 switch (assigning) {
2716 case OP_DELETE:
2717 op = DELETE_SLICE;
2718 break;
2719 case OP_ASSIGN:
2720 op = STORE_SLICE;
2721 break;
2722 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002723 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002724 break;
2725 default:
2726 com_augassign_slice(c, sub, assigning, augn);
2727 return;
2728 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002729 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002730 if (op == STORE_SLICE)
2731 com_pop(c, 2);
2732 else if (op == DELETE_SLICE)
2733 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002734 return;
2735 }
2736 }
2737 /* Else normal subscriptlist. Compile each subscript. */
2738 for (i = 0; i < NCH(n); i += 2)
2739 com_subscript(c, CHILD(n, i));
2740 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002741 if (NCH(n) > 1) {
2742 i = (NCH(n)+1) / 2;
2743 com_addoparg(c, BUILD_TUPLE, i);
2744 com_pop(c, i-1);
2745 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002746 switch (assigning) {
2747 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002748 op = DELETE_SUBSCR;
2749 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002750 break;
2751 default:
2752 case OP_ASSIGN:
2753 op = STORE_SUBSCR;
2754 i = 3;
2755 break;
2756 case OP_APPLY:
2757 op = BINARY_SUBSCR;
2758 i = 1;
2759 break;
2760 }
2761 if (assigning > OP_APPLY) {
2762 com_addoparg(c, DUP_TOPX, 2);
2763 com_push(c, 2);
2764 com_addbyte(c, BINARY_SUBSCR);
2765 com_pop(c, 1);
2766 com_node(c, augn);
2767 com_addbyte(c, assigning);
2768 com_pop(c, 1);
2769 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002770 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002771 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002772 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002773}
2774
2775static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002776com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002777{
2778 REQ(n, trailer);
2779 switch (TYPE(CHILD(n, 0))) {
2780 case LPAR:
2781 com_call_function(c, CHILD(n, 1));
2782 break;
2783 case DOT:
2784 com_select_member(c, CHILD(n, 1));
2785 break;
2786 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002787 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002788 break;
2789 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002790 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002791 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002792 }
2793}
2794
2795static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002796com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002797{
2798 int i;
2799 REQ(n, power);
2800 com_atom(c, CHILD(n, 0));
2801 for (i = 1; i < NCH(n); i++) {
2802 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2803 com_factor(c, CHILD(n, i+1));
2804 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002805 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002806 break;
2807 }
2808 else
2809 com_apply_trailer(c, CHILD(n, i));
2810 }
2811}
2812
2813static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002814com_invert_constant(struct compiling *c, node *n)
2815{
2816 /* Compute the inverse of int and longs and use them directly,
2817 but be prepared to generate code for all other
2818 possibilities (invalid numbers, floats, complex).
2819 */
2820 PyObject *num, *inv = NULL;
2821 int i;
2822
2823 REQ(n, NUMBER);
2824 num = parsenumber(c, STR(n));
2825 if (num == NULL)
2826 i = 255;
2827 else {
2828 inv = PyNumber_Invert(num);
2829 if (inv == NULL) {
2830 PyErr_Clear();
2831 i = com_addconst(c, num);
2832 } else {
2833 i = com_addconst(c, inv);
2834 Py_DECREF(inv);
2835 }
2836 Py_DECREF(num);
2837 }
2838 com_addoparg(c, LOAD_CONST, i);
2839 com_push(c, 1);
2840 if (num != NULL && inv == NULL)
2841 com_addbyte(c, UNARY_INVERT);
2842}
2843
Tim Peters51e26512001-09-07 08:45:55 +00002844static int
2845is_float_zero(const char *p)
2846{
2847 int found_radix_point = 0;
2848 int ch;
2849 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2850 switch (ch) {
2851 case '0':
2852 /* no reason to believe it's not 0 -- continue */
2853 break;
2854
2855 case 'e': case 'E': case 'j': case 'J':
2856 /* If this was a hex constant, we already would have
2857 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2858 must be an exponent marker, and we haven't yet
2859 seen a non-zero digit, and it doesn't matter what
2860 the exponent is then. For 'j' or 'J' similarly,
2861 except that this is an imaginary 0 then. */
2862 return 1;
2863
2864 case '.':
2865 found_radix_point = 1;
2866 break;
2867
2868 default:
2869 return 0;
2870 }
2871 }
2872 return found_radix_point;
2873}
2874
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002875static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002876com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002877{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002878 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002879 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002880 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002881 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002882 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002883 approriate value as a constant. If the value is negative,
2884 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002885 negative in the 0th position -- unless we're doing unary minus
2886 of a floating zero! In that case the sign is significant, but
2887 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002888 */
2889 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002890 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002891 && TYPE((pfactor = CHILD(n, 1))) == factor
2892 && NCH(pfactor) == 1
2893 && TYPE((ppower = CHILD(pfactor, 0))) == power
2894 && NCH(ppower) == 1
2895 && TYPE((patom = CHILD(ppower, 0))) == atom
2896 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002897 && !(childtype == MINUS &&
2898 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002899 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002900 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002901 return;
2902 }
2903 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002904 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002905 if (s == NULL) {
2906 com_error(c, PyExc_MemoryError, "");
2907 com_addbyte(c, 255);
2908 return;
2909 }
2910 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002911 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002912 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002913 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002914 }
Tim Peters51e26512001-09-07 08:45:55 +00002915 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002916 }
2917 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002918 com_factor(c, CHILD(n, 1));
2919 com_addbyte(c, UNARY_POSITIVE);
2920 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002921 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002922 com_factor(c, CHILD(n, 1));
2923 com_addbyte(c, UNARY_NEGATIVE);
2924 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002925 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002926 com_factor(c, CHILD(n, 1));
2927 com_addbyte(c, UNARY_INVERT);
2928 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002929 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002930 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002931 }
2932}
2933
2934static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002935com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002936{
2937 int i;
2938 int op;
2939 REQ(n, term);
2940 com_factor(c, CHILD(n, 0));
2941 for (i = 2; i < NCH(n); i += 2) {
2942 com_factor(c, CHILD(n, i));
2943 switch (TYPE(CHILD(n, i-1))) {
2944 case STAR:
2945 op = BINARY_MULTIPLY;
2946 break;
2947 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002948 if (c->c_flags & CO_FUTURE_DIVISION)
2949 op = BINARY_TRUE_DIVIDE;
2950 else
2951 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002952 break;
2953 case PERCENT:
2954 op = BINARY_MODULO;
2955 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002956 case DOUBLESLASH:
2957 op = BINARY_FLOOR_DIVIDE;
2958 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002959 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002960 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002961 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002962 op = 255;
2963 }
2964 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002965 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002966 }
2967}
2968
2969static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002970com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002971{
2972 int i;
2973 int op;
2974 REQ(n, arith_expr);
2975 com_term(c, CHILD(n, 0));
2976 for (i = 2; i < NCH(n); i += 2) {
2977 com_term(c, CHILD(n, i));
2978 switch (TYPE(CHILD(n, i-1))) {
2979 case PLUS:
2980 op = BINARY_ADD;
2981 break;
2982 case MINUS:
2983 op = BINARY_SUBTRACT;
2984 break;
2985 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002986 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002987 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002988 op = 255;
2989 }
2990 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002991 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002992 }
2993}
2994
2995static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002996com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002997{
2998 int i;
2999 int op;
3000 REQ(n, shift_expr);
3001 com_arith_expr(c, CHILD(n, 0));
3002 for (i = 2; i < NCH(n); i += 2) {
3003 com_arith_expr(c, CHILD(n, i));
3004 switch (TYPE(CHILD(n, i-1))) {
3005 case LEFTSHIFT:
3006 op = BINARY_LSHIFT;
3007 break;
3008 case RIGHTSHIFT:
3009 op = BINARY_RSHIFT;
3010 break;
3011 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003012 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003013 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00003014 op = 255;
3015 }
3016 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003017 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00003018 }
3019}
3020
3021static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003022com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00003023{
3024 int i;
3025 int op;
3026 REQ(n, and_expr);
3027 com_shift_expr(c, CHILD(n, 0));
3028 for (i = 2; i < NCH(n); i += 2) {
3029 com_shift_expr(c, CHILD(n, i));
3030 if (TYPE(CHILD(n, i-1)) == AMPER) {
3031 op = BINARY_AND;
3032 }
3033 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003034 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003035 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00003036 op = 255;
3037 }
3038 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003039 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00003040 }
3041}
3042
3043static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003044com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00003045{
3046 int i;
3047 int op;
3048 REQ(n, xor_expr);
3049 com_and_expr(c, CHILD(n, 0));
3050 for (i = 2; i < NCH(n); i += 2) {
3051 com_and_expr(c, CHILD(n, i));
3052 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
3053 op = BINARY_XOR;
3054 }
3055 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003056 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003057 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003058 op = 255;
3059 }
3060 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003061 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003062 }
3063}
3064
3065static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003066com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003067{
3068 int i;
3069 int op;
3070 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00003071 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003072 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00003073 com_xor_expr(c, CHILD(n, i));
3074 if (TYPE(CHILD(n, i-1)) == VBAR) {
3075 op = BINARY_OR;
3076 }
3077 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003078 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003079 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003080 op = 255;
3081 }
3082 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003083 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003084 }
3085}
3086
3087static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003088cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003089{
3090 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00003091 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003092 | 'in' | 'not' 'in' | 'is' | 'is' not' */
3093 if (NCH(n) == 1) {
3094 n = CHILD(n, 0);
3095 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00003096 case LESS: return PyCmp_LT;
3097 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00003098 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003099 case LESSEQUAL: return PyCmp_LE;
3100 case GREATEREQUAL: return PyCmp_GE;
3101 case NOTEQUAL: return PyCmp_NE; /* <> or != */
3102 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
3103 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003104 }
3105 }
3106 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003107 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003108 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00003109 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003110 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00003111 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003112 }
3113 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00003114 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003115}
3116
3117static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003118com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003119{
3120 int i;
3121 enum cmp_op op;
3122 int anchor;
3123 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
3124 com_expr(c, CHILD(n, 0));
3125 if (NCH(n) == 1)
3126 return;
3127
3128 /****************************************************************
3129 The following code is generated for all but the last
3130 comparison in a chain:
3131
3132 label: on stack: opcode: jump to:
3133
3134 a <code to load b>
3135 a, b DUP_TOP
3136 a, b, b ROT_THREE
3137 b, a, b COMPARE_OP
3138 b, 0-or-1 JUMP_IF_FALSE L1
3139 b, 1 POP_TOP
3140 b
3141
3142 We are now ready to repeat this sequence for the next
3143 comparison in the chain.
3144
3145 For the last we generate:
3146
3147 b <code to load c>
3148 b, c COMPARE_OP
3149 0-or-1
3150
3151 If there were any jumps to L1 (i.e., there was more than one
3152 comparison), we generate:
3153
3154 0-or-1 JUMP_FORWARD L2
3155 L1: b, 0 ROT_TWO
3156 0, b POP_TOP
3157 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00003158 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003159 ****************************************************************/
3160
3161 anchor = 0;
3162
3163 for (i = 2; i < NCH(n); i += 2) {
3164 com_expr(c, CHILD(n, i));
3165 if (i+2 < NCH(n)) {
3166 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003167 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003168 com_addbyte(c, ROT_THREE);
3169 }
3170 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003171 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003172 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003173 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003174 }
3175 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003176 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003177 if (i+2 < NCH(n)) {
3178 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3179 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003180 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003181 }
3182 }
3183
3184 if (anchor) {
3185 int anchor2 = 0;
3186 com_addfwref(c, JUMP_FORWARD, &anchor2);
3187 com_backpatch(c, anchor);
3188 com_addbyte(c, ROT_TWO);
3189 com_addbyte(c, POP_TOP);
3190 com_backpatch(c, anchor2);
3191 }
3192}
3193
3194static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003195com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003196{
3197 REQ(n, not_test); /* 'not' not_test | comparison */
3198 if (NCH(n) == 1) {
3199 com_comparison(c, CHILD(n, 0));
3200 }
3201 else {
3202 com_not_test(c, CHILD(n, 1));
3203 com_addbyte(c, UNARY_NOT);
3204 }
3205}
3206
3207static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003208com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003209{
3210 int i;
3211 int anchor;
3212 REQ(n, and_test); /* not_test ('and' not_test)* */
3213 anchor = 0;
3214 i = 0;
3215 for (;;) {
3216 com_not_test(c, CHILD(n, i));
3217 if ((i += 2) >= NCH(n))
3218 break;
3219 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3220 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003221 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003222 }
3223 if (anchor)
3224 com_backpatch(c, anchor);
3225}
3226
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003227static int
3228com_make_closure(struct compiling *c, PyCodeObject *co)
3229{
Jeremy Hylton733c8932001-12-13 19:51:56 +00003230 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003231 if (free == 0)
3232 return 0;
3233 for (i = 0; i < free; ++i) {
3234 /* Bypass com_addop_varname because it will generate
3235 LOAD_DEREF but LOAD_CLOSURE is needed.
3236 */
3237 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
3238 int arg, reftype;
3239
3240 /* Special case: If a class contains a method with a
3241 free variable that has the same name as a method,
3242 the name will be considered free *and* local in the
3243 class. It should be handled by the closure, as
3244 well as by the normal name loookup logic.
3245 */
3246 reftype = get_ref_type(c, PyString_AS_STRING(name));
3247 if (reftype == CELL)
3248 arg = com_lookup_arg(c->c_cellvars, name);
3249 else /* (reftype == FREE) */
3250 arg = com_lookup_arg(c->c_freevars, name);
3251 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00003252 fprintf(stderr, "lookup %s in %s %d %d\n"
3253 "freevars of %s: %s\n",
3254 PyObject_REPR(name),
3255 c->c_name,
3256 reftype, arg,
3257 PyString_AS_STRING(co->co_name),
3258 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003259 Py_FatalError("com_make_closure()");
3260 }
3261 com_addoparg(c, LOAD_CLOSURE, arg);
3262
3263 }
3264 com_push(c, free);
3265 return 1;
3266}
3267
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003268static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003269com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003270{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003271 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00003272 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003273 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003274 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003275 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003276 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
3277 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003278 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003279 if (co == NULL) {
3280 c->c_errors++;
3281 return;
3282 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003283 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003284 i = com_addconst(c, (PyObject *)co);
3285 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00003286 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003287 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003288 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003289 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003290 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003291 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003292 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003293 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003294 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003295 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00003296 else {
3297 int anchor = 0;
3298 int i = 0;
3299 for (;;) {
3300 com_and_test(c, CHILD(n, i));
3301 if ((i += 2) >= NCH(n))
3302 break;
3303 com_addfwref(c, JUMP_IF_TRUE, &anchor);
3304 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003305 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00003306 }
3307 if (anchor)
3308 com_backpatch(c, anchor);
3309 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003310}
3311
3312static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003313com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003314{
3315 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00003316 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003317 com_node(c, CHILD(n, 0));
3318 }
3319 else {
3320 int i;
3321 int len;
3322 len = (NCH(n) + 1) / 2;
3323 for (i = 0; i < NCH(n); i += 2)
3324 com_node(c, CHILD(n, i));
3325 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003326 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003327 }
3328}
3329
3330
3331/* Begin of assignment compilation */
3332
Thomas Wouters434d0822000-08-24 20:11:32 +00003333
3334static void
3335com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
3336{
3337 com_addbyte(c, DUP_TOP);
3338 com_push(c, 1);
3339 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00003340 com_node(c, augn);
3341 com_addbyte(c, opcode);
3342 com_pop(c, 1);
3343 com_addbyte(c, ROT_TWO);
3344 com_addopname(c, STORE_ATTR, n);
3345 com_pop(c, 2);
3346}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003347
3348static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003349com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003350{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00003351 if (none_assignment_check(c, STR(n), assigning))
3352 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003353 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003354 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003355}
3356
3357static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003358com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003359{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003360 REQ(n, trailer);
3361 switch (TYPE(CHILD(n, 0))) {
3362 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00003363 if (assigning == OP_DELETE)
3364 com_error(c, PyExc_SyntaxError,
3365 "can't delete function call");
3366 else
3367 com_error(c, PyExc_SyntaxError,
3368 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003369 break;
3370 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00003371 if (assigning > OP_APPLY)
3372 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
3373 else
3374 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003375 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00003376 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00003377 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003378 break;
3379 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003380 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003381 }
3382}
3383
3384static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003385com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003386{
3387 int i;
Raymond Hettinger354433a2004-05-19 08:20:33 +00003388 if (TYPE(n) != testlist && TYPE(n) != testlist_gexp &&
3389 TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003390 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003391 if (assigning) {
3392 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003393 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003394 com_push(c, i-1);
3395 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003396 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00003397 com_assign(c, CHILD(n, i), assigning, NULL);
3398}
3399
3400static void
3401com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
3402{
3403 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003404 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00003405 com_push(c, 1);
3406 com_node(c, augn);
3407 com_addbyte(c, opcode);
3408 com_pop(c, 1);
3409 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003410}
3411
3412static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003413com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003414{
3415 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003416 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003417 if (assigning)
3418 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003419}
3420
3421static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003422com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003423{
3424 /* Loop to avoid trivial recursion */
3425 for (;;) {
3426 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003427
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003428 case exprlist:
3429 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003430 case testlist1:
Raymond Hettinger354433a2004-05-19 08:20:33 +00003431 case testlist_gexp:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003432 if (NCH(n) > 1) {
Raymond Hettinger354433a2004-05-19 08:20:33 +00003433 if (TYPE(CHILD(n, 1)) == gen_for) {
Raymond Hettinger8ffc1412004-09-29 21:47:10 +00003434 com_error(c, PyExc_SyntaxError,
Raymond Hettinger354433a2004-05-19 08:20:33 +00003435 "assign to generator expression not possible");
3436 return;
3437 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003438 if (assigning > OP_APPLY) {
3439 com_error(c, PyExc_SyntaxError,
Raymond Hettinger8ffc1412004-09-29 21:47:10 +00003440 "augmented assign to generator expression not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003441 return;
3442 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003443 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003444 return;
3445 }
3446 n = CHILD(n, 0);
3447 break;
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00003448 case yield_expr:
3449 com_error(c, PyExc_SyntaxError,
3450 "assignment to yield expression not possible");
3451 return;
3452
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003453 case test:
3454 case and_test:
3455 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003456 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003457 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00003458 case xor_expr:
3459 case and_expr:
3460 case shift_expr:
3461 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003462 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00003463 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003464 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003465 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003466 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003467 return;
3468 }
3469 n = CHILD(n, 0);
3470 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003471
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003472 case power: /* atom trailer* ('**' power)*
3473 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00003474 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003475 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003476 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003477 return;
3478 }
Guido van Rossum50564e81996-01-12 01:13:16 +00003479 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003480 int i;
3481 com_node(c, CHILD(n, 0));
3482 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003483 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003484 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003485 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00003486 return;
3487 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003488 com_apply_trailer(c, CHILD(n, i));
3489 } /* NB i is still alive */
3490 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00003491 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003492 return;
3493 }
3494 n = CHILD(n, 0);
3495 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003496
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003497 case atom:
3498 switch (TYPE(CHILD(n, 0))) {
3499 case LPAR:
3500 n = CHILD(n, 1);
3501 if (TYPE(n) == RPAR) {
3502 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003503 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003504 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003505 return;
3506 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003507 if (assigning > OP_APPLY) {
3508 com_error(c, PyExc_SyntaxError,
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00003509 "augmented assign to tuple literal, yield, or generator expression not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003510 return;
3511 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003512 break;
3513 case LSQB:
3514 n = CHILD(n, 1);
3515 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003516 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003517 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003518 return;
3519 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003520 if (assigning > OP_APPLY) {
3521 com_error(c, PyExc_SyntaxError,
Raymond Hettingerfec0c462004-09-29 23:54:08 +00003522 "augmented assign to list literal or comprehension not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003523 return;
3524 }
3525 if (NCH(n) > 1
3526 && TYPE(CHILD(n, 1)) == list_for) {
3527 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003528 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00003529 return;
3530 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003531 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003532 return;
3533 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00003534 if (assigning > OP_APPLY)
3535 com_augassign_name(c, CHILD(n, 0),
3536 assigning, augn);
3537 else
3538 com_assign_name(c, CHILD(n, 0),
3539 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003540 return;
3541 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003542 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003543 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003544 return;
3545 }
3546 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003547
3548 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003549 com_error(c, PyExc_SyntaxError,
3550 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003551 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003552
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003553 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003554 com_error(c, PyExc_SystemError,
3555 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003556 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003557
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003558 }
3559 }
3560}
Guido van Rossum7c531111997-03-11 18:42:21 +00003561
Thomas Wouters434d0822000-08-24 20:11:32 +00003562static void
3563com_augassign(struct compiling *c, node *n)
3564{
3565 int opcode;
3566
3567 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
3568 case '+': opcode = INPLACE_ADD; break;
3569 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00003570 case '/':
3571 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
3572 opcode = INPLACE_FLOOR_DIVIDE;
3573 else if (c->c_flags & CO_FUTURE_DIVISION)
3574 opcode = INPLACE_TRUE_DIVIDE;
3575 else
3576 opcode = INPLACE_DIVIDE;
3577 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00003578 case '%': opcode = INPLACE_MODULO; break;
3579 case '<': opcode = INPLACE_LSHIFT; break;
3580 case '>': opcode = INPLACE_RSHIFT; break;
3581 case '&': opcode = INPLACE_AND; break;
3582 case '^': opcode = INPLACE_XOR; break;
3583 case '|': opcode = INPLACE_OR; break;
3584 case '*':
3585 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
3586 opcode = INPLACE_POWER;
3587 else
3588 opcode = INPLACE_MULTIPLY;
3589 break;
3590 default:
3591 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
3592 return;
3593 }
3594 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
3595}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003596
3597static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003598com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003599{
Thomas Wouters434d0822000-08-24 20:11:32 +00003600 REQ(n, expr_stmt);
3601 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003602 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00003603 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003604 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00003605 if (NCH(n) == 1) {
3606 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003607 if (c->c_interactive)
3608 com_addbyte(c, PRINT_EXPR);
3609 else
3610 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003611 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003612 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003613 else if (TYPE(CHILD(n,1)) == augassign)
3614 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003615 else {
3616 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00003617 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003618 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003619 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003620 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003621 com_push(c, 1);
3622 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003623 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003624 }
3625 }
3626}
3627
3628static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003629com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00003630{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003631 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003632 int i;
3633 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003634 if (Py_OptimizeFlag)
3635 return;
3636 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00003637
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003638 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00003639 raise AssertionError [, <message>]
3640
3641 where <message> is the second test, if present.
3642 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003643 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003644 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003645 com_addbyte(c, POP_TOP);
3646 com_pop(c, 1);
3647 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003648 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00003649 com_push(c, 1);
3650 i = NCH(n)/2; /* Either 2 or 4 */
3651 if (i > 1)
3652 com_node(c, CHILD(n, 3));
3653 com_addoparg(c, RAISE_VARARGS, i);
3654 com_pop(c, i);
3655 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003656 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003657 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003658 com_addbyte(c, POP_TOP);
3659}
3660
3661static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003662com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003663{
Barry Warsaw29c574e2000-08-21 15:38:56 +00003664 int i = 1;
3665 node* stream = NULL;
3666
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003667 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003668
3669 /* are we using the extended print form? */
3670 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
3671 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00003672 com_node(c, stream);
3673 /* stack: [...] => [... stream] */
3674 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003675 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3676 i = 4;
3677 else
3678 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003679 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003680 for (; i < NCH(n); i += 2) {
3681 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003682 com_addbyte(c, DUP_TOP);
3683 /* stack: [stream] => [stream stream] */
3684 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003685 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003686 /* stack: [stream stream] => [stream stream obj] */
3687 com_addbyte(c, ROT_TWO);
3688 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003689 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003690 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003691 com_pop(c, 2);
3692 }
3693 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003694 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003695 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003696 com_addbyte(c, PRINT_ITEM);
3697 com_pop(c, 1);
3698 }
3699 }
3700 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003701 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003702 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003703 /* must pop the extra stream object off the stack */
3704 com_addbyte(c, POP_TOP);
3705 /* stack: [... stream] => [...] */
3706 com_pop(c, 1);
3707 }
3708 }
3709 else {
3710 if (stream != NULL) {
3711 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003712 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003713 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003714 com_pop(c, 1);
3715 }
3716 else
3717 com_addbyte(c, PRINT_NEWLINE);
3718 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003719}
3720
3721static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003722com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003723{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003724 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003725 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003726 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003727 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003728 if (c->c_flags & CO_GENERATOR) {
3729 if (NCH(n) > 1) {
3730 com_error(c, PyExc_SyntaxError,
3731 "'return' with argument inside generator");
3732 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003733 }
3734 if (NCH(n) < 2) {
3735 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003736 com_push(c, 1);
3737 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003738 else
3739 com_node(c, CHILD(n, 1));
3740 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003741 com_pop(c, 1);
3742}
3743
3744static void
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00003745com_yield_expr(struct compiling *c, node *n)
Tim Peters5ca576e2001-06-18 22:08:13 +00003746{
Tim Peters95c80f82001-06-23 02:07:08 +00003747 int i;
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00003748 REQ(n, yield_expr); /* 'yield' testlist */
Tim Peters5ca576e2001-06-18 22:08:13 +00003749 if (!c->c_infunction) {
3750 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3751 }
Tim Peters95c80f82001-06-23 02:07:08 +00003752
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00003753 /* for (i = 0; i < c->c_nblocks; ++i) {
Tim Peters95c80f82001-06-23 02:07:08 +00003754 if (c->c_block[i] == SETUP_FINALLY) {
3755 com_error(c, PyExc_SyntaxError,
3756 "'yield' not allowed in a 'try' block "
3757 "with a 'finally' clause");
3758 return;
3759 }
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00003760 } */
3761
3762 if (NCH(n) < 2) {
3763 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
3764 com_push(c, 1);
Tim Peters95c80f82001-06-23 02:07:08 +00003765 }
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00003766 else
3767 com_node(c, CHILD(n, 1));
Tim Peters5ca576e2001-06-18 22:08:13 +00003768 com_addbyte(c, YIELD_VALUE);
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00003769}
3770
3771static void
3772com_yield_stmt(struct compiling *c, node *n)
3773{
3774 REQ(n, yield_stmt); /* yield_expr */
3775 com_node(c, CHILD(n, 0));
3776 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003777 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003778}
3779
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00003780
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003781static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003782com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003783{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003784 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003785 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3786 if (NCH(n) > 1) {
3787 com_node(c, CHILD(n, 1));
3788 if (NCH(n) > 3) {
3789 com_node(c, CHILD(n, 3));
3790 if (NCH(n) > 5)
3791 com_node(c, CHILD(n, 5));
3792 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003793 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003794 i = NCH(n)/2;
3795 com_addoparg(c, RAISE_VARARGS, i);
3796 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003797}
3798
3799static void
Thomas Wouters52152252000-08-17 22:55:00 +00003800com_from_import(struct compiling *c, node *n)
3801{
3802 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3803 com_push(c, 1);
3804 if (NCH(n) > 1) {
3805 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3806 com_error(c, PyExc_SyntaxError, "invalid syntax");
3807 return;
3808 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003809 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003810 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003811 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003812 com_pop(c, 1);
3813}
3814
3815static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003816com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003817{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003818 node *nn;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003819 int i;
3820 REQ(n, import_stmt);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003821 n = CHILD(n, 0);
3822 /* import_stmt: import_name | import_from */
3823 if (TYPE(n) == import_from) {
3824 /* 'from' dotted_name 'import' ('*' |
3825 '(' import_as_names ')' | import_as_names) */
Guido van Rossum83fb0732000-11-27 22:22:36 +00003826 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003827 REQ(CHILD(n, 1), dotted_name);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003828 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
3829 if (TYPE(nn) == STAR)
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003830 tup = Py_BuildValue("(s)", "*");
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003831 else {
3832 if (TYPE(CHILD(nn, NCH(nn) - 1)) == COMMA &&
3833 TYPE(CHILD(n, 3)) != LPAR) {
3834 com_error(c, PyExc_SyntaxError,
3835 "trailing comma not allowed "
3836 "without surrounding parentheses");
3837 return;
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003838 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003839 REQ(nn, import_as_names);
3840 tup = PyTuple_New((NCH(nn) + 1) / 2);
Jeremy Hylton16b04792004-11-07 14:04:00 +00003841 for (i = 0; i < NCH(nn); i += 2) {
3842 PyObject *s = PyString_FromString(
3843 STR(CHILD(CHILD(nn, i), 0)));
3844 if (s == NULL) {
3845 Py_CLEAR(tup);
3846 break;
3847 } else
3848 PyTuple_SET_ITEM(tup, i / 2, s);
3849 }
3850 if (tup == NULL) {
3851 /* Assume that failue above was MemoryError */
3852 com_error(c, PyExc_MemoryError, "");
3853 return;
3854 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003855 }
3856 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003857 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003858 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003859 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003860 if (TYPE(nn) == STAR)
Thomas Wouters52152252000-08-17 22:55:00 +00003861 com_addbyte(c, IMPORT_STAR);
3862 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003863 for (i = 0; i < NCH(nn); i += 2)
3864 com_from_import(c, CHILD(nn, i));
Thomas Wouters52152252000-08-17 22:55:00 +00003865 com_addbyte(c, POP_TOP);
3866 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003867 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003868 }
3869 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003870 /* 'import' dotted_as_names */
3871 nn = CHILD(n, 1);
3872 REQ(nn, dotted_as_names);
3873 for (i = 0; i < NCH(nn); i += 2) {
3874 node *subn = CHILD(nn, i);
Thomas Wouters52152252000-08-17 22:55:00 +00003875 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003876 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003877 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003878 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003879 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003880 int j;
3881 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003882 com_error(c, PyExc_SyntaxError,
3883 "invalid syntax");
3884 return;
3885 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003886 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3887 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003888 CHILD(CHILD(subn, 0),
3889 j));
3890 com_addop_varname(c, VAR_STORE,
3891 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003892 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003893 com_addop_varname(c, VAR_STORE,
3894 STR(CHILD(CHILD(subn, 0),
3895 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003896 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003897 }
3898 }
3899}
3900
3901static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003902com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003903{
3904 REQ(n, exec_stmt);
3905 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3906 com_node(c, CHILD(n, 1));
3907 if (NCH(n) >= 4)
3908 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003909 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003910 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003911 com_push(c, 1);
3912 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003913 if (NCH(n) >= 6)
3914 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003915 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003916 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003917 com_push(c, 1);
3918 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003919 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003920 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003921}
3922
Guido van Rossum7c531111997-03-11 18:42:21 +00003923static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003924is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003925{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003926 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003927 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003928 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003929
3930 /* Label to avoid tail recursion */
3931 next:
3932 switch (TYPE(n)) {
3933
3934 case suite:
3935 if (NCH(n) == 1) {
3936 n = CHILD(n, 0);
3937 goto next;
3938 }
3939 /* Fall through */
3940 case file_input:
3941 for (i = 0; i < NCH(n); i++) {
3942 node *ch = CHILD(n, i);
3943 if (TYPE(ch) == stmt) {
3944 n = ch;
3945 goto next;
3946 }
3947 }
3948 break;
3949
3950 case stmt:
3951 case simple_stmt:
3952 case small_stmt:
3953 n = CHILD(n, 0);
3954 goto next;
3955
3956 case expr_stmt:
3957 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003958 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003959 case test:
3960 case and_test:
3961 case not_test:
3962 case comparison:
3963 case expr:
3964 case xor_expr:
3965 case and_expr:
3966 case shift_expr:
3967 case arith_expr:
3968 case term:
3969 case factor:
3970 case power:
3971 case atom:
3972 if (NCH(n) == 1) {
3973 n = CHILD(n, 0);
3974 goto next;
3975 }
3976 break;
3977
3978 case NAME:
3979 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3980 return 1;
3981 break;
3982
3983 case NUMBER:
3984 v = parsenumber(c, STR(n));
3985 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003986 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003987 break;
3988 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003989 i = PyObject_IsTrue(v);
3990 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003991 return i == 0;
3992
3993 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003994 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003995 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003996 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003997 break;
3998 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003999 i = PyObject_IsTrue(v);
4000 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00004001 return i == 0;
4002
4003 }
4004 return 0;
4005}
4006
Tim Peters08a898f2001-06-28 01:52:22 +00004007
4008/* Look under n for a return stmt with an expression.
4009 * This hack is used to find illegal returns under "if 0:" blocks in
4010 * functions already known to be generators (as determined by the symtable
4011 * pass).
4012 * Return the offending return node if found, else NULL.
4013 */
4014static node *
4015look_for_offending_return(node *n)
4016{
4017 int i;
4018
4019 for (i = 0; i < NCH(n); ++i) {
4020 node *kid = CHILD(n, i);
4021
4022 switch (TYPE(kid)) {
4023 case classdef:
4024 case funcdef:
4025 case lambdef:
4026 /* Stuff in nested functions & classes doesn't
4027 affect the code block we started in. */
4028 return NULL;
4029
4030 case return_stmt:
4031 if (NCH(kid) > 1)
4032 return kid;
4033 break;
4034
4035 default: {
4036 node *bad = look_for_offending_return(kid);
4037 if (bad != NULL)
4038 return bad;
4039 }
4040 }
4041 }
4042
4043 return NULL;
4044}
4045
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004046static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004047com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004048{
4049 int i;
4050 int anchor = 0;
4051 REQ(n, if_stmt);
4052 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
4053 for (i = 0; i+3 < NCH(n); i+=4) {
4054 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004055 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00004056 if (is_constant_false(c, ch)) {
4057 /* We're going to skip this block. However, if this
4058 is a generator, we have to check the dead code
4059 anyway to make sure there aren't any return stmts
4060 with expressions, in the same scope. */
4061 if (c->c_flags & CO_GENERATOR) {
4062 node *p = look_for_offending_return(n);
4063 if (p != NULL) {
4064 int savelineno = c->c_lineno;
4065 c->c_lineno = p->n_lineno;
4066 com_error(c, PyExc_SyntaxError,
4067 "'return' with argument "
4068 "inside generator");
4069 c->c_lineno = savelineno;
4070 }
4071 }
Guido van Rossum7c531111997-03-11 18:42:21 +00004072 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00004073 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00004074 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004075 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00004076 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004077 com_addfwref(c, JUMP_IF_FALSE, &a);
4078 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004079 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004080 com_node(c, CHILD(n, i+3));
4081 com_addfwref(c, JUMP_FORWARD, &anchor);
4082 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004083 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004084 com_addbyte(c, POP_TOP);
4085 }
4086 if (i+2 < NCH(n))
4087 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00004088 if (anchor)
4089 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004090}
4091
4092static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004093com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004094{
4095 int break_anchor = 0;
4096 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004097 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004098 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
4099 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004100 block_push(c, SETUP_LOOP);
4101 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004102 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004103 com_node(c, CHILD(n, 1));
4104 com_addfwref(c, JUMP_IF_FALSE, &anchor);
4105 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004106 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004107 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004108 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004109 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004110 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4111 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004112 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004113 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004114 com_addbyte(c, POP_TOP);
4115 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004116 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004117 if (NCH(n) > 4)
4118 com_node(c, CHILD(n, 6));
4119 com_backpatch(c, break_anchor);
4120}
4121
4122static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004123com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004124{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004125 int break_anchor = 0;
4126 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004127 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004128 REQ(n, for_stmt);
4129 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
4130 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004131 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004132 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004133 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004134 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00004135 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004136 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004137 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00004138 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004139 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004140 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004141 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004142 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4143 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004144 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004145 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004146 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004147 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004148 if (NCH(n) > 8)
4149 com_node(c, CHILD(n, 8));
4150 com_backpatch(c, break_anchor);
4151}
4152
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004153/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004154
4155 SETUP_FINALLY L
4156 <code for S>
4157 POP_BLOCK
4158 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004159 L: <code for Sf>
4160 END_FINALLY
4161
4162 The special instructions use the block stack. Each block
4163 stack entry contains the instruction that created it (here
4164 SETUP_FINALLY), the level of the value stack at the time the
4165 block stack entry was created, and a label (here L).
4166
4167 SETUP_FINALLY:
4168 Pushes the current value stack level and the label
4169 onto the block stack.
4170 POP_BLOCK:
4171 Pops en entry from the block stack, and pops the value
4172 stack until its level is the same as indicated on the
4173 block stack. (The label is ignored.)
4174 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004175 Pops a variable number of entries from the *value* stack
4176 and re-raises the exception they specify. The number of
4177 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004178
4179 The block stack is unwound when an exception is raised:
4180 when a SETUP_FINALLY entry is found, the exception is pushed
4181 onto the value stack (and the exception condition is cleared),
4182 and the interpreter jumps to the label gotten from the block
4183 stack.
4184
4185 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00004186 (The contents of the value stack is shown in [], with the top
4187 at the right; 'tb' is trace-back info, 'val' the exception's
4188 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004189
4190 Value stack Label Instruction Argument
4191 [] SETUP_EXCEPT L1
4192 [] <code for S>
4193 [] POP_BLOCK
4194 [] JUMP_FORWARD L0
4195
Guido van Rossum3f5da241990-12-20 15:06:42 +00004196 [tb, val, exc] L1: DUP )
4197 [tb, val, exc, exc] <evaluate E1> )
4198 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
4199 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
4200 [tb, val, exc, 1] POP )
4201 [tb, val, exc] POP
4202 [tb, val] <assign to V1> (or POP if no V1)
4203 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004204 [] <code for S1>
4205 JUMP_FORWARD L0
4206
Guido van Rossum3f5da241990-12-20 15:06:42 +00004207 [tb, val, exc, 0] L2: POP
4208 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004209 .............................etc.......................
4210
Guido van Rossum3f5da241990-12-20 15:06:42 +00004211 [tb, val, exc, 0] Ln+1: POP
4212 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004213
4214 [] L0: <next statement>
4215
4216 Of course, parts are not generated if Vi or Ei is not present.
4217*/
4218
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004219static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004220com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004221{
4222 int except_anchor = 0;
4223 int end_anchor = 0;
4224 int else_anchor = 0;
4225 int i;
4226 node *ch;
4227
4228 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
4229 block_push(c, SETUP_EXCEPT);
4230 com_node(c, CHILD(n, 2));
4231 com_addbyte(c, POP_BLOCK);
4232 block_pop(c, SETUP_EXCEPT);
4233 com_addfwref(c, JUMP_FORWARD, &else_anchor);
4234 com_backpatch(c, except_anchor);
4235 for (i = 3;
4236 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
4237 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004238 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004239 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004240 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004241 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004242 break;
4243 }
4244 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004245 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004246 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004247 if (NCH(ch) > 1) {
4248 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004249 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004250 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00004251 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004252 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004253 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
4254 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004255 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004256 }
4257 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004258 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004259 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00004260 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004261 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004262 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004263 com_pop(c, 1);
4264 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004265 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004266 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004267 com_node(c, CHILD(n, i+2));
4268 com_addfwref(c, JUMP_FORWARD, &end_anchor);
4269 if (except_anchor) {
4270 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004271 /* We come in with [tb, val, exc, 0] on the
4272 stack; one pop and it's the same as
4273 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004274 com_addbyte(c, POP_TOP);
4275 }
4276 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004277 /* We actually come in here with [tb, val, exc] but the
4278 END_FINALLY will zap those and jump around.
4279 The c_stacklevel does not reflect them so we need not pop
4280 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004281 com_addbyte(c, END_FINALLY);
4282 com_backpatch(c, else_anchor);
4283 if (i < NCH(n))
4284 com_node(c, CHILD(n, i+2));
4285 com_backpatch(c, end_anchor);
4286}
4287
4288static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004289com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004290{
4291 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004292 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00004293
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004294 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
4295 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004296 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004297 com_addbyte(c, POP_BLOCK);
4298 block_pop(c, SETUP_FINALLY);
4299 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004300 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004301 /* While the generated code pushes only one item,
4302 the try-finally handling can enter here with
4303 up to three items. OK, here are the details:
4304 3 for an exception, 2 for RETURN, 1 for BREAK. */
4305 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004306 com_backpatch(c, finally_anchor);
4307 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004308 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004309 com_node(c, ch);
4310 com_addbyte(c, END_FINALLY);
4311 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004312 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004313}
4314
4315static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004316com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004317{
4318 REQ(n, try_stmt);
4319 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
4320 | 'try' ':' suite 'finally' ':' suite */
4321 if (TYPE(CHILD(n, 3)) != except_clause)
4322 com_try_finally(c, n);
4323 else
4324 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004325}
4326
Guido van Rossum8b993a91997-01-17 21:04:03 +00004327static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004328get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004329{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004330 int i;
4331
Guido van Rossum8b993a91997-01-17 21:04:03 +00004332 /* Label to avoid tail recursion */
4333 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004334 switch (TYPE(n)) {
4335
4336 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004337 if (NCH(n) == 1) {
4338 n = CHILD(n, 0);
4339 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004340 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004341 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004342 case file_input:
4343 for (i = 0; i < NCH(n); i++) {
4344 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004345 if (TYPE(ch) == stmt) {
4346 n = ch;
4347 goto next;
4348 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004349 }
4350 break;
4351
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004352 case stmt:
4353 case simple_stmt:
4354 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004355 n = CHILD(n, 0);
4356 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004357
4358 case expr_stmt:
4359 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004360 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004361 case test:
4362 case and_test:
4363 case not_test:
4364 case comparison:
4365 case expr:
4366 case xor_expr:
4367 case and_expr:
4368 case shift_expr:
4369 case arith_expr:
4370 case term:
4371 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00004372 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004373 if (NCH(n) == 1) {
4374 n = CHILD(n, 0);
4375 goto next;
4376 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004377 break;
4378
4379 case atom:
4380 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004381 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004382 break;
4383
4384 }
4385 return NULL;
4386}
4387
Guido van Rossum79f25d91997-04-29 20:08:16 +00004388static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004389get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004390{
Guido van Rossum541563e1999-01-28 15:08:09 +00004391 /* Don't generate doc-strings if run with -OO */
4392 if (Py_OptimizeFlag > 1)
4393 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004394 n = get_rawdocstring(n);
4395 if (n == NULL)
4396 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004397 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004398}
4399
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004400static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004401com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004402{
4403 REQ(n, suite);
4404 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
4405 if (NCH(n) == 1) {
4406 com_node(c, CHILD(n, 0));
4407 }
4408 else {
4409 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004410 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004411 node *ch = CHILD(n, i);
4412 if (TYPE(ch) == stmt)
4413 com_node(c, ch);
4414 }
4415 }
4416}
4417
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004418/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004419static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004420com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004421{
4422 int i = c->c_nblocks;
4423 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
4424 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4425 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004426 else if (i <= 0) {
4427 /* at the outer level */
4428 com_error(c, PyExc_SyntaxError,
4429 "'continue' not properly in loop");
4430 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004431 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004432 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004433 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004434 if (c->c_block[j] == SETUP_LOOP)
4435 break;
4436 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004437 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004438 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004439 for (; i > j; --i) {
4440 if (c->c_block[i] == SETUP_EXCEPT ||
4441 c->c_block[i] == SETUP_FINALLY) {
4442 com_addoparg(c, CONTINUE_LOOP,
4443 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00004444 return;
4445 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004446 if (c->c_block[i] == END_FINALLY) {
4447 com_error(c, PyExc_SyntaxError,
4448 "'continue' not supported inside 'finally' clause");
4449 return;
4450 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004451 }
4452 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00004453 com_error(c, PyExc_SyntaxError,
4454 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004455 }
4456 /* XXX Could allow it inside a 'finally' clause
4457 XXX if we could pop the exception still on the stack */
4458}
4459
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004460/* Return the number of default values in the argument list.
4461
4462 If a non-default argument follows a default argument, set an
4463 exception and return -1.
4464*/
4465
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004466static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004467com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004468{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004469 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004470 if (TYPE(n) == lambdef) {
4471 /* lambdef: 'lambda' [varargslist] ':' test */
4472 n = CHILD(n, 1);
4473 }
4474 else {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004475 REQ(n, funcdef);
4476 /* funcdef: [decorators] 'def' NAME parameters ':' suite */
4477 n = RCHILD(n, -3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004478 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
4479 n = CHILD(n, 1);
4480 }
4481 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004482 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004483 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004484 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004485 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
4486 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004487 ndefs = 0;
4488 for (i = 0; i < nch; i++) {
4489 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004490 if (TYPE(CHILD(n, i)) == STAR ||
4491 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00004492 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004493 i++;
4494 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00004495 t = RPAR; /* Anything except EQUAL or COMMA */
4496 else
4497 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004498 if (t == EQUAL) {
4499 i++;
4500 ndefs++;
4501 com_node(c, CHILD(n, i));
4502 i++;
4503 if (i >= nch)
4504 break;
4505 t = TYPE(CHILD(n, i));
4506 }
4507 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004508 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004509 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004510 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00004511 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004512 return -1;
4513 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004514 }
4515 if (t != COMMA)
4516 break;
4517 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004518 return ndefs;
4519}
4520
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004521static void
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004522com_decorator_name(struct compiling *c, node *n)
4523{
4524 /* dotted_name: NAME ('.' NAME)* */
4525
4526 int i, nch;
4527 node *varname;
4528
4529 REQ(n, dotted_name);
4530 nch = NCH(n);
4531 assert(nch >= 1 && nch % 2 == 1);
4532
4533 varname = CHILD(n, 0);
4534 REQ(varname, NAME);
4535 com_addop_varname(c, VAR_LOAD, STR(varname));
Anthony Baxter4e7785a2004-08-02 11:08:15 +00004536 com_push(c, 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004537
4538 for (i = 1; i < nch; i += 2) {
4539 node *attrname;
4540
4541 REQ(CHILD(n, i), DOT);
4542
4543 attrname = CHILD(n, i + 1);
4544 REQ(attrname, NAME);
4545 com_addop_name(c, LOAD_ATTR, STR(attrname));
4546 }
4547}
4548
4549static void
4550com_decorator(struct compiling *c, node *n)
4551{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004552 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004553 int nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004554 assert(nch >= 3);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004555 REQ(CHILD(n, 0), AT);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004556 REQ(RCHILD(n, -1), NEWLINE);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004557 com_decorator_name(c, CHILD(n, 1));
4558
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004559 if (nch > 3) {
4560 assert(nch == 5 || nch == 6);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004561 REQ(CHILD(n, 2), LPAR);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004562 REQ(RCHILD(n, -2), RPAR);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004563 com_call_function(c, CHILD(n, 3));
4564 }
4565}
4566
4567static int
4568com_decorators(struct compiling *c, node *n)
4569{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004570 int i, nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004571
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004572 /* decorator+ */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004573 nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004574 assert(nch >= 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004575
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004576 for (i = 0; i < nch; ++i) {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004577 node *ch = CHILD(n, i);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004578 REQ(ch, decorator);
4579
4580 com_decorator(c, ch);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004581 }
4582
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004583 return nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004584}
4585
4586static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004587com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004588{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004589 PyObject *co;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004590 int ndefs, ndecorators;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004591
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004592 REQ(n, funcdef);
4593 /* -6 -5 -4 -3 -2 -1
4594 funcdef: [decorators] 'def' NAME parameters ':' suite */
4595
4596 if (NCH(n) == 6)
4597 ndecorators = com_decorators(c, CHILD(n, 0));
4598 else
4599 ndecorators = 0;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004600
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004601 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004602 if (ndefs < 0)
4603 return;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004604 symtable_enter_scope(c->c_symtable, STR(RCHILD(n, -4)), TYPE(n),
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004605 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004606 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004607 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004608 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004609 c->c_errors++;
4610 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004611 int closure = com_make_closure(c, (PyCodeObject *)co);
4612 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004613 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004614 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004615 if (closure)
4616 com_addoparg(c, MAKE_CLOSURE, ndefs);
4617 else
4618 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004619 com_pop(c, ndefs);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004620
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004621 while (ndecorators > 0) {
4622 com_addoparg(c, CALL_FUNCTION, 1);
4623 com_pop(c, 1);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004624 --ndecorators;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004625 }
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004626
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004627 com_addop_varname(c, VAR_STORE, STR(RCHILD(n, -4)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004628 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004629 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004630 }
4631}
4632
4633static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004634com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004635{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004636 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004637 REQ(n, testlist);
4638 /* testlist: test (',' test)* [','] */
4639 for (i = 0; i < NCH(n); i += 2)
4640 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004641 i = (NCH(n)+1) / 2;
4642 com_addoparg(c, BUILD_TUPLE, i);
4643 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004644}
4645
4646static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004647com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004648{
Guido van Rossum25831651993-05-19 14:50:45 +00004649 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004650 PyObject *v;
4651 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004652 char *name;
4653
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004654 REQ(n, classdef);
Brett Cannon409d8f22005-03-05 06:47:57 +00004655 /* classdef: class NAME ['(' [testlist] ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004656 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004657 c->c_errors++;
4658 return;
4659 }
4660 /* Push the class name on the stack */
4661 i = com_addconst(c, v);
4662 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004663 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004664 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004665 /* Push the tuple of base classes on the stack */
Brett Cannon409d8f22005-03-05 06:47:57 +00004666 if (TYPE(CHILD(n, 2)) != LPAR ||
4667 TYPE(CHILD(n, 3)) == RPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004668 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004669 com_push(c, 1);
4670 }
Guido van Rossum25831651993-05-19 14:50:45 +00004671 else
4672 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004673 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004674 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004675 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004676 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004677 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004678 c->c_errors++;
4679 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004680 int closure = com_make_closure(c, co);
4681 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004682 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004683 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004684 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004685 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004686 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004687 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004688 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004689 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004690 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004691 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004692 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004693 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004694 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004695 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004696}
4697
4698static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004699com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004700{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004701 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004702 if (c->c_errors)
4703 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004704 switch (TYPE(n)) {
4705
4706 /* Definition nodes */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004707
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004708 case funcdef:
4709 com_funcdef(c, n);
4710 break;
4711 case classdef:
4712 com_classdef(c, n);
4713 break;
4714
4715 /* Trivial parse tree nodes */
4716
4717 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004718 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004719 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004720 n = CHILD(n, 0);
4721 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004722
4723 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004724 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004725 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004726 {
4727 int i;
4728 for (i = 0; i < NCH(n)-1; i += 2)
4729 com_node(c, CHILD(n, i));
4730 }
4731 break;
4732
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004733 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004734 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004735 n = CHILD(n, 0);
4736 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004737
4738 /* Statement nodes */
4739
4740 case expr_stmt:
4741 com_expr_stmt(c, n);
4742 break;
4743 case print_stmt:
4744 com_print_stmt(c, n);
4745 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004746 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004747 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004748 break;
4749 case pass_stmt:
4750 break;
4751 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004752 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004753 com_error(c, PyExc_SyntaxError,
4754 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004755 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004756 com_addbyte(c, BREAK_LOOP);
4757 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004758 case continue_stmt:
4759 com_continue_stmt(c, n);
4760 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004761 case return_stmt:
4762 com_return_stmt(c, n);
4763 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004764 case yield_stmt:
4765 com_yield_stmt(c, n);
4766 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004767 case raise_stmt:
4768 com_raise_stmt(c, n);
4769 break;
4770 case import_stmt:
4771 com_import_stmt(c, n);
4772 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004773 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004774 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004775 case exec_stmt:
4776 com_exec_stmt(c, n);
4777 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004778 case assert_stmt:
4779 com_assert_stmt(c, n);
4780 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004781 case if_stmt:
4782 com_if_stmt(c, n);
4783 break;
4784 case while_stmt:
4785 com_while_stmt(c, n);
4786 break;
4787 case for_stmt:
4788 com_for_stmt(c, n);
4789 break;
4790 case try_stmt:
4791 com_try_stmt(c, n);
4792 break;
4793 case suite:
4794 com_suite(c, n);
4795 break;
4796
4797 /* Expression nodes */
4798
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00004799 case yield_expr:
4800 com_yield_expr(c, n);
4801 break;
4802
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004803 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004804 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004805 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004806 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004807 break;
4808 case test:
4809 com_test(c, n);
4810 break;
4811 case and_test:
4812 com_and_test(c, n);
4813 break;
4814 case not_test:
4815 com_not_test(c, n);
4816 break;
4817 case comparison:
4818 com_comparison(c, n);
4819 break;
4820 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004821 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004822 break;
4823 case expr:
4824 com_expr(c, n);
4825 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004826 case xor_expr:
4827 com_xor_expr(c, n);
4828 break;
4829 case and_expr:
4830 com_and_expr(c, n);
4831 break;
4832 case shift_expr:
4833 com_shift_expr(c, n);
4834 break;
4835 case arith_expr:
4836 com_arith_expr(c, n);
4837 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004838 case term:
4839 com_term(c, n);
4840 break;
4841 case factor:
4842 com_factor(c, n);
4843 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004844 case power:
4845 com_power(c, n);
4846 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004847 case atom:
4848 com_atom(c, n);
4849 break;
4850
4851 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004852 com_error(c, PyExc_SystemError,
4853 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004854 }
4855}
4856
Tim Petersdbd9ba62000-07-09 03:09:57 +00004857static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004858
4859static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004860com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004861{
4862 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4863 if (TYPE(CHILD(n, 0)) == LPAR)
4864 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004865 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004866 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004867 com_pop(c, 1);
4868 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004869}
4870
4871static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004872com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004873{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004874 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004875 if (NCH(n) == 1) {
4876 com_fpdef(c, CHILD(n, 0));
4877 }
4878 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004879 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004880 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004881 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004882 for (i = 0; i < NCH(n); i += 2)
4883 com_fpdef(c, CHILD(n, i));
4884 }
4885}
4886
4887static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004888com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004889{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004890 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004891 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004892 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004893 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004894 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004895 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004896 nch = NCH(n);
4897 /* Enter all arguments in table of locals */
4898 for (i = 0, narg = 0; i < nch; i++) {
4899 node *ch = CHILD(n, i);
4900 node *fp;
4901 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004902 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004903 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4904 fp = CHILD(ch, 0);
4905 if (TYPE(fp) != NAME) {
4906 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4907 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004908 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004909 narg++;
4910 /* all name updates handled by symtable */
4911 if (++i >= nch)
4912 break;
4913 ch = CHILD(n, i);
4914 if (TYPE(ch) == EQUAL)
4915 i += 2;
4916 else
4917 REQ(ch, COMMA);
4918 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004919 if (complex) {
4920 /* Generate code for complex arguments only after
4921 having counted the simple arguments */
4922 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004923 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004924 node *ch = CHILD(n, i);
4925 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004926 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004927 break;
4928 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4929 fp = CHILD(ch, 0);
4930 if (TYPE(fp) != NAME) {
4931 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004932 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004933 com_fpdef(c, ch);
4934 }
4935 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004936 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004937 break;
4938 ch = CHILD(n, i);
4939 if (TYPE(ch) == EQUAL)
4940 i += 2;
4941 else
4942 REQ(ch, COMMA);
4943 }
4944 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004945}
4946
4947static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004948com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004949{
4950 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004951 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004952 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004953 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004954 if (doc != NULL) {
4955 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004956 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004957 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004958 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004959 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004960 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004961 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004962 for (i = 0; i < NCH(n); i++) {
4963 node *ch = CHILD(n, i);
4964 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4965 com_node(c, ch);
4966 }
4967}
4968
4969/* Top-level compile-node interface */
4970
4971static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004972compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004973{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004974 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004975 node *ch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004976 REQ(n, funcdef);
4977 /* -6 -5 -4 -3 -2 -1
4978 funcdef: [decorators] 'def' NAME parameters ':' suite */
4979 c->c_name = STR(RCHILD(n, -4));
4980 doc = get_docstring(c, RCHILD(n, -1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004981 if (doc != NULL) {
4982 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004983 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004984 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004985 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004986 (void) com_addconst(c, Py_None); /* No docstring */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004987 ch = RCHILD(n, -3); /* parameters: '(' [varargslist] ')' */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004988 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004989 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004990 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004991 c->c_infunction = 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004992 com_node(c, RCHILD(n, -1));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004993 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004994 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004995 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4996 com_push(c, 1);
4997 com_addbyte(c, RETURN_VALUE);
4998 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004999}
5000
5001static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005002compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00005003{
Guido van Rossum590baa41993-11-30 13:40:46 +00005004 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00005005 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00005006 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00005007
5008 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005009 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00005010 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00005011 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00005012 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00005013 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00005014 else
5015 ch = CHILD(n, 2);
5016 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00005017 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00005018 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00005019}
5020
5021static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005022compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005023{
5024 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00005025 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005026 REQ(n, classdef);
5027 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
5028 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005029 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00005030 /* Initialize local __module__ from global __name__ */
5031 com_addop_name(c, LOAD_GLOBAL, "__name__");
5032 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005033 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00005034 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005035 if (doc != NULL) {
5036 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005037 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005038 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00005039 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005040 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00005041 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005042 }
5043 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00005044 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005045 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00005046 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005047 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00005048 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005049 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00005050 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005051}
5052
5053static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00005054compile_generator_expression(struct compiling *c, node *n)
5055{
5056 /* testlist_gexp: test gen_for */
5057 /* argument: test gen_for */
5058 REQ(CHILD(n, 0), test);
5059 REQ(CHILD(n, 1), gen_for);
5060
5061 c->c_name = "<generator expression>";
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00005062 c->c_infunction = 1;
Raymond Hettinger354433a2004-05-19 08:20:33 +00005063 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00005064 c->c_infunction = 0;
Raymond Hettinger354433a2004-05-19 08:20:33 +00005065
5066 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
5067 com_push(c, 1);
5068 com_addbyte(c, RETURN_VALUE);
5069 com_pop(c, 1);
5070}
5071
5072static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005073compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005074{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00005075 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00005076
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005077 switch (TYPE(n)) {
5078
Guido van Rossum4c417781991-01-21 16:09:22 +00005079 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005080 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00005081 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005082 n = CHILD(n, 0);
5083 if (TYPE(n) != NEWLINE)
5084 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00005085 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00005086 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
5087 com_push(c, 1);
5088 com_addbyte(c, RETURN_VALUE);
5089 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00005090 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005091 break;
5092
Guido van Rossum4c417781991-01-21 16:09:22 +00005093 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005094 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00005095 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00005096 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
5097 com_push(c, 1);
5098 com_addbyte(c, RETURN_VALUE);
5099 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005100 break;
5101
Guido van Rossum590baa41993-11-30 13:40:46 +00005102 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00005103 com_node(c, CHILD(n, 0));
5104 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00005105 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00005106 break;
5107
Guido van Rossum590baa41993-11-30 13:40:46 +00005108 case lambdef: /* anonymous function definition */
5109 compile_lambdef(c, n);
5110 break;
5111
Guido van Rossum4c417781991-01-21 16:09:22 +00005112 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005113 compile_funcdef(c, n);
5114 break;
5115
Guido van Rossum4c417781991-01-21 16:09:22 +00005116 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005117 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00005118 break;
5119
Raymond Hettinger354433a2004-05-19 08:20:33 +00005120 case testlist_gexp: /* A generator expression */
5121 case argument: /* A generator expression */
5122 compile_generator_expression(c, n);
5123 break;
5124
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005125 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00005126 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00005127 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005128 }
5129}
5130
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005131static PyObject *
5132dict_keys_inorder(PyObject *dict, int offset)
5133{
5134 PyObject *tuple, *k, *v;
5135 int i, pos = 0, size = PyDict_Size(dict);
5136
5137 tuple = PyTuple_New(size);
5138 if (tuple == NULL)
5139 return NULL;
5140 while (PyDict_Next(dict, &pos, &k, &v)) {
5141 i = PyInt_AS_LONG(v);
5142 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005143 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005144 PyTuple_SET_ITEM(tuple, i - offset, k);
5145 }
5146 return tuple;
5147}
5148
Guido van Rossum79f25d91997-04-29 20:08:16 +00005149PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005150PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005151{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005152 return PyNode_CompileFlags(n, filename, NULL);
5153}
5154
5155PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005156PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005157{
5158 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005159}
5160
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005161struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005162PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005163{
5164 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00005165 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005166
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00005167 ff = PyNode_Future(n, filename);
5168 if (ff == NULL)
5169 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005170 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00005171 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005172 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005173 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00005174 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005175 return st;
5176}
5177
Guido van Rossum79f25d91997-04-29 20:08:16 +00005178static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005179icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005180{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005181 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005182}
5183
Guido van Rossum79f25d91997-04-29 20:08:16 +00005184static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005185jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005186 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005187{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005188 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00005189 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00005190 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005191 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00005192 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
5193 sc.c_encoding = "utf-8";
5194 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00005195 sc.c_encoding = STR(n);
5196 n = CHILD(n, 0);
5197 } else {
5198 sc.c_encoding = NULL;
5199 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005200 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005201 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005202 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005203 /* c_symtable still points to parent's symbols */
5204 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005205 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005206 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00005207 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00005208 if (base->c_encoding != NULL) {
5209 assert(sc.c_encoding == NULL);
5210 sc.c_encoding = base->c_encoding;
5211 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005212 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005213 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00005214 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005215 if (sc.c_future == NULL) {
5216 com_free(&sc);
5217 return NULL;
5218 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00005219 if (flags) {
5220 int merged = sc.c_future->ff_features |
5221 flags->cf_flags;
5222 sc.c_future->ff_features = merged;
5223 flags->cf_flags = merged;
5224 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005225 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
5226 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005227 com_free(&sc);
5228 return NULL;
5229 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005230 /* reset symbol table for second pass */
5231 sc.c_symtable->st_nscopes = 1;
5232 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005233 }
5234 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005235 if (symtable_load_symbols(&sc) < 0) {
5236 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005237 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005238 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005239 compile_node(&sc, n);
5240 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00005241 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005242 PyObject *consts, *names, *varnames, *filename, *name,
Raymond Hettinger1a789292004-08-18 05:22:06 +00005243 *freevars, *cellvars, *code;
Guido van Rossum79f25d91997-04-29 20:08:16 +00005244 names = PyList_AsTuple(sc.c_names);
5245 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005246 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
5247 freevars = dict_keys_inorder(sc.c_freevars,
5248 PyTuple_GET_SIZE(cellvars));
Michael W. Hudsone51c4f92004-08-04 10:26:08 +00005249 filename = PyString_InternFromString(sc.c_filename);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00005250 name = PyString_InternFromString(sc.c_name);
Raymond Hettinger2c31a052004-09-22 18:44:21 +00005251 code = optimize_code(sc.c_code, sc.c_consts, names, sc.c_lnotab);
5252 consts = PyList_AsTuple(sc.c_consts);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005253 if (!PyErr_Occurred())
5254 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005255 sc.c_nlocals,
5256 sc.c_maxstacklevel,
5257 sc.c_flags,
Raymond Hettinger1a789292004-08-18 05:22:06 +00005258 code,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005259 consts,
5260 names,
5261 varnames,
5262 freevars,
5263 cellvars,
5264 filename,
5265 name,
5266 sc.c_firstlineno,
5267 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005268 Py_XDECREF(consts);
5269 Py_XDECREF(names);
5270 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005271 Py_XDECREF(freevars);
5272 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005273 Py_XDECREF(filename);
5274 Py_XDECREF(name);
Raymond Hettinger1a789292004-08-18 05:22:06 +00005275 Py_XDECREF(code);
Guido van Rossuma082ce41991-06-04 19:41:56 +00005276 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00005277 else if (!PyErr_Occurred()) {
5278 /* This could happen if someone called PyErr_Clear() after an
5279 error was reported above. That's not supposed to happen,
5280 but I just plugged one case and I'm not sure there can't be
5281 others. In that case, raise SystemError so that at least
5282 it gets reported instead dumping core. */
5283 PyErr_SetString(PyExc_SystemError, "lost syntax error");
5284 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005285 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005286 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005287 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005288 sc.c_symtable = NULL;
5289 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005290 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005291 return co;
5292}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005293
5294int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005295PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005296{
5297 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00005298 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005299 int line = co->co_firstlineno;
5300 int addr = 0;
5301 while (--size >= 0) {
5302 addr += *p++;
5303 if (addr > addrq)
5304 break;
5305 line += *p++;
5306 }
5307 return line;
5308}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005309
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005310/* The test for LOCAL must come before the test for FREE in order to
5311 handle classes where name is both local and free. The local var is
5312 a method and the free var is a free var referenced within a method.
5313*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005314
5315static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005316get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005317{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005318 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005319 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00005320
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005321 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
5322 return CELL;
5323 if (PyDict_GetItemString(c->c_locals, name) != NULL)
5324 return LOCAL;
5325 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
5326 return FREE;
5327 v = PyDict_GetItemString(c->c_globals, name);
5328 if (v) {
5329 if (v == Py_None)
5330 return GLOBAL_EXPLICIT;
5331 else {
5332 return GLOBAL_IMPLICIT;
5333 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005334 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00005335 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005336 "unknown scope for %.100s in %.100s(%s) "
5337 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
5338 name, c->c_name,
5339 PyObject_REPR(c->c_symtable->st_cur->ste_id),
5340 c->c_filename,
5341 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
5342 PyObject_REPR(c->c_locals),
5343 PyObject_REPR(c->c_globals)
5344 );
5345
5346 Py_FatalError(buf);
5347 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005348}
5349
Guido van Rossum207fda62001-03-02 03:30:41 +00005350/* Helper functions to issue warnings */
5351
5352static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00005353issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00005354{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005355 if (PyErr_Occurred()) {
5356 /* This can happen because symtable_node continues
5357 processing even after raising a SyntaxError.
5358 Calling PyErr_WarnExplicit now would clobber the
5359 pending exception; instead we fail and let that
5360 exception propagate.
5361 */
5362 return -1;
5363 }
Guido van Rossum207fda62001-03-02 03:30:41 +00005364 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
5365 lineno, NULL, NULL) < 0) {
5366 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
5367 PyErr_SetString(PyExc_SyntaxError, msg);
5368 PyErr_SyntaxLocation(filename, lineno);
5369 }
5370 return -1;
5371 }
5372 return 0;
5373}
Guido van Rossumee34ac12001-02-28 22:08:12 +00005374
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005375static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00005376symtable_warn(struct symtable *st, char *msg)
5377{
Guido van Rossum207fda62001-03-02 03:30:41 +00005378 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00005379 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005380 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005381 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005382 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005383}
5384
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00005385/* Helper function for setting lineno and filename */
5386
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005387static struct symtable *
5388symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005389{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005390 struct symtable *st;
5391
5392 st = symtable_init();
5393 if (st == NULL)
5394 return NULL;
5395 st->st_future = ff;
5396 st->st_filename = filename;
5397 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
5398 if (st->st_errors > 0)
5399 goto fail;
5400 symtable_node(st, n);
5401 if (st->st_errors > 0)
5402 goto fail;
5403 return st;
5404 fail:
5405 if (!PyErr_Occurred()) {
5406 /* This could happen because after a syntax error is
5407 detected, the symbol-table-building continues for
5408 a while, and PyErr_Clear() might erroneously be
5409 called during that process. One such case has been
5410 fixed, but there might be more (now or later).
5411 */
5412 PyErr_SetString(PyExc_SystemError, "lost exception");
5413 }
5414 st->st_future = NULL;
5415 st->st_filename = NULL;
5416 PySymtable_Free(st);
5417 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005418}
5419
5420static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005421symtable_init_compiling_symbols(struct compiling *c)
5422{
5423 PyObject *varnames;
5424
5425 varnames = c->c_symtable->st_cur->ste_varnames;
5426 if (varnames == NULL) {
5427 varnames = PyList_New(0);
5428 if (varnames == NULL)
5429 return -1;
5430 c->c_symtable->st_cur->ste_varnames = varnames;
5431 Py_INCREF(varnames);
5432 } else
5433 Py_INCREF(varnames);
5434 c->c_varnames = varnames;
5435
5436 c->c_globals = PyDict_New();
5437 if (c->c_globals == NULL)
5438 return -1;
5439 c->c_freevars = PyDict_New();
5440 if (c->c_freevars == NULL)
5441 return -1;
5442 c->c_cellvars = PyDict_New();
5443 if (c->c_cellvars == NULL)
5444 return -1;
5445 return 0;
5446}
5447
5448struct symbol_info {
5449 int si_nlocals;
5450 int si_ncells;
5451 int si_nfrees;
5452 int si_nimplicit;
5453};
5454
5455static void
5456symtable_init_info(struct symbol_info *si)
5457{
5458 si->si_nlocals = 0;
5459 si->si_ncells = 0;
5460 si->si_nfrees = 0;
5461 si->si_nimplicit = 0;
5462}
5463
5464static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005465symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005466 struct symbol_info *si)
5467{
5468 PyObject *dict, *v;
5469
5470 /* Seperate logic for DEF_FREE. If it occurs in a function,
5471 it indicates a local that we must allocate storage for (a
5472 cell var). If it occurs in a class, then the class has a
5473 method and a free variable with the same name.
5474 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005475 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005476 /* If it isn't declared locally, it can't be a cell. */
5477 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
5478 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005479 v = PyInt_FromLong(si->si_ncells++);
5480 dict = c->c_cellvars;
5481 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005482 /* If it is free anyway, then there is no need to do
5483 anything here.
5484 */
5485 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00005486 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005487 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005488 v = PyInt_FromLong(si->si_nfrees++);
5489 dict = c->c_freevars;
5490 }
5491 if (v == NULL)
5492 return -1;
5493 if (PyDict_SetItem(dict, name, v) < 0) {
5494 Py_DECREF(v);
5495 return -1;
5496 }
5497 Py_DECREF(v);
5498 return 0;
5499}
5500
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005501/* If a variable is a cell and an argument, make sure that appears in
5502 co_cellvars before any variable to its right in varnames.
5503*/
5504
5505
5506static int
5507symtable_cellvar_offsets(PyObject **cellvars, int argcount,
5508 PyObject *varnames, int flags)
5509{
Tim Petersb39903b2003-03-24 17:22:24 +00005510 PyObject *v = NULL;
5511 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005512 int i, pos;
5513
5514 if (flags & CO_VARARGS)
5515 argcount++;
5516 if (flags & CO_VARKEYWORDS)
5517 argcount++;
5518 for (i = argcount; --i >= 0; ) {
5519 v = PyList_GET_ITEM(varnames, i);
5520 if (PyDict_GetItem(*cellvars, v)) {
5521 if (list == NULL) {
5522 list = PyList_New(1);
5523 if (list == NULL)
5524 return -1;
5525 PyList_SET_ITEM(list, 0, v);
5526 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005527 } else {
5528 if (PyList_Insert(list, 0, v) < 0) {
5529 Py_DECREF(list);
5530 return -1;
5531 }
5532 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005533 }
5534 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00005535 if (list == NULL)
5536 return 0;
5537
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005538 /* There are cellvars that are also arguments. Create a dict
5539 to replace cellvars and put the args at the front.
5540 */
5541 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005542 if (d == NULL)
5543 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005544 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
5545 v = PyInt_FromLong(i);
5546 if (v == NULL)
5547 goto fail;
5548 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
5549 goto fail;
5550 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
5551 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00005552 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005553 }
5554 pos = 0;
5555 i = PyList_GET_SIZE(list);
5556 Py_DECREF(list);
5557 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
5558 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005559 if (w == NULL)
5560 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005561 if (PyDict_SetItem(d, v, w) < 0) {
5562 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00005563 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005564 goto fail;
5565 }
5566 Py_DECREF(w);
5567 }
5568 Py_DECREF(*cellvars);
5569 *cellvars = d;
5570 return 1;
5571 fail:
5572 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00005573 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005574 return -1;
5575}
5576
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005577static int
5578symtable_freevar_offsets(PyObject *freevars, int offset)
5579{
5580 PyObject *name, *v;
5581 int pos;
5582
5583 /* The cell vars are the first elements of the closure,
5584 followed by the free vars. Update the offsets in
5585 c_freevars to account for number of cellvars. */
5586 pos = 0;
5587 while (PyDict_Next(freevars, &pos, &name, &v)) {
5588 int i = PyInt_AS_LONG(v) + offset;
5589 PyObject *o = PyInt_FromLong(i);
5590 if (o == NULL)
5591 return -1;
5592 if (PyDict_SetItem(freevars, name, o) < 0) {
5593 Py_DECREF(o);
5594 return -1;
5595 }
5596 Py_DECREF(o);
5597 }
5598 return 0;
5599}
5600
5601static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005602symtable_check_unoptimized(struct compiling *c,
5603 PySymtableEntryObject *ste,
5604 struct symbol_info *si)
5605{
5606 char buf[300];
5607
5608 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
5609 || (ste->ste_nested && si->si_nimplicit)))
5610 return 0;
5611
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005612#define ILLEGAL_CONTAINS "contains a nested function with free variables"
5613
5614#define ILLEGAL_IS "is a nested function"
5615
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005616#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005617"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005618
5619#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005620"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005621
5622#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005623"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005624"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005625
5626 /* XXX perhaps the linenos for these opt-breaking statements
5627 should be stored so the exception can point to them. */
5628
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005629 if (ste->ste_child_free) {
5630 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005631 PyOS_snprintf(buf, sizeof(buf),
5632 ILLEGAL_IMPORT_STAR,
5633 PyString_AS_STRING(ste->ste_name),
5634 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005635 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005636 PyOS_snprintf(buf, sizeof(buf),
5637 ILLEGAL_BARE_EXEC,
5638 PyString_AS_STRING(ste->ste_name),
5639 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005640 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005641 PyOS_snprintf(buf, sizeof(buf),
5642 ILLEGAL_EXEC_AND_IMPORT_STAR,
5643 PyString_AS_STRING(ste->ste_name),
5644 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005645 }
5646 } else {
5647 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005648 PyOS_snprintf(buf, sizeof(buf),
5649 ILLEGAL_IMPORT_STAR,
5650 PyString_AS_STRING(ste->ste_name),
5651 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005652 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005653 PyOS_snprintf(buf, sizeof(buf),
5654 ILLEGAL_BARE_EXEC,
5655 PyString_AS_STRING(ste->ste_name),
5656 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005657 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005658 PyOS_snprintf(buf, sizeof(buf),
5659 ILLEGAL_EXEC_AND_IMPORT_STAR,
5660 PyString_AS_STRING(ste->ste_name),
5661 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005662 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005663 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005664
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005665 PyErr_SetString(PyExc_SyntaxError, buf);
5666 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5667 ste->ste_opt_lineno);
5668 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005669}
5670
5671static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005672symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5673 struct symbol_info *si)
5674{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005675 if (c->c_future)
5676 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005677 if (ste->ste_generator)
5678 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005679 if (ste->ste_type != TYPE_MODULE)
5680 c->c_flags |= CO_NEWLOCALS;
5681 if (ste->ste_type == TYPE_FUNCTION) {
5682 c->c_nlocals = si->si_nlocals;
5683 if (ste->ste_optimized == 0)
5684 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005685 else if (ste->ste_optimized != OPT_EXEC)
5686 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005687 }
5688 return 0;
5689}
5690
5691static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005692symtable_error(struct symtable *st, int lineno)
5693{
5694 if (lineno == 0)
5695 lineno = st->st_cur->ste_lineno;
5696 PyErr_SyntaxLocation(st->st_filename, lineno);
5697 st->st_errors++;
5698 return -1;
5699}
5700
5701static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005702symtable_load_symbols(struct compiling *c)
5703{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005704 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005705 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005706 PyObject *name, *varnames, *v;
5707 int i, flags, pos;
5708 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005709
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005710 v = NULL;
5711
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005712 if (symtable_init_compiling_symbols(c) < 0)
5713 goto fail;
5714 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005715 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005716 si.si_nlocals = PyList_GET_SIZE(varnames);
5717 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005718
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005719 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005720 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005721 if (v == NULL)
5722 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005723 if (PyDict_SetItem(c->c_locals,
5724 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005725 goto fail;
5726 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005727 }
5728
5729 /* XXX The cases below define the rules for whether a name is
5730 local or global. The logic could probably be clearer. */
5731 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005732 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5733 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005734
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005735 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005736 /* undo the original DEF_FREE */
5737 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005738
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005739 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005740 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005741 2. Free variables in methods that are also class
5742 variables or declared global.
5743 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005744 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005745 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005746
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005747 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005748 c->c_argcount--;
5749 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005750 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005751 c->c_argcount--;
5752 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005753 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005754 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005755 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005756 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005757 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005758 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005759 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005760 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005761 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005762 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5763 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005764 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005765 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005766 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005767 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005768 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005769 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005770 if (v == NULL)
5771 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005772 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005773 goto fail;
5774 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005775 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005776 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005777 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005778 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005779 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005780 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005781 if (v == NULL)
5782 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005783 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005784 goto fail;
5785 Py_DECREF(v);
5786 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005787 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005788 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005789 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005790 goto fail;
5791 if (st->st_nscopes != 1) {
5792 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005793 if (v == NULL)
5794 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005795 if (PyDict_SetItem(st->st_global,
5796 name, v))
5797 goto fail;
5798 Py_DECREF(v);
5799 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005800 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005801 }
5802 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005803 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5804
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005805 if (si.si_ncells > 1) { /* one cell is always in order */
5806 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5807 c->c_varnames, c->c_flags) < 0)
5808 return -1;
5809 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005810 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5811 return -1;
5812 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005813 fail:
5814 /* is this always the right thing to do? */
5815 Py_XDECREF(v);
5816 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005817}
5818
5819static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005820symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005821{
5822 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005823
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005824 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005825 if (st == NULL)
5826 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005827 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005828
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005829 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005830 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005831 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005832 goto fail;
5833 if ((st->st_symbols = PyDict_New()) == NULL)
5834 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005835 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005836 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005837 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005838 st->st_private = NULL;
5839 return st;
5840 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005841 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005842 return NULL;
5843}
5844
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005845void
5846PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005847{
5848 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005849 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005850 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005851 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005852}
5853
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005854/* When the compiler exits a scope, it must should update the scope's
5855 free variable information with the list of free variables in its
5856 children.
5857
5858 Variables that are free in children and defined in the current
5859 scope are cellvars.
5860
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005861 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005862 false), free variables in children that are not defined here are
5863 implicit globals.
5864
5865*/
5866
5867static int
5868symtable_update_free_vars(struct symtable *st)
5869{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005870 int i, j, def;
5871 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005872 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005873
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005874 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005875 def = DEF_FREE_CLASS;
5876 else
5877 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005878 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005879 int pos = 0;
5880
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005881 if (list && PyList_SetSlice(list, 0,
5882 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005883 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005884 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005885 PyList_GET_ITEM(ste->ste_children, i);
5886 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005887 int flags = PyInt_AS_LONG(o);
5888 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005889 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005890 if (list == NULL) {
5891 list = PyList_New(0);
5892 if (list == NULL)
5893 return -1;
5894 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005895 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005896 if (PyList_Append(list, name) < 0) {
5897 Py_DECREF(list);
5898 return -1;
5899 }
5900 }
5901 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005902 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005903 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005904 v = PyDict_GetItem(ste->ste_symbols, name);
5905 /* If a name N is declared global in scope A and
5906 referenced in scope B contained (perhaps
5907 indirectly) in A and there are no scopes
5908 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005909 is global in B. Unless A is a class scope,
5910 because class scopes are not considered for
5911 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005912 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005913 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005914 int flags = PyInt_AS_LONG(v);
5915 if (flags & DEF_GLOBAL) {
5916 symtable_undo_free(st, child->ste_id,
5917 name);
5918 continue;
5919 }
5920 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005921 if (ste->ste_nested) {
5922 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005923 name, def) < 0) {
5924 Py_DECREF(list);
5925 return -1;
5926 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005927 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005928 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005929 name) < 0) {
5930 Py_DECREF(list);
5931 return -1;
5932 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005933 }
5934 }
5935 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005936
5937 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005938 return 0;
5939}
5940
5941/* If the current scope is a non-nested class or if name is not
5942 defined in the current, non-nested scope, then it is an implicit
5943 global in all nested scopes.
5944*/
5945
5946static int
5947symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5948{
5949 PyObject *o;
5950 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005951 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005952
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005953 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005954 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005955 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005956 if (o == NULL)
5957 return symtable_undo_free(st, child, name);
5958 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005959
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005960 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005961 return symtable_undo_free(st, child, name);
5962 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005963 return symtable_add_def_o(st, ste->ste_symbols,
5964 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005965}
5966
5967static int
5968symtable_undo_free(struct symtable *st, PyObject *id,
5969 PyObject *name)
5970{
5971 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005972 PyObject *info;
5973 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005974
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005975 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5976 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005977 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005978
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005979 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005980 if (info == NULL)
5981 return 0;
5982 v = PyInt_AS_LONG(info);
5983 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005984 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005985 DEF_FREE_GLOBAL) < 0)
5986 return -1;
5987 } else
5988 /* If the name is defined here or declared global,
5989 then the recursion stops. */
5990 return 0;
5991
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005992 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5993 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005994 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005995 PyList_GET_ITEM(ste->ste_children, i);
5996 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005997 if (x < 0)
5998 return x;
5999 }
6000 return 0;
6001}
6002
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006003/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
6004 This reference is released when the scope is exited, via the DECREF
6005 in symtable_exit_scope().
6006*/
6007
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006008static int
6009symtable_exit_scope(struct symtable *st)
6010{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006011 int end;
6012
Jeremy Hylton4419ac12001-02-28 22:54:51 +00006013 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006014 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00006015 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006016 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00006017 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
6018 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006019 if (PySequence_DelItem(st->st_stack, end) < 0)
6020 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00006021 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006022}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006023
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006024static void
6025symtable_enter_scope(struct symtable *st, char *name, int type,
6026 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006027{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00006028 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006029
6030 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00006031 prev = st->st_cur;
6032 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006033 st->st_errors++;
6034 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006035 }
6036 }
Barry Warsaw0372af72001-02-23 18:22:59 +00006037 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00006038 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00006039 if (st->st_cur == NULL) {
6040 st->st_errors++;
6041 return;
6042 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00006043 if (strcmp(name, TOP) == 0)
6044 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00006045 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00006046 if (PyList_Append(prev->ste_children,
6047 (PyObject *)st->st_cur) < 0)
6048 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00006049 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006050}
6051
6052static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006053symtable_lookup(struct symtable *st, char *name)
6054{
6055 char buffer[MANGLE_LEN];
6056 PyObject *v;
6057 int flags;
6058
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00006059 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006060 name = buffer;
6061 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
6062 if (v == NULL) {
6063 if (PyErr_Occurred())
6064 return -1;
6065 else
6066 return 0;
6067 }
6068
6069 flags = PyInt_AS_LONG(v);
6070 return flags;
6071}
6072
6073static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006074symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006075{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006076 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006077 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006078 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006079
Guido van Rossumb7164622002-08-16 02:48:11 +00006080 /* Warn about None, except inside a tuple (where the assignment
6081 code already issues a warning). */
6082 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
6083 *name == 'N' && strcmp(name, "None") == 0)
6084 {
Raymond Hettinger11a70c72004-07-17 21:46:25 +00006085 PyErr_SetString(PyExc_SyntaxError,
6086 "Invalid syntax. Assignment to None.");
6087 symtable_error(st, 0);
6088 return -1;
Guido van Rossumb7164622002-08-16 02:48:11 +00006089 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00006090 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006091 name = buffer;
6092 if ((s = PyString_InternFromString(name)) == NULL)
6093 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006094 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
6095 Py_DECREF(s);
6096 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006097}
6098
6099/* Must only be called with mangled names */
6100
6101static int
6102symtable_add_def_o(struct symtable *st, PyObject *dict,
6103 PyObject *name, int flag)
6104{
6105 PyObject *o;
6106 int val;
6107
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006108 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006109 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006110 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006111 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00006112 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00006113 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006114 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006115 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006116 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006117 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006118 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00006119 if (o == NULL)
6120 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006121 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006122 Py_DECREF(o);
6123 return -1;
6124 }
6125 Py_DECREF(o);
6126
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006127 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00006128 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006129 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006130 } else if (flag & DEF_GLOBAL) {
6131 /* XXX need to update DEF_GLOBAL for other flags too;
6132 perhaps only DEF_FREE_GLOBAL */
6133 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006134 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006135 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006136 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006137 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006138 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00006139 if (o == NULL)
6140 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006141 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006142 Py_DECREF(o);
6143 return -1;
6144 }
6145 Py_DECREF(o);
6146 }
6147 return 0;
6148}
6149
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006150#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006151
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00006152/* Look for a yield stmt or expr under n. Return 1 if found, else 0.
Tim Peters08a898f2001-06-28 01:52:22 +00006153 This hack is used to look inside "if 0:" blocks (which are normally
6154 ignored) in case those are the only places a yield occurs (so that this
6155 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00006156static int
6157look_for_yield(node *n)
6158{
6159 int i;
6160
6161 for (i = 0; i < NCH(n); ++i) {
6162 node *kid = CHILD(n, i);
6163
6164 switch (TYPE(kid)) {
6165
6166 case classdef:
6167 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00006168 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00006169 /* Stuff in nested functions and classes can't make
6170 the parent a generator. */
6171 return 0;
6172
6173 case yield_stmt:
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00006174 case yield_expr:
Raymond Hettinger354433a2004-05-19 08:20:33 +00006175 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006176
6177 default:
6178 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00006179 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006180 }
6181 }
6182 return 0;
6183}
6184
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006185static void
6186symtable_node(struct symtable *st, node *n)
6187{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006188 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006189
6190 loop:
6191 switch (TYPE(n)) {
6192 case funcdef: {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006193 char *func_name;
6194 if (NCH(n) == 6)
6195 symtable_node(st, CHILD(n, 0));
6196 func_name = STR(RCHILD(n, -4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006197 symtable_add_def(st, func_name, DEF_LOCAL);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006198 symtable_default_args(st, RCHILD(n, -3));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006199 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006200 symtable_funcdef(st, n);
6201 symtable_exit_scope(st);
6202 break;
6203 }
6204 case lambdef:
6205 if (NCH(n) == 4)
6206 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006207 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006208 symtable_funcdef(st, n);
6209 symtable_exit_scope(st);
6210 break;
6211 case classdef: {
6212 char *tmp, *class_name = STR(CHILD(n, 1));
6213 symtable_add_def(st, class_name, DEF_LOCAL);
6214 if (TYPE(CHILD(n, 2)) == LPAR) {
6215 node *bases = CHILD(n, 3);
6216 int i;
6217 for (i = 0; i < NCH(bases); i += 2) {
6218 symtable_node(st, CHILD(bases, i));
6219 }
6220 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006221 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006222 tmp = st->st_private;
6223 st->st_private = class_name;
6224 symtable_node(st, CHILD(n, NCH(n) - 1));
6225 st->st_private = tmp;
6226 symtable_exit_scope(st);
6227 break;
6228 }
6229 case if_stmt:
6230 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00006231 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
6232 if (st->st_cur->ste_generator == 0)
6233 st->st_cur->ste_generator =
6234 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006235 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006236 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006237 symtable_node(st, CHILD(n, i + 1));
6238 symtable_node(st, CHILD(n, i + 3));
6239 }
6240 if (i + 2 < NCH(n))
6241 symtable_node(st, CHILD(n, i + 2));
6242 break;
6243 case global_stmt:
6244 symtable_global(st, n);
6245 break;
6246 case import_stmt:
6247 symtable_import(st, n);
6248 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006249 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006250 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006251 symtable_node(st, CHILD(n, 1));
6252 if (NCH(n) > 2)
6253 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006254 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006255 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006256 st->st_cur->ste_opt_lineno = n->n_lineno;
6257 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006258 if (NCH(n) > 4)
6259 symtable_node(st, CHILD(n, 5));
6260 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006261
6262 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00006263 case assert_stmt:
6264 if (Py_OptimizeFlag)
6265 return;
6266 if (NCH(n) == 2) {
6267 n = CHILD(n, 1);
6268 goto loop;
6269 } else {
6270 symtable_node(st, CHILD(n, 1));
6271 n = CHILD(n, 3);
6272 goto loop;
6273 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006274 case except_clause:
6275 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006276 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006277 if (NCH(n) > 1) {
6278 n = CHILD(n, 1);
6279 goto loop;
6280 }
6281 break;
6282 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006283 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006284 break;
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00006285 case yield_expr:
Tim Peters5ca576e2001-06-18 22:08:13 +00006286 st->st_cur->ste_generator = 1;
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00006287 if (NCH(n)==1)
6288 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00006289 n = CHILD(n, 1);
6290 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006291 case expr_stmt:
6292 if (NCH(n) == 1)
6293 n = CHILD(n, 0);
6294 else {
6295 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006296 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006297 symtable_node(st, CHILD(n, 2));
6298 break;
6299 } else {
6300 int i;
6301 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006302 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006303 n = CHILD(n, NCH(n) - 1);
6304 }
6305 }
6306 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006307 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006308 /* only occurs when there are multiple for loops
6309 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006310 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006311 if (TYPE(n) == list_for)
6312 symtable_list_for(st, n);
6313 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006314 REQ(n, list_if);
6315 symtable_node(st, CHILD(n, 1));
6316 if (NCH(n) == 3) {
6317 n = CHILD(n, 2);
6318 goto loop;
6319 }
6320 }
6321 break;
6322 case for_stmt:
6323 symtable_assign(st, CHILD(n, 1), 0);
6324 for (i = 3; i < NCH(n); ++i)
6325 if (TYPE(CHILD(n, i)) >= single_input)
6326 symtable_node(st, CHILD(n, i));
6327 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006328 case arglist:
6329 if (NCH(n) > 1)
6330 for (i = 0; i < NCH(n); ++i) {
6331 node *ch = CHILD(n, i);
6332 if (TYPE(ch) == argument && NCH(ch) == 2 &&
6333 TYPE(CHILD(ch, 1)) == gen_for) {
6334 PyErr_SetString(PyExc_SyntaxError,
6335 "invalid syntax");
6336 symtable_error(st, n->n_lineno);
6337 return;
6338 }
6339 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006340 /* The remaining cases fall through to default except in
6341 special circumstances. This requires the individual cases
6342 to be coded with great care, even though they look like
6343 rather innocuous. Each case must double-check TYPE(n).
6344 */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006345 case decorator:
6346 if (TYPE(n) == decorator) {
6347 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
6348 node *name, *varname;
6349 name = CHILD(n, 1);
6350 REQ(name, dotted_name);
6351 varname = CHILD(name, 0);
6352 REQ(varname, NAME);
6353 symtable_add_use(st, STR(varname));
6354 }
6355 /* fall through */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006356 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006357 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006358 n = CHILD(n, 2);
6359 goto loop;
6360 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00006361 else if (TYPE(n) == argument && NCH(n) == 2 &&
6362 TYPE(CHILD(n, 1)) == gen_for) {
6363 symtable_generator_expression(st, n);
6364 break;
6365 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006366 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006367 case listmaker:
6368 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006369 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006370 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006371 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006372 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00006373 case testlist_gexp:
6374 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6375 symtable_generator_expression(st, n);
6376 break;
6377 }
6378 /* fall through */
6379
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006380 case atom:
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00006381 if (TYPE(n) == atom) {
6382 if (TYPE(CHILD(n, 0)) == NAME) {
6383 symtable_add_use(st, STR(CHILD(n, 0)));
6384 break;
6385 }
6386 else if (TYPE(CHILD(n,0)) == LPAR) {
6387 n = CHILD(n,1);
6388 goto loop;
6389 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006390 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006391 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006392 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006393 /* Walk over every non-token child with a special case
6394 for one child.
6395 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006396 if (NCH(n) == 1) {
6397 n = CHILD(n, 0);
6398 goto loop;
6399 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006400 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006401 if (TYPE(CHILD(n, i)) >= single_input)
6402 symtable_node(st, CHILD(n, i));
6403 }
6404}
6405
6406static void
6407symtable_funcdef(struct symtable *st, node *n)
6408{
6409 node *body;
6410
6411 if (TYPE(n) == lambdef) {
6412 if (NCH(n) == 4)
6413 symtable_params(st, CHILD(n, 1));
6414 } else
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006415 symtable_params(st, RCHILD(n, -3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006416 body = CHILD(n, NCH(n) - 1);
6417 symtable_node(st, body);
6418}
6419
6420/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00006421 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006422 which are references in the defining scope. symtable_params()
6423 parses the parameter names, which are defined in the function's
6424 body.
6425
6426 varargslist:
6427 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
6428 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
6429*/
6430
6431static void
6432symtable_default_args(struct symtable *st, node *n)
6433{
6434 node *c;
6435 int i;
6436
6437 if (TYPE(n) == parameters) {
6438 n = CHILD(n, 1);
6439 if (TYPE(n) == RPAR)
6440 return;
6441 }
6442 REQ(n, varargslist);
6443 for (i = 0; i < NCH(n); i += 2) {
6444 c = CHILD(n, i);
6445 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6446 break;
6447 }
6448 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
6449 symtable_node(st, CHILD(n, i));
6450 }
6451}
6452
6453static void
6454symtable_params(struct symtable *st, node *n)
6455{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006456 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00006457 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006458
6459 if (TYPE(n) == parameters) {
6460 n = CHILD(n, 1);
6461 if (TYPE(n) == RPAR)
6462 return;
6463 }
6464 REQ(n, varargslist);
6465 for (i = 0; i < NCH(n); i += 2) {
6466 c = CHILD(n, i);
6467 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6468 ext = 1;
6469 break;
6470 }
6471 if (TYPE(c) == test) {
6472 continue;
6473 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00006474 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006475 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00006476 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006477 char nbuf[30];
6478 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006479 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006480 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006481 }
6482 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006483 if (ext) {
6484 c = CHILD(n, i);
6485 if (TYPE(c) == STAR) {
6486 i++;
6487 symtable_add_def(st, STR(CHILD(n, i)),
6488 DEF_PARAM | DEF_STAR);
6489 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00006490 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006491 c = NULL;
6492 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006493 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006494 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006495 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006496 i++;
6497 symtable_add_def(st, STR(CHILD(n, i)),
6498 DEF_PARAM | DEF_DOUBLESTAR);
6499 }
6500 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006501 if (complex >= 0) {
6502 int j;
6503 for (j = 0; j <= complex; j++) {
6504 c = CHILD(n, j);
6505 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00006506 c = CHILD(n, ++j);
6507 else if (TYPE(c) == EQUAL)
6508 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006509 if (TYPE(CHILD(c, 0)) == LPAR)
6510 symtable_params_fplist(st, CHILD(c, 1));
6511 }
6512 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006513}
6514
6515static void
6516symtable_params_fplist(struct symtable *st, node *n)
6517{
6518 int i;
6519 node *c;
6520
6521 REQ(n, fplist);
6522 for (i = 0; i < NCH(n); i += 2) {
6523 c = CHILD(n, i);
6524 REQ(c, fpdef);
6525 if (NCH(c) == 1)
6526 symtable_add_def(st, STR(CHILD(c, 0)),
6527 DEF_PARAM | DEF_INTUPLE);
6528 else
6529 symtable_params_fplist(st, CHILD(c, 1));
6530 }
6531
6532}
6533
6534static void
6535symtable_global(struct symtable *st, node *n)
6536{
6537 int i;
6538
Jeremy Hylton9f324e92001-03-01 22:59:14 +00006539 /* XXX It might be helpful to warn about module-level global
6540 statements, but it's hard to tell the difference between
6541 module-level and a string passed to exec.
6542 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00006543
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006544 for (i = 1; i < NCH(n); i += 2) {
6545 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006546 int flags;
6547
6548 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006549 if (flags < 0)
6550 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006551 if (flags && flags != DEF_GLOBAL) {
6552 char buf[500];
6553 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00006554 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006555 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00006556 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006557 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006558 }
6559 else {
6560 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006561 PyOS_snprintf(buf, sizeof(buf),
6562 GLOBAL_AFTER_ASSIGN,
6563 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006564 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006565 PyOS_snprintf(buf, sizeof(buf),
6566 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00006567 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006568 }
6569 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006570 symtable_add_def(st, name, DEF_GLOBAL);
6571 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006572}
6573
6574static void
6575symtable_list_comprehension(struct symtable *st, node *n)
6576{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006577 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006578 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006579
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006580 REQ(n, listmaker);
6581 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
6582 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006583 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006584 symtable_list_for(st, CHILD(n, 1));
6585 symtable_node(st, CHILD(n, 0));
6586 --st->st_cur->ste_tmpname;
6587}
6588
6589static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006590symtable_generator_expression(struct symtable *st, node *n)
6591{
6592 /* testlist_gexp: test gen_for */
6593 REQ(CHILD(n, 0), test);
6594 REQ(CHILD(n, 1), gen_for);
6595
6596 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
6597 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
6598
6599 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
6600
6601 symtable_gen_for(st, CHILD(n, 1), 1);
6602 symtable_node(st, CHILD(n, 0));
6603 symtable_exit_scope(st);
6604
6605 /* for outmost iterable precomputation */
6606 symtable_node(st, CHILD(CHILD(n, 1), 3));
6607}
6608
6609static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006610symtable_list_for(struct symtable *st, node *n)
6611{
6612 REQ(n, list_for);
6613 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006614 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006615 symtable_node(st, CHILD(n, 3));
6616 if (NCH(n) == 5)
6617 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006618}
6619
6620static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006621symtable_gen_for(struct symtable *st, node *n, int is_outmost)
6622{
6623 REQ(n, gen_for);
6624
6625 /* gen_for: for v in test [gen_iter] */
6626 symtable_assign(st, CHILD(n, 1), 0);
6627 if (is_outmost)
6628 symtable_add_use(st, "[outmost-iterable]");
6629 else
6630 symtable_node(st, CHILD(n, 3));
6631
6632 if (NCH(n) == 5)
6633 symtable_gen_iter(st, CHILD(n, 4));
6634}
6635
6636static void
6637symtable_gen_iter(struct symtable *st, node *n)
6638{
6639 REQ(n, gen_iter);
6640
6641 n = CHILD(n, 0);
6642 if (TYPE(n) == gen_for)
6643 symtable_gen_for(st, n, 0);
6644 else {
6645 REQ(n, gen_if);
6646 symtable_node(st, CHILD(n, 1));
6647
6648 if (NCH(n) == 3)
6649 symtable_gen_iter(st, CHILD(n, 2));
6650 }
6651}
6652
6653static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006654symtable_import(struct symtable *st, node *n)
6655{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006656 node *nn;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006657 int i;
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006658 /* import_stmt: import_name | import_from */
6659 n = CHILD(n, 0);
6660 if (TYPE(n) == import_from) {
6661 /* import_from: 'from' dotted_name 'import' ('*' |
6662 | '(' import_as_names ')' | import_as_names) */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006663 node *dotname = CHILD(n, 1);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006664 REQ(dotname, dotted_name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006665 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6666 /* check for bogus imports */
6667 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6668 PyErr_SetString(PyExc_SyntaxError,
6669 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006670 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006671 return;
6672 }
6673 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006674 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
6675 if (TYPE(nn) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006676 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006677 if (symtable_warn(st,
6678 "import * only allowed at module level") < 0)
6679 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006680 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006681 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006682 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006683 } else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006684 REQ(nn, import_as_names);
6685 for (i = 0; i < NCH(nn); i += 2) {
6686 node *c = CHILD(nn, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006687 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006688 symtable_assign(st, CHILD(c, 2),
6689 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006690 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006691 symtable_assign(st, CHILD(c, 0),
6692 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006693 }
6694 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006695 } else {
6696 /* 'import' dotted_as_names */
6697 nn = CHILD(n, 1);
6698 REQ(nn, dotted_as_names);
6699 for (i = 0; i < NCH(nn); i += 2)
6700 symtable_assign(st, CHILD(nn, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006701 }
6702}
6703
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006704/* The third argument to symatble_assign() is a flag to be passed to
6705 symtable_add_def() if it is eventually called. The flag is useful
6706 to specify the particular type of assignment that should be
6707 recorded, e.g. an assignment caused by import.
6708 */
6709
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006710static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006711symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006712{
6713 node *tmp;
6714 int i;
6715
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006716 loop:
6717 switch (TYPE(n)) {
6718 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006719 /* invalid assignment, e.g. lambda x:x=2. The next
6720 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006721 return;
6722 case power:
6723 if (NCH(n) > 2) {
6724 for (i = 2; i < NCH(n); ++i)
6725 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6726 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006727 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006728 if (NCH(n) > 1) {
6729 symtable_node(st, CHILD(n, 0));
6730 symtable_node(st, CHILD(n, 1));
6731 } else {
6732 n = CHILD(n, 0);
6733 goto loop;
6734 }
6735 return;
6736 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006737 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6738 /* XXX This is an error, but the next pass
6739 will catch it. */
6740 return;
6741 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006742 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006743 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006744 }
6745 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006746 case testlist_gexp:
6747 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6748 /* XXX This is an error, but the next pass
6749 will catch it. */
6750 return;
6751 } else {
6752 for (i = 0; i < NCH(n); i += 2)
6753 symtable_assign(st, CHILD(n, i), def_flag);
6754 }
6755 return;
6756
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006757 case exprlist:
6758 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006759 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006760 if (NCH(n) == 1) {
6761 n = CHILD(n, 0);
6762 goto loop;
6763 }
6764 else {
6765 int i;
6766 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006767 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006768 return;
6769 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006770 case atom:
6771 tmp = CHILD(n, 0);
6772 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6773 n = CHILD(n, 1);
6774 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006775 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006776 if (strcmp(STR(tmp), "__debug__") == 0) {
6777 PyErr_SetString(PyExc_SyntaxError,
6778 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006779 symtable_error(st, n->n_lineno);
6780 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006781 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006782 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006783 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006784 return;
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00006785
6786 case yield_expr:
6787 st->st_cur->ste_generator = 1;
6788 if (NCH(n)==2) {
6789 n = CHILD(n, 1);
6790 goto loop;
6791 }
6792 return;
6793
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006794 case dotted_as_name:
6795 if (NCH(n) == 3)
6796 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006797 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006798 else
6799 symtable_add_def(st,
6800 STR(CHILD(CHILD(n,
6801 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006802 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006803 return;
6804 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006805 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006806 return;
6807 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006808 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006809 return;
6810 default:
6811 if (NCH(n) == 0)
6812 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006813 if (NCH(n) == 1) {
6814 n = CHILD(n, 0);
6815 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006816 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006817 /* Should only occur for errors like x + 1 = 1,
6818 which will be caught in the next pass. */
6819 for (i = 0; i < NCH(n); ++i)
6820 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006821 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006822 }
6823}