blob: 045f966e7f6fa5b8ca04e094802886ece5ddd5ca [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011/* Compile an expression node to intermediate code */
12
Guido van Rossum3f5da241990-12-20 15:06:42 +000013/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +000014 XXX add __doc__ attribute == co_doc to code object attributes?
15 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +000016 XXX Generate simple jump for break/return outside 'try...finally'
Guido van Rossum8b993a91997-01-17 21:04:03 +000017 XXX Allow 'continue' inside try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +000018 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +000019 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000020*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000021
Guido van Rossum8ff077b1996-08-24 06:21:31 +000022#ifndef NO_PRIVATE_NAME_MANGLING
23#define PRIVATE_NAME_MANGLING
24#endif
25
Guido van Rossum79f25d91997-04-29 20:08:16 +000026#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000027
Guido van Rossum10dc2e81990-11-18 17:27:39 +000028#include "node.h"
29#include "token.h"
30#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000031#include "compile.h"
32#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000033#include "structmember.h"
Fred Drakedcf08e02000-08-15 15:49:44 +000034#include "osdefs.h" /* SEP */
Guido van Rossum3f5da241990-12-20 15:06:42 +000035
36#include <ctype.h>
Jack Jansen41aa8e52000-07-03 21:39:47 +000037#ifdef HAVE_LIMITS_H
38#include <limits.h>
39#endif
Guido van Rossum282914b1991-04-04 10:42:56 +000040
Guido van Rossumb05a5c71997-05-07 17:46:13 +000041/* Three symbols from graminit.h are also defined in Python.h, with
42 Py_ prefixes to their names. Python.h can't include graminit.h
43 (which defines too many confusing symbols), but we can check here
44 that they haven't changed (which is very unlikely, but possible). */
45#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000046 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000047#endif
48#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000049 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000050#endif
51#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000052 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000053#endif
54
Guido van Rossum8e793d91997-03-03 19:13:14 +000055int Py_OptimizeFlag = 0;
56
Guido van Rossum8861b741996-07-30 16:49:37 +000057#define OP_DELETE 0
58#define OP_ASSIGN 1
59#define OP_APPLY 2
60
Guido van Rossum79f25d91997-04-29 20:08:16 +000061#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000062
63static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000064 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
65 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000066 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000067 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000068 {"co_code", T_OBJECT, OFF(co_code), READONLY},
69 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
70 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000071 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000072 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000073 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000074 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
75 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000076 {NULL} /* Sentinel */
77};
78
Guido van Rossum79f25d91997-04-29 20:08:16 +000079static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000080code_getattr(PyCodeObject *co, char *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +000081{
Guido van Rossum79f25d91997-04-29 20:08:16 +000082 return PyMember_Get((char *)co, code_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +000083}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000084
85static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000086code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +000087{
Guido van Rossum79f25d91997-04-29 20:08:16 +000088 Py_XDECREF(co->co_code);
89 Py_XDECREF(co->co_consts);
90 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +000091 Py_XDECREF(co->co_varnames);
Guido van Rossum79f25d91997-04-29 20:08:16 +000092 Py_XDECREF(co->co_filename);
93 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +000094 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +000095 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +000096}
97
Guido van Rossum79f25d91997-04-29 20:08:16 +000098static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000099code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000100{
101 char buf[500];
102 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000103 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000104 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000105
Guido van Rossuma396a882000-04-07 01:21:36 +0000106 if (co->co_firstlineno != 0)
107 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000108 if (co->co_filename && PyString_Check(co->co_filename))
109 filename = PyString_AsString(co->co_filename);
110 if (co->co_name && PyString_Check(co->co_name))
111 name = PyString_AsString(co->co_name);
Fred Drake615ae552000-06-30 16:20:13 +0000112 sprintf(buf, "<code object %.100s at %p, file \"%.300s\", line %d>",
113 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000114 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000115}
116
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000117static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000118code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000119{
120 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000121 cmp = PyObject_Compare(co->co_name, cp->co_name);
122 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000123 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000124 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000125 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000126 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000127 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000128 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000129 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000130 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000131 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000132 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000133 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000134 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000135 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000136 return cmp;
137}
138
139static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000140code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000141{
Guido van Rossum44679592000-04-10 16:20:31 +0000142 long h, h0, h1, h2, h3, h4;
143 h0 = PyObject_Hash(co->co_name);
144 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000145 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000146 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000147 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000148 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000149 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000150 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000151 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000152 if (h4 == -1) return -1;
Guido van Rossum44679592000-04-10 16:20:31 +0000153 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000154 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000155 if (h == -1) h = -2;
156 return h;
157}
158
Guido van Rossum79f25d91997-04-29 20:08:16 +0000159PyTypeObject PyCode_Type = {
160 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000161 0,
162 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000163 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000164 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000165 (destructor)code_dealloc, /*tp_dealloc*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000166 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000167 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000168 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000169 (cmpfunc)code_compare, /*tp_compare*/
170 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000171 0, /*tp_as_number*/
172 0, /*tp_as_sequence*/
173 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000174 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000175};
176
Guido van Rossum644a12b1997-04-09 19:24:53 +0000177#define NAME_CHARS \
178 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
179
Guido van Rossum79f25d91997-04-29 20:08:16 +0000180PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000181PyCode_New(int argcount, int nlocals, int stacksize, int flags,
182 PyObject *code, PyObject *consts, PyObject *names,
183 PyObject *varnames, PyObject *filename, PyObject *name,
184 int firstlineno, PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000185{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000186 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000187 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000188 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000189 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000190 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000191 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000192 consts == NULL || !PyTuple_Check(consts) ||
193 names == NULL || !PyTuple_Check(names) ||
194 varnames == NULL || !PyTuple_Check(varnames) ||
195 name == NULL || !PyString_Check(name) ||
196 filename == NULL || !PyString_Check(filename) ||
197 lnotab == NULL || !PyString_Check(lnotab)) {
198 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000199 return NULL;
200 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000201 pb = code->ob_type->tp_as_buffer;
202 if (pb == NULL ||
203 pb->bf_getreadbuffer == NULL ||
204 pb->bf_getsegcount == NULL ||
205 (*pb->bf_getsegcount)(code, NULL) != 1)
206 {
207 PyErr_BadInternalCall();
208 return NULL;
209 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000210 /* Make sure names and varnames are all strings, & intern them */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000211 for (i = PyTuple_Size(names); --i >= 0; ) {
212 PyObject *v = PyTuple_GetItem(names, i);
213 if (v == NULL || !PyString_Check(v)) {
214 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000215 return NULL;
216 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000217 PyString_InternInPlace(&PyTuple_GET_ITEM(names, i));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000218 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000219 for (i = PyTuple_Size(varnames); --i >= 0; ) {
220 PyObject *v = PyTuple_GetItem(varnames, i);
221 if (v == NULL || !PyString_Check(v)) {
222 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000223 return NULL;
224 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000225 PyString_InternInPlace(&PyTuple_GET_ITEM(varnames, i));
226 }
227 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000228 for (i = PyTuple_Size(consts); --i >= 0; ) {
229 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000230 char *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000231 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000232 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000233 p = PyString_AsString(v);
Guido van Rossum582acec2000-06-28 22:07:35 +0000234 if (strspn(p, NAME_CHARS)
235 != (size_t)PyString_Size(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000236 continue;
237 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000238 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000239 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000240 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000241 co->co_argcount = argcount;
242 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000243 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000244 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000245 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000246 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000247 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000248 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000249 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000250 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000251 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000252 co->co_varnames = varnames;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000253 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000254 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000255 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000256 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000257 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000258 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000259 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000260 }
261 return co;
262}
263
264
265/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000266
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000267struct compiling {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000268 PyObject *c_code; /* string */
269 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000270 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000271 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000272 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000273 PyObject *c_globals; /* dictionary (value=None) */
274 PyObject *c_locals; /* dictionary (value=localID) */
275 PyObject *c_varnames; /* list (inverse of c_locals) */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000276 int c_nlocals; /* index of next local */
277 int c_argcount; /* number of top-level arguments */
278 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000279 int c_nexti; /* index into c_code */
280 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000281 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000282 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000283 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000284 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000285 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000286 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000287 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000288 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000289 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000290 int c_stacklevel; /* Current stack level */
291 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000292 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000293 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000294 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000295#ifdef PRIVATE_NAME_MANGLING
296 char *c_private; /* for private name mangling */
297#endif
Skip Montanaro803d6e52000-08-12 18:09:51 +0000298 int c_tmpname; /* temporary local name counter */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000299};
300
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000301
Guido van Rossum452a9831996-09-17 14:32:04 +0000302/* Error message including line number */
303
304static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000305com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000306{
Guido van Rossum582acec2000-06-28 22:07:35 +0000307 size_t n = strlen(msg);
Fred Drakedcf08e02000-08-15 15:49:44 +0000308 PyObject *v, *tb, *tmp;
Guido van Rossum452a9831996-09-17 14:32:04 +0000309 char *s;
Guido van Rossum635abd21997-01-06 22:56:52 +0000310 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000311 if (c->c_lineno <= 1) {
312 /* Unknown line number or single interactive command */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000313 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000314 return;
315 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000316 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000317 if (v == NULL)
318 return; /* MemoryError, too bad */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000319 PyErr_SetObject(exc, v);
320 Py_DECREF(v);
Fred Drakedcf08e02000-08-15 15:49:44 +0000321
322 /* add attributes for the line number and filename for the error */
323 PyErr_Fetch(&exc, &v, &tb);
324 PyErr_NormalizeException(&exc, &v, &tb);
325 tmp = PyInt_FromLong(c->c_lineno);
326 if (tmp == NULL)
327 PyErr_Clear();
328 else {
329 if (PyObject_SetAttrString(v, "lineno", tmp))
330 PyErr_Clear();
331 Py_DECREF(tmp);
332 }
333 if (c->c_filename != NULL) {
334 tmp = PyString_FromString(c->c_filename);
335 if (tmp == NULL)
336 PyErr_Clear();
337 else {
338 if (PyObject_SetAttrString(v, "filename", tmp))
339 PyErr_Clear();
340 Py_DECREF(tmp);
341 }
342 }
343 PyErr_Restore(exc, v, tb);
Guido van Rossum452a9831996-09-17 14:32:04 +0000344}
345
346
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000347/* Interface to the block stack */
348
349static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000350block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000351{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000352 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000353 com_error(c, PyExc_SystemError,
354 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000355 }
356 else {
357 c->c_block[c->c_nblocks++] = type;
358 }
359}
360
361static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000362block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000363{
364 if (c->c_nblocks > 0)
365 c->c_nblocks--;
366 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000367 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000368 }
369}
370
371
Guido van Rossum681d79a1995-07-18 14:51:37 +0000372/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000373
Tim Petersdbd9ba62000-07-09 03:09:57 +0000374static int com_init(struct compiling *, char *);
375static void com_free(struct compiling *);
376static void com_push(struct compiling *, int);
377static void com_pop(struct compiling *, int);
378static void com_done(struct compiling *);
379static void com_node(struct compiling *, struct _node *);
380static void com_factor(struct compiling *, struct _node *);
381static void com_addbyte(struct compiling *, int);
382static void com_addint(struct compiling *, int);
383static void com_addoparg(struct compiling *, int, int);
384static void com_addfwref(struct compiling *, int, int *);
385static void com_backpatch(struct compiling *, int);
386static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
387static int com_addconst(struct compiling *, PyObject *);
388static int com_addname(struct compiling *, PyObject *);
389static void com_addopname(struct compiling *, int, node *);
390static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000391static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000392static int com_argdefs(struct compiling *, node *);
393static int com_newlocal(struct compiling *, char *);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000394static void com_assign(struct compiling *, node *, int);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000395static PyCodeObject *icompile(struct _node *, struct compiling *);
396static PyCodeObject *jcompile(struct _node *, char *,
397 struct compiling *);
398static PyObject *parsestrplus(node *);
399static PyObject *parsestr(char *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000400
401static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000402com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000403{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000404 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000405 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
406 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000407 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000408 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000409 goto fail;
410 if ((c->c_const_dict = PyDict_New()) == NULL)
411 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000412 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000413 goto fail;
414 if ((c->c_name_dict = PyDict_New()) == NULL)
415 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000416 if ((c->c_globals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000417 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000418 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000419 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000420 if ((c->c_varnames = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000421 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000422 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
423 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000424 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000425 c->c_nlocals = 0;
426 c->c_argcount = 0;
427 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000428 c->c_nexti = 0;
429 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000430 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000431 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000432 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000433 c->c_begin = 0;
434 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000435 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000436 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000437 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000438 c->c_stacklevel = 0;
439 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000440 c->c_firstlineno = 0;
441 c->c_last_addr = 0;
442 c->c_last_line = 0;
443 c-> c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000444 c->c_tmpname = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000445 return 1;
446
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000447 fail:
448 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000449 return 0;
450}
451
452static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000453com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000454{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000455 Py_XDECREF(c->c_code);
456 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000457 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000458 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000459 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000460 Py_XDECREF(c->c_globals);
461 Py_XDECREF(c->c_locals);
462 Py_XDECREF(c->c_varnames);
463 Py_XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000464}
465
466static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000467com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000468{
469 c->c_stacklevel += n;
470 if (c->c_stacklevel > c->c_maxstacklevel)
471 c->c_maxstacklevel = c->c_stacklevel;
472}
473
474static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000475com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000476{
477 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000478 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000479 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
480 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000481 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000482 c->c_stacklevel = 0;
483 }
484 else
485 c->c_stacklevel -= n;
486}
487
488static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000489com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000490{
491 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000492 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000493 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000494 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000495}
496
497static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000498com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000499{
500 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000501 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000502 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000503 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000504 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000505 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000506 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000507 com_error(c, PyExc_SystemError,
508 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000509 }
510 if (c->c_code == NULL)
511 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000512 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000513 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000514 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000515 c->c_errors++;
516 return;
517 }
518 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000519 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000520}
521
522static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000523com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000524{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000525 com_addbyte(c, x & 0xff);
526 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000527}
528
529static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000530com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000531{
532 int size;
533 char *p;
534 if (c->c_lnotab == NULL)
535 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000536 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000537 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000538 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000539 c->c_errors++;
540 return;
541 }
542 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000543 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000544 *p++ = addr;
545 *p++ = line;
546 c->c_lnotab_next += 2;
547}
548
549static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000550com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000551{
552 c->c_lineno = lineno;
553 if (c->c_firstlineno == 0) {
554 c->c_firstlineno = c->c_last_line = lineno;
555 }
556 else {
557 int incr_addr = c->c_nexti - c->c_last_addr;
558 int incr_line = lineno - c->c_last_line;
559 while (incr_addr > 0 || incr_line > 0) {
560 int trunc_addr = incr_addr;
561 int trunc_line = incr_line;
562 if (trunc_addr > 255)
563 trunc_addr = 255;
564 if (trunc_line > 255)
565 trunc_line = 255;
566 com_add_lnotab(c, trunc_addr, trunc_line);
567 incr_addr -= trunc_addr;
568 incr_line -= trunc_line;
569 }
570 c->c_last_addr = c->c_nexti;
571 c->c_last_line = lineno;
572 }
573}
574
575static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000576com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000577{
Guido van Rossum8e793d91997-03-03 19:13:14 +0000578 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000579 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000580 if (Py_OptimizeFlag)
581 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000582 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000583 com_addbyte(c, op);
584 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000585}
586
587static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000588com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000589{
590 /* Compile a forward reference for backpatching */
591 int here;
592 int anchor;
593 com_addbyte(c, op);
594 here = c->c_nexti;
595 anchor = *p_anchor;
596 *p_anchor = here;
597 com_addint(c, anchor == 0 ? 0 : here - anchor);
598}
599
600static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000601com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000602{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000603 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000604 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000605 int dist;
606 int prev;
607 for (;;) {
608 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000609 prev = code[anchor] + (code[anchor+1] << 8);
610 dist = target - (anchor+2);
611 code[anchor] = dist & 0xff;
612 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000613 if (!prev)
614 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000615 anchor -= prev;
616 }
617}
618
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000619/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000620
621static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000622com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000623{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000624 PyObject *w, *t, *np=NULL;
625 long n;
626
627 t = Py_BuildValue("(OO)", v, v->ob_type);
628 if (t == NULL)
629 goto fail;
630 w = PyDict_GetItem(dict, t);
631 if (w != NULL) {
632 n = PyInt_AsLong(w);
633 } else {
634 n = PyList_Size(list);
635 np = PyInt_FromLong(n);
636 if (np == NULL)
637 goto fail;
638 if (PyList_Append(list, v) != 0)
639 goto fail;
640 if (PyDict_SetItem(dict, t, np) != 0)
641 goto fail;
642 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000643 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000644 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000645 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000646 fail:
647 Py_XDECREF(np);
648 Py_XDECREF(t);
649 c->c_errors++;
650 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000651}
652
653static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000654com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000655{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000656 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000657}
658
659static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000660com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000661{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000662 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000663}
664
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000665#ifdef PRIVATE_NAME_MANGLING
666static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000667com_mangle(struct compiling *c, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000668{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000669 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000670 This is independent from how the name is used. */
671 char *p;
Guido van Rossum582acec2000-06-28 22:07:35 +0000672 size_t nlen, plen;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000673 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000674 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000675 return 0; /* Don't mangle __extremely_long_names */
676 if (name[nlen-1] == '_' && name[nlen-2] == '_')
677 return 0; /* Don't mangle __whatever__ */
678 p = c->c_private;
679 /* Strip leading underscores from class name */
680 while (*p == '_')
681 p++;
682 if (*p == '\0')
683 return 0; /* Don't mangle if class is just underscores */
684 plen = strlen(p);
685 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000686 plen = maxlen-nlen-2; /* Truncate class name if too long */
687 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000688 buffer[0] = '_';
689 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000690 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000691 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
692 return 1;
693}
694#endif
695
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000696static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000697com_addopnamestr(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000698{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000699 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000700 int i;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000701#ifdef PRIVATE_NAME_MANGLING
702 char buffer[256];
703 if (name != NULL && name[0] == '_' && name[1] == '_' &&
704 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +0000705 com_mangle(c, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000706 name = buffer;
707#endif
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000708 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000709 c->c_errors++;
710 i = 255;
711 }
712 else {
713 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000714 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000715 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000716 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
717 switch (op) {
718 case LOAD_NAME:
719 case STORE_NAME:
720 case DELETE_NAME:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000721 if (PyDict_GetItemString(c->c_globals, name) != NULL) {
Guido van Rossumc5e96291991-12-10 13:53:51 +0000722 switch (op) {
723 case LOAD_NAME: op = LOAD_GLOBAL; break;
724 case STORE_NAME: op = STORE_GLOBAL; break;
725 case DELETE_NAME: op = DELETE_GLOBAL; break;
726 }
727 }
728 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000729 com_addoparg(c, op, i);
730}
731
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000732static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000733com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000734{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000735 char *name;
736 char buffer[1000];
737 /* XXX it is possible to write this code without the 1000
738 chars on the total length of dotted names, I just can't be
739 bothered right now */
740 if (TYPE(n) == STAR)
741 name = "*";
742 else if (TYPE(n) == dotted_name) {
743 char *p = buffer;
744 int i;
745 name = buffer;
746 for (i = 0; i < NCH(n); i += 2) {
747 char *s = STR(CHILD(n, i));
748 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000749 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000750 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000751 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000752 break;
753 }
754 if (p != buffer)
755 *p++ = '.';
756 strcpy(p, s);
757 p = strchr(p, '\0');
758 }
759 }
760 else {
761 REQ(n, NAME);
762 name = STR(n);
763 }
764 com_addopnamestr(c, op, name);
765}
766
Guido van Rossum79f25d91997-04-29 20:08:16 +0000767static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000768parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000769{
Tim Petersdbd9ba62000-07-09 03:09:57 +0000770 extern double atof(const char *);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000771 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000772 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000773 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +0000774#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000775 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000776 int imflag;
777#endif
778
Guido van Rossum282914b1991-04-04 10:42:56 +0000779 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000780 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000781#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000782 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000783#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000784 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000785 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000786 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000787 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000788 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000789 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000790 if (*end == '\0') {
791 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000792 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000793 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000794 return NULL;
795 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000796 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000797 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000798 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000799#ifndef WITHOUT_COMPLEX
800 if (imflag) {
801 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000802 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +0000803 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000804 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000805 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +0000806 }
Guido van Rossumac1fc951997-10-08 15:23:55 +0000807 else
Guido van Rossum50564e81996-01-12 01:13:16 +0000808#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +0000809 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000810 PyFPE_START_PROTECT("atof", return 0)
811 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000812 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000813 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000814 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000815}
816
Guido van Rossum79f25d91997-04-29 20:08:16 +0000817static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000818parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000819{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000820 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +0000821 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000822 char *buf;
823 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000824 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000825 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +0000826 int first = *s;
827 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000828 int rawmode = 0;
829 int unicode = 0;
830 if (isalpha(quote) || quote == '_') {
831 if (quote == 'u' || quote == 'U') {
832 quote = *++s;
833 unicode = 1;
834 }
835 if (quote == 'r' || quote == 'R') {
836 quote = *++s;
837 rawmode = 1;
838 }
839 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000840 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000841 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000842 return NULL;
843 }
844 s++;
845 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +0000846 if (len > INT_MAX) {
847 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
848 return NULL;
849 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000850 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000851 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000852 return NULL;
853 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000854 if (len >= 4 && s[0] == quote && s[1] == quote) {
855 s += 2;
856 len -= 2;
857 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000858 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000859 return NULL;
860 }
861 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +0000862 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000863 if (rawmode)
864 return PyUnicode_DecodeRawUnicodeEscape(
865 s, len, NULL);
866 else
867 return PyUnicode_DecodeUnicodeEscape(
868 s, len, NULL);
869 }
870 else if (rawmode || strchr(s, '\\') == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000871 return PyString_FromStringAndSize(s, len);
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000872 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000873 v = PyString_FromStringAndSize((char *)NULL, len);
874 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000875 end = s + len;
876 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000877 if (*s != '\\') {
878 *p++ = *s++;
879 continue;
880 }
881 s++;
882 switch (*s++) {
883 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000884 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000885 case '\\': *p++ = '\\'; break;
886 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000887 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000888 case 'b': *p++ = '\b'; break;
889 case 'f': *p++ = '\014'; break; /* FF */
890 case 't': *p++ = '\t'; break;
891 case 'n': *p++ = '\n'; break;
892 case 'r': *p++ = '\r'; break;
893 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000894 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
895 case '0': case '1': case '2': case '3':
896 case '4': case '5': case '6': case '7':
897 c = s[-1] - '0';
898 if ('0' <= *s && *s <= '7') {
899 c = (c<<3) + *s++ - '0';
900 if ('0' <= *s && *s <= '7')
901 c = (c<<3) + *s++ - '0';
902 }
903 *p++ = c;
904 break;
905 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000906 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000907 unsigned int x = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000908 do {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000909 c = Py_CHARMASK(*s);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000910 s++;
Guido van Rossumed1100f1997-10-20 23:24:07 +0000911 x = (x<<4) & ~0xF;
912 if (isdigit(c))
913 x += c - '0';
914 else if (islower(c))
915 x += 10 + c - 'a';
916 else
917 x += 10 + c - 'A';
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000918 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossumed1100f1997-10-20 23:24:07 +0000919 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000920 break;
921 }
922 /* FALLTHROUGH */
923 default: *p++ = '\\'; *p++ = s[-1]; break;
924 }
925 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000926 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000927 return v;
928}
929
Guido van Rossum79f25d91997-04-29 20:08:16 +0000930static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000931parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000932{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000933 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000934 int i;
935 REQ(CHILD(n, 0), STRING);
936 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
937 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +0000938 for (i = 1; i < NCH(n); i++) {
939 PyObject *s;
940 s = parsestr(STR(CHILD(n, i)));
941 if (s == NULL)
942 goto onError;
943 if (PyString_Check(v) && PyString_Check(s)) {
944 PyString_ConcatAndDel(&v, s);
945 if (v == NULL)
946 goto onError;
947 }
948 else {
949 PyObject *temp;
950 temp = PyUnicode_Concat(v, s);
951 Py_DECREF(s);
952 if (temp == NULL)
953 goto onError;
954 Py_DECREF(v);
955 v = temp;
956 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000957 }
958 }
959 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +0000960
961 onError:
962 Py_XDECREF(v);
963 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000964}
965
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000966static void
Skip Montanaro803d6e52000-08-12 18:09:51 +0000967com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000968{
Skip Montanaro803d6e52000-08-12 18:09:51 +0000969 PyObject *v;
970 int anchor = 0;
971 int save_begin = c->c_begin;
972
973 /* list_iter: for v in expr [list_iter] */
974 com_node(c, CHILD(n, 3)); /* expr */
975 v = PyInt_FromLong(0L);
976 if (v == NULL)
977 c->c_errors++;
978 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
979 com_push(c, 1);
980 Py_XDECREF(v);
981 c->c_begin = c->c_nexti;
982 com_addoparg(c, SET_LINENO, n->n_lineno);
983 com_addfwref(c, FOR_LOOP, &anchor);
984 com_push(c, 1);
985 com_assign(c, CHILD(n, 1), OP_ASSIGN);
986 c->c_loops++;
987 com_list_iter(c, n, e, t);
988 c->c_loops--;
989 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
990 c->c_begin = save_begin;
991 com_backpatch(c, anchor);
992 com_pop(c, 2); /* FOR_LOOP has popped these */
993}
994
995static void
996com_list_if(struct compiling *c, node *n, node *e, char *t)
997{
998 int anchor = 0;
999 int a = 0;
1000 /* list_iter: 'if' test [list_iter] */
1001 com_addoparg(c, SET_LINENO, n->n_lineno);
1002 com_node(c, CHILD(n, 1));
1003 com_addfwref(c, JUMP_IF_FALSE, &a);
1004 com_addbyte(c, POP_TOP);
1005 com_pop(c, 1);
1006 com_list_iter(c, n, e, t);
1007 com_addfwref(c, JUMP_FORWARD, &anchor);
1008 com_backpatch(c, a);
1009 /* We jump here with an extra entry which we now pop */
1010 com_addbyte(c, POP_TOP);
1011 com_backpatch(c, anchor);
1012}
1013
1014static void
1015com_list_iter(struct compiling *c,
1016 node *p, /* parent of list_iter node */
1017 node *e, /* element expression node */
1018 char *t /* name of result list temp local */)
1019{
1020 /* list_iter is the last child in a listmaker, list_for, or list_if */
1021 node *n = CHILD(p, NCH(p)-1);
1022 if (TYPE(n) == list_iter) {
1023 n = CHILD(n, 0);
1024 switch (TYPE(n)) {
1025 case list_for:
1026 com_list_for(c, n, e, t);
1027 break;
1028 case list_if:
1029 com_list_if(c, n, e, t);
1030 break;
1031 default:
1032 com_error(c, PyExc_SystemError,
1033 "invalid list_iter node type");
1034 }
1035 }
1036 else {
1037 com_addopnamestr(c, LOAD_NAME, t);
1038 com_push(c, 1);
1039 com_node(c, e);
1040 com_addoparg(c, CALL_FUNCTION, 1);
1041 com_addbyte(c, POP_TOP);
1042 com_pop(c, 2);
1043 }
1044}
1045
1046static void
1047com_list_comprehension(struct compiling *c, node *n)
1048{
1049 /* listmaker: test list_iter */
1050 char tmpname[12];
1051 sprintf(tmpname, "__%d__", ++c->c_tmpname);
1052 com_addoparg(c, BUILD_LIST, 0);
1053 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1054 com_push(c, 2);
1055 com_addopnamestr(c, LOAD_ATTR, "append");
1056 com_addopnamestr(c, STORE_NAME, tmpname);
1057 com_pop(c, 1);
1058 com_list_iter(c, n, CHILD(n, 0), tmpname);
1059 com_addopnamestr(c, DELETE_NAME, tmpname);
1060 --c->c_tmpname;
1061}
1062
1063static void
1064com_listmaker(struct compiling *c, node *n)
1065{
1066 /* listmaker: test ( list_iter | (',' test)* [','] ) */
Thomas Wouters87df80d2000-08-13 17:05:17 +00001067 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_iter)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001068 com_list_comprehension(c, n);
1069 else {
1070 int len = 0;
1071 int i;
1072 for (i = 0; i < NCH(n); i += 2, len++)
1073 com_node(c, CHILD(n, i));
1074 com_addoparg(c, BUILD_LIST, len);
1075 com_pop(c, len-1);
1076 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001077}
1078
1079static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001080com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001081{
1082 int i;
1083 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1084 for (i = 0; i+2 < NCH(n); i += 4) {
1085 /* We must arrange things just right for STORE_SUBSCR.
1086 It wants the stack to look like (value) (dict) (key) */
1087 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001088 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001089 com_node(c, CHILD(n, i+2)); /* value */
1090 com_addbyte(c, ROT_TWO);
1091 com_node(c, CHILD(n, i)); /* key */
1092 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001093 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001094 }
1095}
1096
1097static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001098com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001099{
1100 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001101 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001102 int i;
1103 REQ(n, atom);
1104 ch = CHILD(n, 0);
1105 switch (TYPE(ch)) {
1106 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001107 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001108 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001109 com_push(c, 1);
1110 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001111 else
1112 com_node(c, CHILD(n, 1));
1113 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001114 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001115 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001116 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001117 com_push(c, 1);
1118 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001119 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001120 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001121 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001122 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001123 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001124 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001125 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001126 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001127 break;
1128 case BACKQUOTE:
1129 com_node(c, CHILD(n, 1));
1130 com_addbyte(c, UNARY_CONVERT);
1131 break;
1132 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001133 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001134 i = 255;
1135 }
1136 else {
1137 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001138 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001139 }
1140 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001141 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001142 break;
1143 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001144 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001145 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001146 c->c_errors++;
1147 i = 255;
1148 }
1149 else {
1150 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001151 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001152 }
1153 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001154 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001155 break;
1156 case NAME:
1157 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001158 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001159 break;
1160 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001161 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001162 com_error(c, PyExc_SystemError,
1163 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001164 }
1165}
1166
1167static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001168com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001169{
1170 if (NCH(n) == 1) {
1171 com_addbyte(c, op);
1172 }
1173 else if (NCH(n) == 2) {
1174 if (TYPE(CHILD(n, 0)) != COLON) {
1175 com_node(c, CHILD(n, 0));
1176 com_addbyte(c, op+1);
1177 }
1178 else {
1179 com_node(c, CHILD(n, 1));
1180 com_addbyte(c, op+2);
1181 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001182 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001183 }
1184 else {
1185 com_node(c, CHILD(n, 0));
1186 com_node(c, CHILD(n, 2));
1187 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001188 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001189 }
1190}
1191
Guido van Rossum635abd21997-01-06 22:56:52 +00001192static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001193com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001194{
1195 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001196 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001197 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001198 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001199 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001200 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001201 }
1202 else {
1203 com_node(c, CHILD(n, 0));
1204 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001205 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001206 }
1207 m = n;
1208 do {
1209 m = CHILD(m, 0);
1210 } while (NCH(m) == 1);
1211 if (TYPE(m) != NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001212 com_error(c, PyExc_SyntaxError,
1213 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001214 }
1215 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001216 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001217 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001218 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001219 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001220 c->c_errors++;
1221 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001222 if (PyDict_GetItem(*pkeywords, v) != NULL)
1223 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001224 "duplicate keyword argument");
1225 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001226 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001227 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001228 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001229 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001230 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001231 }
1232 }
1233 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001234}
1235
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001236static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001237com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001238{
1239 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001240 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001241 }
1242 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001243 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001244 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001245 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001246 int star_flag = 0;
1247 int starstar_flag = 0;
1248 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001249 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001250 na = 0;
1251 nk = 0;
1252 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001253 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001254 if (TYPE(ch) == STAR ||
1255 TYPE(ch) == DOUBLESTAR)
1256 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001257 if (ch->n_lineno != lineno) {
1258 lineno = ch->n_lineno;
1259 com_addoparg(c, SET_LINENO, lineno);
1260 }
1261 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001262 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001263 na++;
1264 else
1265 nk++;
1266 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001267 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001268 while (i < NCH(n)) {
1269 node *tok = CHILD(n, i);
1270 node *ch = CHILD(n, i+1);
1271 i += 3;
1272 switch (TYPE(tok)) {
1273 case STAR: star_flag = 1; break;
1274 case DOUBLESTAR: starstar_flag = 1; break;
1275 }
1276 com_node(c, ch);
1277 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001278 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001279 com_error(c, PyExc_SyntaxError,
1280 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001281 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001282 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001283 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001284 star_flag + (starstar_flag << 1);
1285 else
1286 opcode = CALL_FUNCTION;
1287 com_addoparg(c, opcode, na | (nk << 8));
1288 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001289 }
1290}
1291
1292static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001293com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001294{
1295 com_addopname(c, LOAD_ATTR, n);
1296}
1297
1298static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001299com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001300{
1301 int i=0;
1302 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001303 node *ch;
1304
1305 /* first argument */
1306 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001307 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001308 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001309 i++;
1310 }
1311 else {
1312 com_node(c, CHILD(n,i));
1313 i++;
1314 REQ(CHILD(n,i),COLON);
1315 i++;
1316 }
1317 /* second argument */
1318 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1319 com_node(c, CHILD(n,i));
1320 i++;
1321 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001322 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001323 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001324 com_push(c, 1);
1325 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001326 /* remaining arguments */
1327 for (; i < NCH(n); i++) {
1328 ns++;
1329 ch=CHILD(n,i);
1330 REQ(ch, sliceop);
1331 if (NCH(ch) == 1) {
1332 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001333 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001334 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001335 }
1336 else
1337 com_node(c, CHILD(ch,1));
1338 }
1339 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001340 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001341}
1342
1343static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001344com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001345{
1346 node *ch;
1347 REQ(n, subscript);
1348 ch = CHILD(n,0);
1349 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001350 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001351 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001352 com_push(c, 1);
1353 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001354 else {
1355 /* check for slice */
1356 if ((TYPE(ch) == COLON || NCH(n) > 1))
1357 com_sliceobj(c, n);
1358 else {
1359 REQ(ch, test);
1360 com_node(c, ch);
1361 }
1362 }
1363}
1364
1365static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001366com_subscriptlist(struct compiling *c, node *n, int assigning)
Guido van Rossum8861b741996-07-30 16:49:37 +00001367{
1368 int i, op;
1369 REQ(n, subscriptlist);
1370 /* Check to make backward compatible slice behavior for '[i:j]' */
1371 if (NCH(n) == 1) {
1372 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001373 /* 'Basic' slice, should have exactly one colon. */
1374 if ((TYPE(CHILD(sub, 0)) == COLON
1375 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1376 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1377 {
Guido van Rossum8861b741996-07-30 16:49:37 +00001378 if (assigning == OP_APPLY)
1379 op = SLICE;
1380 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001381 op = ((assigning == OP_ASSIGN) ?
1382 STORE_SLICE : DELETE_SLICE);
Guido van Rossum8861b741996-07-30 16:49:37 +00001383 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001384 if (op == STORE_SLICE)
1385 com_pop(c, 2);
1386 else if (op == DELETE_SLICE)
1387 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001388 return;
1389 }
1390 }
1391 /* Else normal subscriptlist. Compile each subscript. */
1392 for (i = 0; i < NCH(n); i += 2)
1393 com_subscript(c, CHILD(n, i));
1394 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001395 if (NCH(n) > 1) {
1396 i = (NCH(n)+1) / 2;
1397 com_addoparg(c, BUILD_TUPLE, i);
1398 com_pop(c, i-1);
1399 }
1400 if (assigning == OP_APPLY) {
Guido van Rossum8861b741996-07-30 16:49:37 +00001401 op = BINARY_SUBSCR;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001402 i = 1;
1403 }
1404 else if (assigning == OP_ASSIGN) {
1405 op = STORE_SUBSCR;
1406 i = 3;
1407 }
1408 else {
1409 op = DELETE_SUBSCR;
1410 i = 2;
1411 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001412 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001413 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001414}
1415
1416static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001417com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001418{
1419 REQ(n, trailer);
1420 switch (TYPE(CHILD(n, 0))) {
1421 case LPAR:
1422 com_call_function(c, CHILD(n, 1));
1423 break;
1424 case DOT:
1425 com_select_member(c, CHILD(n, 1));
1426 break;
1427 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001428 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001429 break;
1430 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001431 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001432 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001433 }
1434}
1435
1436static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001437com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001438{
1439 int i;
1440 REQ(n, power);
1441 com_atom(c, CHILD(n, 0));
1442 for (i = 1; i < NCH(n); i++) {
1443 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1444 com_factor(c, CHILD(n, i+1));
1445 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001446 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001447 break;
1448 }
1449 else
1450 com_apply_trailer(c, CHILD(n, i));
1451 }
1452}
1453
1454static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001455com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001456{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001457 REQ(n, factor);
1458 if (TYPE(CHILD(n, 0)) == PLUS) {
1459 com_factor(c, CHILD(n, 1));
1460 com_addbyte(c, UNARY_POSITIVE);
1461 }
1462 else if (TYPE(CHILD(n, 0)) == MINUS) {
1463 com_factor(c, CHILD(n, 1));
1464 com_addbyte(c, UNARY_NEGATIVE);
1465 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001466 else if (TYPE(CHILD(n, 0)) == TILDE) {
1467 com_factor(c, CHILD(n, 1));
1468 com_addbyte(c, UNARY_INVERT);
1469 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001470 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001471 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001472 }
1473}
1474
1475static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001476com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001477{
1478 int i;
1479 int op;
1480 REQ(n, term);
1481 com_factor(c, CHILD(n, 0));
1482 for (i = 2; i < NCH(n); i += 2) {
1483 com_factor(c, CHILD(n, i));
1484 switch (TYPE(CHILD(n, i-1))) {
1485 case STAR:
1486 op = BINARY_MULTIPLY;
1487 break;
1488 case SLASH:
1489 op = BINARY_DIVIDE;
1490 break;
1491 case PERCENT:
1492 op = BINARY_MODULO;
1493 break;
1494 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001495 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001496 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001497 op = 255;
1498 }
1499 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001500 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001501 }
1502}
1503
1504static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001505com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001506{
1507 int i;
1508 int op;
1509 REQ(n, arith_expr);
1510 com_term(c, CHILD(n, 0));
1511 for (i = 2; i < NCH(n); i += 2) {
1512 com_term(c, CHILD(n, i));
1513 switch (TYPE(CHILD(n, i-1))) {
1514 case PLUS:
1515 op = BINARY_ADD;
1516 break;
1517 case MINUS:
1518 op = BINARY_SUBTRACT;
1519 break;
1520 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001521 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001522 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001523 op = 255;
1524 }
1525 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001526 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001527 }
1528}
1529
1530static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001531com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001532{
1533 int i;
1534 int op;
1535 REQ(n, shift_expr);
1536 com_arith_expr(c, CHILD(n, 0));
1537 for (i = 2; i < NCH(n); i += 2) {
1538 com_arith_expr(c, CHILD(n, i));
1539 switch (TYPE(CHILD(n, i-1))) {
1540 case LEFTSHIFT:
1541 op = BINARY_LSHIFT;
1542 break;
1543 case RIGHTSHIFT:
1544 op = BINARY_RSHIFT;
1545 break;
1546 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001547 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001548 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001549 op = 255;
1550 }
1551 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001552 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001553 }
1554}
1555
1556static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001557com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001558{
1559 int i;
1560 int op;
1561 REQ(n, and_expr);
1562 com_shift_expr(c, CHILD(n, 0));
1563 for (i = 2; i < NCH(n); i += 2) {
1564 com_shift_expr(c, CHILD(n, i));
1565 if (TYPE(CHILD(n, i-1)) == AMPER) {
1566 op = BINARY_AND;
1567 }
1568 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001569 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001570 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001571 op = 255;
1572 }
1573 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001574 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001575 }
1576}
1577
1578static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001579com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001580{
1581 int i;
1582 int op;
1583 REQ(n, xor_expr);
1584 com_and_expr(c, CHILD(n, 0));
1585 for (i = 2; i < NCH(n); i += 2) {
1586 com_and_expr(c, CHILD(n, i));
1587 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1588 op = BINARY_XOR;
1589 }
1590 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001591 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001592 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001593 op = 255;
1594 }
1595 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001596 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001597 }
1598}
1599
1600static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001601com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001602{
1603 int i;
1604 int op;
1605 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001606 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001607 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001608 com_xor_expr(c, CHILD(n, i));
1609 if (TYPE(CHILD(n, i-1)) == VBAR) {
1610 op = BINARY_OR;
1611 }
1612 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001613 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001614 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001615 op = 255;
1616 }
1617 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001618 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001619 }
1620}
1621
1622static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001623cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001624{
1625 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001626 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001627 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1628 if (NCH(n) == 1) {
1629 n = CHILD(n, 0);
1630 switch (TYPE(n)) {
1631 case LESS: return LT;
1632 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001633 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001634 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001635 case LESSEQUAL: return LE;
1636 case GREATEREQUAL: return GE;
1637 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001638 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1639 if (strcmp(STR(n), "is") == 0) return IS;
1640 }
1641 }
1642 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001643 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001644 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1645 return NOT_IN;
1646 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1647 return IS_NOT;
1648 }
1649 }
1650 return BAD;
1651}
1652
1653static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001654com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001655{
1656 int i;
1657 enum cmp_op op;
1658 int anchor;
1659 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1660 com_expr(c, CHILD(n, 0));
1661 if (NCH(n) == 1)
1662 return;
1663
1664 /****************************************************************
1665 The following code is generated for all but the last
1666 comparison in a chain:
1667
1668 label: on stack: opcode: jump to:
1669
1670 a <code to load b>
1671 a, b DUP_TOP
1672 a, b, b ROT_THREE
1673 b, a, b COMPARE_OP
1674 b, 0-or-1 JUMP_IF_FALSE L1
1675 b, 1 POP_TOP
1676 b
1677
1678 We are now ready to repeat this sequence for the next
1679 comparison in the chain.
1680
1681 For the last we generate:
1682
1683 b <code to load c>
1684 b, c COMPARE_OP
1685 0-or-1
1686
1687 If there were any jumps to L1 (i.e., there was more than one
1688 comparison), we generate:
1689
1690 0-or-1 JUMP_FORWARD L2
1691 L1: b, 0 ROT_TWO
1692 0, b POP_TOP
1693 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001694 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001695 ****************************************************************/
1696
1697 anchor = 0;
1698
1699 for (i = 2; i < NCH(n); i += 2) {
1700 com_expr(c, CHILD(n, i));
1701 if (i+2 < NCH(n)) {
1702 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001703 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001704 com_addbyte(c, ROT_THREE);
1705 }
1706 op = cmp_type(CHILD(n, i-1));
1707 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001708 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001709 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001710 }
1711 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001712 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001713 if (i+2 < NCH(n)) {
1714 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1715 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001716 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001717 }
1718 }
1719
1720 if (anchor) {
1721 int anchor2 = 0;
1722 com_addfwref(c, JUMP_FORWARD, &anchor2);
1723 com_backpatch(c, anchor);
1724 com_addbyte(c, ROT_TWO);
1725 com_addbyte(c, POP_TOP);
1726 com_backpatch(c, anchor2);
1727 }
1728}
1729
1730static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001731com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001732{
1733 REQ(n, not_test); /* 'not' not_test | comparison */
1734 if (NCH(n) == 1) {
1735 com_comparison(c, CHILD(n, 0));
1736 }
1737 else {
1738 com_not_test(c, CHILD(n, 1));
1739 com_addbyte(c, UNARY_NOT);
1740 }
1741}
1742
1743static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001744com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001745{
1746 int i;
1747 int anchor;
1748 REQ(n, and_test); /* not_test ('and' not_test)* */
1749 anchor = 0;
1750 i = 0;
1751 for (;;) {
1752 com_not_test(c, CHILD(n, i));
1753 if ((i += 2) >= NCH(n))
1754 break;
1755 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1756 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001757 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001758 }
1759 if (anchor)
1760 com_backpatch(c, anchor);
1761}
1762
1763static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001764com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001765{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001766 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001767 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001768 PyObject *v;
Guido van Rossum57531fe1993-11-30 14:57:42 +00001769 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001770 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001771 v = (PyObject *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001772 if (v == NULL) {
1773 c->c_errors++;
1774 i = 255;
1775 }
1776 else {
1777 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001778 Py_DECREF(v);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001779 }
1780 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001781 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001782 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001783 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001784 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001785 else {
1786 int anchor = 0;
1787 int i = 0;
1788 for (;;) {
1789 com_and_test(c, CHILD(n, i));
1790 if ((i += 2) >= NCH(n))
1791 break;
1792 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1793 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001794 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001795 }
1796 if (anchor)
1797 com_backpatch(c, anchor);
1798 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001799}
1800
1801static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001802com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001803{
1804 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001805 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001806 com_node(c, CHILD(n, 0));
1807 }
1808 else {
1809 int i;
1810 int len;
1811 len = (NCH(n) + 1) / 2;
1812 for (i = 0; i < NCH(n); i += 2)
1813 com_node(c, CHILD(n, i));
1814 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001815 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001816 }
1817}
1818
1819
1820/* Begin of assignment compilation */
1821
Tim Petersdbd9ba62000-07-09 03:09:57 +00001822static void com_assign_name(struct compiling *, node *, int);
1823static void com_assign(struct compiling *, node *, int);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001824
1825static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001826com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001827{
1828 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001829 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001830}
1831
1832static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001833com_assign_trailer(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001834{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001835 REQ(n, trailer);
1836 switch (TYPE(CHILD(n, 0))) {
1837 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001838 com_error(c, PyExc_SyntaxError,
1839 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001840 break;
1841 case DOT: /* '.' NAME */
1842 com_assign_attr(c, CHILD(n, 1), assigning);
1843 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001844 case LSQB: /* '[' subscriptlist ']' */
1845 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001846 break;
1847 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001848 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001849 }
1850}
1851
1852static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001853com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001854{
1855 int i;
1856 if (TYPE(n) != testlist)
1857 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001858 if (assigning) {
1859 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001860 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001861 com_push(c, i-1);
1862 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001863 for (i = 0; i < NCH(n); i += 2)
1864 com_assign(c, CHILD(n, i), assigning);
1865}
1866
1867static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001868com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001869{
1870 REQ(n, NAME);
1871 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001872 if (assigning)
1873 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001874}
1875
1876static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001877com_assign(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001878{
1879 /* Loop to avoid trivial recursion */
1880 for (;;) {
1881 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001882
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001883 case exprlist:
1884 case testlist:
1885 if (NCH(n) > 1) {
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001886 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001887 return;
1888 }
1889 n = CHILD(n, 0);
1890 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001891
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001892 case test:
1893 case and_test:
1894 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001895 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001896 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001897 case xor_expr:
1898 case and_expr:
1899 case shift_expr:
1900 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001901 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001902 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001903 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001904 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001905 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001906 return;
1907 }
1908 n = CHILD(n, 0);
1909 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001910
Guido van Rossum50564e81996-01-12 01:13:16 +00001911 case power: /* atom trailer* ('**' power)* */
1912/* ('+'|'-'|'~') factor | atom trailer* */
1913 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001914 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001915 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001916 return;
1917 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001918 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001919 int i;
1920 com_node(c, CHILD(n, 0));
1921 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001922 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001923 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001924 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00001925 return;
1926 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001927 com_apply_trailer(c, CHILD(n, i));
1928 } /* NB i is still alive */
1929 com_assign_trailer(c,
1930 CHILD(n, i), assigning);
1931 return;
1932 }
1933 n = CHILD(n, 0);
1934 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001935
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001936 case atom:
1937 switch (TYPE(CHILD(n, 0))) {
1938 case LPAR:
1939 n = CHILD(n, 1);
1940 if (TYPE(n) == RPAR) {
1941 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001942 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001943 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001944 return;
1945 }
1946 break;
1947 case LSQB:
1948 n = CHILD(n, 1);
1949 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001950 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001951 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001952 return;
1953 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001954 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001955 return;
1956 case NAME:
1957 com_assign_name(c, CHILD(n, 0), assigning);
1958 return;
1959 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001960 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001961 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001962 return;
1963 }
1964 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001965
1966 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001967 com_error(c, PyExc_SyntaxError,
1968 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001969 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001970
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001971 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001972 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001973 com_error(c, PyExc_SystemError,
1974 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001975 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001976
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001977 }
1978 }
1979}
Guido van Rossum7c531111997-03-11 18:42:21 +00001980
Tim Petersdbd9ba62000-07-09 03:09:57 +00001981/* Forward */ static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001982
1983static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001984com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001985{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001986 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001987 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001988 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001989 return;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001990 com_node(c, CHILD(n, NCH(n)-1));
1991 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001992 if (c->c_interactive)
1993 com_addbyte(c, PRINT_EXPR);
1994 else
1995 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001996 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001997 }
1998 else {
1999 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002000 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002001 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002002 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002003 com_push(c, 1);
2004 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002005 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002006 }
2007 }
2008}
2009
2010static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002011com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002012{
2013 int a = 0, b = 0;
2014 int i;
2015 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2016 /* Generate code like for
2017
2018 if __debug__:
2019 if not <test>:
2020 raise AssertionError [, <message>]
2021
2022 where <message> is the second test, if present.
2023 */
2024 if (Py_OptimizeFlag)
2025 return;
2026 com_addopnamestr(c, LOAD_GLOBAL, "__debug__");
2027 com_push(c, 1);
2028 com_addfwref(c, JUMP_IF_FALSE, &a);
2029 com_addbyte(c, POP_TOP);
2030 com_pop(c, 1);
2031 com_node(c, CHILD(n, 1));
2032 com_addfwref(c, JUMP_IF_TRUE, &b);
2033 com_addbyte(c, POP_TOP);
2034 com_pop(c, 1);
2035 /* Raise that exception! */
2036 com_addopnamestr(c, LOAD_GLOBAL, "AssertionError");
2037 com_push(c, 1);
2038 i = NCH(n)/2; /* Either 2 or 4 */
2039 if (i > 1)
2040 com_node(c, CHILD(n, 3));
2041 com_addoparg(c, RAISE_VARARGS, i);
2042 com_pop(c, i);
2043 /* The interpreter does not fall through */
2044 /* All jumps converge here */
2045 com_backpatch(c, a);
2046 com_backpatch(c, b);
2047 com_addbyte(c, POP_TOP);
2048}
2049
2050static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002051com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002052{
2053 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002054 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
2055 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002056 com_node(c, CHILD(n, i));
2057 com_addbyte(c, PRINT_ITEM);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002058 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002059 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002060 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002061 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002062 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002063}
2064
2065static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002066com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002067{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002068 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002069 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002070 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002071 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002072 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002073 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002074 com_push(c, 1);
2075 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002076 else
2077 com_node(c, CHILD(n, 1));
2078 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002079 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002080}
2081
2082static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002083com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002084{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002085 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002086 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2087 if (NCH(n) > 1) {
2088 com_node(c, CHILD(n, 1));
2089 if (NCH(n) > 3) {
2090 com_node(c, CHILD(n, 3));
2091 if (NCH(n) > 5)
2092 com_node(c, CHILD(n, 5));
2093 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002094 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002095 i = NCH(n)/2;
2096 com_addoparg(c, RAISE_VARARGS, i);
2097 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002098}
2099
2100static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002101com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002102{
2103 int i;
2104 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002105 /* 'import' dotted_name (',' dotted_name)* |
2106 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002107 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002108 /* 'from' dotted_name 'import' ... */
2109 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002110 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002111 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002112 for (i = 3; i < NCH(n); i += 2)
2113 com_addopname(c, IMPORT_FROM, CHILD(n, i));
2114 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002115 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002116 }
2117 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002118 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002119 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002120 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002121 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002122 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002123 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002124 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002125 }
2126 }
2127}
2128
2129static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002130com_global_stmt(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002131{
2132 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002133 REQ(n, global_stmt);
2134 /* 'global' NAME (',' NAME)* */
2135 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002136 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002137#ifdef PRIVATE_NAME_MANGLING
2138 char buffer[256];
2139 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2140 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +00002141 com_mangle(c, s, buffer, sizeof(buffer)))
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002142 s = buffer;
2143#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00002144 if (PyDict_GetItemString(c->c_locals, s) != NULL) {
2145 com_error(c, PyExc_SyntaxError,
2146 "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002147 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002148 else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002149 c->c_errors++;
2150 }
2151}
2152
Guido van Rossum681d79a1995-07-18 14:51:37 +00002153static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002154com_newlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002155{
2156 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002157 PyObject *ival;
2158 if (PyList_Size(c->c_varnames) != c->c_nlocals) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002159 /* This is usually caused by an error on a previous call */
2160 if (c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002161 com_error(c, PyExc_SystemError,
2162 "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002163 }
2164 return 0;
2165 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002166 ival = PyInt_FromLong(i = c->c_nlocals++);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002167 if (ival == NULL)
2168 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002169 else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002170 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002171 else if (PyList_Append(c->c_varnames, nameval) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002172 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002173 Py_XDECREF(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002174 return i;
2175}
2176
2177static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002178com_addlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002179{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002180 PyObject *ival = PyDict_GetItem(c->c_locals, nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002181 if (ival != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002182 return PyInt_AsLong(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002183 return com_newlocal_o(c, nameval);
2184}
2185
2186static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002187com_newlocal(struct compiling *c, char *name)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002188{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002189 PyObject *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002190 int i;
2191 if (nameval == NULL) {
2192 c->c_errors++;
2193 return 0;
2194 }
2195 i = com_newlocal_o(c, nameval);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002196 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002197 return i;
2198}
2199
Guido van Rossumc5e96291991-12-10 13:53:51 +00002200static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002201com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002202{
2203 REQ(n, exec_stmt);
2204 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2205 com_node(c, CHILD(n, 1));
2206 if (NCH(n) >= 4)
2207 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002208 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002209 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002210 com_push(c, 1);
2211 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002212 if (NCH(n) >= 6)
2213 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002214 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002215 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002216 com_push(c, 1);
2217 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002218 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002219 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002220}
2221
Guido van Rossum7c531111997-03-11 18:42:21 +00002222static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002223is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002224{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002225 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002226 int i;
2227
2228 /* Label to avoid tail recursion */
2229 next:
2230 switch (TYPE(n)) {
2231
2232 case suite:
2233 if (NCH(n) == 1) {
2234 n = CHILD(n, 0);
2235 goto next;
2236 }
2237 /* Fall through */
2238 case file_input:
2239 for (i = 0; i < NCH(n); i++) {
2240 node *ch = CHILD(n, i);
2241 if (TYPE(ch) == stmt) {
2242 n = ch;
2243 goto next;
2244 }
2245 }
2246 break;
2247
2248 case stmt:
2249 case simple_stmt:
2250 case small_stmt:
2251 n = CHILD(n, 0);
2252 goto next;
2253
2254 case expr_stmt:
2255 case testlist:
2256 case test:
2257 case and_test:
2258 case not_test:
2259 case comparison:
2260 case expr:
2261 case xor_expr:
2262 case and_expr:
2263 case shift_expr:
2264 case arith_expr:
2265 case term:
2266 case factor:
2267 case power:
2268 case atom:
2269 if (NCH(n) == 1) {
2270 n = CHILD(n, 0);
2271 goto next;
2272 }
2273 break;
2274
2275 case NAME:
2276 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2277 return 1;
2278 break;
2279
2280 case NUMBER:
2281 v = parsenumber(c, STR(n));
2282 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002283 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002284 break;
2285 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002286 i = PyObject_IsTrue(v);
2287 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002288 return i == 0;
2289
2290 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002291 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002292 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002293 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002294 break;
2295 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002296 i = PyObject_IsTrue(v);
2297 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002298 return i == 0;
2299
2300 }
2301 return 0;
2302}
2303
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002304static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002305com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002306{
2307 int i;
2308 int anchor = 0;
2309 REQ(n, if_stmt);
2310 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2311 for (i = 0; i+3 < NCH(n); i+=4) {
2312 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002313 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002314 if (is_constant_false(c, ch))
2315 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002316 if (i > 0)
2317 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002318 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002319 com_addfwref(c, JUMP_IF_FALSE, &a);
2320 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002321 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002322 com_node(c, CHILD(n, i+3));
2323 com_addfwref(c, JUMP_FORWARD, &anchor);
2324 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002325 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002326 com_addbyte(c, POP_TOP);
2327 }
2328 if (i+2 < NCH(n))
2329 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002330 if (anchor)
2331 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002332}
2333
2334static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002335com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002336{
2337 int break_anchor = 0;
2338 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002339 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002340 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2341 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002342 block_push(c, SETUP_LOOP);
2343 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002344 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002345 com_node(c, CHILD(n, 1));
2346 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2347 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002348 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002349 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002350 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002351 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002352 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2353 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002354 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002355 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002356 com_addbyte(c, POP_TOP);
2357 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002358 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002359 if (NCH(n) > 4)
2360 com_node(c, CHILD(n, 6));
2361 com_backpatch(c, break_anchor);
2362}
2363
2364static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002365com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002366{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002367 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002368 int break_anchor = 0;
2369 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002370 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002371 REQ(n, for_stmt);
2372 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2373 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002374 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002375 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002376 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002377 if (v == NULL)
2378 c->c_errors++;
2379 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002380 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002381 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002382 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002383 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002384 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002385 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002386 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002387 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002388 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002389 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002390 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2391 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002392 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002393 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002394 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002395 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002396 if (NCH(n) > 8)
2397 com_node(c, CHILD(n, 8));
2398 com_backpatch(c, break_anchor);
2399}
2400
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002401/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002402
2403 SETUP_FINALLY L
2404 <code for S>
2405 POP_BLOCK
2406 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002407 L: <code for Sf>
2408 END_FINALLY
2409
2410 The special instructions use the block stack. Each block
2411 stack entry contains the instruction that created it (here
2412 SETUP_FINALLY), the level of the value stack at the time the
2413 block stack entry was created, and a label (here L).
2414
2415 SETUP_FINALLY:
2416 Pushes the current value stack level and the label
2417 onto the block stack.
2418 POP_BLOCK:
2419 Pops en entry from the block stack, and pops the value
2420 stack until its level is the same as indicated on the
2421 block stack. (The label is ignored.)
2422 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002423 Pops a variable number of entries from the *value* stack
2424 and re-raises the exception they specify. The number of
2425 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002426
2427 The block stack is unwound when an exception is raised:
2428 when a SETUP_FINALLY entry is found, the exception is pushed
2429 onto the value stack (and the exception condition is cleared),
2430 and the interpreter jumps to the label gotten from the block
2431 stack.
2432
2433 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002434 (The contents of the value stack is shown in [], with the top
2435 at the right; 'tb' is trace-back info, 'val' the exception's
2436 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002437
2438 Value stack Label Instruction Argument
2439 [] SETUP_EXCEPT L1
2440 [] <code for S>
2441 [] POP_BLOCK
2442 [] JUMP_FORWARD L0
2443
Guido van Rossum3f5da241990-12-20 15:06:42 +00002444 [tb, val, exc] L1: DUP )
2445 [tb, val, exc, exc] <evaluate E1> )
2446 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2447 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2448 [tb, val, exc, 1] POP )
2449 [tb, val, exc] POP
2450 [tb, val] <assign to V1> (or POP if no V1)
2451 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002452 [] <code for S1>
2453 JUMP_FORWARD L0
2454
Guido van Rossum3f5da241990-12-20 15:06:42 +00002455 [tb, val, exc, 0] L2: POP
2456 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002457 .............................etc.......................
2458
Guido van Rossum3f5da241990-12-20 15:06:42 +00002459 [tb, val, exc, 0] Ln+1: POP
2460 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002461
2462 [] L0: <next statement>
2463
2464 Of course, parts are not generated if Vi or Ei is not present.
2465*/
2466
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002467static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002468com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002469{
2470 int except_anchor = 0;
2471 int end_anchor = 0;
2472 int else_anchor = 0;
2473 int i;
2474 node *ch;
2475
2476 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2477 block_push(c, SETUP_EXCEPT);
2478 com_node(c, CHILD(n, 2));
2479 com_addbyte(c, POP_BLOCK);
2480 block_pop(c, SETUP_EXCEPT);
2481 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2482 com_backpatch(c, except_anchor);
2483 for (i = 3;
2484 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2485 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002486 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002487 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002488 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002489 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002490 break;
2491 }
2492 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002493 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002494 com_addoparg(c, SET_LINENO, ch->n_lineno);
2495 if (NCH(ch) > 1) {
2496 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002497 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002498 com_node(c, CHILD(ch, 1));
2499 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002500 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002501 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2502 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002503 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002504 }
2505 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002506 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002507 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002508 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002509 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002510 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002511 com_pop(c, 1);
2512 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002513 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002514 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002515 com_node(c, CHILD(n, i+2));
2516 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2517 if (except_anchor) {
2518 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002519 /* We come in with [tb, val, exc, 0] on the
2520 stack; one pop and it's the same as
2521 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002522 com_addbyte(c, POP_TOP);
2523 }
2524 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002525 /* We actually come in here with [tb, val, exc] but the
2526 END_FINALLY will zap those and jump around.
2527 The c_stacklevel does not reflect them so we need not pop
2528 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002529 com_addbyte(c, END_FINALLY);
2530 com_backpatch(c, else_anchor);
2531 if (i < NCH(n))
2532 com_node(c, CHILD(n, i+2));
2533 com_backpatch(c, end_anchor);
2534}
2535
2536static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002537com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002538{
2539 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002540 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002541
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002542 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2543 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002544 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002545 com_addbyte(c, POP_BLOCK);
2546 block_pop(c, SETUP_FINALLY);
2547 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002548 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002549 /* While the generated code pushes only one item,
2550 the try-finally handling can enter here with
2551 up to three items. OK, here are the details:
2552 3 for an exception, 2 for RETURN, 1 for BREAK. */
2553 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002554 com_backpatch(c, finally_anchor);
2555 ch = CHILD(n, NCH(n)-1);
2556 com_addoparg(c, SET_LINENO, ch->n_lineno);
2557 com_node(c, ch);
2558 com_addbyte(c, END_FINALLY);
2559 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002560 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002561}
2562
2563static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002564com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002565{
2566 REQ(n, try_stmt);
2567 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2568 | 'try' ':' suite 'finally' ':' suite */
2569 if (TYPE(CHILD(n, 3)) != except_clause)
2570 com_try_finally(c, n);
2571 else
2572 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002573}
2574
Guido van Rossum8b993a91997-01-17 21:04:03 +00002575static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002576get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002577{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002578 int i;
2579
Guido van Rossum8b993a91997-01-17 21:04:03 +00002580 /* Label to avoid tail recursion */
2581 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002582 switch (TYPE(n)) {
2583
2584 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002585 if (NCH(n) == 1) {
2586 n = CHILD(n, 0);
2587 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002588 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002589 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002590 case file_input:
2591 for (i = 0; i < NCH(n); i++) {
2592 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002593 if (TYPE(ch) == stmt) {
2594 n = ch;
2595 goto next;
2596 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002597 }
2598 break;
2599
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002600 case stmt:
2601 case simple_stmt:
2602 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002603 n = CHILD(n, 0);
2604 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002605
2606 case expr_stmt:
2607 case testlist:
2608 case test:
2609 case and_test:
2610 case not_test:
2611 case comparison:
2612 case expr:
2613 case xor_expr:
2614 case and_expr:
2615 case shift_expr:
2616 case arith_expr:
2617 case term:
2618 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002619 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002620 if (NCH(n) == 1) {
2621 n = CHILD(n, 0);
2622 goto next;
2623 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002624 break;
2625
2626 case atom:
2627 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002628 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002629 break;
2630
2631 }
2632 return NULL;
2633}
2634
Guido van Rossum79f25d91997-04-29 20:08:16 +00002635static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002636get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002637{
Guido van Rossum541563e1999-01-28 15:08:09 +00002638 /* Don't generate doc-strings if run with -OO */
2639 if (Py_OptimizeFlag > 1)
2640 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002641 n = get_rawdocstring(n);
2642 if (n == NULL)
2643 return NULL;
2644 return parsestrplus(n);
2645}
2646
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002647static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002648com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002649{
2650 REQ(n, suite);
2651 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2652 if (NCH(n) == 1) {
2653 com_node(c, CHILD(n, 0));
2654 }
2655 else {
2656 int i;
2657 for (i = 0; i < NCH(n); i++) {
2658 node *ch = CHILD(n, i);
2659 if (TYPE(ch) == stmt)
2660 com_node(c, ch);
2661 }
2662 }
2663}
2664
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002665/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002666static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002667com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002668{
2669 int i = c->c_nblocks;
2670 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2671 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2672 }
2673 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002674 com_error(c, PyExc_SyntaxError,
2675 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002676 }
2677 /* XXX Could allow it inside a 'finally' clause
2678 XXX if we could pop the exception still on the stack */
2679}
2680
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002681static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002682com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002683{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002684 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002685 if (TYPE(n) == lambdef) {
2686 /* lambdef: 'lambda' [varargslist] ':' test */
2687 n = CHILD(n, 1);
2688 }
2689 else {
2690 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2691 n = CHILD(n, 2);
2692 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2693 n = CHILD(n, 1);
2694 }
2695 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002696 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002697 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002698 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002699 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2700 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002701 nargs = 0;
2702 ndefs = 0;
2703 for (i = 0; i < nch; i++) {
2704 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002705 if (TYPE(CHILD(n, i)) == STAR ||
2706 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002707 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002708 nargs++;
2709 i++;
2710 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002711 t = RPAR; /* Anything except EQUAL or COMMA */
2712 else
2713 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002714 if (t == EQUAL) {
2715 i++;
2716 ndefs++;
2717 com_node(c, CHILD(n, i));
2718 i++;
2719 if (i >= nch)
2720 break;
2721 t = TYPE(CHILD(n, i));
2722 }
2723 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00002724 /* Treat "(a=1, b)" as an error */
2725 if (ndefs)
2726 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00002727 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002728 }
2729 if (t != COMMA)
2730 break;
2731 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002732 return ndefs;
2733}
2734
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002735static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002736com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002737{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002738 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002739 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002740 v = (PyObject *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002741 if (v == NULL)
2742 c->c_errors++;
2743 else {
2744 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002745 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002746 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002747 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002748 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002749 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002750 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002751 com_pop(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002752 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002753 }
2754}
2755
2756static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002757com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002758{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002759 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002760 REQ(n, testlist);
2761 /* testlist: test (',' test)* [','] */
2762 for (i = 0; i < NCH(n); i += 2)
2763 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002764 i = (NCH(n)+1) / 2;
2765 com_addoparg(c, BUILD_TUPLE, i);
2766 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002767}
2768
2769static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002770com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002771{
Guido van Rossum25831651993-05-19 14:50:45 +00002772 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002773 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002774 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002775 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002776 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002777 c->c_errors++;
2778 return;
2779 }
2780 /* Push the class name on the stack */
2781 i = com_addconst(c, v);
2782 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002783 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002784 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00002785 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002786 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002787 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002788 com_push(c, 1);
2789 }
Guido van Rossum25831651993-05-19 14:50:45 +00002790 else
2791 com_bases(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002792 v = (PyObject *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002793 if (v == NULL)
2794 c->c_errors++;
2795 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002796 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002797 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002798 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002799 com_addoparg(c, MAKE_FUNCTION, 0);
2800 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002801 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002802 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002803 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002804 Py_DECREF(v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002805 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002806}
2807
2808static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002809com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002810{
2811 switch (TYPE(n)) {
2812
2813 /* Definition nodes */
2814
2815 case funcdef:
2816 com_funcdef(c, n);
2817 break;
2818 case classdef:
2819 com_classdef(c, n);
2820 break;
2821
2822 /* Trivial parse tree nodes */
2823
2824 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002825 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002826 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002827 com_node(c, CHILD(n, 0));
2828 break;
2829
2830 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002831 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2832 com_addoparg(c, SET_LINENO, n->n_lineno);
2833 {
2834 int i;
2835 for (i = 0; i < NCH(n)-1; i += 2)
2836 com_node(c, CHILD(n, i));
2837 }
2838 break;
2839
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002840 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002841 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002842 com_node(c, CHILD(n, 0));
2843 break;
2844
2845 /* Statement nodes */
2846
2847 case expr_stmt:
2848 com_expr_stmt(c, n);
2849 break;
2850 case print_stmt:
2851 com_print_stmt(c, n);
2852 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002853 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002854 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002855 break;
2856 case pass_stmt:
2857 break;
2858 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002859 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002860 com_error(c, PyExc_SyntaxError,
2861 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002862 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002863 com_addbyte(c, BREAK_LOOP);
2864 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002865 case continue_stmt:
2866 com_continue_stmt(c, n);
2867 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002868 case return_stmt:
2869 com_return_stmt(c, n);
2870 break;
2871 case raise_stmt:
2872 com_raise_stmt(c, n);
2873 break;
2874 case import_stmt:
2875 com_import_stmt(c, n);
2876 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002877 case global_stmt:
2878 com_global_stmt(c, n);
2879 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002880 case exec_stmt:
2881 com_exec_stmt(c, n);
2882 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002883 case assert_stmt:
2884 com_assert_stmt(c, n);
2885 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002886 case if_stmt:
2887 com_if_stmt(c, n);
2888 break;
2889 case while_stmt:
2890 com_while_stmt(c, n);
2891 break;
2892 case for_stmt:
2893 com_for_stmt(c, n);
2894 break;
2895 case try_stmt:
2896 com_try_stmt(c, n);
2897 break;
2898 case suite:
2899 com_suite(c, n);
2900 break;
2901
2902 /* Expression nodes */
2903
2904 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002905 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002906 break;
2907 case test:
2908 com_test(c, n);
2909 break;
2910 case and_test:
2911 com_and_test(c, n);
2912 break;
2913 case not_test:
2914 com_not_test(c, n);
2915 break;
2916 case comparison:
2917 com_comparison(c, n);
2918 break;
2919 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002920 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002921 break;
2922 case expr:
2923 com_expr(c, n);
2924 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002925 case xor_expr:
2926 com_xor_expr(c, n);
2927 break;
2928 case and_expr:
2929 com_and_expr(c, n);
2930 break;
2931 case shift_expr:
2932 com_shift_expr(c, n);
2933 break;
2934 case arith_expr:
2935 com_arith_expr(c, n);
2936 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002937 case term:
2938 com_term(c, n);
2939 break;
2940 case factor:
2941 com_factor(c, n);
2942 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00002943 case power:
2944 com_power(c, n);
2945 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002946 case atom:
2947 com_atom(c, n);
2948 break;
2949
2950 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002951 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002952 com_error(c, PyExc_SystemError,
2953 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002954 }
2955}
2956
Tim Petersdbd9ba62000-07-09 03:09:57 +00002957static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002958
2959static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002960com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002961{
2962 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2963 if (TYPE(CHILD(n, 0)) == LPAR)
2964 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002965 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002966 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002967 com_pop(c, 1);
2968 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002969}
2970
2971static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002972com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002973{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00002974 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002975 if (NCH(n) == 1) {
2976 com_fpdef(c, CHILD(n, 0));
2977 }
2978 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002979 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002980 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002981 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002982 for (i = 0; i < NCH(n); i += 2)
2983 com_fpdef(c, CHILD(n, i));
2984 }
2985}
2986
2987static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002988com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002989{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002990 int nch, i;
2991 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00002992 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002993 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00002994 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002995 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002996 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002997 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002998 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002999 node *ch = CHILD(n, i);
3000 node *fp;
3001 char *name;
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003002 PyObject *nameval;
Guido van Rossum50564e81996-01-12 01:13:16 +00003003 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003004 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003005 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3006 fp = CHILD(ch, 0);
3007 if (TYPE(fp) == NAME)
3008 name = STR(fp);
3009 else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003010 name = nbuf;
3011 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003012 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003013 }
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003014 nameval = PyString_InternFromString(name);
3015 if (nameval == NULL) {
3016 c->c_errors++;
3017 }
Peter Schneider-Kamp9a5086c2000-07-13 06:24:29 +00003018 if (PyDict_GetItem(c->c_locals, nameval)) {
Fred Drakedcf08e02000-08-15 15:49:44 +00003019 com_error(c, PyExc_SyntaxError,
3020 "duplicate argument in function definition");
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003021 }
3022 com_newlocal_o(c, nameval);
3023 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003024 c->c_argcount++;
3025 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003026 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003027 ch = CHILD(n, i);
3028 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003029 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003030 else
3031 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003032 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003033 /* Handle *arguments */
3034 if (i < nch) {
3035 node *ch;
3036 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003037 if (TYPE(ch) != DOUBLESTAR) {
3038 REQ(ch, STAR);
3039 ch = CHILD(n, i+1);
3040 if (TYPE(ch) == NAME) {
3041 c->c_flags |= CO_VARARGS;
3042 i += 3;
3043 com_newlocal(c, STR(ch));
3044 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003045 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003046 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003047 /* Handle **keywords */
3048 if (i < nch) {
3049 node *ch;
3050 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003051 if (TYPE(ch) != DOUBLESTAR) {
3052 REQ(ch, STAR);
3053 ch = CHILD(n, i+1);
3054 REQ(ch, STAR);
3055 ch = CHILD(n, i+2);
3056 }
3057 else
3058 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003059 REQ(ch, NAME);
3060 c->c_flags |= CO_VARKEYWORDS;
3061 com_newlocal(c, STR(ch));
3062 }
3063 if (complex) {
3064 /* Generate code for complex arguments only after
3065 having counted the simple arguments */
3066 int ilocal = 0;
3067 for (i = 0; i < nch; i++) {
3068 node *ch = CHILD(n, i);
3069 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003070 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003071 break;
3072 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3073 fp = CHILD(ch, 0);
3074 if (TYPE(fp) != NAME) {
3075 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003076 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003077 com_fpdef(c, ch);
3078 }
3079 ilocal++;
3080 if (++i >= nch)
3081 break;
3082 ch = CHILD(n, i);
3083 if (TYPE(ch) == EQUAL)
3084 i += 2;
3085 else
3086 REQ(ch, COMMA);
3087 }
3088 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003089}
3090
3091static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003092com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003093{
3094 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003095 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003096 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003097 doc = get_docstring(n);
3098 if (doc != NULL) {
3099 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003100 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003101 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003102 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003103 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003104 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003105 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003106 for (i = 0; i < NCH(n); i++) {
3107 node *ch = CHILD(n, i);
3108 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3109 com_node(c, ch);
3110 }
3111}
3112
3113/* Top-level compile-node interface */
3114
3115static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003116compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003117{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003118 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003119 node *ch;
3120 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003121 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003122 doc = get_docstring(CHILD(n, 4));
3123 if (doc != NULL) {
3124 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003125 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003126 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003127 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003128 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003129 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3130 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003131 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003132 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003133 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003134 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003135 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003136 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003137 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003138 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003139 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003140}
3141
3142static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003143compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003144{
Guido van Rossum590baa41993-11-30 13:40:46 +00003145 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003146 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003147 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003148
3149 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003150 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003151 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003152 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003153 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003154 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003155 else
3156 ch = CHILD(n, 2);
3157 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003158 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003159 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003160}
3161
3162static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003163compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003164{
3165 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003166 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003167 REQ(n, classdef);
3168 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3169 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003170#ifdef PRIVATE_NAME_MANGLING
3171 c->c_private = c->c_name;
3172#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003173 ch = CHILD(n, NCH(n)-1); /* The suite */
3174 doc = get_docstring(ch);
3175 if (doc != NULL) {
3176 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003177 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003178 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003179 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003180 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003181 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003182 }
3183 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003184 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003185 com_node(c, ch);
3186 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003187 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003188 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003189 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003190}
3191
3192static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003193compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003194{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003195 com_addoparg(c, SET_LINENO, n->n_lineno);
3196
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003197 switch (TYPE(n)) {
3198
Guido van Rossum4c417781991-01-21 16:09:22 +00003199 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003200 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003201 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003202 n = CHILD(n, 0);
3203 if (TYPE(n) != NEWLINE)
3204 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003205 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003206 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003207 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003208 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003209 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003210 break;
3211
Guido van Rossum4c417781991-01-21 16:09:22 +00003212 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003213 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003214 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003215 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003216 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003217 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003218 break;
3219
Guido van Rossum590baa41993-11-30 13:40:46 +00003220 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003221 com_node(c, CHILD(n, 0));
3222 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003223 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003224 break;
3225
Guido van Rossum590baa41993-11-30 13:40:46 +00003226 case lambdef: /* anonymous function definition */
3227 compile_lambdef(c, n);
3228 break;
3229
Guido van Rossum4c417781991-01-21 16:09:22 +00003230 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003231 compile_funcdef(c, n);
3232 break;
3233
Guido van Rossum4c417781991-01-21 16:09:22 +00003234 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003235 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003236 break;
3237
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003238 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003239 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003240 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003241 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003242 }
3243}
3244
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003245/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003246
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003247 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3248 instructions that refer to local variables with LOAD_FAST etc.
3249 The latter instructions are much faster because they don't need to
3250 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003251
Guido van Rossum681d79a1995-07-18 14:51:37 +00003252 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3253 and DELETE_NAME instructions. This yields all local variables,
3254 function definitions, class definitions and import statements.
3255 Argument names have already been entered into the list by the
3256 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003257
3258 All remaining LOAD_NAME instructions must refer to non-local (global
3259 or builtin) variables, so are replaced by LOAD_GLOBAL.
3260
3261 There are two problems: 'from foo import *' and 'exec' may introduce
3262 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003263 case, we can still optimize bona fide locals (since those
3264 statements will be surrounded by fast_2_locals() and
3265 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003266
Guido van Rossum681d79a1995-07-18 14:51:37 +00003267 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003268
3269static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003270optimize(struct compiling *c)
Guido van Rossum282914b1991-04-04 10:42:56 +00003271{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003272 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003273 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003274 int oparg = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003275 PyObject *name;
3276 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003277
Guido van Rossum282914b1991-04-04 10:42:56 +00003278#define NEXTOP() (*next_instr++)
3279#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossum79f25d91997-04-29 20:08:16 +00003280#define GETITEM(v, i) (PyList_GetItem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003281#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3282
Guido van Rossum79f25d91997-04-29 20:08:16 +00003283 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003284
3285 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003286
Guido van Rossum79f25d91997-04-29 20:08:16 +00003287 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003288 for (;;) {
3289 opcode = NEXTOP();
3290 if (opcode == STOP_CODE)
3291 break;
3292 if (HAS_ARG(opcode))
3293 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003294 switch (opcode) {
3295 case STORE_NAME:
3296 case DELETE_NAME:
3297 case IMPORT_FROM:
3298 com_addlocal_o(c, GETNAMEOBJ(oparg));
3299 break;
3300 case EXEC_STMT:
3301 c->c_flags &= ~CO_OPTIMIZED;
3302 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003303 }
3304 }
3305
Guido van Rossum79f25d91997-04-29 20:08:16 +00003306 if (PyDict_GetItemString(c->c_locals, "*") != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003307 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003308
Guido van Rossum79f25d91997-04-29 20:08:16 +00003309 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003310 for (;;) {
3311 cur_instr = next_instr;
3312 opcode = NEXTOP();
3313 if (opcode == STOP_CODE)
3314 break;
3315 if (HAS_ARG(opcode))
3316 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003317 if (opcode == LOAD_NAME ||
3318 opcode == STORE_NAME ||
3319 opcode == DELETE_NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003320 PyObject *v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003321 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003322 name = GETNAMEOBJ(oparg);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003323 v = PyDict_GetItem(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003324 if (v == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003325 if (opcode == LOAD_NAME &&
3326 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003327 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003328 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003329 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003330 i = PyInt_AsLong(v);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003331 switch (opcode) {
3332 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3333 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3334 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3335 }
3336 cur_instr[1] = i & 0xff;
3337 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00003338 }
3339 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003340
Guido van Rossum681d79a1995-07-18 14:51:37 +00003341 if (c->c_errors == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00003342 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003343}
3344
Guido van Rossum79f25d91997-04-29 20:08:16 +00003345PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003346PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003347{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003348 return jcompile(n, filename, NULL);
3349}
3350
Guido van Rossum79f25d91997-04-29 20:08:16 +00003351static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003352icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003353{
3354 return jcompile(n, base->c_filename, base);
3355}
3356
Guido van Rossum79f25d91997-04-29 20:08:16 +00003357static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003358jcompile(node *n, char *filename, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003359{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003360 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003361 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003362 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003363 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003364#ifdef PRIVATE_NAME_MANGLING
3365 if (base)
3366 sc.c_private = base->c_private;
3367 else
3368 sc.c_private = NULL;
3369#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003370 compile_node(&sc, n);
3371 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003372 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003373 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003374 sc.c_flags |= CO_NEWLOCALS;
3375 }
3376 else if (TYPE(n) == classdef)
3377 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003378 co = NULL;
3379 if (sc.c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003380 PyObject *consts, *names, *varnames, *filename, *name;
3381 consts = PyList_AsTuple(sc.c_consts);
3382 names = PyList_AsTuple(sc.c_names);
3383 varnames = PyList_AsTuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003384 filename = PyString_InternFromString(sc.c_filename);
3385 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003386 if (!PyErr_Occurred())
3387 co = PyCode_New(sc.c_argcount,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003388 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003389 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003390 sc.c_flags,
3391 sc.c_code,
3392 consts,
3393 names,
3394 varnames,
3395 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003396 name,
3397 sc.c_firstlineno,
3398 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003399 Py_XDECREF(consts);
3400 Py_XDECREF(names);
3401 Py_XDECREF(varnames);
3402 Py_XDECREF(filename);
3403 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003404 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003405 else if (!PyErr_Occurred()) {
3406 /* This could happen if someone called PyErr_Clear() after an
3407 error was reported above. That's not supposed to happen,
3408 but I just plugged one case and I'm not sure there can't be
3409 others. In that case, raise SystemError so that at least
3410 it gets reported instead dumping core. */
3411 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3412 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003413 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003414 return co;
3415}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003416
3417int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003418PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003419{
3420 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003421 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003422 int line = co->co_firstlineno;
3423 int addr = 0;
3424 while (--size >= 0) {
3425 addr += *p++;
3426 if (addr > addrq)
3427 break;
3428 line += *p++;
3429 }
3430 return line;
3431}