blob: a387317ef3c9542d5bec3cd56ed741f3e8903792 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum10dc2e81990-11-18 17:27:39 +000032/* Compile an expression node to intermediate code */
33
Guido van Rossum3f5da241990-12-20 15:06:42 +000034/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +000035 XXX add __doc__ attribute == co_doc to code object attributes?
36 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +000037 XXX Generate simple jump for break/return outside 'try...finally'
Guido van Rossum8b993a91997-01-17 21:04:03 +000038 XXX Allow 'continue' inside try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +000039 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +000040 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000041*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000042
Guido van Rossum8ff077b1996-08-24 06:21:31 +000043#ifndef NO_PRIVATE_NAME_MANGLING
44#define PRIVATE_NAME_MANGLING
45#endif
46
Guido van Rossum79f25d91997-04-29 20:08:16 +000047#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000048
Guido van Rossum10dc2e81990-11-18 17:27:39 +000049#include "node.h"
50#include "token.h"
51#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000052#include "compile.h"
53#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000054#include "structmember.h"
55
56#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000057
Guido van Rossumb05a5c71997-05-07 17:46:13 +000058/* Three symbols from graminit.h are also defined in Python.h, with
59 Py_ prefixes to their names. Python.h can't include graminit.h
60 (which defines too many confusing symbols), but we can check here
61 that they haven't changed (which is very unlikely, but possible). */
62#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000063 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000064#endif
65#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000066 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000067#endif
68#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000069 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000070#endif
71
Guido van Rossum8e793d91997-03-03 19:13:14 +000072int Py_OptimizeFlag = 0;
73
Guido van Rossum8861b741996-07-30 16:49:37 +000074#define OP_DELETE 0
75#define OP_ASSIGN 1
76#define OP_APPLY 2
77
Guido van Rossum79f25d91997-04-29 20:08:16 +000078#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000079
80static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000081 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
82 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000083 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000084 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000085 {"co_code", T_OBJECT, OFF(co_code), READONLY},
86 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
87 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000088 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000089 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000090 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000091 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
92 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000093 {NULL} /* Sentinel */
94};
95
Guido van Rossum79f25d91997-04-29 20:08:16 +000096static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +000097code_getattr(co, name)
Guido van Rossum79f25d91997-04-29 20:08:16 +000098 PyCodeObject *co;
Guido van Rossum3f5da241990-12-20 15:06:42 +000099 char *name;
100{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000101 return PyMember_Get((char *)co, code_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000102}
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000103
104static void
Guido van Rossum3f5da241990-12-20 15:06:42 +0000105code_dealloc(co)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000106 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000107{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000108 Py_XDECREF(co->co_code);
109 Py_XDECREF(co->co_consts);
110 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000111 Py_XDECREF(co->co_varnames);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000112 Py_XDECREF(co->co_filename);
113 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000114 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000115 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000116}
117
Guido van Rossum79f25d91997-04-29 20:08:16 +0000118static PyObject *
Guido van Rossum2dff9911992-09-03 20:50:59 +0000119code_repr(co)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000120 PyCodeObject *co;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000121{
122 char buf[500];
123 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000124 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000125 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000126
Guido van Rossuma396a882000-04-07 01:21:36 +0000127 if (co->co_firstlineno != 0)
128 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000129 if (co->co_filename && PyString_Check(co->co_filename))
130 filename = PyString_AsString(co->co_filename);
131 if (co->co_name && PyString_Check(co->co_name))
132 name = PyString_AsString(co->co_name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000133 sprintf(buf, "<code object %.100s at %lx, file \"%.300s\", line %d>",
134 name, (long)co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000135 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000136}
137
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000138static int
139code_compare(co, cp)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000140 PyCodeObject *co, *cp;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000141{
142 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000143 cmp = PyObject_Compare(co->co_name, cp->co_name);
144 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000145 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000146 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000147 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000148 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000149 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000150 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000151 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000152 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000153 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000154 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000155 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000156 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000157 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000158 return cmp;
159}
160
161static long
162code_hash(co)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000163 PyCodeObject *co;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000164{
Guido van Rossum44679592000-04-10 16:20:31 +0000165 long h, h0, h1, h2, h3, h4;
166 h0 = PyObject_Hash(co->co_name);
167 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000168 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000169 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000170 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000171 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000172 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000173 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000174 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000175 if (h4 == -1) return -1;
Guido van Rossum44679592000-04-10 16:20:31 +0000176 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000177 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000178 if (h == -1) h = -2;
179 return h;
180}
181
Guido van Rossum79f25d91997-04-29 20:08:16 +0000182PyTypeObject PyCode_Type = {
183 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000184 0,
185 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000186 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000187 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000188 (destructor)code_dealloc, /*tp_dealloc*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000189 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000190 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000191 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000192 (cmpfunc)code_compare, /*tp_compare*/
193 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000194 0, /*tp_as_number*/
195 0, /*tp_as_sequence*/
196 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000197 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000198};
199
Guido van Rossum644a12b1997-04-09 19:24:53 +0000200#define NAME_CHARS \
201 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
202
Guido van Rossum79f25d91997-04-29 20:08:16 +0000203PyCodeObject *
204PyCode_New(argcount, nlocals, stacksize, flags,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000205 code, consts, names, varnames, filename, name,
206 firstlineno, lnotab)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000207 int argcount;
208 int nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000209 int stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000210 int flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000211 PyObject *code;
212 PyObject *consts;
213 PyObject *names;
214 PyObject *varnames;
215 PyObject *filename;
216 PyObject *name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000217 int firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000218 PyObject *lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000219{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000220 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000221 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000222 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000223 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000224 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000225 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 consts == NULL || !PyTuple_Check(consts) ||
227 names == NULL || !PyTuple_Check(names) ||
228 varnames == NULL || !PyTuple_Check(varnames) ||
229 name == NULL || !PyString_Check(name) ||
230 filename == NULL || !PyString_Check(filename) ||
231 lnotab == NULL || !PyString_Check(lnotab)) {
232 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000233 return NULL;
234 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000235 pb = code->ob_type->tp_as_buffer;
236 if (pb == NULL ||
237 pb->bf_getreadbuffer == NULL ||
238 pb->bf_getsegcount == NULL ||
239 (*pb->bf_getsegcount)(code, NULL) != 1)
240 {
241 PyErr_BadInternalCall();
242 return NULL;
243 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000244 /* Make sure names and varnames are all strings, & intern them */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000245 for (i = PyTuple_Size(names); --i >= 0; ) {
246 PyObject *v = PyTuple_GetItem(names, i);
247 if (v == NULL || !PyString_Check(v)) {
248 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000249 return NULL;
250 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000251 PyString_InternInPlace(&PyTuple_GET_ITEM(names, i));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000252 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000253 for (i = PyTuple_Size(varnames); --i >= 0; ) {
254 PyObject *v = PyTuple_GetItem(varnames, i);
255 if (v == NULL || !PyString_Check(v)) {
256 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000257 return NULL;
258 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000259 PyString_InternInPlace(&PyTuple_GET_ITEM(varnames, i));
260 }
261 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000262 for (i = PyTuple_Size(consts); --i >= 0; ) {
263 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000264 char *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000265 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000266 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000267 p = PyString_AsString(v);
Guido van Rossum644a12b1997-04-09 19:24:53 +0000268 if ((int)strspn(p, NAME_CHARS)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000269 != PyString_Size(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000270 continue;
271 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000272 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000273 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000274 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000275 co->co_argcount = argcount;
276 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000277 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000278 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000279 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000280 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000281 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000282 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000283 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000284 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000285 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000286 co->co_varnames = varnames;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000287 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000288 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000289 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000290 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000291 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000292 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000293 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000294 }
295 return co;
296}
297
298
299/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000300
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000301struct compiling {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000302 PyObject *c_code; /* string */
303 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000304 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000305 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000306 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000307 PyObject *c_globals; /* dictionary (value=None) */
308 PyObject *c_locals; /* dictionary (value=localID) */
309 PyObject *c_varnames; /* list (inverse of c_locals) */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000310 int c_nlocals; /* index of next local */
311 int c_argcount; /* number of top-level arguments */
312 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000313 int c_nexti; /* index into c_code */
314 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000315 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000316 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000317 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000318 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000319 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000320 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000321 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000322 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000323 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000324 int c_stacklevel; /* Current stack level */
325 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000326 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000327 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000328 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000329#ifdef PRIVATE_NAME_MANGLING
330 char *c_private; /* for private name mangling */
331#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000332};
333
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000334
Guido van Rossum452a9831996-09-17 14:32:04 +0000335/* Error message including line number */
336
337static void
338com_error(c, exc, msg)
339 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000340 PyObject *exc;
Guido van Rossum452a9831996-09-17 14:32:04 +0000341 char *msg;
342{
343 int n = strlen(msg);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000344 PyObject *v;
Guido van Rossum452a9831996-09-17 14:32:04 +0000345 char buffer[30];
346 char *s;
Guido van Rossum635abd21997-01-06 22:56:52 +0000347 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000348 if (c->c_lineno <= 1) {
349 /* Unknown line number or single interactive command */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000350 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000351 return;
352 }
353 sprintf(buffer, " (line %d)", c->c_lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000354 v = PyString_FromStringAndSize((char *)NULL, n + strlen(buffer));
Guido van Rossum452a9831996-09-17 14:32:04 +0000355 if (v == NULL)
356 return; /* MemoryError, too bad */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000357 s = PyString_AS_STRING((PyStringObject *)v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000358 strcpy(s, msg);
359 strcat(s, buffer);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000360 PyErr_SetObject(exc, v);
361 Py_DECREF(v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000362}
363
364
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000365/* Interface to the block stack */
366
367static void
368block_push(c, type)
369 struct compiling *c;
370 int type;
371{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000372 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000373 com_error(c, PyExc_SystemError,
374 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000375 }
376 else {
377 c->c_block[c->c_nblocks++] = type;
378 }
379}
380
381static void
382block_pop(c, type)
383 struct compiling *c;
384 int type;
385{
386 if (c->c_nblocks > 0)
387 c->c_nblocks--;
388 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000389 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000390 }
391}
392
393
Guido van Rossum681d79a1995-07-18 14:51:37 +0000394/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000395
Guido van Rossum79f25d91997-04-29 20:08:16 +0000396static int com_init Py_PROTO((struct compiling *, char *));
397static void com_free Py_PROTO((struct compiling *));
398static void com_push Py_PROTO((struct compiling *, int));
399static void com_pop Py_PROTO((struct compiling *, int));
400static void com_done Py_PROTO((struct compiling *));
401static void com_node Py_PROTO((struct compiling *, struct _node *));
402static void com_factor Py_PROTO((struct compiling *, struct _node *));
403static void com_addbyte Py_PROTO((struct compiling *, int));
404static void com_addint Py_PROTO((struct compiling *, int));
405static void com_addoparg Py_PROTO((struct compiling *, int, int));
406static void com_addfwref Py_PROTO((struct compiling *, int, int *));
407static void com_backpatch Py_PROTO((struct compiling *, int));
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000408static int com_add Py_PROTO((struct compiling *, PyObject *, PyObject *, PyObject *));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000409static int com_addconst Py_PROTO((struct compiling *, PyObject *));
410static int com_addname Py_PROTO((struct compiling *, PyObject *));
411static void com_addopname Py_PROTO((struct compiling *, int, node *));
412static void com_list Py_PROTO((struct compiling *, node *, int));
413static int com_argdefs Py_PROTO((struct compiling *, node *));
414static int com_newlocal Py_PROTO((struct compiling *, char *));
415static PyCodeObject *icompile Py_PROTO((struct _node *, struct compiling *));
416static PyCodeObject *jcompile Py_PROTO((struct _node *, char *,
417 struct compiling *));
418static PyObject *parsestrplus Py_PROTO((node *));
419static PyObject *parsestr Py_PROTO((char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000420
421static int
Guido van Rossum590baa41993-11-30 13:40:46 +0000422com_init(c, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000423 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000424 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000425{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000426 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000427 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
428 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000429 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000430 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000431 goto fail;
432 if ((c->c_const_dict = PyDict_New()) == NULL)
433 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000434 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000435 goto fail;
436 if ((c->c_name_dict = PyDict_New()) == NULL)
437 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000438 if ((c->c_globals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000439 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000440 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000441 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000442 if ((c->c_varnames = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000443 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000444 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
445 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000446 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000447 c->c_nlocals = 0;
448 c->c_argcount = 0;
449 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000450 c->c_nexti = 0;
451 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000452 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000453 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000454 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000455 c->c_begin = 0;
456 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000457 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000458 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000459 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000460 c->c_stacklevel = 0;
461 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000462 c->c_firstlineno = 0;
463 c->c_last_addr = 0;
464 c->c_last_line = 0;
465 c-> c_lnotab_next = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000466 return 1;
467
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000468 fail:
469 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000470 return 0;
471}
472
473static void
474com_free(c)
475 struct compiling *c;
476{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000477 Py_XDECREF(c->c_code);
478 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000479 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000480 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000481 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000482 Py_XDECREF(c->c_globals);
483 Py_XDECREF(c->c_locals);
484 Py_XDECREF(c->c_varnames);
485 Py_XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000486}
487
488static void
Guido van Rossum8b993a91997-01-17 21:04:03 +0000489com_push(c, n)
490 struct compiling *c;
491 int n;
492{
493 c->c_stacklevel += n;
494 if (c->c_stacklevel > c->c_maxstacklevel)
495 c->c_maxstacklevel = c->c_stacklevel;
496}
497
498static void
499com_pop(c, n)
500 struct compiling *c;
501 int n;
502{
503 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000504 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000505 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
506 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000507 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000508 c->c_stacklevel = 0;
509 }
510 else
511 c->c_stacklevel -= n;
512}
513
514static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000515com_done(c)
516 struct compiling *c;
517{
518 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000519 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000520 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000521 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000522}
523
524static void
525com_addbyte(c, byte)
526 struct compiling *c;
527 int byte;
528{
529 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000530 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000531 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000532 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000533 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000534 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000535 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000536 com_error(c, PyExc_SystemError,
537 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000538 }
539 if (c->c_code == NULL)
540 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000541 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000542 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000543 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000544 c->c_errors++;
545 return;
546 }
547 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000548 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000549}
550
551static void
552com_addint(c, x)
553 struct compiling *c;
554 int x;
555{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000556 com_addbyte(c, x & 0xff);
557 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000558}
559
560static void
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000561com_add_lnotab(c, addr, line)
562 struct compiling *c;
563 int addr;
564 int line;
565{
566 int size;
567 char *p;
568 if (c->c_lnotab == NULL)
569 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000570 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000571 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000572 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000573 c->c_errors++;
574 return;
575 }
576 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000577 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000578 *p++ = addr;
579 *p++ = line;
580 c->c_lnotab_next += 2;
581}
582
583static void
584com_set_lineno(c, lineno)
585 struct compiling *c;
586 int lineno;
587{
588 c->c_lineno = lineno;
589 if (c->c_firstlineno == 0) {
590 c->c_firstlineno = c->c_last_line = lineno;
591 }
592 else {
593 int incr_addr = c->c_nexti - c->c_last_addr;
594 int incr_line = lineno - c->c_last_line;
595 while (incr_addr > 0 || incr_line > 0) {
596 int trunc_addr = incr_addr;
597 int trunc_line = incr_line;
598 if (trunc_addr > 255)
599 trunc_addr = 255;
600 if (trunc_line > 255)
601 trunc_line = 255;
602 com_add_lnotab(c, trunc_addr, trunc_line);
603 incr_addr -= trunc_addr;
604 incr_line -= trunc_line;
605 }
606 c->c_last_addr = c->c_nexti;
607 c->c_last_line = lineno;
608 }
609}
610
611static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000612com_addoparg(c, op, arg)
613 struct compiling *c;
614 int op;
615 int arg;
616{
Guido van Rossum8e793d91997-03-03 19:13:14 +0000617 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000618 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000619 if (Py_OptimizeFlag)
620 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000621 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000622 com_addbyte(c, op);
623 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000624}
625
626static void
627com_addfwref(c, op, p_anchor)
628 struct compiling *c;
629 int op;
630 int *p_anchor;
631{
632 /* Compile a forward reference for backpatching */
633 int here;
634 int anchor;
635 com_addbyte(c, op);
636 here = c->c_nexti;
637 anchor = *p_anchor;
638 *p_anchor = here;
639 com_addint(c, anchor == 0 ? 0 : here - anchor);
640}
641
642static void
643com_backpatch(c, anchor)
644 struct compiling *c;
645 int anchor; /* Must be nonzero */
646{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000647 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000648 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000649 int dist;
650 int prev;
651 for (;;) {
652 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000653 prev = code[anchor] + (code[anchor+1] << 8);
654 dist = target - (anchor+2);
655 code[anchor] = dist & 0xff;
656 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000657 if (!prev)
658 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000659 anchor -= prev;
660 }
661}
662
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000663/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000664
665static int
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000666com_add(c, list, dict, v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000667 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000668 PyObject *list;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000669 PyObject *dict;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000670 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000671{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000672 PyObject *w, *t, *np=NULL;
673 long n;
674
675 t = Py_BuildValue("(OO)", v, v->ob_type);
676 if (t == NULL)
677 goto fail;
678 w = PyDict_GetItem(dict, t);
679 if (w != NULL) {
680 n = PyInt_AsLong(w);
681 } else {
682 n = PyList_Size(list);
683 np = PyInt_FromLong(n);
684 if (np == NULL)
685 goto fail;
686 if (PyList_Append(list, v) != 0)
687 goto fail;
688 if (PyDict_SetItem(dict, t, np) != 0)
689 goto fail;
690 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000691 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000692 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000693 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000694 fail:
695 Py_XDECREF(np);
696 Py_XDECREF(t);
697 c->c_errors++;
698 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000699}
700
701static int
702com_addconst(c, v)
703 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000704 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000705{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000706 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000707}
708
709static int
710com_addname(c, v)
711 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000712 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000713{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000714 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000715}
716
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000717#ifdef PRIVATE_NAME_MANGLING
718static int
719com_mangle(c, name, buffer, maxlen)
720 struct compiling *c;
721 char *name;
722 char *buffer;
723 int maxlen;
724{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000725 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000726 This is independent from how the name is used. */
727 char *p;
728 int nlen, plen;
729 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000730 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000731 return 0; /* Don't mangle __extremely_long_names */
732 if (name[nlen-1] == '_' && name[nlen-2] == '_')
733 return 0; /* Don't mangle __whatever__ */
734 p = c->c_private;
735 /* Strip leading underscores from class name */
736 while (*p == '_')
737 p++;
738 if (*p == '\0')
739 return 0; /* Don't mangle if class is just underscores */
740 plen = strlen(p);
741 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000742 plen = maxlen-nlen-2; /* Truncate class name if too long */
743 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000744 buffer[0] = '_';
745 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000746 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000747 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
748 return 1;
749}
750#endif
751
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000752static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000753com_addopnamestr(c, op, name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000754 struct compiling *c;
755 int op;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000756 char *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000757{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000758 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000759 int i;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000760#ifdef PRIVATE_NAME_MANGLING
761 char buffer[256];
762 if (name != NULL && name[0] == '_' && name[1] == '_' &&
763 c->c_private != NULL &&
764 com_mangle(c, name, buffer, (int)sizeof(buffer)))
765 name = buffer;
766#endif
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000767 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000768 c->c_errors++;
769 i = 255;
770 }
771 else {
772 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000773 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000774 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000775 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
776 switch (op) {
777 case LOAD_NAME:
778 case STORE_NAME:
779 case DELETE_NAME:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000780 if (PyDict_GetItemString(c->c_globals, name) != NULL) {
Guido van Rossumc5e96291991-12-10 13:53:51 +0000781 switch (op) {
782 case LOAD_NAME: op = LOAD_GLOBAL; break;
783 case STORE_NAME: op = STORE_GLOBAL; break;
784 case DELETE_NAME: op = DELETE_GLOBAL; break;
785 }
786 }
787 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000788 com_addoparg(c, op, i);
789}
790
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000791static void
792com_addopname(c, op, n)
793 struct compiling *c;
794 int op;
795 node *n;
796{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000797 char *name;
798 char buffer[1000];
799 /* XXX it is possible to write this code without the 1000
800 chars on the total length of dotted names, I just can't be
801 bothered right now */
802 if (TYPE(n) == STAR)
803 name = "*";
804 else if (TYPE(n) == dotted_name) {
805 char *p = buffer;
806 int i;
807 name = buffer;
808 for (i = 0; i < NCH(n); i += 2) {
809 char *s = STR(CHILD(n, i));
810 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000811 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000812 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000813 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000814 break;
815 }
816 if (p != buffer)
817 *p++ = '.';
818 strcpy(p, s);
819 p = strchr(p, '\0');
820 }
821 }
822 else {
823 REQ(n, NAME);
824 name = STR(n);
825 }
826 com_addopnamestr(c, op, name);
827}
828
Guido van Rossum79f25d91997-04-29 20:08:16 +0000829static PyObject *
Guido van Rossum452a9831996-09-17 14:32:04 +0000830parsenumber(co, s)
831 struct compiling *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000832 char *s;
833{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000834 extern double atof Py_PROTO((const char *));
Guido van Rossumc5e96291991-12-10 13:53:51 +0000835 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000836 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000837 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +0000838#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000839 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000840 int imflag;
841#endif
842
Guido van Rossum282914b1991-04-04 10:42:56 +0000843 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000844 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000845#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000846 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000847#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000848 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000849 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000850 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000851 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000852 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000853 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000854 if (*end == '\0') {
855 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000856 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000857 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000858 return NULL;
859 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000860 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000861 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000862 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000863#ifndef WITHOUT_COMPLEX
864 if (imflag) {
865 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000866 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +0000867 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000868 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000869 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +0000870 }
Guido van Rossumac1fc951997-10-08 15:23:55 +0000871 else
Guido van Rossum50564e81996-01-12 01:13:16 +0000872#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +0000873 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000874 PyFPE_START_PROTECT("atof", return 0)
875 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000876 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000877 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000878 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000879}
880
Guido van Rossum79f25d91997-04-29 20:08:16 +0000881static PyObject *
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000882parsestr(s)
883 char *s;
884{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000885 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000886 int len;
887 char *buf;
888 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000889 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000890 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +0000891 int first = *s;
892 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000893 int rawmode = 0;
894 int unicode = 0;
895 if (isalpha(quote) || quote == '_') {
896 if (quote == 'u' || quote == 'U') {
897 quote = *++s;
898 unicode = 1;
899 }
900 if (quote == 'r' || quote == 'R') {
901 quote = *++s;
902 rawmode = 1;
903 }
904 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000905 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000906 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000907 return NULL;
908 }
909 s++;
910 len = strlen(s);
Guido van Rossum8054fad1993-10-26 15:19:44 +0000911 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000912 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000913 return NULL;
914 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000915 if (len >= 4 && s[0] == quote && s[1] == quote) {
916 s += 2;
917 len -= 2;
918 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000919 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000920 return NULL;
921 }
922 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +0000923 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000924 if (rawmode)
925 return PyUnicode_DecodeRawUnicodeEscape(
926 s, len, NULL);
927 else
928 return PyUnicode_DecodeUnicodeEscape(
929 s, len, NULL);
930 }
931 else if (rawmode || strchr(s, '\\') == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000932 return PyString_FromStringAndSize(s, len);
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000933 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000934 v = PyString_FromStringAndSize((char *)NULL, len);
935 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000936 end = s + len;
937 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000938 if (*s != '\\') {
939 *p++ = *s++;
940 continue;
941 }
942 s++;
943 switch (*s++) {
944 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000945 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000946 case '\\': *p++ = '\\'; break;
947 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000948 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000949 case 'b': *p++ = '\b'; break;
950 case 'f': *p++ = '\014'; break; /* FF */
951 case 't': *p++ = '\t'; break;
952 case 'n': *p++ = '\n'; break;
953 case 'r': *p++ = '\r'; break;
954 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000955 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
956 case '0': case '1': case '2': case '3':
957 case '4': case '5': case '6': case '7':
958 c = s[-1] - '0';
959 if ('0' <= *s && *s <= '7') {
960 c = (c<<3) + *s++ - '0';
961 if ('0' <= *s && *s <= '7')
962 c = (c<<3) + *s++ - '0';
963 }
964 *p++ = c;
965 break;
966 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000967 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000968 unsigned int x = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000969 do {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000970 c = Py_CHARMASK(*s);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000971 s++;
Guido van Rossumed1100f1997-10-20 23:24:07 +0000972 x = (x<<4) & ~0xF;
973 if (isdigit(c))
974 x += c - '0';
975 else if (islower(c))
976 x += 10 + c - 'a';
977 else
978 x += 10 + c - 'A';
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000979 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossumed1100f1997-10-20 23:24:07 +0000980 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000981 break;
982 }
983 /* FALLTHROUGH */
984 default: *p++ = '\\'; *p++ = s[-1]; break;
985 }
986 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000987 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000988 return v;
989}
990
Guido van Rossum79f25d91997-04-29 20:08:16 +0000991static PyObject *
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000992parsestrplus(n)
993 node *n;
994{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000995 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000996 int i;
997 REQ(CHILD(n, 0), STRING);
998 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
999 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001000 for (i = 1; i < NCH(n); i++) {
1001 PyObject *s;
1002 s = parsestr(STR(CHILD(n, i)));
1003 if (s == NULL)
1004 goto onError;
1005 if (PyString_Check(v) && PyString_Check(s)) {
1006 PyString_ConcatAndDel(&v, s);
1007 if (v == NULL)
1008 goto onError;
1009 }
1010 else {
1011 PyObject *temp;
1012 temp = PyUnicode_Concat(v, s);
1013 Py_DECREF(s);
1014 if (temp == NULL)
1015 goto onError;
1016 Py_DECREF(v);
1017 v = temp;
1018 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001019 }
1020 }
1021 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001022
1023 onError:
1024 Py_XDECREF(v);
1025 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001026}
1027
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001028static void
1029com_list_constructor(c, n)
1030 struct compiling *c;
1031 node *n;
1032{
1033 int len;
1034 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001035 if (TYPE(n) != testlist)
1036 REQ(n, exprlist);
1037 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
1038 len = (NCH(n) + 1) / 2;
1039 for (i = 0; i < NCH(n); i += 2)
1040 com_node(c, CHILD(n, i));
1041 com_addoparg(c, BUILD_LIST, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001042 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001043}
1044
1045static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001046com_dictmaker(c, n)
1047 struct compiling *c;
1048 node *n;
1049{
1050 int i;
1051 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1052 for (i = 0; i+2 < NCH(n); i += 4) {
1053 /* We must arrange things just right for STORE_SUBSCR.
1054 It wants the stack to look like (value) (dict) (key) */
1055 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001056 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001057 com_node(c, CHILD(n, i+2)); /* value */
1058 com_addbyte(c, ROT_TWO);
1059 com_node(c, CHILD(n, i)); /* key */
1060 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001061 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001062 }
1063}
1064
1065static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001066com_atom(c, n)
1067 struct compiling *c;
1068 node *n;
1069{
1070 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001071 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001072 int i;
1073 REQ(n, atom);
1074 ch = CHILD(n, 0);
1075 switch (TYPE(ch)) {
1076 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001077 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001078 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001079 com_push(c, 1);
1080 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001081 else
1082 com_node(c, CHILD(n, 1));
1083 break;
1084 case LSQB:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001085 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001086 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001087 com_push(c, 1);
1088 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001089 else
1090 com_list_constructor(c, CHILD(n, 1));
1091 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001092 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001093 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001094 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001095 if (TYPE(CHILD(n, 1)) != RBRACE)
1096 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001097 break;
1098 case BACKQUOTE:
1099 com_node(c, CHILD(n, 1));
1100 com_addbyte(c, UNARY_CONVERT);
1101 break;
1102 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001103 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001104 i = 255;
1105 }
1106 else {
1107 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001108 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001109 }
1110 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001111 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001112 break;
1113 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001114 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001115 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001116 c->c_errors++;
1117 i = 255;
1118 }
1119 else {
1120 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001121 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001122 }
1123 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001124 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001125 break;
1126 case NAME:
1127 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001128 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001129 break;
1130 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001131 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001132 com_error(c, PyExc_SystemError,
1133 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001134 }
1135}
1136
1137static void
1138com_slice(c, n, op)
1139 struct compiling *c;
1140 node *n;
1141 int op;
1142{
1143 if (NCH(n) == 1) {
1144 com_addbyte(c, op);
1145 }
1146 else if (NCH(n) == 2) {
1147 if (TYPE(CHILD(n, 0)) != COLON) {
1148 com_node(c, CHILD(n, 0));
1149 com_addbyte(c, op+1);
1150 }
1151 else {
1152 com_node(c, CHILD(n, 1));
1153 com_addbyte(c, op+2);
1154 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001155 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001156 }
1157 else {
1158 com_node(c, CHILD(n, 0));
1159 com_node(c, CHILD(n, 2));
1160 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001161 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001162 }
1163}
1164
Guido van Rossum635abd21997-01-06 22:56:52 +00001165static void
1166com_argument(c, n, pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001167 struct compiling *c;
1168 node *n; /* argument */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001169 PyObject **pkeywords;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001170{
1171 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001172 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001173 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001174 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001175 com_error(c, PyExc_SyntaxError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001176 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001177 }
1178 else {
1179 com_node(c, CHILD(n, 0));
1180 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001181 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001182 }
1183 m = n;
1184 do {
1185 m = CHILD(m, 0);
1186 } while (NCH(m) == 1);
1187 if (TYPE(m) != NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001188 com_error(c, PyExc_SyntaxError,
1189 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001190 }
1191 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001192 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001193 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001194 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001195 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001196 c->c_errors++;
1197 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001198 if (PyDict_GetItem(*pkeywords, v) != NULL)
1199 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001200 "duplicate keyword argument");
1201 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001202 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001203 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001204 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001205 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001206 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001207 }
1208 }
1209 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001210}
1211
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001212static void
1213com_call_function(c, n)
1214 struct compiling *c;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001215 node *n; /* EITHER arglist OR ')' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001216{
1217 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001218 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001219 }
1220 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001221 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001222 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001223 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001224 int star_flag = 0;
1225 int starstar_flag = 0;
1226 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001227 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001228 na = 0;
1229 nk = 0;
1230 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001231 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001232 if (TYPE(ch) == STAR ||
1233 TYPE(ch) == DOUBLESTAR)
1234 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001235 if (ch->n_lineno != lineno) {
1236 lineno = ch->n_lineno;
1237 com_addoparg(c, SET_LINENO, lineno);
1238 }
1239 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001240 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001241 na++;
1242 else
1243 nk++;
1244 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001245 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001246 while (i < NCH(n)) {
1247 node *tok = CHILD(n, i);
1248 node *ch = CHILD(n, i+1);
1249 i += 3;
1250 switch (TYPE(tok)) {
1251 case STAR: star_flag = 1; break;
1252 case DOUBLESTAR: starstar_flag = 1; break;
1253 }
1254 com_node(c, ch);
1255 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001256 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001257 com_error(c, PyExc_SyntaxError,
1258 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001259 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001260 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001261 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001262 star_flag + (starstar_flag << 1);
1263 else
1264 opcode = CALL_FUNCTION;
1265 com_addoparg(c, opcode, na | (nk << 8));
1266 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001267 }
1268}
1269
1270static void
1271com_select_member(c, n)
1272 struct compiling *c;
1273 node *n;
1274{
1275 com_addopname(c, LOAD_ATTR, n);
1276}
1277
1278static void
Guido van Rossum8861b741996-07-30 16:49:37 +00001279com_sliceobj(c, n)
1280 struct compiling *c;
1281 node *n;
1282{
1283 int i=0;
1284 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001285 node *ch;
1286
1287 /* first argument */
1288 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001289 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001290 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001291 i++;
1292 }
1293 else {
1294 com_node(c, CHILD(n,i));
1295 i++;
1296 REQ(CHILD(n,i),COLON);
1297 i++;
1298 }
1299 /* second argument */
1300 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1301 com_node(c, CHILD(n,i));
1302 i++;
1303 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001304 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001305 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001306 com_push(c, 1);
1307 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001308 /* remaining arguments */
1309 for (; i < NCH(n); i++) {
1310 ns++;
1311 ch=CHILD(n,i);
1312 REQ(ch, sliceop);
1313 if (NCH(ch) == 1) {
1314 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001315 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001316 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001317 }
1318 else
1319 com_node(c, CHILD(ch,1));
1320 }
1321 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001322 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001323}
1324
1325static void
1326com_subscript(c, n)
1327 struct compiling *c;
1328 node *n;
1329{
1330 node *ch;
1331 REQ(n, subscript);
1332 ch = CHILD(n,0);
1333 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001334 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001335 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001336 com_push(c, 1);
1337 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001338 else {
1339 /* check for slice */
1340 if ((TYPE(ch) == COLON || NCH(n) > 1))
1341 com_sliceobj(c, n);
1342 else {
1343 REQ(ch, test);
1344 com_node(c, ch);
1345 }
1346 }
1347}
1348
1349static void
1350com_subscriptlist(c, n, assigning)
1351 struct compiling *c;
1352 node *n;
1353 int assigning;
1354{
1355 int i, op;
1356 REQ(n, subscriptlist);
1357 /* Check to make backward compatible slice behavior for '[i:j]' */
1358 if (NCH(n) == 1) {
1359 node *sub = CHILD(n, 0); /* subscript */
1360 /* Make it is a simple slice.
Guido van Rossum8b993a91997-01-17 21:04:03 +00001361 Should have exactly one colon. */
Guido van Rossum8861b741996-07-30 16:49:37 +00001362 if ((TYPE(CHILD(sub, 0)) == COLON
1363 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
Guido van Rossum8b993a91997-01-17 21:04:03 +00001364 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1365 {
Guido van Rossum8861b741996-07-30 16:49:37 +00001366 if (assigning == OP_APPLY)
1367 op = SLICE;
1368 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001369 op = ((assigning == OP_ASSIGN) ?
1370 STORE_SLICE : DELETE_SLICE);
Guido van Rossum8861b741996-07-30 16:49:37 +00001371 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001372 if (op == STORE_SLICE)
1373 com_pop(c, 2);
1374 else if (op == DELETE_SLICE)
1375 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001376 return;
1377 }
1378 }
1379 /* Else normal subscriptlist. Compile each subscript. */
1380 for (i = 0; i < NCH(n); i += 2)
1381 com_subscript(c, CHILD(n, i));
1382 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001383 if (NCH(n) > 1) {
1384 i = (NCH(n)+1) / 2;
1385 com_addoparg(c, BUILD_TUPLE, i);
1386 com_pop(c, i-1);
1387 }
1388 if (assigning == OP_APPLY) {
Guido van Rossum8861b741996-07-30 16:49:37 +00001389 op = BINARY_SUBSCR;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001390 i = 1;
1391 }
1392 else if (assigning == OP_ASSIGN) {
1393 op = STORE_SUBSCR;
1394 i = 3;
1395 }
1396 else {
1397 op = DELETE_SUBSCR;
1398 i = 2;
1399 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001400 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001401 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001402}
1403
1404static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001405com_apply_trailer(c, n)
1406 struct compiling *c;
1407 node *n;
1408{
1409 REQ(n, trailer);
1410 switch (TYPE(CHILD(n, 0))) {
1411 case LPAR:
1412 com_call_function(c, CHILD(n, 1));
1413 break;
1414 case DOT:
1415 com_select_member(c, CHILD(n, 1));
1416 break;
1417 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001418 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001419 break;
1420 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001421 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001422 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001423 }
1424}
1425
1426static void
Guido van Rossum50564e81996-01-12 01:13:16 +00001427com_power(c, n)
1428 struct compiling *c;
1429 node *n;
1430{
1431 int i;
1432 REQ(n, power);
1433 com_atom(c, CHILD(n, 0));
1434 for (i = 1; i < NCH(n); i++) {
1435 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1436 com_factor(c, CHILD(n, i+1));
1437 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001438 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001439 break;
1440 }
1441 else
1442 com_apply_trailer(c, CHILD(n, i));
1443 }
1444}
1445
1446static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001447com_factor(c, n)
1448 struct compiling *c;
1449 node *n;
1450{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001451 REQ(n, factor);
1452 if (TYPE(CHILD(n, 0)) == PLUS) {
1453 com_factor(c, CHILD(n, 1));
1454 com_addbyte(c, UNARY_POSITIVE);
1455 }
1456 else if (TYPE(CHILD(n, 0)) == MINUS) {
1457 com_factor(c, CHILD(n, 1));
1458 com_addbyte(c, UNARY_NEGATIVE);
1459 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001460 else if (TYPE(CHILD(n, 0)) == TILDE) {
1461 com_factor(c, CHILD(n, 1));
1462 com_addbyte(c, UNARY_INVERT);
1463 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001464 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001465 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001466 }
1467}
1468
1469static void
1470com_term(c, n)
1471 struct compiling *c;
1472 node *n;
1473{
1474 int i;
1475 int op;
1476 REQ(n, term);
1477 com_factor(c, CHILD(n, 0));
1478 for (i = 2; i < NCH(n); i += 2) {
1479 com_factor(c, CHILD(n, i));
1480 switch (TYPE(CHILD(n, i-1))) {
1481 case STAR:
1482 op = BINARY_MULTIPLY;
1483 break;
1484 case SLASH:
1485 op = BINARY_DIVIDE;
1486 break;
1487 case PERCENT:
1488 op = BINARY_MODULO;
1489 break;
1490 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001491 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001492 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001493 op = 255;
1494 }
1495 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001496 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001497 }
1498}
1499
1500static void
1501com_arith_expr(c, n)
1502 struct compiling *c;
1503 node *n;
1504{
1505 int i;
1506 int op;
1507 REQ(n, arith_expr);
1508 com_term(c, CHILD(n, 0));
1509 for (i = 2; i < NCH(n); i += 2) {
1510 com_term(c, CHILD(n, i));
1511 switch (TYPE(CHILD(n, i-1))) {
1512 case PLUS:
1513 op = BINARY_ADD;
1514 break;
1515 case MINUS:
1516 op = BINARY_SUBTRACT;
1517 break;
1518 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001519 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001520 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001521 op = 255;
1522 }
1523 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001524 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001525 }
1526}
1527
1528static void
1529com_shift_expr(c, n)
1530 struct compiling *c;
1531 node *n;
1532{
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
1557com_and_expr(c, n)
1558 struct compiling *c;
1559 node *n;
1560{
1561 int i;
1562 int op;
1563 REQ(n, and_expr);
1564 com_shift_expr(c, CHILD(n, 0));
1565 for (i = 2; i < NCH(n); i += 2) {
1566 com_shift_expr(c, CHILD(n, i));
1567 if (TYPE(CHILD(n, i-1)) == AMPER) {
1568 op = BINARY_AND;
1569 }
1570 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001571 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001572 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001573 op = 255;
1574 }
1575 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001576 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001577 }
1578}
1579
1580static void
1581com_xor_expr(c, n)
1582 struct compiling *c;
1583 node *n;
1584{
1585 int i;
1586 int op;
1587 REQ(n, xor_expr);
1588 com_and_expr(c, CHILD(n, 0));
1589 for (i = 2; i < NCH(n); i += 2) {
1590 com_and_expr(c, CHILD(n, i));
1591 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1592 op = BINARY_XOR;
1593 }
1594 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001595 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001596 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001597 op = 255;
1598 }
1599 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001600 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001601 }
1602}
1603
1604static void
1605com_expr(c, n)
1606 struct compiling *c;
1607 node *n;
1608{
1609 int i;
1610 int op;
1611 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001612 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001613 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001614 com_xor_expr(c, CHILD(n, i));
1615 if (TYPE(CHILD(n, i-1)) == VBAR) {
1616 op = BINARY_OR;
1617 }
1618 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001619 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001620 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001621 op = 255;
1622 }
1623 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001624 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001625 }
1626}
1627
1628static enum cmp_op
1629cmp_type(n)
1630 node *n;
1631{
1632 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001633 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001634 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1635 if (NCH(n) == 1) {
1636 n = CHILD(n, 0);
1637 switch (TYPE(n)) {
1638 case LESS: return LT;
1639 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001640 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001641 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001642 case LESSEQUAL: return LE;
1643 case GREATEREQUAL: return GE;
1644 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001645 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1646 if (strcmp(STR(n), "is") == 0) return IS;
1647 }
1648 }
1649 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001650 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001651 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1652 return NOT_IN;
1653 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1654 return IS_NOT;
1655 }
1656 }
1657 return BAD;
1658}
1659
1660static void
1661com_comparison(c, n)
1662 struct compiling *c;
1663 node *n;
1664{
1665 int i;
1666 enum cmp_op op;
1667 int anchor;
1668 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1669 com_expr(c, CHILD(n, 0));
1670 if (NCH(n) == 1)
1671 return;
1672
1673 /****************************************************************
1674 The following code is generated for all but the last
1675 comparison in a chain:
1676
1677 label: on stack: opcode: jump to:
1678
1679 a <code to load b>
1680 a, b DUP_TOP
1681 a, b, b ROT_THREE
1682 b, a, b COMPARE_OP
1683 b, 0-or-1 JUMP_IF_FALSE L1
1684 b, 1 POP_TOP
1685 b
1686
1687 We are now ready to repeat this sequence for the next
1688 comparison in the chain.
1689
1690 For the last we generate:
1691
1692 b <code to load c>
1693 b, c COMPARE_OP
1694 0-or-1
1695
1696 If there were any jumps to L1 (i.e., there was more than one
1697 comparison), we generate:
1698
1699 0-or-1 JUMP_FORWARD L2
1700 L1: b, 0 ROT_TWO
1701 0, b POP_TOP
1702 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001703 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001704 ****************************************************************/
1705
1706 anchor = 0;
1707
1708 for (i = 2; i < NCH(n); i += 2) {
1709 com_expr(c, CHILD(n, i));
1710 if (i+2 < NCH(n)) {
1711 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001712 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001713 com_addbyte(c, ROT_THREE);
1714 }
1715 op = cmp_type(CHILD(n, i-1));
1716 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001717 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001718 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001719 }
1720 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001721 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001722 if (i+2 < NCH(n)) {
1723 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1724 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001725 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001726 }
1727 }
1728
1729 if (anchor) {
1730 int anchor2 = 0;
1731 com_addfwref(c, JUMP_FORWARD, &anchor2);
1732 com_backpatch(c, anchor);
1733 com_addbyte(c, ROT_TWO);
1734 com_addbyte(c, POP_TOP);
1735 com_backpatch(c, anchor2);
1736 }
1737}
1738
1739static void
1740com_not_test(c, n)
1741 struct compiling *c;
1742 node *n;
1743{
1744 REQ(n, not_test); /* 'not' not_test | comparison */
1745 if (NCH(n) == 1) {
1746 com_comparison(c, CHILD(n, 0));
1747 }
1748 else {
1749 com_not_test(c, CHILD(n, 1));
1750 com_addbyte(c, UNARY_NOT);
1751 }
1752}
1753
1754static void
1755com_and_test(c, n)
1756 struct compiling *c;
1757 node *n;
1758{
1759 int i;
1760 int anchor;
1761 REQ(n, and_test); /* not_test ('and' not_test)* */
1762 anchor = 0;
1763 i = 0;
1764 for (;;) {
1765 com_not_test(c, CHILD(n, i));
1766 if ((i += 2) >= NCH(n))
1767 break;
1768 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1769 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001770 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001771 }
1772 if (anchor)
1773 com_backpatch(c, anchor);
1774}
1775
1776static void
1777com_test(c, n)
1778 struct compiling *c;
1779 node *n;
1780{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001781 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001782 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001783 PyObject *v;
Guido van Rossum57531fe1993-11-30 14:57:42 +00001784 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001785 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001786 v = (PyObject *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001787 if (v == NULL) {
1788 c->c_errors++;
1789 i = 255;
1790 }
1791 else {
1792 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001793 Py_DECREF(v);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001794 }
1795 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001796 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001797 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001798 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001799 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001800 else {
1801 int anchor = 0;
1802 int i = 0;
1803 for (;;) {
1804 com_and_test(c, CHILD(n, i));
1805 if ((i += 2) >= NCH(n))
1806 break;
1807 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1808 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001809 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001810 }
1811 if (anchor)
1812 com_backpatch(c, anchor);
1813 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001814}
1815
1816static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001817com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001818 struct compiling *c;
1819 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001820 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001821{
1822 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001823 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001824 com_node(c, CHILD(n, 0));
1825 }
1826 else {
1827 int i;
1828 int len;
1829 len = (NCH(n) + 1) / 2;
1830 for (i = 0; i < NCH(n); i += 2)
1831 com_node(c, CHILD(n, i));
1832 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001833 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001834 }
1835}
1836
1837
1838/* Begin of assignment compilation */
1839
Guido van Rossum79f25d91997-04-29 20:08:16 +00001840static void com_assign_name Py_PROTO((struct compiling *, node *, int));
1841static void com_assign Py_PROTO((struct compiling *, node *, int));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001842
1843static void
1844com_assign_attr(c, n, assigning)
1845 struct compiling *c;
1846 node *n;
1847 int assigning;
1848{
1849 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001850 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001851}
1852
1853static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001854com_assign_trailer(c, n, assigning)
1855 struct compiling *c;
1856 node *n;
1857 int assigning;
1858{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001859 REQ(n, trailer);
1860 switch (TYPE(CHILD(n, 0))) {
1861 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001862 com_error(c, PyExc_SyntaxError,
1863 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001864 break;
1865 case DOT: /* '.' NAME */
1866 com_assign_attr(c, CHILD(n, 1), assigning);
1867 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001868 case LSQB: /* '[' subscriptlist ']' */
1869 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001870 break;
1871 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001872 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001873 }
1874}
1875
1876static void
1877com_assign_tuple(c, n, assigning)
1878 struct compiling *c;
1879 node *n;
1880 int assigning;
1881{
1882 int i;
1883 if (TYPE(n) != testlist)
1884 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001885 if (assigning) {
1886 i = (NCH(n)+1)/2;
1887 com_addoparg(c, UNPACK_TUPLE, i);
1888 com_push(c, i-1);
1889 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001890 for (i = 0; i < NCH(n); i += 2)
1891 com_assign(c, CHILD(n, i), assigning);
1892}
1893
1894static void
1895com_assign_list(c, n, assigning)
1896 struct compiling *c;
1897 node *n;
1898 int assigning;
1899{
1900 int i;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001901 if (assigning) {
1902 i = (NCH(n)+1)/2;
1903 com_addoparg(c, UNPACK_LIST, i);
1904 com_push(c, i-1);
1905 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001906 for (i = 0; i < NCH(n); i += 2)
1907 com_assign(c, CHILD(n, i), assigning);
1908}
1909
1910static void
1911com_assign_name(c, n, assigning)
1912 struct compiling *c;
1913 node *n;
1914 int assigning;
1915{
1916 REQ(n, NAME);
1917 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001918 if (assigning)
1919 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001920}
1921
1922static void
1923com_assign(c, n, assigning)
1924 struct compiling *c;
1925 node *n;
1926 int assigning;
1927{
1928 /* Loop to avoid trivial recursion */
1929 for (;;) {
1930 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001931
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001932 case exprlist:
1933 case testlist:
1934 if (NCH(n) > 1) {
1935 com_assign_tuple(c, n, assigning);
1936 return;
1937 }
1938 n = CHILD(n, 0);
1939 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001940
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001941 case test:
1942 case and_test:
1943 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001944 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001945 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001946 case xor_expr:
1947 case and_expr:
1948 case shift_expr:
1949 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001950 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001951 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001952 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001953 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001954 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001955 return;
1956 }
1957 n = CHILD(n, 0);
1958 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001959
Guido van Rossum50564e81996-01-12 01:13:16 +00001960 case power: /* atom trailer* ('**' power)* */
1961/* ('+'|'-'|'~') factor | atom trailer* */
1962 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001963 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001964 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001965 return;
1966 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001967 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001968 int i;
1969 com_node(c, CHILD(n, 0));
1970 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001971 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001972 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001973 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00001974 return;
1975 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001976 com_apply_trailer(c, CHILD(n, i));
1977 } /* NB i is still alive */
1978 com_assign_trailer(c,
1979 CHILD(n, i), assigning);
1980 return;
1981 }
1982 n = CHILD(n, 0);
1983 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001984
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001985 case atom:
1986 switch (TYPE(CHILD(n, 0))) {
1987 case LPAR:
1988 n = CHILD(n, 1);
1989 if (TYPE(n) == RPAR) {
1990 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001991 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001992 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001993 return;
1994 }
1995 break;
1996 case LSQB:
1997 n = CHILD(n, 1);
1998 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001999 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002000 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002001 return;
2002 }
2003 com_assign_list(c, n, assigning);
2004 return;
2005 case NAME:
2006 com_assign_name(c, CHILD(n, 0), assigning);
2007 return;
2008 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002009 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002010 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002011 return;
2012 }
2013 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002014
2015 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002016 com_error(c, PyExc_SyntaxError,
2017 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002018 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002019
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002020 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002021 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002022 com_error(c, PyExc_SystemError,
2023 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002024 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002025
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002026 }
2027 }
2028}
Guido van Rossum7c531111997-03-11 18:42:21 +00002029
Guido van Rossum79f25d91997-04-29 20:08:16 +00002030/* Forward */ static node *get_rawdocstring Py_PROTO((node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002031
2032static void
2033com_expr_stmt(c, n)
2034 struct compiling *c;
2035 node *n;
2036{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002037 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002038 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002039 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002040 return;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002041 com_node(c, CHILD(n, NCH(n)-1));
2042 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002043 if (c->c_interactive)
2044 com_addbyte(c, PRINT_EXPR);
2045 else
2046 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002047 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002048 }
2049 else {
2050 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002051 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002052 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002053 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002054 com_push(c, 1);
2055 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002056 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002057 }
2058 }
2059}
2060
2061static void
Guido van Rossum228d7f31997-04-02 05:24:36 +00002062com_assert_stmt(c, n)
2063 struct compiling *c;
2064 node *n;
2065{
2066 int a = 0, b = 0;
2067 int i;
2068 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2069 /* Generate code like for
2070
2071 if __debug__:
2072 if not <test>:
2073 raise AssertionError [, <message>]
2074
2075 where <message> is the second test, if present.
2076 */
2077 if (Py_OptimizeFlag)
2078 return;
2079 com_addopnamestr(c, LOAD_GLOBAL, "__debug__");
2080 com_push(c, 1);
2081 com_addfwref(c, JUMP_IF_FALSE, &a);
2082 com_addbyte(c, POP_TOP);
2083 com_pop(c, 1);
2084 com_node(c, CHILD(n, 1));
2085 com_addfwref(c, JUMP_IF_TRUE, &b);
2086 com_addbyte(c, POP_TOP);
2087 com_pop(c, 1);
2088 /* Raise that exception! */
2089 com_addopnamestr(c, LOAD_GLOBAL, "AssertionError");
2090 com_push(c, 1);
2091 i = NCH(n)/2; /* Either 2 or 4 */
2092 if (i > 1)
2093 com_node(c, CHILD(n, 3));
2094 com_addoparg(c, RAISE_VARARGS, i);
2095 com_pop(c, i);
2096 /* The interpreter does not fall through */
2097 /* All jumps converge here */
2098 com_backpatch(c, a);
2099 com_backpatch(c, b);
2100 com_addbyte(c, POP_TOP);
2101}
2102
2103static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002104com_print_stmt(c, n)
2105 struct compiling *c;
2106 node *n;
2107{
2108 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002109 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
2110 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002111 com_node(c, CHILD(n, i));
2112 com_addbyte(c, PRINT_ITEM);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002113 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002114 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002115 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002116 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002117 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002118}
2119
2120static void
2121com_return_stmt(c, n)
2122 struct compiling *c;
2123 node *n;
2124{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002125 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002126 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002127 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002128 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002129 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002130 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002131 com_push(c, 1);
2132 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002133 else
2134 com_node(c, CHILD(n, 1));
2135 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002136 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002137}
2138
2139static void
2140com_raise_stmt(c, n)
2141 struct compiling *c;
2142 node *n;
2143{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002144 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002145 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2146 if (NCH(n) > 1) {
2147 com_node(c, CHILD(n, 1));
2148 if (NCH(n) > 3) {
2149 com_node(c, CHILD(n, 3));
2150 if (NCH(n) > 5)
2151 com_node(c, CHILD(n, 5));
2152 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002153 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002154 i = NCH(n)/2;
2155 com_addoparg(c, RAISE_VARARGS, i);
2156 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002157}
2158
2159static void
2160com_import_stmt(c, n)
2161 struct compiling *c;
2162 node *n;
2163{
2164 int i;
2165 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002166 /* 'import' dotted_name (',' dotted_name)* |
2167 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002168 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002169 /* 'from' dotted_name 'import' ... */
2170 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002171 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002172 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002173 for (i = 3; i < NCH(n); i += 2)
2174 com_addopname(c, IMPORT_FROM, CHILD(n, i));
2175 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002176 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002177 }
2178 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002179 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002180 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002181 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002182 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002183 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002184 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002185 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002186 }
2187 }
2188}
2189
2190static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00002191com_global_stmt(c, n)
2192 struct compiling *c;
2193 node *n;
2194{
2195 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002196 REQ(n, global_stmt);
2197 /* 'global' NAME (',' NAME)* */
2198 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002199 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002200#ifdef PRIVATE_NAME_MANGLING
2201 char buffer[256];
2202 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2203 c->c_private != NULL &&
2204 com_mangle(c, s, buffer, (int)sizeof(buffer)))
2205 s = buffer;
2206#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00002207 if (PyDict_GetItemString(c->c_locals, s) != NULL) {
2208 com_error(c, PyExc_SyntaxError,
2209 "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002210 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002211 else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002212 c->c_errors++;
2213 }
2214}
2215
Guido van Rossum681d79a1995-07-18 14:51:37 +00002216static int
2217com_newlocal_o(c, nameval)
2218 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002219 PyObject *nameval;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002220{
2221 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002222 PyObject *ival;
2223 if (PyList_Size(c->c_varnames) != c->c_nlocals) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002224 /* This is usually caused by an error on a previous call */
2225 if (c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002226 com_error(c, PyExc_SystemError,
2227 "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002228 }
2229 return 0;
2230 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002231 ival = PyInt_FromLong(i = c->c_nlocals++);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002232 if (ival == NULL)
2233 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002234 else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002235 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002236 else if (PyList_Append(c->c_varnames, nameval) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002237 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002238 Py_XDECREF(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002239 return i;
2240}
2241
2242static int
2243com_addlocal_o(c, nameval)
2244 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002245 PyObject *nameval;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002246{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002247 PyObject *ival = PyDict_GetItem(c->c_locals, nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002248 if (ival != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002249 return PyInt_AsLong(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002250 return com_newlocal_o(c, nameval);
2251}
2252
2253static int
2254com_newlocal(c, name)
2255 struct compiling *c;
2256 char *name;
2257{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002258 PyObject *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002259 int i;
2260 if (nameval == NULL) {
2261 c->c_errors++;
2262 return 0;
2263 }
2264 i = com_newlocal_o(c, nameval);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002265 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002266 return i;
2267}
2268
Guido van Rossumc5e96291991-12-10 13:53:51 +00002269static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002270com_exec_stmt(c, n)
2271 struct compiling *c;
2272 node *n;
2273{
2274 REQ(n, exec_stmt);
2275 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2276 com_node(c, CHILD(n, 1));
2277 if (NCH(n) >= 4)
2278 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002279 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002280 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002281 com_push(c, 1);
2282 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002283 if (NCH(n) >= 6)
2284 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002285 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002286 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002287 com_push(c, 1);
2288 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002289 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002290 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002291}
2292
Guido van Rossum7c531111997-03-11 18:42:21 +00002293static int
2294is_constant_false(c, n)
2295 struct compiling *c;
2296 node *n;
2297{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002298 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002299 int i;
2300
2301 /* Label to avoid tail recursion */
2302 next:
2303 switch (TYPE(n)) {
2304
2305 case suite:
2306 if (NCH(n) == 1) {
2307 n = CHILD(n, 0);
2308 goto next;
2309 }
2310 /* Fall through */
2311 case file_input:
2312 for (i = 0; i < NCH(n); i++) {
2313 node *ch = CHILD(n, i);
2314 if (TYPE(ch) == stmt) {
2315 n = ch;
2316 goto next;
2317 }
2318 }
2319 break;
2320
2321 case stmt:
2322 case simple_stmt:
2323 case small_stmt:
2324 n = CHILD(n, 0);
2325 goto next;
2326
2327 case expr_stmt:
2328 case testlist:
2329 case test:
2330 case and_test:
2331 case not_test:
2332 case comparison:
2333 case expr:
2334 case xor_expr:
2335 case and_expr:
2336 case shift_expr:
2337 case arith_expr:
2338 case term:
2339 case factor:
2340 case power:
2341 case atom:
2342 if (NCH(n) == 1) {
2343 n = CHILD(n, 0);
2344 goto next;
2345 }
2346 break;
2347
2348 case NAME:
2349 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2350 return 1;
2351 break;
2352
2353 case NUMBER:
2354 v = parsenumber(c, STR(n));
2355 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002356 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002357 break;
2358 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002359 i = PyObject_IsTrue(v);
2360 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002361 return i == 0;
2362
2363 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002364 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002365 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002366 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002367 break;
2368 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002369 i = PyObject_IsTrue(v);
2370 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002371 return i == 0;
2372
2373 }
2374 return 0;
2375}
2376
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002377static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002378com_if_stmt(c, n)
2379 struct compiling *c;
2380 node *n;
2381{
2382 int i;
2383 int anchor = 0;
2384 REQ(n, if_stmt);
2385 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2386 for (i = 0; i+3 < NCH(n); i+=4) {
2387 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002388 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002389 if (is_constant_false(c, ch))
2390 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002391 if (i > 0)
2392 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002393 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002394 com_addfwref(c, JUMP_IF_FALSE, &a);
2395 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002396 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002397 com_node(c, CHILD(n, i+3));
2398 com_addfwref(c, JUMP_FORWARD, &anchor);
2399 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002400 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002401 com_addbyte(c, POP_TOP);
2402 }
2403 if (i+2 < NCH(n))
2404 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002405 if (anchor)
2406 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002407}
2408
2409static void
2410com_while_stmt(c, n)
2411 struct compiling *c;
2412 node *n;
2413{
2414 int break_anchor = 0;
2415 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002416 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002417 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2418 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002419 block_push(c, SETUP_LOOP);
2420 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002421 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002422 com_node(c, CHILD(n, 1));
2423 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2424 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002425 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002426 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002427 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002428 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002429 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2430 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002431 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002432 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002433 com_addbyte(c, POP_TOP);
2434 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002435 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002436 if (NCH(n) > 4)
2437 com_node(c, CHILD(n, 6));
2438 com_backpatch(c, break_anchor);
2439}
2440
2441static void
2442com_for_stmt(c, n)
2443 struct compiling *c;
2444 node *n;
2445{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002446 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002447 int break_anchor = 0;
2448 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002449 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002450 REQ(n, for_stmt);
2451 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2452 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002453 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002454 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002455 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002456 if (v == NULL)
2457 c->c_errors++;
2458 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002459 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002460 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002461 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002462 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002463 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002464 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002465 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002466 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002467 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002468 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002469 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2470 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002471 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002472 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002473 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002474 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002475 if (NCH(n) > 8)
2476 com_node(c, CHILD(n, 8));
2477 com_backpatch(c, break_anchor);
2478}
2479
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002480/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002481
2482 SETUP_FINALLY L
2483 <code for S>
2484 POP_BLOCK
2485 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002486 L: <code for Sf>
2487 END_FINALLY
2488
2489 The special instructions use the block stack. Each block
2490 stack entry contains the instruction that created it (here
2491 SETUP_FINALLY), the level of the value stack at the time the
2492 block stack entry was created, and a label (here L).
2493
2494 SETUP_FINALLY:
2495 Pushes the current value stack level and the label
2496 onto the block stack.
2497 POP_BLOCK:
2498 Pops en entry from the block stack, and pops the value
2499 stack until its level is the same as indicated on the
2500 block stack. (The label is ignored.)
2501 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002502 Pops a variable number of entries from the *value* stack
2503 and re-raises the exception they specify. The number of
2504 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002505
2506 The block stack is unwound when an exception is raised:
2507 when a SETUP_FINALLY entry is found, the exception is pushed
2508 onto the value stack (and the exception condition is cleared),
2509 and the interpreter jumps to the label gotten from the block
2510 stack.
2511
2512 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002513 (The contents of the value stack is shown in [], with the top
2514 at the right; 'tb' is trace-back info, 'val' the exception's
2515 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002516
2517 Value stack Label Instruction Argument
2518 [] SETUP_EXCEPT L1
2519 [] <code for S>
2520 [] POP_BLOCK
2521 [] JUMP_FORWARD L0
2522
Guido van Rossum3f5da241990-12-20 15:06:42 +00002523 [tb, val, exc] L1: DUP )
2524 [tb, val, exc, exc] <evaluate E1> )
2525 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2526 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2527 [tb, val, exc, 1] POP )
2528 [tb, val, exc] POP
2529 [tb, val] <assign to V1> (or POP if no V1)
2530 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002531 [] <code for S1>
2532 JUMP_FORWARD L0
2533
Guido van Rossum3f5da241990-12-20 15:06:42 +00002534 [tb, val, exc, 0] L2: POP
2535 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002536 .............................etc.......................
2537
Guido van Rossum3f5da241990-12-20 15:06:42 +00002538 [tb, val, exc, 0] Ln+1: POP
2539 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002540
2541 [] L0: <next statement>
2542
2543 Of course, parts are not generated if Vi or Ei is not present.
2544*/
2545
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002546static void
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002547com_try_except(c, n)
2548 struct compiling *c;
2549 node *n;
2550{
2551 int except_anchor = 0;
2552 int end_anchor = 0;
2553 int else_anchor = 0;
2554 int i;
2555 node *ch;
2556
2557 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2558 block_push(c, SETUP_EXCEPT);
2559 com_node(c, CHILD(n, 2));
2560 com_addbyte(c, POP_BLOCK);
2561 block_pop(c, SETUP_EXCEPT);
2562 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2563 com_backpatch(c, except_anchor);
2564 for (i = 3;
2565 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2566 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002567 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002568 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002569 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002570 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002571 break;
2572 }
2573 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002574 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002575 com_addoparg(c, SET_LINENO, ch->n_lineno);
2576 if (NCH(ch) > 1) {
2577 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002578 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002579 com_node(c, CHILD(ch, 1));
2580 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002581 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002582 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2583 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002584 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002585 }
2586 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002587 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002588 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002589 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002590 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002591 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002592 com_pop(c, 1);
2593 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002594 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002595 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002596 com_node(c, CHILD(n, i+2));
2597 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2598 if (except_anchor) {
2599 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002600 /* We come in with [tb, val, exc, 0] on the
2601 stack; one pop and it's the same as
2602 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002603 com_addbyte(c, POP_TOP);
2604 }
2605 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002606 /* We actually come in here with [tb, val, exc] but the
2607 END_FINALLY will zap those and jump around.
2608 The c_stacklevel does not reflect them so we need not pop
2609 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002610 com_addbyte(c, END_FINALLY);
2611 com_backpatch(c, else_anchor);
2612 if (i < NCH(n))
2613 com_node(c, CHILD(n, i+2));
2614 com_backpatch(c, end_anchor);
2615}
2616
2617static void
2618com_try_finally(c, n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002619 struct compiling *c;
2620 node *n;
2621{
2622 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002623 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002624
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002625 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2626 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002627 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002628 com_addbyte(c, POP_BLOCK);
2629 block_pop(c, SETUP_FINALLY);
2630 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002631 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002632 /* While the generated code pushes only one item,
2633 the try-finally handling can enter here with
2634 up to three items. OK, here are the details:
2635 3 for an exception, 2 for RETURN, 1 for BREAK. */
2636 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002637 com_backpatch(c, finally_anchor);
2638 ch = CHILD(n, NCH(n)-1);
2639 com_addoparg(c, SET_LINENO, ch->n_lineno);
2640 com_node(c, ch);
2641 com_addbyte(c, END_FINALLY);
2642 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002643 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002644}
2645
2646static void
2647com_try_stmt(c, n)
2648 struct compiling *c;
2649 node *n;
2650{
2651 REQ(n, try_stmt);
2652 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2653 | 'try' ':' suite 'finally' ':' suite */
2654 if (TYPE(CHILD(n, 3)) != except_clause)
2655 com_try_finally(c, n);
2656 else
2657 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002658}
2659
Guido van Rossum8b993a91997-01-17 21:04:03 +00002660static node *
2661get_rawdocstring(n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002662 node *n;
2663{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002664 int i;
2665
Guido van Rossum8b993a91997-01-17 21:04:03 +00002666 /* Label to avoid tail recursion */
2667 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002668 switch (TYPE(n)) {
2669
2670 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002671 if (NCH(n) == 1) {
2672 n = CHILD(n, 0);
2673 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002674 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002675 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002676 case file_input:
2677 for (i = 0; i < NCH(n); i++) {
2678 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002679 if (TYPE(ch) == stmt) {
2680 n = ch;
2681 goto next;
2682 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002683 }
2684 break;
2685
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002686 case stmt:
2687 case simple_stmt:
2688 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002689 n = CHILD(n, 0);
2690 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002691
2692 case expr_stmt:
2693 case testlist:
2694 case test:
2695 case and_test:
2696 case not_test:
2697 case comparison:
2698 case expr:
2699 case xor_expr:
2700 case and_expr:
2701 case shift_expr:
2702 case arith_expr:
2703 case term:
2704 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002705 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002706 if (NCH(n) == 1) {
2707 n = CHILD(n, 0);
2708 goto next;
2709 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002710 break;
2711
2712 case atom:
2713 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002714 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002715 break;
2716
2717 }
2718 return NULL;
2719}
2720
Guido van Rossum79f25d91997-04-29 20:08:16 +00002721static PyObject *
Guido van Rossum8b993a91997-01-17 21:04:03 +00002722get_docstring(n)
2723 node *n;
2724{
Guido van Rossum541563e1999-01-28 15:08:09 +00002725 /* Don't generate doc-strings if run with -OO */
2726 if (Py_OptimizeFlag > 1)
2727 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002728 n = get_rawdocstring(n);
2729 if (n == NULL)
2730 return NULL;
2731 return parsestrplus(n);
2732}
2733
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002734static void
2735com_suite(c, n)
2736 struct compiling *c;
2737 node *n;
2738{
2739 REQ(n, suite);
2740 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2741 if (NCH(n) == 1) {
2742 com_node(c, CHILD(n, 0));
2743 }
2744 else {
2745 int i;
2746 for (i = 0; i < NCH(n); i++) {
2747 node *ch = CHILD(n, i);
2748 if (TYPE(ch) == stmt)
2749 com_node(c, ch);
2750 }
2751 }
2752}
2753
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002754/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002755static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002756com_continue_stmt(c, n)
2757 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002758 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002759{
2760 int i = c->c_nblocks;
2761 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2762 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2763 }
2764 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002765 com_error(c, PyExc_SyntaxError,
2766 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002767 }
2768 /* XXX Could allow it inside a 'finally' clause
2769 XXX if we could pop the exception still on the stack */
2770}
2771
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002772static int
Guido van Rossum681d79a1995-07-18 14:51:37 +00002773com_argdefs(c, n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002774 struct compiling *c;
2775 node *n;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002776{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002777 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002778 if (TYPE(n) == lambdef) {
2779 /* lambdef: 'lambda' [varargslist] ':' test */
2780 n = CHILD(n, 1);
2781 }
2782 else {
2783 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2784 n = CHILD(n, 2);
2785 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2786 n = CHILD(n, 1);
2787 }
2788 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002789 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002790 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002791 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002792 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2793 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002794 nargs = 0;
2795 ndefs = 0;
2796 for (i = 0; i < nch; i++) {
2797 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002798 if (TYPE(CHILD(n, i)) == STAR ||
2799 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002800 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002801 nargs++;
2802 i++;
2803 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002804 t = RPAR; /* Anything except EQUAL or COMMA */
2805 else
2806 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002807 if (t == EQUAL) {
2808 i++;
2809 ndefs++;
2810 com_node(c, CHILD(n, i));
2811 i++;
2812 if (i >= nch)
2813 break;
2814 t = TYPE(CHILD(n, i));
2815 }
2816 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00002817 /* Treat "(a=1, b)" as an error */
2818 if (ndefs)
2819 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00002820 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002821 }
2822 if (t != COMMA)
2823 break;
2824 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002825 return ndefs;
2826}
2827
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002828static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002829com_funcdef(c, n)
2830 struct compiling *c;
2831 node *n;
2832{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002833 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002834 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002835 v = (PyObject *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002836 if (v == NULL)
2837 c->c_errors++;
2838 else {
2839 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002840 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002841 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002842 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002843 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002844 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002845 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002846 com_pop(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002847 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002848 }
2849}
2850
2851static void
Guido van Rossum25831651993-05-19 14:50:45 +00002852com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002853 struct compiling *c;
2854 node *n;
2855{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002856 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002857 REQ(n, testlist);
2858 /* testlist: test (',' test)* [','] */
2859 for (i = 0; i < NCH(n); i += 2)
2860 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002861 i = (NCH(n)+1) / 2;
2862 com_addoparg(c, BUILD_TUPLE, i);
2863 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002864}
2865
2866static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002867com_classdef(c, n)
2868 struct compiling *c;
2869 node *n;
2870{
Guido van Rossum25831651993-05-19 14:50:45 +00002871 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002872 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002873 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002874 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002875 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002876 c->c_errors++;
2877 return;
2878 }
2879 /* Push the class name on the stack */
2880 i = com_addconst(c, v);
2881 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002882 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002883 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00002884 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002885 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002886 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002887 com_push(c, 1);
2888 }
Guido van Rossum25831651993-05-19 14:50:45 +00002889 else
2890 com_bases(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002891 v = (PyObject *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002892 if (v == NULL)
2893 c->c_errors++;
2894 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002895 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002896 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002897 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002898 com_addoparg(c, MAKE_FUNCTION, 0);
2899 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002900 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002901 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002902 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002903 Py_DECREF(v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002904 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002905}
2906
2907static void
2908com_node(c, n)
2909 struct compiling *c;
2910 node *n;
2911{
2912 switch (TYPE(n)) {
2913
2914 /* Definition nodes */
2915
2916 case funcdef:
2917 com_funcdef(c, n);
2918 break;
2919 case classdef:
2920 com_classdef(c, n);
2921 break;
2922
2923 /* Trivial parse tree nodes */
2924
2925 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002926 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002927 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002928 com_node(c, CHILD(n, 0));
2929 break;
2930
2931 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002932 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2933 com_addoparg(c, SET_LINENO, n->n_lineno);
2934 {
2935 int i;
2936 for (i = 0; i < NCH(n)-1; i += 2)
2937 com_node(c, CHILD(n, i));
2938 }
2939 break;
2940
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002941 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002942 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002943 com_node(c, CHILD(n, 0));
2944 break;
2945
2946 /* Statement nodes */
2947
2948 case expr_stmt:
2949 com_expr_stmt(c, n);
2950 break;
2951 case print_stmt:
2952 com_print_stmt(c, n);
2953 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002954 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002955 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002956 break;
2957 case pass_stmt:
2958 break;
2959 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002960 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002961 com_error(c, PyExc_SyntaxError,
2962 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002963 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002964 com_addbyte(c, BREAK_LOOP);
2965 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002966 case continue_stmt:
2967 com_continue_stmt(c, n);
2968 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002969 case return_stmt:
2970 com_return_stmt(c, n);
2971 break;
2972 case raise_stmt:
2973 com_raise_stmt(c, n);
2974 break;
2975 case import_stmt:
2976 com_import_stmt(c, n);
2977 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002978 case global_stmt:
2979 com_global_stmt(c, n);
2980 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002981 case exec_stmt:
2982 com_exec_stmt(c, n);
2983 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002984 case assert_stmt:
2985 com_assert_stmt(c, n);
2986 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002987 case if_stmt:
2988 com_if_stmt(c, n);
2989 break;
2990 case while_stmt:
2991 com_while_stmt(c, n);
2992 break;
2993 case for_stmt:
2994 com_for_stmt(c, n);
2995 break;
2996 case try_stmt:
2997 com_try_stmt(c, n);
2998 break;
2999 case suite:
3000 com_suite(c, n);
3001 break;
3002
3003 /* Expression nodes */
3004
3005 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003006 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003007 break;
3008 case test:
3009 com_test(c, n);
3010 break;
3011 case and_test:
3012 com_and_test(c, n);
3013 break;
3014 case not_test:
3015 com_not_test(c, n);
3016 break;
3017 case comparison:
3018 com_comparison(c, n);
3019 break;
3020 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003021 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003022 break;
3023 case expr:
3024 com_expr(c, n);
3025 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003026 case xor_expr:
3027 com_xor_expr(c, n);
3028 break;
3029 case and_expr:
3030 com_and_expr(c, n);
3031 break;
3032 case shift_expr:
3033 com_shift_expr(c, n);
3034 break;
3035 case arith_expr:
3036 com_arith_expr(c, n);
3037 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003038 case term:
3039 com_term(c, n);
3040 break;
3041 case factor:
3042 com_factor(c, n);
3043 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003044 case power:
3045 com_power(c, n);
3046 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003047 case atom:
3048 com_atom(c, n);
3049 break;
3050
3051 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003052 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003053 com_error(c, PyExc_SystemError,
3054 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003055 }
3056}
3057
Guido van Rossum79f25d91997-04-29 20:08:16 +00003058static void com_fplist Py_PROTO((struct compiling *, node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003059
3060static void
3061com_fpdef(c, n)
3062 struct compiling *c;
3063 node *n;
3064{
3065 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3066 if (TYPE(CHILD(n, 0)) == LPAR)
3067 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003068 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003069 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003070 com_pop(c, 1);
3071 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003072}
3073
3074static void
3075com_fplist(c, n)
3076 struct compiling *c;
3077 node *n;
3078{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003079 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003080 if (NCH(n) == 1) {
3081 com_fpdef(c, CHILD(n, 0));
3082 }
3083 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003084 int i = (NCH(n)+1)/2;
3085 com_addoparg(c, UNPACK_TUPLE, i);
3086 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003087 for (i = 0; i < NCH(n); i += 2)
3088 com_fpdef(c, CHILD(n, i));
3089 }
3090}
3091
3092static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003093com_arglist(c, n)
3094 struct compiling *c;
3095 node *n;
3096{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003097 int nch, i;
3098 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003099 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003100 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003101 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003102 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003103 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003104 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003105 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003106 node *ch = CHILD(n, i);
3107 node *fp;
3108 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003109 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003110 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003111 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3112 fp = CHILD(ch, 0);
3113 if (TYPE(fp) == NAME)
3114 name = STR(fp);
3115 else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003116 name = nbuf;
3117 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003118 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003119 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003120 com_newlocal(c, name);
3121 c->c_argcount++;
3122 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003123 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003124 ch = CHILD(n, i);
3125 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003126 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003127 else
3128 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003129 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003130 /* Handle *arguments */
3131 if (i < nch) {
3132 node *ch;
3133 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003134 if (TYPE(ch) != DOUBLESTAR) {
3135 REQ(ch, STAR);
3136 ch = CHILD(n, i+1);
3137 if (TYPE(ch) == NAME) {
3138 c->c_flags |= CO_VARARGS;
3139 i += 3;
3140 com_newlocal(c, STR(ch));
3141 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003142 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003143 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003144 /* Handle **keywords */
3145 if (i < nch) {
3146 node *ch;
3147 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003148 if (TYPE(ch) != DOUBLESTAR) {
3149 REQ(ch, STAR);
3150 ch = CHILD(n, i+1);
3151 REQ(ch, STAR);
3152 ch = CHILD(n, i+2);
3153 }
3154 else
3155 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003156 REQ(ch, NAME);
3157 c->c_flags |= CO_VARKEYWORDS;
3158 com_newlocal(c, STR(ch));
3159 }
3160 if (complex) {
3161 /* Generate code for complex arguments only after
3162 having counted the simple arguments */
3163 int ilocal = 0;
3164 for (i = 0; i < nch; i++) {
3165 node *ch = CHILD(n, i);
3166 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003167 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003168 break;
3169 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3170 fp = CHILD(ch, 0);
3171 if (TYPE(fp) != NAME) {
3172 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003173 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003174 com_fpdef(c, ch);
3175 }
3176 ilocal++;
3177 if (++i >= nch)
3178 break;
3179 ch = CHILD(n, i);
3180 if (TYPE(ch) == EQUAL)
3181 i += 2;
3182 else
3183 REQ(ch, COMMA);
3184 }
3185 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003186}
3187
3188static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003189com_file_input(c, n)
3190 struct compiling *c;
3191 node *n;
3192{
3193 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003194 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003195 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003196 doc = get_docstring(n);
3197 if (doc != NULL) {
3198 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003199 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003200 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003201 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003202 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003203 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003204 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003205 for (i = 0; i < NCH(n); i++) {
3206 node *ch = CHILD(n, i);
3207 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3208 com_node(c, ch);
3209 }
3210}
3211
3212/* Top-level compile-node interface */
3213
3214static void
3215compile_funcdef(c, n)
3216 struct compiling *c;
3217 node *n;
3218{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003219 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003220 node *ch;
3221 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003222 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003223 doc = get_docstring(CHILD(n, 4));
3224 if (doc != NULL) {
3225 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003226 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003227 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003228 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003229 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003230 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3231 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003232 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003233 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003234 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003235 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003236 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003237 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003238 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003239 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003240 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003241}
3242
3243static void
Guido van Rossum590baa41993-11-30 13:40:46 +00003244compile_lambdef(c, n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003245 struct compiling *c;
3246 node *n;
3247{
Guido van Rossum590baa41993-11-30 13:40:46 +00003248 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003249 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003250 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003251
3252 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003253 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003254 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003255 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003256 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003257 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003258 else
3259 ch = CHILD(n, 2);
3260 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003261 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003262 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003263}
3264
3265static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003266compile_classdef(c, n)
3267 struct compiling *c;
3268 node *n;
3269{
3270 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003271 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003272 REQ(n, classdef);
3273 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3274 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003275#ifdef PRIVATE_NAME_MANGLING
3276 c->c_private = c->c_name;
3277#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003278 ch = CHILD(n, NCH(n)-1); /* The suite */
3279 doc = get_docstring(ch);
3280 if (doc != NULL) {
3281 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003282 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003283 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003284 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003285 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003286 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003287 }
3288 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003289 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003290 com_node(c, ch);
3291 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003292 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003293 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003294 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003295}
3296
3297static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003298compile_node(c, n)
3299 struct compiling *c;
3300 node *n;
3301{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003302 com_addoparg(c, SET_LINENO, n->n_lineno);
3303
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003304 switch (TYPE(n)) {
3305
Guido van Rossum4c417781991-01-21 16:09:22 +00003306 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003307 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003308 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003309 n = CHILD(n, 0);
3310 if (TYPE(n) != NEWLINE)
3311 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003312 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003313 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003314 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003315 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003316 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003317 break;
3318
Guido van Rossum4c417781991-01-21 16:09:22 +00003319 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003320 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003321 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003322 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003323 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003324 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003325 break;
3326
Guido van Rossum590baa41993-11-30 13:40:46 +00003327 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003328 com_node(c, CHILD(n, 0));
3329 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003330 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003331 break;
3332
Guido van Rossum590baa41993-11-30 13:40:46 +00003333 case lambdef: /* anonymous function definition */
3334 compile_lambdef(c, n);
3335 break;
3336
Guido van Rossum4c417781991-01-21 16:09:22 +00003337 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003338 compile_funcdef(c, n);
3339 break;
3340
Guido van Rossum4c417781991-01-21 16:09:22 +00003341 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003342 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003343 break;
3344
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003345 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003346 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003347 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003348 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003349 }
3350}
3351
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003352/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003353
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003354 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3355 instructions that refer to local variables with LOAD_FAST etc.
3356 The latter instructions are much faster because they don't need to
3357 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003358
Guido van Rossum681d79a1995-07-18 14:51:37 +00003359 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3360 and DELETE_NAME instructions. This yields all local variables,
3361 function definitions, class definitions and import statements.
3362 Argument names have already been entered into the list by the
3363 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003364
3365 All remaining LOAD_NAME instructions must refer to non-local (global
3366 or builtin) variables, so are replaced by LOAD_GLOBAL.
3367
3368 There are two problems: 'from foo import *' and 'exec' may introduce
3369 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003370 case, we can still optimize bona fide locals (since those
3371 statements will be surrounded by fast_2_locals() and
3372 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003373
Guido van Rossum681d79a1995-07-18 14:51:37 +00003374 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003375
3376static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003377optimize(c)
3378 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00003379{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003380 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003381 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003382 int oparg = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003383 PyObject *name;
3384 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003385
Guido van Rossum282914b1991-04-04 10:42:56 +00003386#define NEXTOP() (*next_instr++)
3387#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossum79f25d91997-04-29 20:08:16 +00003388#define GETITEM(v, i) (PyList_GetItem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003389#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3390
Guido van Rossum79f25d91997-04-29 20:08:16 +00003391 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003392
3393 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003394
Guido van Rossum79f25d91997-04-29 20:08:16 +00003395 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003396 for (;;) {
3397 opcode = NEXTOP();
3398 if (opcode == STOP_CODE)
3399 break;
3400 if (HAS_ARG(opcode))
3401 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003402 switch (opcode) {
3403 case STORE_NAME:
3404 case DELETE_NAME:
3405 case IMPORT_FROM:
3406 com_addlocal_o(c, GETNAMEOBJ(oparg));
3407 break;
3408 case EXEC_STMT:
3409 c->c_flags &= ~CO_OPTIMIZED;
3410 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003411 }
3412 }
3413
Guido van Rossum79f25d91997-04-29 20:08:16 +00003414 if (PyDict_GetItemString(c->c_locals, "*") != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003415 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003416
Guido van Rossum79f25d91997-04-29 20:08:16 +00003417 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003418 for (;;) {
3419 cur_instr = next_instr;
3420 opcode = NEXTOP();
3421 if (opcode == STOP_CODE)
3422 break;
3423 if (HAS_ARG(opcode))
3424 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003425 if (opcode == LOAD_NAME ||
3426 opcode == STORE_NAME ||
3427 opcode == DELETE_NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003428 PyObject *v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003429 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003430 name = GETNAMEOBJ(oparg);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003431 v = PyDict_GetItem(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003432 if (v == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003433 if (opcode == LOAD_NAME &&
3434 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003435 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003436 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003437 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003438 i = PyInt_AsLong(v);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003439 switch (opcode) {
3440 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3441 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3442 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3443 }
3444 cur_instr[1] = i & 0xff;
3445 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00003446 }
3447 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003448
Guido van Rossum681d79a1995-07-18 14:51:37 +00003449 if (c->c_errors == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00003450 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003451}
3452
Guido van Rossum79f25d91997-04-29 20:08:16 +00003453PyCodeObject *
3454PyNode_Compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003455 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003456 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003457{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003458 return jcompile(n, filename, NULL);
3459}
3460
Guido van Rossum79f25d91997-04-29 20:08:16 +00003461static PyCodeObject *
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003462icompile(n, base)
3463 node *n;
3464 struct compiling *base;
3465{
3466 return jcompile(n, base->c_filename, base);
3467}
3468
Guido van Rossum79f25d91997-04-29 20:08:16 +00003469static PyCodeObject *
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003470jcompile(n, filename, base)
3471 node *n;
3472 char *filename;
3473 struct compiling *base;
3474{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003475 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003476 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003477 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003478 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003479#ifdef PRIVATE_NAME_MANGLING
3480 if (base)
3481 sc.c_private = base->c_private;
3482 else
3483 sc.c_private = NULL;
3484#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003485 compile_node(&sc, n);
3486 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003487 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003488 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003489 sc.c_flags |= CO_NEWLOCALS;
3490 }
3491 else if (TYPE(n) == classdef)
3492 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003493 co = NULL;
3494 if (sc.c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003495 PyObject *consts, *names, *varnames, *filename, *name;
3496 consts = PyList_AsTuple(sc.c_consts);
3497 names = PyList_AsTuple(sc.c_names);
3498 varnames = PyList_AsTuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003499 filename = PyString_InternFromString(sc.c_filename);
3500 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003501 if (!PyErr_Occurred())
3502 co = PyCode_New(sc.c_argcount,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003503 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003504 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003505 sc.c_flags,
3506 sc.c_code,
3507 consts,
3508 names,
3509 varnames,
3510 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003511 name,
3512 sc.c_firstlineno,
3513 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003514 Py_XDECREF(consts);
3515 Py_XDECREF(names);
3516 Py_XDECREF(varnames);
3517 Py_XDECREF(filename);
3518 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003519 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003520 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003521 return co;
3522}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003523
3524int
3525PyCode_Addr2Line(co, addrq)
3526 PyCodeObject *co;
3527 int addrq;
3528{
3529 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003530 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003531 int line = co->co_firstlineno;
3532 int addr = 0;
3533 while (--size >= 0) {
3534 addr += *p++;
3535 if (addr > addrq)
3536 break;
3537 line += *p++;
3538 }
3539 return line;
3540}